Search code examples
c++c++11buildcmakecustom-build-step

Add custom build step in CMake


I'm trying to add a custom build step in CMake that generates some files. I haven't found a description how it works.

I have an project where source, header & implementation files have to be generated by ODB for C++. ODB takes class headers as arguments and generates source files that I want to use in my project.

Right now I have the following command in my CMakeLists.txt:

add_custom_command(TARGET ${PROJECT_NAME}
    PRE_BUILD
    COMMAND odb -o /home/david/dev/ --std c++11 -I/home/david/dev/ -d sqlite --generate-    query --generate-schema ${PROMOTER_LIB_PREFIX}/entities/person.hpp
    DEPENDS ${PROJECT_NAME}
    VERBATIM
)

For a file person.hpp ODB should generate person-odb.hxx, person-odb.cxx, person-odb.ixx but the CMake command I''ve used doesn't generate anything. In a terminal this command works fine.

What am I doing wrong?

EDIT: The problem can be solved by adding the following lines:

set(FAKE_TARGET fakeTarget)
add_custom_target(fakeTarget
    odb -o /home/david/dev/ --std c++11 -I/home/david/dev/ -d sqlite --generate-query --generate-schema ${PROMOTER_LIB_PREFIX}/entities/person.hpp
)
add_dependencies(${PROJECT_NAME} ${FAKE_TARGET})

Solution

  • For me, with something similar, I just use :

    add_custom_command(TARGET ${PROJECT_NAME}
        PRE_BUILD
        COMMAND odb -o /home/david/dev/ --std c++11 -I/home/david/dev/ -d sqlite --generate-    query --generate-schema ${PROMOTER_LIB_PREFIX}/entities/person.hpp
    )
    

    We don't use DEPENDS or VERBATIM.

    The DEPENDS option specify that the command must be executed only after that the project you gave to this option is built.

    EDIT :

    Note that the PRE_BUILD option is only supported on Visual Studio 7 or later. For all other generators PRE_BUILD will be treated as PRE_LINK.

    Maybe that's why it doesn't work for you.

    A work around could be (a bit ugly) :

    • Create a fake project
    • Add your custom command on it as POST_BUILD
    • Make you current project dependent on the fake one