mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Gradle/C++: compatibility fix for the Gradle 4.10
This commit is contained in:
@@ -3,15 +3,11 @@ package org.jetbrains.plugins.gradle.nativeplatform.tooling.builder;
|
||||
|
||||
import org.gradle.api.Project;
|
||||
import org.gradle.api.component.SoftwareComponent;
|
||||
import org.gradle.api.file.*;
|
||||
import org.gradle.api.internal.file.FileCollectionInternal;
|
||||
import org.gradle.api.internal.file.FileCollectionVisitor;
|
||||
import org.gradle.api.internal.file.FileTreeInternal;
|
||||
import org.gradle.api.internal.file.collections.DirectoryFileTree;
|
||||
import org.gradle.api.file.FileCollection;
|
||||
import org.gradle.api.file.RegularFileProperty;
|
||||
import org.gradle.api.internal.project.DefaultProject;
|
||||
import org.gradle.api.plugins.PluginContainer;
|
||||
import org.gradle.api.provider.Provider;
|
||||
import org.gradle.api.tasks.util.PatternSet;
|
||||
import org.gradle.internal.impldep.org.apache.commons.lang.StringUtils;
|
||||
import org.gradle.internal.os.OperatingSystem;
|
||||
import org.gradle.language.cpp.CppBinary;
|
||||
@@ -48,16 +44,21 @@ import org.jetbrains.plugins.gradle.tooling.ModelBuilderService;
|
||||
|
||||
import java.io.File;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* The prototype of the C++ project gradle tooling model builder.
|
||||
* This implementation should be moved or replaced with the similar model builder from the Gradle distribution.
|
||||
*
|
||||
* @deprecated to be removed in 2019.1, use built-in 'org.gradle.tooling.model.cpp.CppComponent' available since Gradle 4.10
|
||||
*
|
||||
* @author Vladislav.Soroka
|
||||
*/
|
||||
public class CppModelBuilder implements ModelBuilderService {
|
||||
private static final boolean IS_48_OR_BETTER = GradleVersion.current().getBaseVersion().compareTo(GradleVersion.version("4.8")) >= 0;
|
||||
private static final boolean IS_410_OR_BETTER = GradleVersion.current().getBaseVersion().compareTo(GradleVersion.version("4.10")) >= 0;
|
||||
private static final boolean IS_48_OR_BETTER = IS_410_OR_BETTER ||
|
||||
GradleVersion.current().getBaseVersion().compareTo(GradleVersion.version("4.8")) >= 0;
|
||||
private static final boolean IS_47_OR_BETTER = IS_48_OR_BETTER ||
|
||||
GradleVersion.current().getBaseVersion().compareTo(GradleVersion.version("4.7")) >= 0;
|
||||
private static final boolean IS_41_OR_BETTER = IS_47_OR_BETTER ||
|
||||
@@ -71,7 +72,8 @@ public class CppModelBuilder implements ModelBuilderService {
|
||||
@Nullable
|
||||
@Override
|
||||
public Object buildAll(final String modelName, final Project project) {
|
||||
if(!IS_41_OR_BETTER) {
|
||||
// uncomment when 'org.gradle.tooling.model.cpp.CppComponent' will be used for the import
|
||||
if (!IS_41_OR_BETTER /*|| IS_410_OR_BETTER*/) {
|
||||
return null;
|
||||
}
|
||||
PluginContainer pluginContainer = project.getPlugins();
|
||||
@@ -240,23 +242,15 @@ public class CppModelBuilder implements ModelBuilderService {
|
||||
}
|
||||
|
||||
FileCollection cppSource = cppComponent.getCppSource();
|
||||
// try to resolve cpp source folders
|
||||
((FileCollectionInternal)cppSource).visitRootElements(new FileCollectionVisitor() {
|
||||
@Override
|
||||
public void visitCollection(FileCollectionInternal internal) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitTree(FileTreeInternal internal) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitDirectoryTree(DirectoryFileTree tree) {
|
||||
File dir = tree.getDir();
|
||||
PatternSet patterns = tree.getPatterns();
|
||||
cppProject.addSourceFolder(new SourceFolderImpl(dir, new FilePatternSetImpl(patterns.getIncludes(), patterns.getExcludes())));
|
||||
}
|
||||
});
|
||||
// resolve cpp source folders
|
||||
Set<File> dirs = new LinkedHashSet<File>();
|
||||
for (File file : cppSource.getFiles()) {
|
||||
dirs.add(file.getParentFile());
|
||||
}
|
||||
for (File dir : dirs) {
|
||||
cppProject.addSourceFolder(new SourceFolderImpl(
|
||||
dir, new FilePatternSetImpl(Collections.<String>emptySet(), Collections.<String>emptySet())));
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@@ -265,12 +259,19 @@ public class CppModelBuilder implements ModelBuilderService {
|
||||
try {
|
||||
if (cppBinary instanceof ConfigurableComponentWithExecutable) {
|
||||
PlatformToolProvider toolProvider = ((ConfigurableComponentWithExecutable)cppBinary).getPlatformToolProvider();
|
||||
ToolSearchResult toolSearchResult = toolProvider.isToolAvailable(ToolType.CPP_COMPILER);
|
||||
ToolSearchResult toolSearchResult;
|
||||
if (IS_410_OR_BETTER) {
|
||||
Method locateToolMethod = toolProvider.getClass().getDeclaredMethod("locateTool", ToolType.class);
|
||||
toolSearchResult = (ToolSearchResult)locateToolMethod.invoke(toolProvider, ToolType.CPP_COMPILER);
|
||||
}
|
||||
else {
|
||||
toolSearchResult = toolProvider.isToolAvailable(ToolType.CPP_COMPILER);
|
||||
}
|
||||
if (toolSearchResult.isAvailable()) {
|
||||
if (toolSearchResult instanceof CommandLineToolSearchResult) {
|
||||
return ((CommandLineToolSearchResult)toolSearchResult).getTool();
|
||||
}
|
||||
// dirty hack because of dummy implementation of org.gradle.nativeplatform.toolchain.internal.msvcpp.VisualCppPlatformToolProvider.isToolAvailable
|
||||
// dirty hack for gradle versions <= 4.9 because of dummy implementation of org.gradle.nativeplatform.toolchain.internal.msvcpp.VisualCppPlatformToolProvider.isToolAvailable
|
||||
if (toolProvider.getClass().getSimpleName().equals("VisualCppPlatformToolProvider")) {
|
||||
Field visualCppField = toolProvider.getClass().getDeclaredField("visualCpp");
|
||||
visualCppField.setAccessible(true);
|
||||
|
||||
Reference in New Issue
Block a user