[CMake] Fwd: Adding custom directories to PATH enviroment

Michael Wild themiwi at gmail.com
Thu Apr 14 03:35:32 EDT 2011


On 04/14/2011 09:31 AM, Gabriele Greco wrote:
> 
>     You're right about the explicit listing, but you should do the copying
>     using configure_file(... COPYONLY). And don't even think about using
>     file(GLOB) and friends, that's usually the wrong approach.
> 
> 
> The problem is that those files can be modified by the user and in that
> case obviously the sources should be recompiled, so I ended with an
> approach similar to the one for the .idl interfaces, the only thing I
> don't like is that those small targets are listed as % points of the
> progress of the build, anyway it's really impressive the flexibility of
> cmake!
> 
> 
> MACRO (MACRO_ADD_CUSTOMIZED)
>  FOREACH(_in_FILE ${ARGN})
> 
>    GET_FILENAME_COMPONENT(_out_DIR ${_in_FILE} PATH)
>    GET_FILENAME_COMPONENT(_out_FILE ${_in_FILE} NAME_WE)
> 
>    ADD_CUSTOM_COMMAND(
>      OUTPUT ${PROJECT_BINARY_DIR}/inc/intf/${_out_DIR}/${_out_FILE}.h
>      DEPENDS ${PROJECT_SOURCE_DIR}/inc/intf/${_in_FILE}
>      COMMAND mkdir -p "${PROJECT_BINARY_DIR}/inc/intf/${_out_DIR}"
>      COMMAND cp "${PROJECT_SOURCE_DIR}/inc/intf/${_in_FILE}"
> "${PROJECT_BINARY_DIR}/inc/intf/${_out_DIR}"
>    )
> 
>    SET_SOURCE_FILES_PROPERTIES(
>      ${PROJECT_BINARY_DIR}/inc/intf/${_out_DIR}/${_out_FILE}.h
>      PROPERTIES
>      GENERATED TRUE
>    )
> 
>    ADD_CUSTOM_TARGET(${_out_FILE} DEPENDS
> ${PROJECT_BINARY_DIR}/inc/intf/${_out_DIR}/${_out_FILE}.h)
> 
>    add_dependencies(idl ${_out_FILE} )
>  ENDFOREACH(_in_FILE ${ARGN})
> 
> 
> MACRO_ADD_CUSTOMIZED(AckNak/AckNakImpl.h        
>  GlacToGcrf/GlacToGcrfImpl.h        SfdToVld/SfdToVldImpl.h
>         AckNak/AckNakIntf.h          GlacToGcrf/GlacToGcrfIntf.h      
>  SfdToVld/SfdToVldIntf.h
>         FromASII/FromASIIImpl.h      GlacToGtr/GlacToGtrImpl.h        
>  SubToMaster/SubToMasterImpl.h
>         FromASII/FromASIIIntf.h      GlacToGtr/GlacToGtrIntf.h        
>  SubToMaster/SubToMasterIntf.h
>         FromGRL/FromGRLImpl.h        GrfToGcrf/GrfToGcrfImpl.h        
>  SupvToMonitor/SupvToMonitorImpl.h
>         FromGRL/FromGRLIntf.h        GrfToGcrf/GrfToGcrfIntf.h        
>  SupvToMonitor/SupvToMonitorIntf.h
>         FromTLP/FromTLPImpl.h        GtlrToGtr/GtlrToGtrImpl.h        
>  TechInterface/TechInterfaceImpl.h
>         FromTLP/FromTLPIntf.h        GtlrToGtr/GtlrToGtrIntf.h        
>  TechInterface/TechInterfaceIntf.h
>         FromTTL/FromTTLImpl.h        GtrToGcfg/GtrToGcfgImpl.h        
>  ToASII/ToASIIImpl.h
>         FromTTL/FromTTLIntf.h        GtrToGcfg/GtrToGcfgIntf.h        
>  ToASII/ToASIIIntf.h
>         GcfgToGfg/GcfgToGfgImpl.h    GtrToGcrf/GtrToGcrfImpl.h        
>  ToCLK/ToCLKImpl.h
>         GcfgToGfg/GcfgToGfgIntf.h    GtrToGcrf/GtrToGcrfIntf.h        
>  ToCLK/ToCLKIntf.h
>         GcfgToGtr/GcfgToGtrImpl.h    GtrToGcrl/GtrToGcrlImpl.h        
>  ToGprotoIdle/ToGprotoIdleImpl.h
>         GcfgToGtr/GcfgToGtrIntf.h    GtrToGcrl/GtrToGcrlIntf.h        
>  ToGprotoIdle/ToGprotoIdleIntf.h
>         GcrfToGlac/GcrfToGlacImpl.h  GtrToGlac/GtrToGlacImpl.h        
>  ToGprotoNull/ToGprotoNullImpl.h
>         GcrfToGlac/GcrfToGlacIntf.h  GtrToGlac/GtrToGlacIntf.h        
>  ToGprotoNull/ToGprotoNullIntf.h
>         GcrfToGrf/GcrfToGrfImpl.h    GtrToGmsg/GtrToGmsgImpl.h        
>  ToGprotoReady/ToGprotoReadyImpl.h
>         GcrfToGrf/GcrfToGrfIntf.h    GtrToGmsg/GtrToGmsgIntf.h        
>  ToGprotoReady/ToGprotoReadyIntf.h
>         GcrfToGtr/GcrfToGtrImpl.h    GtrToGtlr/GtrToGtlrImpl.h        
>  ToTLP/ToTLPImpl.h
>         GcrfToGtr/GcrfToGtrIntf.h    GtrToGtlr/GtrToGtlrIntf.h        
>  ToTLP/ToTLPIntf.h
>         GcrlToGrl/GcrlToGrlImpl.h    MasterToSub/MasterToSubImpl.h    
>  ToTTL/ToTTLImpl.h
>         GcrlToGrl/GcrlToGrlIntf.h    MasterToSub/MasterToSubIntf.h    
>  ToTTL/ToTTLIntf.h
>         GcrlToGtr/GcrlToGtrImpl.h    MonitorToSupv/MonitorToSupvImpl.h
>  VldToProc/VldToProcImpl.h
>         GcrlToGtr/GcrlToGtrIntf.h    MonitorToSupv/MonitorToSupvIntf.h
>  VldToProc/VldToProcIntf.h
>         GfgToGcfg/GfgToGcfgImpl.h    ProcToVld/ProcToVldImpl.h        
>  VldToSfd/VldToSfdImpl.h
>         GfgToGcfg/GfgToGcfgIntf.h    ProcToVld/ProcToVldIntf.h        
>  VldToSfd/VldToSfdIntf.h
>     )             
> 
> -- 
> Ing. Gabriele Greco, DARTS Engineering
> Tel: +39-0105761240  Fax: +39-0105760224
> s-mail: Via G.T. Invrea 14 - 16129 GENOVA (ITALY)


configure_file(... COPYONLY) does exactly that. If the source is
modified, CMake is automatically re-run and the file will be copied
again. Creating such a macro is fine (actually, it would be better if it
was a function, though), but then instead of using the
add_custom_command work-around, simply call configure_file. No need for
the custom target and dependencies.

Michael


More information about the CMake mailing list