kiwix-desktop/scripts/pkg-config-wrapper.py
Matthieu Gautier 55b058d10e Fix static linking on Windows
On Windows, static libraries are using "foo.lib" naming.
On Unix, they are in the form of "libfoo.a"
On Windows, "foo.lib" can also the definition of symbols in a foo.dll.
So you can link to "foo.lib", whatever you are doing static or dynamic linking and you are good.
However, meson is always creating static library as "libfoo.a"
'to avoid a potential name clash with shared libraries which also generate import libraries with a lib suffix.' [1]
On top of that, qmake is replacing all `-lfoo` in LIBS by `foo.lib` (on Windows).
So at the end, we try to link with `foo.lib` but we have `libfoo.a`
Solution could be :
- Rename `libfoo.a` to `foo.lib`, but it would mean modify deps libraries on the FS
- Don't use LIBS and directly set QMAKE_LFLAGS but we would have to handle different command line option format
  between g++/clang and msvc
- Update meson build system of each projet to explicitly set the library naming.
- Replace `-lfoo` with absolute path to static library. This is what meson is doing internally and what
  we are doing here

Any `-lfoo` is replace with absolute path to static library (`libfoo.a`) if we found one.
Else, it is keep unchanged.

[1] https://mesonbuild.com/Reference-manual_functions.html#library_name_suffix
2024-08-22 10:53:33 +02:00

59 lines
2.3 KiB
Python

#!/usr/bin/env python
# On Windows, static libraries are using "foo.lib" naming.
# On Unix, they are in the form of "libfoo.a"
# On Windows, "foo.lib" can also the definition of symbols in a foo.dll.
# So you can link to "foo.lib", whatever you are doing static or dynamic linking and you are good.
# However, meson is always creating static library as "libfoo.a"
# 'to avoid a potential name clash with shared libraries which also generate import libraries with a lib suffix.' [1]
# On top of that, qmake is replacing all `-lfoo` in LIBS by `foo.lib` (on Windows).
# So at the end, we try to link with `foo.lib` but we have `libfoo.a`
# Solution could be :
# - Rename `libfoo.a` to `foo.lib`, but it would mean modify deps libraries on the FS
# - Don't use LIBS and direction set QMAKE_LFLAGS but we would have to handle different command line option format
# between g++/clang and msvc
# - Update meson build system of each projet to explicitly set the library naming.
# - Replace `-lfoo` with absolute path to static library. This is what meson is doing internally and what
# we are doing here
#
# Any `-lfoo` is replace with absolute path to static library (`libfoo.a`) if we found one.
# Else, it is keep unchanged.
#
# [1] https://mesonbuild.com/Reference-manual_functions.html#library_name_suffix
import sys, subprocess
from pathlib import Path
def forward_to_pkg_config():
completeProcess = subprocess.run(["pkg-config", *sys.argv[1:]], capture_output=True, check=True, text=True)
return completeProcess.stdout
def search_static_lib(lib_name, search_pathes):
for path in search_pathes:
lib_path = path/f"lib{lib_name}.a"
if lib_path.exists():
return f"lib{lib_name}.a"
return None
def replace_static_lib(pkg_output):
search_pathes = []
for option in pkg_output.split():
if option.startswith("-L"):
search_pathes.append(Path(option[2:]))
yield option
if option.startswith("-l"):
static_lib = search_static_lib(option[2:], search_pathes)
if static_lib:
yield static_lib
else:
yield option
if __name__ == "__main__":
pkg_output = forward_to_pkg_config()
print(" ".join(replace_static_lib(pkg_output)))