mirror of
https://github.com/kiwix/kiwix-desktop.git
synced 2025-09-22 11:37:56 -04:00
Merge pull request #1184 from kiwix/fix_static_linking
[CI] Compile on Windows
This commit is contained in:
commit
02c7d77025
46
.github/workflows/ci.yml
vendored
46
.github/workflows/ci.yml
vendored
@ -7,6 +7,50 @@ on:
|
||||
- main
|
||||
|
||||
jobs:
|
||||
Windows:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
config:
|
||||
- native_mixed
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup python 3.8
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.8'
|
||||
|
||||
- name: Install packages
|
||||
run: |
|
||||
choco.exe install pkgconfiglite
|
||||
|
||||
- name: Install QT
|
||||
uses: jurplel/install-qt-action@v4
|
||||
with:
|
||||
version: 5.15.2
|
||||
modules: "qtwebengine"
|
||||
setup-python: false
|
||||
|
||||
- name: Setup MSVC compiler
|
||||
uses: bus1/cabuild/action/msdevshell@v1
|
||||
with:
|
||||
architecture: x64
|
||||
|
||||
- name: Install dependencies
|
||||
uses: kiwix/kiwix-build/actions/dl_deps_archive@main
|
||||
with:
|
||||
target_platform: win-x86_64-mixed
|
||||
|
||||
- name: Compile
|
||||
shell: cmd
|
||||
run: |
|
||||
set PKG_CONFIG_PATH=%cd%\BUILD_win-amd64\INSTALL\lib\pkgconfig
|
||||
qmake PREFIX=%cd%\BUILD_win-amd64\INSTALL
|
||||
nmake debug-all
|
||||
|
||||
Linux:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
@ -30,7 +74,7 @@ jobs:
|
||||
target_platform: linux-x86_64-dyn
|
||||
|
||||
- name: Retrieve source code
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Compile source code
|
||||
shell: bash
|
||||
|
@ -193,14 +193,19 @@ unix {
|
||||
INSTALLS += mime_file
|
||||
}
|
||||
|
||||
PKGCONFIG_CFLAGS = $$system(pkg-config --cflags $$PKGCONFIG_OPTION \"kiwix >= 13.0.0 kiwix < 14.0.0 libzim >= 9.0.0 libzim < 10.0.0\")
|
||||
DEPS_DEFINITION = \"kiwix >= 13.0.0 kiwix < 14.0.0 libzim >= 9.0.0 libzim < 10.0.0\"
|
||||
|
||||
PKGCONFIG_CFLAGS = $$system(pkg-config --cflags $$PKGCONFIG_OPTION $$DEPS_DEFINITION)
|
||||
|
||||
QMAKE_CXXFLAGS += $$PKGCONFIG_CFLAGS
|
||||
QMAKE_CFLAGS += $$PKGCONFIG_CFLAGS
|
||||
|
||||
LIBS += $$system(pkg-config --libs $$PKGCONFIG_OPTION \"kiwix >= 13.0.0 kiwix < 14.0.0 libzim >= 9.0.0 libzim < 10.0.0\")
|
||||
!win32 {
|
||||
LIBS += $$system(pkg-config --libs $$PKGCONFIG_OPTION $$DEPS_DEFINITION)
|
||||
}
|
||||
|
||||
win32 {
|
||||
LIBS += $$system(python scripts/pkg-config-wrapper.py --libs $$PKGCONFIG_OPTION $$DEPS_DEFINITION)
|
||||
LIBS += -lUser32
|
||||
}
|
||||
|
||||
|
59
scripts/pkg-config-wrapper.py
Normal file
59
scripts/pkg-config-wrapper.py
Normal file
@ -0,0 +1,59 @@
|
||||
#!/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 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
|
||||
|
||||
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_paths):
|
||||
for path in search_paths:
|
||||
lib_path = path / f"lib{lib_name}.a"
|
||||
if lib_path.exists():
|
||||
return str(lib_path)
|
||||
return None
|
||||
|
||||
|
||||
def replace_static_lib(pkg_output):
|
||||
search_paths = []
|
||||
for option in pkg_output.split():
|
||||
if option.startswith("-L"):
|
||||
search_paths.append(Path(option[2:]))
|
||||
yield option
|
||||
if option.startswith("-l"):
|
||||
static_lib = search_static_lib(option[2:], search_paths)
|
||||
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)))
|
Loading…
x
Reference in New Issue
Block a user