Hi Brad, Thanks for investigating this. Do you think it makes sense to land my ExternalProject_Add patch so that others can experiment with it? I can add quit with a fatal_error/warning if the build tree rules are generated with Ninja. However, there is a problem with Unix Makefiles as well: parallelism doesn't work when I run "make check-compiler-rt -j8" in the original build tree, presumably because we call "cd /path/to/compiler-rt/build/tree && make check-all" there. On Tue, Feb 25, 2014 at 7:02 PM, Brad King <brad.king at kitware.com> wrote:> On 02/25/2014 03:28 AM, Alexey Samsonov wrote: > > Then I run > > $ ninja compiler-rt > > twice. The first run builds the libraries, the second shows only: > > "ninja: no work to do." message. > > I'm able to reproduce that, thanks. This is a subtle interaction > between always-out-of-date rules and order-only dependencies. > > The problem is that the build.ninja file has the rule: > > build > projects/compiler-rt/src/compiler-rt-stamp/compiler-rt-force-reconfigure: > phony || bin/clang bin/llvm-config > > to express the always-out-of-date force-reconfigure rule. The Ninja > documentation says: > > "If a phony build statement is written without any dependencies, > the target will be considered out of date if it does not exist." > > However, the rule has dependencies because the Ninja generator implements > add_dependencies by adding order-only dependencies to every individual > rule in the dependent target on all dependencies. > > It looks like the Ninja generator needs to write a rule is always out > of date but still has order-only dependencies. I think this will work: > > build > projects/compiler-rt/src/compiler-rt-stamp/compiler-rt-force-reconfigure: > phony | always || bin/clang bin/llvm-config > build always: phony > > I've recorded this issue in the CMake issue tracker: > > http://www.cmake.org/Bug/view.php?id=14771 > > -Brad >-- Alexey Samsonov, MSK -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140226/a8c08ea5/attachment.html>
On 02/26/2014 12:43 PM, Alexey Samsonov wrote:> Do you think it makes sense to land my ExternalProject_Add patch > so that others can experiment with it? I can add quit with a > fatal_error/warning if the build tree rules are generated with Ninja.Since it is conditional on LLVM_BUILD_EXTERNAL_COMPILER_RT, yes.> parallelism doesn't work when I run "make check-compiler-rt -j8" > in the original build tree, presumably because we call > "cd /path/to/compiler-rt/build/tree && make check-all" there.Right. The ExternalProject module has a special case for the Makefile generators to make with $(MAKE) instead of "make": http://cmake.org/gitweb?p=cmake.git;a=blob;f=Modules/ExternalProject.cmake;hb=v2.8.12.2#l846 so that flags like -j propagate automatically. You could do that too: if(CMAKE_GENERATOR MATCHES "Make") set(check_compiler_rt "$(MAKE)" "check-all") else() set(check_compiler_rt ${CMAKE_COMMAND} --build . --target check-all --config $<CONFIGURATION>) endif() ExternalProject_Get_Property(compiler-rt BINARY_DIR) add_custom_target(check-compiler-rt COMMAND ${check_compiler_rt} DEPENDS compiler-rt WORKING_DIRECTORY ${BINARY_DIR} VERBATIM ) -Brad
On Wed, Feb 26, 2014 at 9:58 PM, Brad King <brad.king at kitware.com> wrote:> On 02/26/2014 12:43 PM, Alexey Samsonov wrote: > > Do you think it makes sense to land my ExternalProject_Add patch > > so that others can experiment with it? I can add quit with a > > fatal_error/warning if the build tree rules are generated with Ninja. > > Since it is conditional on LLVM_BUILD_EXTERNAL_COMPILER_RT, yes. >Submitted as r202367.> > > parallelism doesn't work when I run "make check-compiler-rt -j8" > > in the original build tree, presumably because we call > > "cd /path/to/compiler-rt/build/tree && make check-all" there. > > Right. The ExternalProject module has a special case for the > Makefile generators to make with $(MAKE) instead of "make": > > > http://cmake.org/gitweb?p=cmake.git;a=blob;f=Modules/ExternalProject.cmake;hb=v2.8.12.2#l846 > > so that flags like -j propagate automatically. You could do > that too: > > if(CMAKE_GENERATOR MATCHES "Make") > set(check_compiler_rt "$(MAKE)" "check-all") > else() > set(check_compiler_rt ${CMAKE_COMMAND} --build . > --target check-all --config $<CONFIGURATION>) > endif() > > ExternalProject_Get_Property(compiler-rt BINARY_DIR) > add_custom_target(check-compiler-rt > COMMAND ${check_compiler_rt} > DEPENDS compiler-rt > WORKING_DIRECTORY ${BINARY_DIR} > VERBATIM > ) > >This worked, thanks! Currently I also print fatal_error message if I detect Ninja as a CMAKE_GENERATOR. -- Alexey Samsonov, MSK -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140227/cce3482d/attachment.html>