Gradle/C++: compatibility fix for the Gradle 4.10

This commit is contained in:
Vladislav.Soroka
2018-08-10 15:24:59 +03:00
parent 99237908d8
commit 2c7a0ea8fd
@@ -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);