-
Notifications
You must be signed in to change notification settings - Fork 881
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Use CMAKE_INSTALL_FULL_LIBDIR, CMAKE_INSTALL_FULL_INCLUDEDIR #1124
base: c_master
Are you sure you want to change the base?
Conversation
Do not roll our own path contatenation, let's use GNUInstallDirs macros to do the work.
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.
@redboltz |
I agree with @otegami concerns. This patch seems to work fine. but does not account in the possibility to let the users override Can we integrate https://github.com/jtojnar/cmake-snips/blob/master/CMakeScripts/JoinPaths.cmake into this build? (It is MIT-licensed)? |
I believe I have already done so in the following section: Lines 33 to 42 in a5c8a2c
However, I think the issue lies in the following section. These header files are being installed without respecting our specified Lines 273 to 280 in a5c8a2c
|
I tried to fix the above problem at this PR #1125. |
I'll check if the problem is fixed, unless we need to simplify the code (which might be difficult if we want to keep both relative/absolute names and prefix setting in the pkg-config file), we might not need/want this change anymore. |
I was tracking a branch before this commit |
New knowledge. This bug is not fixed in msgpack_c-6.0.2 When I patch msgpack-c using this patch, i no longer get the bug tracked here: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=279615 I do however still encounter knock on issues. Because of how msgpack-c resolves these paths, compiling binutils leads to the compile command:
The relevant part of this command line is:
This empty include path argument consumes the following |
Do not roll our own path contatenation, let's use
GNUInstallDirs macros to do the work.