# (c) 2025 by Stephan Menzel # Licensed under the Apache License, Version 2.0. # See attached file LICENSE for full details import os import re from pathlib import Path from build_functions.build_utils import run_in_shell, print_banner, file_and_console_log from common.azure import write_package_version_batch from common.directory_helpers import pushd from common.errors import BuildError from common.git_helpers import clone_git_tag import common.settings from package.package_info import get_package_info def build_qwt(prefix: Path | str, sbom: dict): """This gave me a lot of headaches. Very unusual build system, if that term is applicable at all. Also, they seemed to have moved _from_ github _to_ Sourceforge prior to the 6.3.0 tag. They have also changed the build config files a bit, so this will only work with 6.3.0 """ print_banner("Building Qwt") if not os.name == "nt": raise BuildError(f"qwt is only implemented on windows. Please implement me for your system") package_info = get_package_info("qwt") package_info.add_to_sbom(sbom) qt_install_path = package_info.dependency_path("qt5") qmake_path = qt_install_path / "bin" / "qmake.exe" if os.name == "nt" else "qmake" if not qmake_path.is_file(): raise BuildError(f"Qmake executable at {qmake_path} doesn't seem to be present") src_dir = clone_git_tag(package_info, recursive=False) with pushd(src_dir): if not common.settings.rebuild and os.path.exists("built_and_installed.txt"): file_and_console_log("already built, exiting") return prefix install_dir = package_info.install_location() # I don't think this old hand-rolled build system supports out-of-src builds. # I will try to build it right here. # It looks like as if configuring this involves two modifications to local files. buildfile = Path("qwtbuild.pri") buildfile_bak = Path("qwtbuild.pri.bak") buildfile_bak.unlink(missing_ok=True) buildfile.rename(buildfile_bak) # I'm trying to set the build config to release here but that doesn't work. # It still builds debug as well. No idea how to fix this with open(buildfile_bak, 'r') as fi, open(buildfile, 'w') as fo: found = False regex = re.compile(R"^\s+CONFIG\s+\+=\s(debug_and_release)$") for line in fi: if not found: if m := regex.match(line): line = line.replace(m.group(1),"release") found = True fo.write(line) else: fo.write(line) configfile = Path("qwtconfig.pri") configfile_bak = Path("qwtconfig.pri.bak") configfile_bak.unlink(missing_ok=True) configfile.rename(configfile_bak) with open(configfile_bak, 'r') as fi, open(configfile, 'w') as fo: found = False regex = re.compile(R"^\s*QWT_INSTALL_PREFIX\s+=\s+(C:/Qwt-\$\$QWT_VERSION-dev)$") for line in fi: if not found: if m := regex.match(line): line = line.replace(m.group(1), str(install_dir.as_posix())) found = True fo.write(line) else: fo.write(line) run_in_shell(f'{qmake_path} qwt.pro') run_in_shell("nmake") run_in_shell("nmake install") with open("built_and_installed.txt", "w") as lockfile: lockfile.write(f"built release") write_package_version_batch(package_info.version) return install_dir