[CMake] Re: ADD_DEPENDENCIES: "non-existent target"??

Matthew Woehlke mw_triad at users.sourceforge.net
Tue Mar 20 13:07:52 EST 2007


Matthew Woehlke wrote:
> Matthew Woehlke wrote:
>> I have a project with some Doxygen doc that has examples. I want to 
>> add a non-default target to build the examples. I tried this:
>>
>> src/CMakeLists.txt:
>> ADD_CUSTOM_TARGET(examples)
>>
>> src/examples/CMakeLists.txt:
>> MACRO(ADD_EXAMPLE name)
>>     ADD_EXECUTABLE(${name} EXCLUDE_FROM_ALL ${name}.c)
>>     TARGET_LINK_LIBRARIES(${name} mylib)
>>     ADD_TEST(${name} ${CMAKE_CURRENT_BINARY_DIR}/${name})
>>     ADD_DEPENDENCIES(examples ${name})
>> ENDMACRO(ADD_EXAMPLE)
>> ADD_EXAMPLE(foo)
>>
>>
>> ...but I always get this error:
>> src/examples/CMakeLists.txt:5:
>> ADD_DEPENDENCIES Adding dependency to non-existent target: examples
>>
>>
>> What am I doing wrong?
> 
> Ok, apparently ADD_DEPENDENCIES only works on targets *in the current 
> directory*. So how do I add a dependency to a top-level target in the 
> CMakeLists.txt of a subdirectory?

Ok, I got this to work:

MACRO(EXAMPLE_SUBDIRS)
   SUBDIRS(${ARGV})
   ADD_CUSTOM_TARGET(examples)
   FOREACH(subdir ${ARGV})
     ADD_CUSTOM_TARGET(examples_${subdir} cd ${subdir} && make examples)
     ADD_DEPENDENCIES(examples examples_${subdir})
   ENDFOREACH(subdir)
ENDMACRO(EXAMPLE_SUBDIRS)

MACRO(ADD_EXAMPLE prefix name)
   ADD_EXECUTABLE(${name} EXCLUDE_FROM_ALL ${name}.c)
   TARGET_LINK_LIBRARIES(${name} mylib)
   ADD_TEST(${prefix}/${name} ${CMAKE_CURRENT_BINARY_DIR}/${name})
   ADD_CUSTOM_TARGET(examples)
   ADD_DEPENDENCIES(examples ${name})
ENDMACRO(ADD_EXAMPLE)

...but this is exactly the sort of recursive calling of 'make' that 
CMake is supposed to *avoid*! Surely there is a better way?!

-- 
Matthew
"What a wonderful smell you've discovered!" -- Princess Leia Organa



More information about the CMake mailing list