[CMake] Add Custom COmmand and CMAKE_CFG_INTDIR

Michael Hertling mhertling at online.de
Thu Jan 5 00:34:10 EST 2012


On 01/04/2012 10:11 PM, Bill Hoffman wrote:
> On 1/4/2012 4:03 PM, Michael Jackson wrote:
>> I robbed this from the HDF5 project which does something very similar to what I am doing:
>>
>> SET (CMD ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}${CFG_INIT}/H5detect${EXE_EXT})
>>
>> That "seems" to at least point to the proper location. Now to get Visual Studio to actually execute the executable.
> That is pretty old stuff...
> 
> There are better ways to do that in CMake now:

Especially if one possibly wants to use the RUNTIME_OUTPUT_NAME target
property to make the executable's name differ from the target's name.

> cmake --help-command add_custom_command
> ....
> 
>         Arguments to COMMAND may use "generator expressions" with the syntax
>         "$<...>".  Generator expressions are evaluted during build system
>         generation to produce information specific to each build
>         configuration.  Valid expressions are:
> 
>           $<CONFIGURATION>          = configuration name
>           $<TARGET_FILE:tgt>        = main file (.exe, .so.1.2, .a)
>           $<TARGET_LINKER_FILE:tgt> = file used to link (.a, .lib, .so)
>           $<TARGET_SONAME_FILE:tgt> = file with soname (.so.3)
> 
> This should work:
>    COMMAND $<TARGET_FILE:FilterWidgetCodeGen>

AFAIK, CMake examines the first argument after the COMMAND clause in
ADD_CUSTOM_COMMAND() whether it denotes an executable target, i.e.

COMMAND $<TARGET_FILE:FilterWidgetCodeGen>

and

COMMAND FilterWidgetCodeGen

should be equivalent, shouldn't they?

Besides, Mike, both above-noted variants establish target-level
dependencies on the executable target following COMMAND for the
targets which trigger the custom command; most certainly, this
isn't done if one provides expressions like

${CMAKE_RUNTIME_OUTPUT_DIRECTORY}${CFG_INIT}/H5detect${EXE_EXT}

for the COMMAND.

Regards,

Michael

> -Bill
> 
> 
> 
>> --
>> Mike Jackson<www.bluequartz.net>
>>
>> On Jan 4, 2012, at 3:54 PM, clinton at elemtech.com wrote:
>>
>>> Have you tried excluding the ".exe" thing?  I thought cmake did the right thing for targets used in custom commands.
>>>
>>> Clint
>>>
>>> ----- Reply message -----
>>> From: "Michael Jackson"<mike.jackson at bluequartz.net>
>>> Date: Wed, Jan 4, 2012 1:28 pm
>>> Subject: [CMake] Add Custom COmmand and CMAKE_CFG_INTDIR
>>> To: "cmake at cmake.org List"<cmake at cmake.org>
>>>
>>> I am having trouble getting add_custom_Command and CMAKE_CFG_INTDIR to work correctly together. This is what I have so far.
>>>
>>> # ---------- Setup output Directories -------------------------
>>> SET (CMAKE_LIBRARY_OUTPUT_DIRECTORY
>>>   ${PROJECT_BINARY_DIR}/Bin
>>>   CACHE PATH
>>>   "Single Directory for all Libraries"
>>>   )
>>>
>>> # Create our custom executable that will generate most of our QFilterWidget
>>> # classes from information stored in the Filters themselves.
>>> configure_file( ${FilterWidgets_SOURCE_DIR}/CodeGen.cpp.in
>>>                 ${FilterWidgets_BINARY_DIR}/FilterWidgetCodeGen.cpp)
>>> add_executable(FilterWidgetCodeGen ${FilterWidgets_BINARY_DIR}/FilterWidgetCodeGen.cpp)
>>> target_link_libraries(FilterWidgetCodeGen MXA EbsdLib DREAM3DLib)
>>> set(EXE_EXTENSION "")
>>> if (WIN32)
>>>   set (EXE_EXTENSION ".exe")
>>> endif()
>>> # Now run the code to generate the header files which will over write the place
>>> # holder files that were generated from above
>>> add_custom_command(TARGET FilterWidgetCodeGen POST_BUILD
>>>             COMMAND FilterWidgetCodeGen${EXE_EXTENSION}
>>>             WORKING_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
>>>
>>>
>>> I know this is going to fail on visual studio, which it did. The issue is, what combination of CMAKE_CFG_INTDIR and anything else do I use to get this to work?
>>>
>>> Thanks


More information about the CMake mailing list