cmake add_custom_command

Use add_custom_command’s to create a file transformation chain

  • *.(cxx|hxx) -> *_(cxx|hxx)_tro
  • *_(cxx|hxx)_tro -> Foo.trx

and make the last transformation an first class entity in cmake by using add_custom_target. By default this target won’t be build, unless you mark it with ALL or let another target that is built depend on it.

set(SOURCES foo.cxx foo.hxx)
add_library(Foo ${SOURCES})

set(trofiles)
foreach(_file ${SOURCES})
  string(REPLACE "." "_" file_tro ${_file})
  set(file_tro "${file_tro}_tro")
  add_custom_command(
    OUTPUT ${file_tro} 
    COMMAND perl ${CMAKE_CURRENT_SOURCE_DIR}/trans.pl ${CMAKE_CURRENT_SOURCE_DIR}/${_file} -o ${file_tro}
    DEPENDS ${_file}
  ) 
  list(APPEND trofiles ${file_tro})
endforeach()
add_custom_command(
  OUTPUT Foo.trx  
  COMMAND perl ${CMAKE_CURRENT_SOURCE_DIR}/combine.pl ${trofiles} -o Foo.trx
  DEPENDS ${trofiles}
)
add_custom_target(do_trofiles DEPENDS Foo.trx)
add_dependencies(Foo do_trofiles)

Leave a Comment