Hi Peter,

We've come across a case where the Makefile, VS, and Xcode generators
work but Ninja does not::

 cmake_minimum_required(VERSION 2.8.10)
 project(DependSideEffect C)
 add_library(A a.c)
 add_custom_command(
   TARGET A POST_BUILD
   COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/a.c a.txt
   )
 add_custom_command(
   OUTPUT b.txt
   DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/a.txt
   COMMAND cp a.txt b.txt
   )
 add_custom_target(B ALL DEPENDS b.txt)
 add_dependencies(B A)

CMake's rule for target-level dependencies is that "A" must be up to
date before the build system evaluates the rules of "B".

Building with Ninja fails with::

 ninja: error: 'a.txt', needed by 'b.txt', missing and no known rule to make it

Relevant portions of build.ninja::

 build libA.a: C_STATIC_LIBRARY_LINKER CMakeFiles/A.dir/a.c.o
   POST_BUILD = cd ".../build" && cp .../a.c a.txt
 ...
 build b.txt: CUSTOM_COMMAND a.txt || libA.a
   COMMAND = cd ".../build" && cp a.txt b.txt
 ...

The rule for "b.txt" has an order-only dependency on "libA.a" and
an explicit dependency on "a.txt".  Ninja does not wait for the
order-only dependencies to be up to date before complaining that
the explicit dependency is missing.

Can ninja be taught to wait for order-only dependencies to be up to
date to see if they produce any of the explicit dependencies as
a side effect?  Is there another way to do this in CMake's Ninja gen?

Thanks,
-Brad
--

Powered by www.kitware.com

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/cgi-bin/mailman/listinfo/cmake-developers

Reply via email to