From 4e027b72de6e5a7f216482bdeea1ddabe53474cf Mon Sep 17 00:00:00 2001 From: otegami Date: Fri, 26 Apr 2024 21:29:47 +0800 Subject: [PATCH] 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. --- CMakeLists.txt | 12 ++++++++++-- msgpack-c.pc.in | 4 ++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 14b6d2219..03d76d8b8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,8 +30,16 @@ LIST (APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/") include(GNUInstallDirs) SET (prefix ${CMAKE_INSTALL_PREFIX}) SET (exec_prefix ${CMAKE_INSTALL_PREFIX}) -SET (libdir ${CMAKE_INSTALL_LIBDIR}) -SET (includedir ${CMAKE_INSTALL_INCLUDEDIR}) +IF (IS_ABSOLUTE ${CMAKE_INSTALL_LIBDIR}) + SET (libdir ${CMAKE_INSTALL_LIBDIR}) +ELSE () + SET (libdir "\${prefix}/${CMAKE_INSTALL_LIBDIR}") +ENDIF () +IF (IS_ABSOLUTE ${CMAKE_INSTALL_INCLUDEDIR}) + SET (includedir ${CMAKE_INSTALL_INCLUDEDIR}) +ELSE () + SET (includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}") +ENDIF () OPTION (MSGPACK_32BIT "32bit compile" OFF) diff --git a/msgpack-c.pc.in b/msgpack-c.pc.in index 14806b7b4..208066252 100644 --- a/msgpack-c.pc.in +++ b/msgpack-c.pc.in @@ -1,7 +1,7 @@ prefix=@prefix@ exec_prefix=@exec_prefix@ -libdir=${prefix}/@libdir@ -includedir=${prefix}/@includedir@ +libdir=@libdir@ +includedir=@includedir@ Name: MessagePack Description: Binary-based efficient object serialization library