Using Dynamically Generated Header Files with CMake

Sometimes it can be useful to dynamically generate header files and include them from a C source file. However, it can be a little difficult getting CMake to recognize when to generate the files and when to recompile the source files that include those headers. What follows is a method to do this.

Telling CMake to Generate the Header File

To generate the header file we need to create a custom_command which will run the command to generate the header file, when the file it is based on has changed. The following shows how to use the hypothetical generatewordlistheader command to create wordlist.h everytime wordlist.txt changes.

add_custom_command(
    PRE_BUILD
    OUTPUT wordlist.h
    COMMAND generatewordlistheader wordlist.txt wordlist.h
    DEPENDS wordlist.txt
)

Telling CMake When to Recompile

Next we need to tell CMake to recompile any source files which include the generated header file, when the header file has changed. To do this we create a statically linked library, here called poet, that relies on the source files that include the header and the header itself.

add_library(poet STATIC poet.c ${MyApp_SOURCE_DIR}/src/wordlist.h)

Finally we need to ensure that the statically generated library above is linked into the application.

target_link_libraries(myapp poet)

Full example

Using a fictional project called MyApp we can see how this is put together.

cmake_minimum_required(VERSION 2.6)
project(MyApp)
add_executable(myapp myapp.c)

add_custom_command(
    PRE_BUILD
    OUTPUT wordlist.h
    COMMAND generatewordlistheader wordlist.txt wordlist.h
    DEPENDS wordlist.txt
)

add_library(poet STATIC poet.c ${MyApp_SOURCE_DIR}/src/wordlist.h)

target_link_libraries(myapp poet)

Conclusion

This isn't perfect but it does work. Unfortunately CMake is an ugly, but very useful tool. I'm sure there is a better way to do this and if anyone can think of a way, please leave a comment or email me. Until then, this achieves what I and a number of other people have been trying to do.

Creative Commons License
Using Dynamically Generated Header Files with CMake by Lawrence Woodman is licensed under a Creative Commons Attribution 4.0 International License.

Share This Post

Feedback/Discuss

Sign up to get new articles straight to your inbox.

Delivered by FeedBurner

Related Articles

Programming in Assembly with VICMON on the VIC-20

VICMON is a machine language monitor released by Commodore in 1982 and is great for programming the VIC-20. Its interactive nature means that it can often be quicker to develop via this rather than us...   Read More

Storing Machine Code in REM Statements on the VIC-20

BASIC programs often contain machine code routines but they take up quite a lot of space in BASIC. An interesting way to reduce the amount of space that they take is to store the machine code in REM s...   Read More

Visualizing Zero Page on the Commodore VIC-20

The VIC-20 is a very flexible little machine and allows us to choose which area of memory represents the screen map. One interesting thing we can do is use this to visualize a section of memory such ...   Read More

Code and Data in Display Memory on the VIC-20

The unexpanded Commodore VIC-20 only had 5K of RAM and therefore creative ways had to be found to maximize the available RAM. The display memory would use some of this memory and therefore one option ...   Read More

Double-Width C64 Style Font on the Commodore VIC-20

The C64 used a fatter double-width font because the video quality of early VIC-IIs wasn't very good. Therefore they had to make the C64's font fatter than the VIC-20's. However, this fatter font look...   Read More