diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index c6adcfa..e736cbe 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -1,8 +1,6 @@ name: wheels on: [ push, pull_request ] -env: - STDCXX: 17 jobs: build_wheels: @@ -11,7 +9,9 @@ jobs: strategy: fail-fast: false matrix: - os: [ ubuntu-latest, macos-14, macos-13, windows-latest ] + os: [ ubuntu-latest, macos-14, macos-15-intel, windows-latest ] + env: + MACOSX_DEPLOYMENT_TARGET: "10.14" # https://cibuildwheel.pypa.io/en/stable/cpp_standards/#macos-and-deployment-target-versions steps: - uses: actions/checkout@v4 @@ -23,12 +23,8 @@ jobs: with: python-version: '3.x' - - name: Patch ogdf::Array on Windows - if: runner.os == 'Windows' - run: git --git-dir ogdf apply --directory ogdf fix_Array_windows.patch - - name: Build wheels - uses: pypa/cibuildwheel@v2.17.0 + uses: pypa/cibuildwheel@v3.0.1 with: package-dir: ./ output-dir: ./wheelhouse @@ -85,12 +81,10 @@ jobs: name: Test on ${{ matrix.os }} needs: check_contents runs-on: ${{ matrix.os }} - env: - CLING_REBUILD_PCH: 1 strategy: fail-fast: false matrix: - os: [ ubuntu-latest, macos-14, macos-13, windows-latest ] + os: [ ubuntu-latest, macos-14, macos-15-intel, windows-latest ] steps: - uses: actions/checkout@v4 @@ -106,19 +100,54 @@ jobs: name: wheels path: dist + # https://github.com/wlav/cppyy/issues/308 + - name: Configure MacOS + if: runner.os == 'macOS' + run: | + # brew install zstd # already installed + echo "LD_LIBRARY_PATH=/opt/homebrew/lib:$LD_LIBRARY_PATH" >> $GITHUB_ENV + echo "DYLD_LIBRARY_PATH=/opt/homebrew/lib:$DYLD_LIBRARY_PATH" >> $GITHUB_ENV + + # https://github.com/wlav/cppyy/issues/282 + - name: Configure Windows + if: runner.os == 'Windows' + run: | + pip install setuptools --force-reinstall + pip install cppyy-cling==6.32.8 --no-deps --no-build-isolation --force-reinstall + pip install cppyy-backend==1.15.3 --no-deps --no-build-isolation --force-reinstall + pip install CPyCppyy==1.13.0 --no-deps --no-build-isolation --force-reinstall + pip install cppyy==3.5.0 --no-deps --no-build-isolation --force-reinstall + - name: Install wheel run: pip install --no-index --find-links ./dist ogdf-wheel + - name: List installed files from wheel + run: pip show -f ogdf-wheel + - name: Install ogdf-python - run: pip install git+https://github.com/N-Coder/ogdf-python.git "cppyy<3.1" + run: pip install git+https://github.com/N-Coder/ogdf-python.git + + - name: Get ogdf-python release info + run: python -m ogdf_python + env: + OGDF_PYTHON_MODE: release - - name: Get ogdf-python info + - name: Get ogdf-python debug info run: python -m ogdf_python + env: + OGDF_PYTHON_MODE: debug - - name: Test ogdf-python layouts + - name: Test ogdf-python layouts in release mode run: python test_layouts.py + env: + OGDF_PYTHON_MODE: release - - uses: actions/upload-artifact@v3 + - name: Test ogdf-python layouts in debug mode + run: python test_layouts.py + env: + OGDF_PYTHON_MODE: debug + + - uses: actions/upload-artifact@v4 if: always() with: name: svgs-${{ matrix.os }} diff --git a/.gitignore b/.gitignore index 3435fb9..fc7d3b4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +*.zip +*.tar.gz +*.whl *.svg cmake_build/ wheelhouse/ diff --git a/README.md b/README.md index 824c681..07ac1a8 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ # ogdf-wheel - an OGDF release build packaged as ready-to-use python wheel. -This project uses [cibuildwheel](cibuildwheel.readthedocs.io) to build the [OGDF](github.com/ogdf/ogdf) library into a ready-to-use python package (called wheel) installable via `pip install ogdf-wheel`. Its mainly intended to be used with [`ogdf-python`](github.com/ogdf/ogdf-python) when you don't want to build the OGDF yourself or use a C++ package manager. +This project uses [cibuildwheel](cibuildwheel.readthedocs.io) to build the [OGDF](github.com/ogdf/ogdf) library into a ready-to-use python package (called wheel) installable via `pip install ogdf-wheel`. +The wheel contains both debug and release builds of the OGDF. +It is mainly intended to be used with [`ogdf-python`](github.com/ogdf/ogdf-python) when you don't want to build the OGDF yourself or use a C++ package manager. ## Publishing new Releases @@ -11,4 +13,15 @@ The CI does neither automatically build new OGDF versions nor directly publishes - Commit and push your changes to GitHub. - Wait for the CI there to finish. - Download the resulting `.whl` files. -- Use [`twine`](https://twine.readthedocs.io/en/stable/index.html) to upload the files to PyPi. +- Use [`twine`](https://twine.readthedocs.io/en/stable/index.html) to upload the files to PyPi, see also the [`ogdf-python` release process](https://github.com/ogdf/ogdf-python/blob/master/README.md). + +## Building a clean sdist locally + +```bash +cd /tmp +git clone /path/to/ogdf-wheel +cd /tmp/ogdf-wheel +git submodule update --init --recursive +python -m build --sdist +mv dist/ogdf_wheel-*.tar.gz /path/to/ogdf-wheel/dist +``` diff --git a/fix_Array_windows.patch b/fix_Array_windows.patch deleted file mode 100644 index 9b68596..0000000 --- a/fix_Array_windows.patch +++ /dev/null @@ -1,215 +0,0 @@ -Index: include/ogdf/basic/Array2D.h -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== -diff --git a/include/ogdf/basic/Array2D.h b/include/ogdf/basic/Array2D.h ---- a/include/ogdf/basic/Array2D.h (revision a4546cc009a133e174dceea02bca6eb45126e35a) -+++ b/include/ogdf/basic/Array2D.h (date 1700144964118) -@@ -201,9 +201,11 @@ - void copy(const Array2D& array2); - }; - -+} -+ - //! Constructs the array with index set [\p a, ..., \p b]*[\p c, ..., \p d]. - template --void Array2D::construct(int a, int b, int c, int d) { -+void ogdf::Array2D::construct(int a, int b, int c, int d) { - m_a = a; - m_b = b; - m_c = c; -@@ -229,7 +231,7 @@ - - //! Initializes the array with default constructor of \a E. - template --void Array2D::initialize() { -+void ogdf::Array2D::initialize() { - E* pDest = m_pStart; - try { - for (; pDest < m_pStop; pDest++) { -@@ -246,7 +248,7 @@ - - //! Initializes the array with \p x. - template --void Array2D::initialize(const E& x) { -+void ogdf::Array2D::initialize(const E& x) { - E* pDest = m_pStart; - try { - for (; pDest < m_pStop; pDest++) { -@@ -263,7 +265,7 @@ - - //! Call destructor of all elements. - template --void Array2D::deconstruct() { -+void ogdf::Array2D::deconstruct() { - if (!std::is_trivially_destructible::value) { - for (E* pDest = m_pStart; pDest < m_pStop; pDest++) { - pDest->~E(); -@@ -274,7 +276,7 @@ - - //! Copy \p array2. - template --void Array2D::copy(const Array2D& array2) { -+void ogdf::Array2D::copy(const ogdf::Array2D& array2) { - construct(array2.m_a, array2.m_b, array2.m_c, array2.m_d); - - if (m_pStart != 0) { -@@ -288,7 +290,7 @@ - - //! Computes the determinant via row expansion. - template --float Array2D::det() const { -+float ogdf::Array2D::det() const { - // matrix must be quadratic - OGDF_ASSERT(size1() == size2()); - -@@ -315,7 +317,7 @@ - - // Expanding along the first row (Laplace's Formula) - default: -- Array2D remMatrix(0, n - 2, 0, n - 2); // the remaining matrix -+ ogdf::Array2D remMatrix(0, n - 2, 0, n - 2); // the remaining matrix - for (column = c; column <= d; column++) { - int rem_i = 0; - int rem_j = 0; -@@ -339,4 +341,3 @@ - return determinant; - } - --} -Index: include/ogdf/basic/Array.h -IDEA additional info: -Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP -<+>UTF-8 -=================================================================== -diff --git a/include/ogdf/basic/Array.h b/include/ogdf/basic/Array.h ---- a/include/ogdf/basic/Array.h (revision a4546cc009a133e174dceea02bca6eb45126e35a) -+++ b/include/ogdf/basic/Array.h (date 1700145012037) -@@ -800,9 +800,11 @@ - OGDF_NEW_DELETE - }; - -+} -+ - // enlarges storage for array and moves old entries - template --void Array::expandArray(INDEX add) { -+void ogdf::Array::expandArray(INDEX add) { - INDEX sOld = size(), sNew = sOld + add; - - // expand allocated memory block -@@ -822,7 +824,7 @@ - - // enlarges array by add elements and sets new elements to x - template --void Array::grow(INDEX add, const E& x) { -+void ogdf::Array::grow(INDEX add, const E& x) { - if (add == 0) { - return; - } -@@ -838,7 +840,7 @@ - - // enlarges array by add elements (initialized with default constructor) - template --void Array::grow(INDEX add) { -+void ogdf::Array::grow(INDEX add) { - if (add == 0) { - return; - } -@@ -853,7 +855,7 @@ - } - - template --void Array::construct(INDEX a, INDEX b) { -+void ogdf::Array::construct(INDEX a, INDEX b) { - m_low = a; - m_high = b; - INDEX s = b - a + 1; -@@ -873,7 +875,7 @@ - } - - template --void Array::initialize() { -+void ogdf::Array::initialize() { - E* pDest = m_pStart; - try { - for (; pDest < m_pStop; pDest++) { -@@ -889,7 +891,7 @@ - } - - template --void Array::initialize(const E& x) { -+void ogdf::Array::initialize(const E& x) { - E* pDest = m_pStart; - try { - for (; pDest < m_pStop; pDest++) { -@@ -905,7 +907,7 @@ - } - - template --void Array::initialize(std::initializer_list initList) { -+void ogdf::Array::initialize(std::initializer_list initList) { - E* pDest = m_pStart; - try { - for (const E& x : initList) { -@@ -921,7 +923,7 @@ - } - - template --void Array::deconstruct() { -+void ogdf::Array::deconstruct() { - if (!std::is_trivially_destructible::value) { - for (E* pDest = m_pStart; pDest < m_pStop; pDest++) { - pDest->~E(); -@@ -931,7 +933,7 @@ - } - - template --void Array::copy(const Array& array2) { -+void ogdf::Array::copy(const ogdf::Array& array2) { - construct(array2.m_low, array2.m_high); - - if (m_pStart != nullptr) { -@@ -948,7 +950,7 @@ - // permutes array a from a[l] to a[r] randomly - template - template --void Array::permute(INDEX l, INDEX r, RNG& rng) { -+void ogdf::Array::permute(INDEX l, INDEX r, RNG& rng) { - OGDF_ASSERT(low() <= l); - OGDF_ASSERT(l <= high()); - OGDF_ASSERT(low() <= r); -@@ -962,6 +964,8 @@ - } - } - -+namespace ogdf { -+ - //! Prints array \p a to output stream \p os using delimiter \p delim. - template - void print(std::ostream& os, const Array& a, char delim = ' ') { -@@ -984,11 +988,10 @@ - - #include - --namespace ogdf { - - //! shift all items up to the last element of \p ind to the left - template --void Array::leftShift(ArrayBuffer& ind) { -+void ogdf::Array::leftShift(ogdf::ArrayBuffer& ind) { - const INDEX nInd = ind.size(); - if (nInd == 0) { - return; -@@ -1015,9 +1018,7 @@ - } - - template --Array::Array(const ArrayBuffer& A) { -+ogdf::Array::Array(const ogdf::ArrayBuffer& A) { - construct(0, -1); - A.compactCopy(*this); - } -- --} diff --git a/hatch_build.py b/hatch_build.py index 1c863ff..e845117 100644 --- a/hatch_build.py +++ b/hatch_build.py @@ -1,6 +1,7 @@ import multiprocessing import os import platform +import re import subprocess import sys import sysconfig @@ -28,6 +29,10 @@ def is_windows(): return platform.system() == "Windows" +def is_macos(): + return platform.system() == "Darwin" + + def sync(): sys.stdout.flush() sys.stderr.flush() @@ -59,9 +64,8 @@ def tag(self): plat = sysconfig.get_platform() return "py3-none-%s" % plat.replace("-", "_").replace(".", "_") - @cached_property - def cmake_build_dir(self): - p = Path(self.directory) / "cmake_build" + def cmake_build_dir(self, config): + p = Path(self.directory) / f"cmake_build_{config}" p.mkdir(parents=True, exist_ok=True) return p @@ -78,10 +82,10 @@ def cmake_install_dir(self): def ogdf_src_dir(self): return Path(self.root) / "ogdf" - def run(self, *args): + def run(self, *args, dir): args = list(map(str, args)) with group("Running", *args): - return subprocess.run(args, capture_output=False, check=True, cwd=self.cmake_build_dir) + return subprocess.run(args, capture_output=False, check=True, cwd=dir) def dump_files(self, dir): with group("Index of", dir): @@ -108,46 +112,53 @@ def initialize(self, version, build_data): del self.build_config.target_config["shared-data"] with group("Config"): + pprint({ + "root": self.root, + "directory": self.directory, + "ogdf_src_dir": self.ogdf_src_dir, + "cmake_install_dir": self.cmake_install_dir, + "cmake_build_dir debug": self.cmake_build_dir("debug"), + "cmake_build_dir release": self.cmake_build_dir("release"), + }) pprint(build_data) pprint(self.build_config.__dict__) - # disable march=native optimizations (including SSE3) - if is_cibuildwheel(): - comp_spec_cmake = self.ogdf_src_dir / "cmake" / "compiler-specifics.cmake" - with open(comp_spec_cmake, "rt") as f: - lines = f.readlines() - with open(comp_spec_cmake, "wt") as f: - f.writelines("# " + l if "march=native" in l and not l.strip().startswith("#") else l for l in lines) + # remove version information from .so name + cmake_file = self.ogdf_src_dir / "CMakeLists.txt" + with open(cmake_file, "rt") as f: + lines = f.readlines() + with open(cmake_file, "wt") as f: + f.writelines(re.sub(' *VERSION "20[0-9.]+"', '', l) for l in lines) - CONFIG = "Debug" flags = [ - "-DCMAKE_BUILD_TYPE=" + CONFIG, "-DBUILD_SHARED_LIBS=ON", + "-DBUILD_SHARED_LIBS=ON", "-DCMAKE_INSTALL_PREFIX=%s" % self.cmake_install_dir, "-DOGDF_WARNING_ERRORS=OFF", "-DCMAKE_BUILD_RPATH=$ORIGIN;@loader_path", "-DCMAKE_INSTALL_RPATH=$ORIGIN;@loader_path", "-DMACOSX_RPATH=TRUE", + "-DCMAKE_INSTALL_LIBDIR=lib", # instead of lib64 https://stackoverflow.com/a/76528304 + "-DOGDF_MEMORY_MANAGER=POOL_TS", # "-DOGDF_MEMORY_MANAGER=MALLOC_TS", "-DOGDF_LEAK_CHECK=ON", ] - if CONFIG == "Debug" and not is_windows(): + + release_dir = self.cmake_build_dir("release") + self.run("cmake", self.ogdf_src_dir, "-DCMAKE_BUILD_TYPE=Release", *flags, dir=release_dir) + self.run("cmake", "--build", ".", "--config", "Release", "--parallel", str(multiprocessing.cpu_count()), + dir=release_dir) + self.run("cmake", "--install", ".", "--config", "Release", dir=release_dir) + + if not is_windows(): flags.extend([ "-DOGDF_USE_ASSERT_EXCEPTIONS=ON", # "-DOGDF_USE_ASSERT_EXCEPTIONS_WITH=ON_LIBUNWIND", ]) - flags.extend([ - "-DOGDF_MEMORY_MANAGER=POOL_TS", - # "-DOGDF_MEMORY_MANAGER=MALLOC_TS", "-DOGDF_LEAK_CHECK=ON", - ]) - self.run("cmake", self.ogdf_src_dir, *flags) + debug_dir = self.cmake_build_dir("debug") + self.run("cmake", self.ogdf_src_dir, "-DCMAKE_BUILD_TYPE=Debug", *flags, dir=debug_dir) + self.run("cmake", "--build", ".", "--config", "Debug", "--parallel", str(multiprocessing.cpu_count()), + dir=debug_dir) + self.run("cmake", "--install", ".", "--config", "Debug", dir=debug_dir) # import IPython # IPython.embed() - # windows needs config repeated but no parallel - build_opts = [] - if not is_windows(): - build_opts = ["--parallel", str(multiprocessing.cpu_count())] - self.run("cmake", "--build", ".", "--config", CONFIG, *build_opts) - - self.run("cmake", "--install", ".", "--config", CONFIG) - self.dump_files(self.directory) self.dump_files(self.root) @@ -170,5 +181,6 @@ def clean(self, versions): the [`clean`](../cli/reference.md#hatch-clean) command. """ import shutil - shutil.rmtree(self.cmake_build_dir) - shutil.rmtree(self.cmake_install_dir) + shutil.rmtree(self.cmake_build_dir("release"), ignore_errors=True) + shutil.rmtree(self.cmake_build_dir("debug"), ignore_errors=True) + shutil.rmtree(self.cmake_install_dir, ignore_errors=True) diff --git a/ogdf b/ogdf index a4546cc..5b67956 160000 --- a/ogdf +++ b/ogdf @@ -1 +1 @@ -Subproject commit a4546cc009a133e174dceea02bca6eb45126e35a +Subproject commit 5b6795655399b9d8e2921afec9d97bab9107d5ee diff --git a/pyproject.toml b/pyproject.toml index 1e568a3..775d8c8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "ogdf-wheel" description = "An OGDF release build packaged as ready-to-use python wheel." -version = "2023.09" +version = "2025.10" classifiers = ["Programming Language :: Python :: 3"] requires-python = ">=3.7" license-files = { paths = [ @@ -18,7 +18,7 @@ readme = "README.md" [tool.cibuildwheel] build = ["cp310-*"] # Skip 32-bit builds, musl build, and pypy builds -skip = ["*-win32", "*-manylinux_i686", "*-musllinux_*", "*pypy*"] +skip = ["*-win32", "*-manylinux_i686", "*-musllinux_*"] environment-pass = ["GITHUB_ACTIONS"] manylinux-x86_64-image = "manylinux_2_28" # manylinux2014 uses a too old gcc (wlav/cppyy#70) build-frontend = "build" diff --git a/test_contents.py b/test_contents.py index 256367e..e8ed376 100644 --- a/test_contents.py +++ b/test_contents.py @@ -62,16 +62,26 @@ def diff_dict_keys(a, b): def check_diff(tag, actual, expected, ign_a="", ign_e="", exp_a=[], win=False): + """ + :param tag: tag for logging + :param actual: {filename: size} dict of actually found files + :param expected: {filename: size} dict of expected files + :param ign_a: regex for ignoring superfluous files that are in actual but not in expected + :param ign_e: regex for ignoring missing files that are in expected but not in actual + :param exp_a: list of additional file names that need to be present in actual, independent of expected + :param win: on windows, we ignore file sizes + """ global issues print("\tChecking", tag) - if win: - actual, expected = diff_dict_keys(actual, expected) - else: - actual, expected = diff_dicts(actual, expected) for e in exp_a: if e not in actual: print("\tMissing file %s in %s!" % (e, tag)) issues += 1 + + if win: # ignore file sizes on windows + actual, expected = diff_dict_keys(actual, expected) + else: + actual, expected = diff_dicts(actual, expected) sup = {k: v for k, v in actual.items() if not re.fullmatch(ign_a, k) and k not in exp_a} mis = {k: v for k, v in expected.items() if not re.fullmatch(ign_e, k)} if sup or mis: @@ -91,7 +101,7 @@ def ignore(*ps): ] -def check_wheel(wheelp, ogdfp, name, tag): +def check_wheel(wheelp, ogdfp, name, tag, config): name_esc = ignore(name) headers, others = {}, {} for k, v in ogdfp["include/"].items(): @@ -100,16 +110,23 @@ def check_wheel(wheelp, ogdfp, name, tag): else: others[k] = v - # _cur is the install location for the current platform (UNIX), _oth for the other (Windows) + # _cur is the install location for the current target platform (default UNIX), _oth for the other (Windows) + # only one of them will actually contain files, depending on the target platform incl_cur, incl_oth = wheelp[name + ".data/data/include/"], wheelp["ogdf_wheel/install/include/"] - exam_cur, exam_oth = wheelp[name + ".data/data/share/doc/libogdf/examples/"], wheelp["ogdf_wheel/install/share/doc/libogdf/examples/"] + exam_cur, exam_oth = wheelp[name + ".data/data/share/doc/libogdf/examples/"], wheelp[ + "ogdf_wheel/install/share/doc/libogdf/examples/"] check = check_diff if "win" in tag: incl_cur, incl_oth = incl_oth, incl_cur exam_cur, exam_oth = exam_oth, exam_cur check = partial(check_diff, win=True) - check("wheel includes [cur]", incl_cur, headers, exp_a=["ogdf/basic/internal/config_autogen.h"]) + if config: + check("wheel includes [cur]", incl_cur, headers, exp_a=[f"ogdf-{config}/ogdf/basic/internal/config_autogen.h"]) + else: + check("wheel includes [cur]", incl_cur, headers, + exp_a=["ogdf-debug/ogdf/basic/internal/config_autogen.h", + "ogdf-release/ogdf/basic/internal/config_autogen.h"]) check("wheel includes [oth]", incl_oth, {}) check("wheel examples [cur]", exam_cur, ogdfp["doc/examples/"], ign_e=IGNORE_GIT + "|.*\\.dox") check("wheel examples [oth]", exam_oth, {}) @@ -121,21 +138,32 @@ def check_wheel(wheelp, ogdfp, name, tag): 'ogdf/lib/minisat/doc/ReleaseNotes-2.2.0.txt': 3418, 'ogdf/geometric/README.md': 321}) - ign_meta = f"{name_esc}\\.dist-info/(METADATA|RECORD|WHEEL)|{name_esc}\\.data/data/lib/cmake/.*\.cmake" + def expand_suffix(*paths, pre=""): + ret = [] + if config != "release": + ret.extend(pre + p.replace("{suffix}", "-debug") for p in paths) + if config != "debug": + ret.extend(pre + p.replace("{suffix}", "") for p in paths) + return ret + + ign_meta = f"{name_esc}\\.dist-info/(METADATA|RECORD|WHEEL)|{name_esc}\\.data/data/(lib/cmake|share/ogdf)/.*\\.cmake" exp_lic = [name + ".dist-info/licenses/" + f for f in LICENSES] + ['ogdf_wheel/__init__.py'] if "win" in tag: check("wheel install [win]", wheelp["ogdf_wheel/install/"], {}, - ign_a="lib/cmake/.*\.cmake|lib/(COIN|OGDF)\.lib", - exp_a=["bin/OGDF.dll"]) + ign_a="bin/(msvc|vcruntime|concrt).*\.dll|share/ogdf/.*\\.cmake|lib/(COIN|OGDF)" + ( + '(-debug)' if config != 'release' else '') + ('' if config else '?') + "\\.lib", + exp_a=expand_suffix("bin/OGDF{suffix}.dll")) check("wheel rest [win]", wheelp[""], {}, ign_a=ign_meta, exp_a=exp_lic) elif "macos" in tag: check("wheel rest [macos]", wheelp[""], {}, ign_a=ign_meta, - exp_a=[name + ".data/data/lib/libOGDF.dylib", name + ".data/data/lib/libCOIN.dylib", *exp_lic]) + exp_a=expand_suffix("libOGDF{suffix}.dylib", "libCOIN{suffix}.dylib", pre=name + ".data/data/lib/") + + exp_lic) else: check("wheel rest [linux]", wheelp[""], {}, ign_a=ign_meta, - exp_a=[name + ".data/data/lib/libOGDF.so", name + ".data/data/lib/libCOIN.so", *exp_lic]) + exp_a=expand_suffix("libOGDF{suffix}.so", "libCOIN{suffix}.so", pre=name + ".data/data/lib/") + + exp_lic) def check_sdist(sdistp, ogdff): @@ -162,7 +190,8 @@ def dump_data(dumpdir, files, partitions, name): @click.option('--dist', type=click.Path(exists=True, file_okay=False), default=Path("dist")) @click.option('--ogdf', type=click.Path(exists=True, file_okay=False), default=Path("ogdf")) @click.option('--dump', type=click.Path(file_okay=False)) - def main(dist, ogdf, dump): + @click.option('--config', default="") + def main(dist, ogdf, dump, config): dist = Path(dist) ogdf = Path(ogdf) dump = Path(dump) if dump else dump @@ -194,7 +223,7 @@ def main(dist, ogdf, dump): name + ".data/data/include/", name + ".data/data/share/doc/libogdf/examples/", "ogdf_wheel/install/include/", "ogdf_wheel/install/share/doc/libogdf/examples/", "ogdf_wheel/install/"]) if dump: dump_data(dump, wheelf, wheelp, "wheel-%s" % wheel.name) - check_wheel(wheelp, ogdfp, name, wheel.stem) + check_wheel(wheelp, ogdfp, name, wheel.stem, config) if issues: print("There were %s issue(s)!" % issues)