Craig Scott <craig.sc...@crascit.com> writes: > A bit of a long-shot, have you tried generating the file with the extension > .h instead of .c? That might allow it to be picked up by the dependency > scanner (I don't know if it treats file extensions differently). Also, the > add_custom_command(OUTPUT...) call needs to be in the same > CMakeLists.txt
No, I have tried that before in several variations, and nothing worked. For exmaple: $ cat simple/mktab #!/usr/bin/awk BEGIN{ print "static int tab[] = { 0, 1, 2 };"; exit } $ cat simple/foo.c #include "tab.h" int main() { return tab[0]; } $ cat simple/CMakeLists.txt cmake_minimum_required(VERSION 3.0) project(simple) add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/tab.h COMMAND "mktab > ${CMAKE_BINARY_DIR}/tab.h" ) include_directories(${CMAKE_BINARY_DIR}) add_executable(foo foo.c) $ mkdir simple-build $ cd simple-build $ cmake ../simple -- The C compiler identification is GNU 4.9.2 -- The CXX compiler identification is GNU 4.9.2 -- Check for working C compiler: /usr/bin/cc -- Check for working C compiler: /usr/bin/cc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working CXX compiler: /usr/bin/c++ -- Check for working CXX compiler: /usr/bin/c++ -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Configuring done -- Generating done -- Build files have been written to: /home/urs/playground/cmake/simple-build $ make Scanning dependencies of target foo [100%] Building C object CMakeFiles/foo.dir/foo.c.o /home/urs/playground/cmake/simple/foo.c:1:17: fatal error: tab.h: No such file or directory #include "tab.h" ^ compilation terminated. CMakeFiles/foo.dir/build.make:54: recipe for target 'CMakeFiles/foo.dir/foo.c.o' failed make[2]: *** [CMakeFiles/foo.dir/foo.c.o] Error 1 CMakeFiles/Makefile2:60: recipe for target 'CMakeFiles/foo.dir/all' failed make[1]: *** [CMakeFiles/foo.dir/all] Error 2 Makefile:76: recipe for target 'all' failed make: *** [all] Error 2 $ make tab.h make: *** No rule to make target 'tab.h'. Stop. The call to make seems to show that cmake does not even try to generate tab.h and the next command shows that it also does not know how to generate it, if it would try. How does cmake scan for dependencies of target foo? Using gcc -MM would fail and gcc -MM -MG would yield the correct dependency: $ cc -MG ../simple/foo.c cc1: error: to generate dependencies you must specify either -M or -MM cc1: error: -MG may only be used with -M or -MM $ cc -MM -MG ../simple/foo.c foo.o: ../simple/foo.c tab.h > I wrote an article on working with generated sources > <https://crascit.com/2017/04/18/generated-sources-in-cmake-builds/> > recently which covers some of these details, maybe it contains some useful > info for you. Hm, it's the same info I've already found in other places. Unfortunately, I still don't see a way to generate a source file that should be #include'd instead of linked into an executable. urs -- Powered by www.kitware.com Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Kitware offers various services to support the CMake community. For more information on each offering, please visit: CMake Support: http://cmake.org/cmake/help/support.html CMake Consulting: http://cmake.org/cmake/help/consulting.html CMake Training Courses: http://cmake.org/cmake/help/training.html Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Follow this link to subscribe/unsubscribe: http://public.kitware.com/mailman/listinfo/cmake