Skip to content
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

Support relative path for CMAKE_INSTALL_*DIR #1119

Merged

Conversation

otegami
Copy link

@otegami otegami commented Apr 25, 2024

Problem

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.

How to reproduce

Build and install msgpack-c.

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

% 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

Expected

Successly compile example/simple_c.c using install 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 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.

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

Solution

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.

@redboltz
Copy link
Contributor

Thank you for sending the PR. It seems that the CI reports errors.
They are unrelated to your fix. In this case, I usually ask the PR creater to fix it. However, this case is a little bit complecated.
So I will fix it. After I would fix it, please rebase your PR from the updated c_master.

@redboltz
Copy link
Contributor

Fixed by #1120 , please rebase the PR.

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.
@otegami otegami force-pushed the support-relative-path-for-pkg-config branch from 699cfa7 to 68cc50a Compare April 26, 2024 04:21
@otegami
Copy link
Author

otegami commented Apr 26, 2024

@redboltz Thank you so much for addressing it. I've just rebased it!

@redboltz redboltz merged commit c31fafb into msgpack:c_master Apr 26, 2024
19 checks passed
@otegami otegami deleted the support-relative-path-for-pkg-config branch April 26, 2024 04:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants