Hello,

I'm trying to create a relocatable package configuration file but I'm having a 
hard time with absolute paths that are used during the build.
Note that I use CMake 3.10.0.

First of all for the include path I'm using this:
target_include_directories(MyStaticTarget PUBLIC
                           $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
                           $<INSTALL_INTERFACE:include>)

This does work but according to the doc it should not : 
https://cmake.org/cmake/help/latest/manual/cmake-generator-expressions.7.html?highlight=build_interface#output-expressions
 
<https://cmake.org/cmake/help/latest/manual/cmake-generator-expressions.7.html?highlight=build_interface#output-expressions>
The doc of BUILD_INTERFACE says: "Content of ... when the property is exported 
using export(), or when the target is used by another target in the same 
buildsystem. Expands to the empty string otherwise."
So according to the doc, when compiling the target MyTarget, the include dir I 
gave should not be used. Which seems consistent with the other uses of 
INTERFACE wording in CMake language. But it actually behaves like PUBLIC rather 
than INTERFACE. This is fine to me but inconsistent… :)
When exporting the target, the include dir uses what's given in for 
INSTALL_INTERFACE so it works fine. No problem on that part.


The second point is about libraries to link when using my project. My project 
exports a static library that depends on other libraries. These libraries are 
found (when generating my project through cmake) through calls like 
find_package(OpenGL). This provides a variable that contains an absolute 
non-relocatable path.

I've tried doing things like this:
target_link_libraries(MyStaticTarget PRIVATE
                      $<BUILD_INTERFACE:${OpenGL_absolute_path}>
                      $<INSTALL_INTERFACE:${OpenGL_relocatable_link_flag}>)

According to https://cmake.org/pipermail/cmake/2016-May/063400.html 
<https://cmake.org/pipermail/cmake/2016-May/063400.html>, for static libraries, 
PRIVATE link dependencies become "PUBLIC", which is ok. And I could see that 
the link flag for this "private" dependency got exported in the generated 
config. But the problem is that whatever I put for INSTALL_INTERFACE, it is 
ignored and not written to the generated cmake config file. The generated CMake 
config file just takes into account what I put for BUILD_INTERFACE. Contrary to 
what happened with include directories. And I don't want to use only 
${OpenGL_relocatable_link_flag} because MyStaticTarget can be configured to be 
a dynamic library, in which case the library is really used during link and 
really want to link against the exact library that's referenced.

How can I have ${OpenGL_relocatable_link_flag} be used in the generated cmake 
config file?
Any other solution that would make the generated config relocatable is also 
fine.

Best regards,
Lucas 
-- 

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:
https://cmake.org/mailman/listinfo/cmake

Reply via email to