diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 59f89ff..d3f4d1c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -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 diff --git a/kiwix-desktop.pro b/kiwix-desktop.pro index f96d805..e326e2c 100644 --- a/kiwix-desktop.pro +++ b/kiwix-desktop.pro @@ -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 } diff --git a/scripts/pkg-config-wrapper.py b/scripts/pkg-config-wrapper.py new file mode 100644 index 0000000..cb89b85 --- /dev/null +++ b/scripts/pkg-config-wrapper.py @@ -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)))