On 2013-04-02 09:19, Brad King wrote:
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?

Why are the rules set up like this and not such that b.txt depends on A?

I'm not convinced this is a bug; In the absence of a custom command having an 'OUTPUT a.txt', there is no expression that the custom command for b.txt depends on any build rule. IMHO what ninja is doing is perfectly justifiable behavior for the build rules given above.

If I were to hand-write a Makefile from the above, I would come up with something like:

a.o: a.c
  <compile...>

A: a.o
  <link...>
  cp a.c ${build}/b.txt

b.txt: ${build}/a.txt
  cp a.txt b.txt

B: A b.txt

Note that there is nothing in the dependency graph of the above which requires that the build system must build A before b.txt.

--
Matthew

--

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