Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Support absolute path for CMAKE_INSTALL_*DIR
Issue When `CMAKE_INSTALL_LIBDIR` and `CMAKE_INSTALL_INCLUDEDIR` are set to absolute paths, the `msgpack-c.pc` file generated by CMake improperly configures `libdir` and `includedir`. This leads to incorrect paths that prevent the compiler from locating necessary header and library files. How to reproduce Build and install `msgpack-c`. ```console % cmake -S . -B ../msgpack-c.build -DCMAKE_INSTALL_LIBDIR=/tmp/local/lib -DCMAKE_INSTALL_INCLUDEDIR=/tmp/local/include % cmake --build ../msgpack-c.build % sudo cmake --install ../msgpack-c.build ``` Compile `example/simple_c.c` using installed msgpack-c. The following error happens because the linker cannot find paths provided by pkg-config. ```console % export PKG_CONFIG_PATH=/tmp/local/lib/pkgconfig:$PKG_CONFIG_PATH % gcc -o simple_c example/simple_c.c $(pkg-config --cflags --libs msgpack-c) /usr/bin/ld: cannot find -lmsgpack-c: No such file or directory collect2: error: ld returned 1 exit status ``` Expected Successfully compile `example/simple_c.c` using installed msgpack-c. We can execute `simple_c` like the following. ```console % gcc -o simple_c example/simple_c.c $(pkg-config --cflags --libs msgpack-c) % ./simple_c 93 01 c3 a7 65 78 61 6d 70 6c 65 [1, true, "example"] ``` Explain the problem in detail The generated `msgpack-c.pc` file does not handle absolute paths correctly. Here is the result of the incorrect configuration in `How to reproduce` section. In the following `msgpack-c.pc` file, `libdir` and `includedir` are showing unrecognized paths, leading to incorrect paths. ```console % cat /tmp/local/lib/pkgconfig/msgpack-c.pc prefix=/usr/local exec_prefix=/usr/local libdir=${prefix}//tmp/local/lib <- Here the path is wrong. We expected `/tmp/local/lib` includedir=${prefix}//tmp/local/include <- Here the path is wrong. We expected `/tmp/local/include` Name: MessagePack Description: Binary-based efficient object serialization library Version: 6.0.1 Libs: -L${libdir} -lmsgpack-c Cflags: -I${includedir} ``` Solution Modify the `CMakeLists.txt` file to ensure that `libdir` and `includedir` use absolute paths. This change addresses the issue by providing correct paths to the compiler and linker.
- Loading branch information
4e027b7
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I have question here - are there cases when
CMAKE_INSTALL_LIBDIR
are absolute already? In any case, would usingCMAKE_INSTALL_FULL_LIBDIR
andCMAKE_INSTALL_INCLUDE_DIR
help? https://cmake.org/cmake/help/v3.11/module/GNUInstallDirs.html(FreeBSD has a downstream bug about this at https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=279615)
4e027b7
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@otegami, Could you answear the question?
4e027b7
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm so sorry I'm late. Sure!
In this change, I have made changes to the generated
pkg-config
file to support absolute path; however, we still face issues using absolute paths forCMAKE_INSTALL_INCLUDEDIR
. Although the absolute paths forCMAKE_INSTALL_LIBDIR
work fine, the header files are still installed in unexpected locations when we use absolute paths forCMAKE_INSTALL_INCLUDEDIR
like the following. Addressing this issue should be our next step.Below are the details of the commands used and the outcomes observed:
I have a sample problem with your case. So I'm trying to support an absolute path now.
I didn't use the
CMAKE_INSTALL_FULL_*
based on the following tips.The Apache Arrow project also supports it in this way.
4e027b7
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think one "snip" above is the better solution: https://github.com/jtojnar/cmake-snips?tab=readme-ov-file#assuming-cmake_install_dir-is-relative-path
Also there should be no need to set the default paths like this:
We have already
GNUInstallDirs
included, maybe we should use it?4e027b7
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I have opened #1124 to discuss this further. For example let's clarify what is special about macos there.
4e027b7
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sorry, I was wrong. We should follow the advice from https://github.com/jtojnar/cmake-snips?tab=readme-ov-file#concatenating-paths-when-building-pkg-config-files as well