8

I'd like to do something like add_custom_command, with the output file name as a target in the generated makefile. Is there an elegant way of doing this?

All the examples I've seen (such as the CMake FAQ re: latex) use add_custom_command to tell how to generate the desired output file, and then add_custom_target to create a target. For example.:

add_executable (hello hello.c)
add_custom_command(OUTPUT hello.bin
                   COMMAND objcopy --output-format=binary hello hello.bin
                   DEPENDS hello
                   COMMENT "objcopying hello to hello.bin")
add_custom_target(bin ALL DEPENDS hello.bin)

However, the target name in the generated makefile is then bin rather than hello.bin. Is there a way to make hello.bin itself a target in the generated makefile?

Some solutions I've tried that don't work:

  • Changing to: add_custom_target(hello.bin ALL DEPENDS hello.bin) results in a circular dependency in the makefile.

1 Answer 1

4

You could do it by generating your hello.bin as a side effect of a target. Instead of generating hello.bin from objcopy, you generate hello.tmp. Then as a side effect you also copy hello.tmp to hello.bin. Finally, you create the phony target hello.bin that depends on your hello.tmp. In code:

add_executable (hello hello.c)
add_custom_command(OUTPUT hello.tmp
                   COMMAND objcopy --output-format=binary hello hello.tmp
                   COMMAND ${CMAKE_COMMAND} -E copy hello.tmp hello.bin
                   DEPENDS hello
                   COMMENT "objcopying hello to hello.bin")
add_custom_target(hello.bin ALL DEPENDS hello.tmp)

The problem with that is that hello.bin is not cleaned when you run clean. To get that working, add:

set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES hello.bin)
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.