I'm trying to use GenerateExportHeader module from cmake.
part of my CmakeLists.txt:
add_compiler_export_flags()
add_library(gui SHARED ${gui_CPP} ${gui_HPP})
generate_export_header(gui)
it works nice for gui project itself, but when I try to include gui's .h files in another project, an #include "gui_export.h" cannot be find.
This is obvious as gui_export.h was created in gui's build dir which is not in include path of other projects.
The simple solution would be to add gui's build dir to other project's includes but:
1. I don't find it as a kosher solution
2. I could not actually even find how to find out what is the build dir of a target
how can I solve this problem well?
With modern (i.e. 2.8.11 or later) CMake, the preferred mechanism is:
target_include_directories(gui PUBLIC ${CMAKE_BINARY_DIR}/exports)
Then when you export() your library (which you should do!) or otherwise use it in a context where the target interface properties are known (e.g. in the same overall CMake project, which seems to be what you are doing), target_link_libraries(foo gui) will also pick up the necessary include directory.
Putting it in a well known directory is somewhat orthogonal. In either case, it is recommended to use target_include_directories to tell consumers where to find your library's headers.
I've solved this problem by using EXPORT_FILE_NAME, so now I have:
generate_export_header(gui EXPORT_FILE_NAME ${CMAKE_BINARY_DIR}/exports/gui_export.h)
and in all projects I add ${CMAKE_BINARY_DIR}/exports/ to includes
Use export() to allow CMake to find your build tree. You can take a look at openobex on gitorious to see how the config.cmake file has to look like.
OTOH, you should not use that generated export header in your public header or install it.