Issue
I have a cmake build in which I'm searching for a bunch of dependencies, i.e. I have many instances of:
FIND_PACKAGE(SomePackage)
if(SOMEPACKAGE_FOUND)
include_directories(${SOMEPACKAGE_INCLUDE_DIR})
link_libraries(${SOMEPACKAGE_LIBRARIES})
endif(SOMEPACKAGE_FOUND)
Now, I want to add a custom command to build a precompiled header file, but to do this I need to know all of the paths added by my include_directories
calls. How can I get a list of these directories (preferably with the proper -I/path/to/directory format) so that I can add them to my custom command?
Solution
You can use the get_property command to retrieve the value of the directory property
INCLUDE_DIRECTORIES
Something like this:
get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES)
foreach(dir ${dirs})
message(STATUS "dir='${dir}'")
endforeach()
The value of this directory property only tracks the include_directories commands that have occurred previously in the same CMakeLists file, or that have been inherited from previous occurrences in a parent CMakeLists file. If your find_package and include_directories commands are scattered about throughout many subdirectories, this becomes a challenging issue.
If you get to that point, you may consider overriding the include_directories command with your own function or macro and track the values passed to it yourself. Or, simply accumulate them in a global property or an internal cache variable alongside each call to include_directories.
See the documentation here:
https://cmake.org/cmake/help/latest/command/get_property.html
https://cmake.org/cmake/help/latest/prop_dir/INCLUDE_DIRECTORIES.html
Answered By - DLRdave Answer Checked By - Clifford M. (WPSolving Volunteer)