[CMake] Generating include files

Michael Ellery mellery451 at gmail.com
Fri May 19 16:36:33 EDT 2017


> On May 19, 2017, at 1:00 PM, Urs Thuermann <urs at isnogud.escape.de> wrote:
> 
> How can I write a CMakeFile that will include a generated source file
> into another C source?  I have read the FAQ, searched the mailing list
> archives and have tried for two hours without success.
> 
> With standard make this would be quite simple:
> 
> 	$ cat Makefile
> 	foo: foo.o
> 	
> 	foo.o: tab.c
> 	
> 	tab.c:
> 		awk -f mktab > $@
> 	$ cat foo.c
> 	#include "tab.c"
> 	
> 	int main() { return tab[0]; }
> 	$ cat mktab
> 	#!/usr/bin/awk
> 	
> 	BEGIN{ print "static int tab[] = { 0, 1, 2 };"; exit }
> 	$ make
> 	awk -f mktab > tab.c
> 	cc    -c -o foo.o foo.c
> 	cc   foo.o   -o foo
> 	$ 
> 
> How would I do this with cmake?
> 
> urs
>> 

if your source can be generated by simple substitution of variable values (like a template file), then configure_file() will do the trick. If the process to create the file is more complex, then add_custom_command() with an appropriate OUTPUT specification is probably what you want, something like:

add_custom_command(OUTPUT tab.c  COMMAND "awk -f mktab > tab.c")

If you don’t like where the files are generated, you can tweak WORKING_DIR and/or use full-paths to the file(s).

You will need to make sure that some other target explicitly depends on tab.c (or whatever you name the output) to cause this custom rule to be executed.

-Mike




More information about the CMake mailing list