On 09/15/2010 05:15 PM, Nick Davidson wrote:
> Whoops, forgot to reply on list, sorry!
> 
>> From: cmake-boun...@cmake.org
>> [mailto:cmake-boun...@cmake.org] On Behalf Of Andreas Pakulat
>> Sent: 15 September 2010 13:03
>> To: cmake@cmake.org
>> Subject: Re: [CMake] add_dependency on a custom target
>>
>> On 15.09.10 12:34:43, Nick Davidson wrote:
>>> Dear List,
>>>
>>> I'm using a file glob to extract a list of xml files to pass to a 
>>> custom target to generate a pot file with getttext, most of
>> the heavy
>>> lifting is handled by a Macro.
>>>
>>> include(FindMsgfmt)
>>> macro (MakePot BIN_NAME CPP_SOURCES XML_SOURCES)
>>>      set(CPP_SRCS ${CPP_SOURCES})
>>>      set(XML_SRCS ${XML_SOURCES})
>>>      set(POT_FILE ${BIN_NAME}.pot)
>>>      if (XGETTEXT_FOUND)
>>>          message(STATUS "Adding Target Potfile: ${POT_FILE}")
>>>          if (XML_SRCS)
>>>              add_custom_target(${POT_FILE} ALL
>>>              COMMAND ${XGETTEXT_EXECUTABLE} --language=C++
>> --force-po
>>> -kN_ -kNN_:1,2 -o  ${POT_FILE} ${CPP_SRCS}
>>>              COMMAND ${XGETTEXT_EXECUTABLE} --language=Glade 
>>> --force-po -j -o  ${POT_FILE} ${XML_SRCS} )
>>>          else (XML_SRCS)             
>> add_custom_target(${POT_FILE} ALL
>>>              COMMAND ${XGETTEXT_EXECUTABLE} --language=C++
>> --force-po
>>> -kN_ -kNN_:1,2 -o  ${POT_FILE} ${CPP_SRCS})
>>>          endif(XML_SRCS)
>>>          add_dependencies(${POT_FILE} ${XML_SOURCES} ${CPP_SRCS})
>>>      else (XGETTEXT_FOUND)
>>>          message(STATUS "Cannot find xgettext")
>>>      endif(XGETTEXT_FOUND)
>>> endmacro (MakePot POT_NAME)
>>>
>>> The only problem is, if the list of xml files changes (e.g. a
>>> deletion) the cmake cache doesn't get regenerated and thus the xml 
>>> files are not reglobbed and so the custom command fails.
>>>
>>> Any suggestions?
>>
>> Don't use a glob (list the files individually) or remember to touch 
>> the cmakelists.txt file after adding new files. I don't think there's 
>> a way to have cmake re-run when calling just make within 
>> cmakelists.txt.
> 
> Ok, but why doesn't adding the files as dependencies work? 
> The glob is stored in the cache - fine, there isn't a way for Cmake to
> automatically figure out what files it should check to see if anything
> has changed. Having added those files as dependencies of the target that
> uses the glob manually then surely it's just a list of files?
> 
> 
> Is there a fundamental difference between a list variable made from
> a globbed set of files and a list made from a manually specified set?

Don't use ADD_DEPENDENCIES() to establish a dependency of a target on
files; it's for target interdependencies only. Furthermore, you don't
need a dependency of a custom target on your XML files unless they're
generated by a custom command; custom targets are always out of date
and, thus, rebuilt when they are checked. So, when (re)building, the
target associated with the POT_FILE is (re)built anyway, but at the
moment, it works on the files collected once at configuration time.
However, you can delay the files' collection till build time:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR)
PROJECT(GLOB NONE)
FILE(WRITE ${CMAKE_BINARY_DIR}/glob.cmake "
FILE(GLOB_RECURSE g *.cmake)
EXECUTE_PROCESS(COMMAND echo \"xgettext ...\" \${g})
")
ADD_CUSTOM_TARGET(glob ALL
  ${CMAKE_COMMAND} -P ${CMAKE_BINARY_DIR}/glob.cmake
)

The glob.cmake script is invoked by a custom target at build time,
collects the files and executes a command on them, so there is no
need to reconfigure after the set of collected files has changed.
BTW, wouldn't it be more appropriate to use a custom command for
the pot files' generation?

Regards,

Michael
_______________________________________________
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://www.cmake.org/mailman/listinfo/cmake

Reply via email to