<div dir="ltr"><div class="gmail_default" style="font-family:'courier new',monospace">Background:  I'm converting an existing project from a custom build process which uses BSD Make to CMake.  The source for the project is contained in about 600 directories, and has about a dozen libraries and maybe a hundred executables.  The old build system (make) has to continue working until the new CMake-based system is fully operational and tested.  For the most part, this has been straight forward and easy, since make is building in source using in-source Makefiles.  I've simply added a CMakeLists.txt file to each directory, and the actual CMake build occurs out-of-source.  It's only the edge cases (of course!) which have given me a headache.  I've solved some of them.  This message is about one I have not yet been able to solve.</div><div class="gmail_default" style="font-family:'courier new',monospace"><br></div><div class="gmail_default" style="font-family:'courier new',monospace">The basic problem is this:  my executables cannot find the header files for some of the libraries, because they are in a subdirectory when installed, but are not in a subdirectory while in source.</div><div class="gmail_default" style="font-family:'courier new',monospace"><br></div><div class="gmail_default" style="font-family:'courier new',monospace">Here's a simplified example (SSCCE) which reproduces this problem.</div><div class="gmail_default" style="font-family:'courier new',monospace"><br></div><div class="gmail_default" style="font-family:'courier new',monospace">The file structure:</div><div class="gmail_default" style="font-family:'courier new',monospace"><div class="gmail_default">.</div><div class="gmail_default">|-- bin/</div><div class="gmail_default">|-- include/</div><div class="gmail_default">|   `-- mylib/</div><div class="gmail_default">|-- lib/</div><div class="gmail_default">`-- src/</div><div class="gmail_default">    |-- CMakeLists.txt</div><div class="gmail_default">    |-- mylib/</div><div class="gmail_default">    |   |-- CMakeLists.txt</div><div class="gmail_default">    |   |-- myfunc.cpp</div><div class="gmail_default">    |   `-- myfunc.h</div><div class="gmail_default">    `-- prog/</div><div class="gmail_default">        |-- CMakeLists.txt</div><div class="gmail_default">        `-- prog.cpp</div><div class="gmail_default"><br></div><div class="gmail_default">The top-level bin, include and lib directories are the install locations, exactly parallel to standard Unix locations.  Note that file myfunc.h installs into ./include/mylib.  Note also that prog.cpp includes this header via #include "myfunc.h".</div><div class="gmail_default"><br></div><div class="gmail_default">Here are the current CMakeLists.txt files.</div><div class="gmail_default"><br></div><div class="gmail_default">Top level (../src):</div><div class="gmail_default"><div class="gmail_default">cmake_minimum_required(VERSION 2.8.4)</div><div class="gmail_default">project(src)</div><div class="gmail_default">add_subdirectory(mylib)<br></div><div class="gmail_default">add_subdirectory(prog)</div><div class="gmail_default"><br></div><div class="gmail_default">mylib:</div></div><div class="gmail_default"><div class="gmail_default">cmake_minimum_required(VERSION 2.8.4)</div><div class="gmail_default">project(mylib)</div><div class="gmail_default"><br></div><div class="gmail_default">set(CPP_SOURCE myfunc.cpp)</div><div class="gmail_default">set(HEADERS myfunc.h)</div><div class="gmail_default"><br></div><div class="gmail_default">add_library(mylib  ${CPP_SOURCE} )</div><div class="gmail_default"><br></div><div class="gmail_default">target_include_directories(</div><div class="gmail_default">    mylib PUBLIC</div><div class="gmail_default">    # Headers used from source/build location:</div><div class="gmail_default">    "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>"</div><div class="gmail_default">    # Headers used from the installed location:</div><div class="gmail_default">    "$<INSTALL_INTERFACE:include>"</div><div class="gmail_default">)</div><div class="gmail_default"><br></div><div class="gmail_default">install(TARGETS mylib DESTINATION lib)</div><div class="gmail_default">install(FILES ${HEADERS} DESTINATION include/mylib)</div><div class="gmail_default"><br></div><div class="gmail_default">prog:</div><div class="gmail_default"><div class="gmail_default">cmake_minimum_required(VERSION 2.8.4)</div><div class="gmail_default">project(prog)</div><div class="gmail_default"><br></div><div class="gmail_default">set(SOURCE_FILES prog.cpp)</div><div class="gmail_default"><br></div><div class="gmail_default">set(LIBS mylib)</div><div class="gmail_default"><br></div><div class="gmail_default">add_executable(prog ${SOURCE_FILES})</div><div class="gmail_default">target_link_libraries(prog  ${LIBS})</div><div class="gmail_default">install(TARGETS prog DESTINATION bin)</div><div class="gmail_default"><br></div><div class="gmail_default">When I build, I get this error:</div><div class="gmail_default"><br></div><div class="gmail_default"><div class="gmail_default">src/.build$ make install</div><div class="gmail_default">-- Configuring done</div><div class="gmail_default">-- Generating done</div><div class="gmail_default">-- Build files have been written to: /sandbox/src/.build</div><div class="gmail_default">Scanning dependencies of target mylib</div><div class="gmail_default">[ 50%] Building CXX object mylib/CMakeFiles/mylib.dir/myfunc.cpp.o</div><div class="gmail_default">Linking CXX static library libmylib.a</div><div class="gmail_default">[ 50%] Built target mylib</div><div class="gmail_default">Scanning dependencies of target prog</div><div class="gmail_default">[100%] Building CXX object prog/CMakeFiles/prog.dir/prog.cpp.o</div><div class="gmail_default">/sandbox/src/prog/prog.cpp:1:10: fatal error: 'mylib/myfunc.h'</div><div class="gmail_default">      file not found</div><div class="gmail_default">#include "mylib/myfunc.h"</div><div class="gmail_default">         ^</div><div class="gmail_default">1 error generated.</div><div class="gmail_default">make[2]: *** [prog/CMakeFiles/prog.dir/prog.cpp.o] Error 1</div><div class="gmail_default">make[1]: *** [prog/CMakeFiles/prog.dir/all] Error 2</div><div class="gmail_default">make: *** [all] Error 2</div></div></div></div><div class="gmail_default"><br></div><div class="gmail_default"><br></div><div class="gmail_default">How can I create CMake rules that will allow me to work around this?  </div><div class="gmail_default"><br></div><div class="gmail_default">As I mentioned above, the existing make-based build has to continue working, so I cannot change the #include statement to remove the subdirectory path.</div><div class="gmail_default"><br></div><div class="gmail_default">..chris</div></div></div>