From 68cc50a3de991e5b534ac628b7f9d1a0475e5bfc Mon Sep 17 00:00:00 2001 From: otegami Date: Wed, 24 Apr 2024 23:30:23 +0800 Subject: [PATCH] Support relative path for CMAKE_INSTALL_*DIR When `CMAKE_INSTALL_LIBDIR` and `CMAKE_INSTALL_INCLUDEDIR` are set to relative 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. Build and install `msgpack-c`. ```console % git switch -c c_master % cmake -S . -B ../msgpack-c.build -DCMAKE_INSTALL_PREFIX=/tmp/local -DCMAKE_INSTALL_LIBDIR=lib-relative -DCMAKE_INSTALL_INCLUDEDIR=include-relative % cmake --build ../msgpack-c.build % 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=/usr/local/lib-relative/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 ``` Successly compile `example/simple_c.c` using install msgpack-c. We can execute `simple_c.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"] ``` The generated `msgpack-c.pc` file does not handle relative 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 relative to the current directory, leading to incorrect paths. ```console cat ../msgpack-c.build/msgpack-c.pc prefix=/tmp/local exec_prefix=/tmp/local libdir=lib-relative includedir=include-relative Name: MessagePack Description: Binary-based efficient object serialization library Version: 6.0.1 Libs: -L${libdir} -lmsgpack-c Cflags: -I${includedir} ``` Modify the `msgpack-c.pc.in` file to ensure that `libdir` and `includedir` use absolute paths by prefixing them with ${prefix}/. This change addresses the issue by providing correct paths to the compiler and linker. --- msgpack-c.pc.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/msgpack-c.pc.in b/msgpack-c.pc.in index 20806625..14806b7b 100644 --- a/msgpack-c.pc.in +++ b/msgpack-c.pc.in @@ -1,7 +1,7 @@ prefix=@prefix@ exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ +libdir=${prefix}/@libdir@ +includedir=${prefix}/@includedir@ Name: MessagePack Description: Binary-based efficient object serialization library