From 2006e6cdf1065f08c313d54f8ba27ce56136e48c Mon Sep 17 00:00:00 2001 From: Fabrizio Iannetti Date: Sun, 14 Apr 2019 13:51:43 +0200 Subject: [PATCH] Bug 546409 - CMake configure failing in corner cases - With Makefiles generator run configure step if no Makefile exists - Clean build dir before running the configure step Change-Id: I3514835920a452e724e04b19f64d4a74fc4f3c2c Signed-off-by: Fabrizio Iannetti --- .../internal/CMakeBuildConfiguration.java | 25 +++++++++++++++++++ .../cdt/cmake/core/internal/Messages.java | 1 + .../cmake/core/internal/messages.properties | 1 + 3 files changed, 27 insertions(+) diff --git a/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/CMakeBuildConfiguration.java b/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/CMakeBuildConfiguration.java index a9bd1dcc41b..99908efd71d 100644 --- a/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/CMakeBuildConfiguration.java +++ b/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/CMakeBuildConfiguration.java @@ -145,12 +145,20 @@ public class CMakeBuildConfiguration extends CBuildConfiguration { case "Ninja": //$NON-NLS-1$ runCMake = !Files.exists(buildDir.resolve("build.ninja")); //$NON-NLS-1$ break; + case "Unix Makefiles": //$NON-NLS-1$ + runCMake = !Files.exists(buildDir.resolve("Makefile")); //$NON-NLS-1$ + break; default: runCMake = !Files.exists(buildDir.resolve("CMakeFiles")); //$NON-NLS-1$ } if (runCMake) { // $NON-NLS-1$ + console.getOutputStream().write(String.format(Messages.CMakeBuildConfiguration_Configuring, buildDir)); + // clean output to make sure there is no content + // incompatible with current settings (cmake config would fail) + cleanBuildDirectory(buildDir); + List command = new ArrayList<>(); command.add("cmake"); //$NON-NLS-1$ @@ -339,4 +347,21 @@ public class CMakeBuildConfiguration extends CBuildConfiguration { } } + private void cleanDirectory(Path dir) throws IOException { + Path[] files = Files.list(dir).toArray(Path[]::new); + for (Path file : files) { + if (Files.isDirectory(file)) + cleanDirectory(file); + else + Files.delete(file); + } + } + + private void cleanBuildDirectory(Path buildDir) throws IOException { + if (!Files.exists(buildDir)) + return; + if (Files.isDirectory(buildDir)) + cleanDirectory(buildDir); + // TODO: not a directory should we do something? + } } diff --git a/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/Messages.java b/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/Messages.java index 96a606d5c1e..18e2f1fddac 100644 --- a/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/Messages.java +++ b/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/Messages.java @@ -19,6 +19,7 @@ public class Messages extends NLS { public static String CMakeBuildConfiguration_BuildingComplete; public static String CMakeBuildConfiguration_BuildComplete; public static String CMakeBuildConfiguration_Cleaning; + public static String CMakeBuildConfiguration_Configuring; public static String CMakeBuildConfiguration_NotFound; public static String CMakeBuildConfiguration_NoToolchainFile; public static String CMakeBuildConfiguration_ProcCompCmds; diff --git a/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/messages.properties b/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/messages.properties index 462dd39c547..7af6fa76592 100644 --- a/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/messages.properties +++ b/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/messages.properties @@ -12,6 +12,7 @@ CMakeBuildConfiguration_Building=Building %s CMakeBuildConfiguration_BuildingIn=Building in: %s\n CMakeBuildConfiguration_BuildingComplete=Build complete (%d errors, %d warnings): %s\n CMakeBuildConfiguration_BuildComplete=Build complete\n +CMakeBuildConfiguration_Configuring=Configuring in: %s\n CMakeBuildConfiguration_Cleaning=Cleaning %s CMakeBuildConfiguration_NotFound=CMakeFiles not found. Assuming clean. CMakeBuildConfiguration_NoToolchainFile=No CMake toolchain file found for this target.