msgpack / msgpack-c

MessagePack implementation for C and C++ / msgpack.org[C/C++]
Other
3.03k stars 883 forks source link

Support absolute path for CMAKE_INSTALL_*DIR #1121

Closed otegami closed 6 months ago

otegami commented 6 months ago

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.

% 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.

% 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.

% 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.

% 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 commented 6 months ago

It looks good to me. cmake is pretty difficult for me ;)

otegami commented 6 months ago

Thank you for addressing it and maintaining this useful library. I really appreciate your reviews every time :pray: