From dcb8bd6343e2e4dd099025d3d2082e6d81236943 Mon Sep 17 00:00:00 2001 From: Simon D Fink Date: Wed, 23 Jul 2025 09:09:37 +0200 Subject: [PATCH 01/21] update ogdf to apple silicon PR --- ogdf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ogdf b/ogdf index a4546cc..4aeb8e9 160000 --- a/ogdf +++ b/ogdf @@ -1 +1 @@ -Subproject commit a4546cc009a133e174dceea02bca6eb45126e35a +Subproject commit 4aeb8e9b5eaab552b767587e805ac709f59373f9 From ad2fcf7074fd155b097371b915035b77783a93a2 Mon Sep 17 00:00:00 2001 From: Simon D Fink Date: Wed, 23 Jul 2025 09:12:27 +0200 Subject: [PATCH 02/21] run on latest macos --- .github/workflows/wheels.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index c6adcfa..5b64417 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -11,7 +11,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ ubuntu-latest, macos-14, macos-13, windows-latest ] + os: [ ubuntu-latest, macos-latest, macos-13, windows-latest ] steps: - uses: actions/checkout@v4 @@ -90,7 +90,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ ubuntu-latest, macos-14, macos-13, windows-latest ] + os: [ ubuntu-latest, macos-latest, macos-13, windows-latest ] steps: - uses: actions/checkout@v4 From dcb62c4995e46661e46279c5d79d6cb0e53a21c3 Mon Sep 17 00:00:00 2001 From: Simon D Fink Date: Wed, 23 Jul 2025 09:16:48 +0200 Subject: [PATCH 03/21] update cibuildwheel --- .github/workflows/wheels.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index 5b64417..2d965ac 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -28,7 +28,7 @@ jobs: 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 From 056a27862d8d070c1903fb8d15f28ed3d6f36f68 Mon Sep 17 00:00:00 2001 From: Simon D Fink Date: Wed, 23 Jul 2025 09:17:01 +0200 Subject: [PATCH 04/21] remove workarounds --- .github/workflows/wheels.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index 2d965ac..95353a6 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: @@ -85,8 +83,6 @@ jobs: name: Test on ${{ matrix.os }} needs: check_contents runs-on: ${{ matrix.os }} - env: - CLING_REBUILD_PCH: 1 strategy: fail-fast: false matrix: @@ -110,7 +106,7 @@ jobs: run: pip install --no-index --find-links ./dist 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 info run: python -m ogdf_python From 61f174f56a03f6fa5a4d7bc9d53a7efeb8d4f26e Mon Sep 17 00:00:00 2001 From: Simon D Fink Date: Wed, 23 Jul 2025 09:22:28 +0200 Subject: [PATCH 05/21] remove windows array patch --- .github/workflows/wheels.yml | 4 - fix_Array_windows.patch | 215 ----------------------------------- 2 files changed, 219 deletions(-) delete mode 100644 fix_Array_windows.patch diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index 95353a6..8a8d8a6 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -21,10 +21,6 @@ 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@v3.0.1 with: 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); - } -- --} From 7dfc11b7153853ef9f23c1184499b0deb4d6e5c3 Mon Sep 17 00:00:00 2001 From: Simon D Fink Date: Wed, 23 Jul 2025 09:28:01 +0200 Subject: [PATCH 06/21] set min macos version --- .github/workflows/wheels.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index 8a8d8a6..33c70c7 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -10,6 +10,8 @@ jobs: fail-fast: false matrix: os: [ ubuntu-latest, macos-latest, macos-13, 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 From be4f5600c750a20fde270eea6b8681b0a56da3e9 Mon Sep 17 00:00:00 2001 From: Simon D Fink Date: Wed, 23 Jul 2025 09:46:08 +0200 Subject: [PATCH 07/21] update upload artifact CI step --- .github/workflows/wheels.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index 33c70c7..32740e6 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -112,7 +112,7 @@ jobs: - name: Test ogdf-python layouts run: python test_layouts.py - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 if: always() with: name: svgs-${{ matrix.os }} From 4d52339f02303a487af51e7e2caf0342476e181e Mon Sep 17 00:00:00 2001 From: Simon D Fink Date: Tue, 29 Jul 2025 08:51:02 +0200 Subject: [PATCH 08/21] fix running on macos --- .github/workflows/wheels.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index 32740e6..ea2b6ab 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -100,6 +100,14 @@ jobs: name: wheels path: dist + # https://github.com/wlav/cppyy/issues/308 + - name: Configure MacOS + if: runner.os == 'macOS' + run: | + brew install zstd + echo "LD_LIBRARY_PATH=/opt/homebrew/lib:$LD_LIBRARY_PATH" >> $GITHUB_ENV + echo "DYLD_LIBRARY_PATH=/opt/homebrew/lib:$DYLD_LIBRARY_PATH" >> $GITHUB_ENV + - name: Install wheel run: pip install --no-index --find-links ./dist ogdf-wheel @@ -116,4 +124,4 @@ jobs: if: always() with: name: svgs-${{ matrix.os }} - path: ./*.svg + path: ./*.svg \ No newline at end of file From 50b93b5d6f1e3b9e1e6ae4aabbc1f2e595d339aa Mon Sep 17 00:00:00 2001 From: Simon D Fink Date: Tue, 29 Jul 2025 08:54:53 +0200 Subject: [PATCH 09/21] fix running on windows --- .github/workflows/wheels.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index ea2b6ab..cee0e71 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -108,6 +108,15 @@ jobs: 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 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 From 3b636e6422ed93cb0899763e3cbd50aa659634c0 Mon Sep 17 00:00:00 2001 From: Simon D Fink Date: Tue, 29 Jul 2025 09:12:17 +0200 Subject: [PATCH 10/21] update OGDF --- ogdf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ogdf b/ogdf index 4aeb8e9..519a266 160000 --- a/ogdf +++ b/ogdf @@ -1 +1 @@ -Subproject commit 4aeb8e9b5eaab552b767587e805ac709f59373f9 +Subproject commit 519a266430e8522e8ecf1a355c83ef9f496c5c80 From 6f85fe1cc42f8e4a25294c12a1d1c0570b072ac9 Mon Sep 17 00:00:00 2001 From: Simon D Fink Date: Tue, 29 Jul 2025 10:28:41 +0200 Subject: [PATCH 11/21] try to fix windows --- .github/workflows/wheels.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index cee0e71..591fe06 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -112,6 +112,7 @@ jobs: - 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 @@ -133,4 +134,4 @@ jobs: if: always() with: name: svgs-${{ matrix.os }} - path: ./*.svg \ No newline at end of file + path: ./*.svg From facefa5312af7fb3ab8a3cbac6cb49f05fa3dcef Mon Sep 17 00:00:00 2001 From: Niko Fink Date: Wed, 30 Jul 2025 20:10:45 +0200 Subject: [PATCH 12/21] fix Array on Windows cppyy --- ogdf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ogdf b/ogdf index 519a266..ef5ba85 160000 --- a/ogdf +++ b/ogdf @@ -1 +1 @@ -Subproject commit 519a266430e8522e8ecf1a355c83ef9f496c5c80 +Subproject commit ef5ba85e92b8837ae3576efeb4e82436fc5f604e From 2eb46cf2b646ca65a95f0c22fbdb4c3102a46b04 Mon Sep 17 00:00:00 2001 From: Simon D Fink Date: Tue, 23 Sep 2025 17:25:10 +0200 Subject: [PATCH 13/21] update ogdf --- ogdf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ogdf b/ogdf index ef5ba85..cc2148d 160000 --- a/ogdf +++ b/ogdf @@ -1 +1 @@ -Subproject commit ef5ba85e92b8837ae3576efeb4e82436fc5f604e +Subproject commit cc2148dc4f6f552fcc94b58be992300dce5b611c From 081f3aab4e310fcdc6b8eac652c875abd4b8e71a Mon Sep 17 00:00:00 2001 From: Simon D Fink Date: Thu, 25 Sep 2025 16:17:30 +0200 Subject: [PATCH 14/21] new wheel build with multi config --- hatch_build.py | 38 +++++++++++++------------------------- 1 file changed, 13 insertions(+), 25 deletions(-) diff --git a/hatch_build.py b/hatch_build.py index 1c863ff..9651752 100644 --- a/hatch_build.py +++ b/hatch_build.py @@ -28,6 +28,10 @@ def is_windows(): return platform.system() == "Windows" +def is_macos(): + return platform.system() == "Darwin" + + def sync(): sys.stdout.flush() sys.stderr.flush() @@ -111,42 +115,26 @@ def initialize(self, version, build_data): 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) - - CONFIG = "Debug" flags = [ - "-DCMAKE_BUILD_TYPE=" + CONFIG, "-DBUILD_SHARED_LIBS=ON", + "-DCMAKE_CONFIGURATION_TYPES=Debug;Release", + "-DCMAKE_CROSS_CONFIGS=all", "-DCMAKE_DEFAULT_CONFIGS=all", + "-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", + "-DOGDF_USE_ASSERT_EXCEPTIONS=ON", # "-DOGDF_USE_ASSERT_EXCEPTIONS_WITH=ON_LIBUNWIND", + "-DOGDF_MEMORY_MANAGER=POOL_TS", # "-DOGDF_MEMORY_MANAGER=MALLOC_TS", "-DOGDF_LEAK_CHECK=ON", ] - if CONFIG == "Debug" and 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", - ]) + if not is_windows() and not is_macos(): # XCode and VS are multi-config by default + flags.append("-G Ninja Multi-Config") self.run("cmake", self.ogdf_src_dir, *flags) # 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.run("cmake", "--build", ".") + self.run("cmake", "--install", ".") self.dump_files(self.directory) self.dump_files(self.root) From 6309f42f89bd0b28c8f424088e7d4d945351652b Mon Sep 17 00:00:00 2001 From: Simon D Fink Date: Thu, 9 Oct 2025 14:31:57 +0200 Subject: [PATCH 15/21] build debug and release versions simultaneously --- .github/workflows/wheels.yml | 18 ++++++++++-- .gitignore | 3 ++ hatch_build.py | 47 +++++++++++++++++++---------- ogdf | 2 +- test_contents.py | 57 ++++++++++++++++++++++++++---------- 5 files changed, 93 insertions(+), 34 deletions(-) diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index 591fe06..e1f71db 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -124,11 +124,25 @@ jobs: - name: Install ogdf-python run: pip install git+https://github.com/N-Coder/ogdf-python.git - - name: Get ogdf-python info + - name: Get ogdf-python release info run: python -m ogdf_python + env: + OGDF_PYTHON_MODE: release - - name: Test ogdf-python layouts + - name: Get ogdf-python debug info + run: python -m ogdf_python + env: + OGDF_PYTHON_MODE: debug + + - name: Test ogdf-python layouts in release mode + run: python test_layouts.py + env: + OGDF_PYTHON_MODE: release + + - 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() 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/hatch_build.py b/hatch_build.py index 9651752..c8ae9e5 100644 --- a/hatch_build.py +++ b/hatch_build.py @@ -63,9 +63,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 @@ -82,10 +81,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): @@ -112,30 +111,45 @@ 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__) flags = [ - "-DCMAKE_CONFIGURATION_TYPES=Debug;Release", - "-DCMAKE_CROSS_CONFIGS=all", "-DCMAKE_DEFAULT_CONFIGS=all", "-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", - "-DOGDF_USE_ASSERT_EXCEPTIONS=ON", # "-DOGDF_USE_ASSERT_EXCEPTIONS_WITH=ON_LIBUNWIND", "-DOGDF_MEMORY_MANAGER=POOL_TS", # "-DOGDF_MEMORY_MANAGER=MALLOC_TS", "-DOGDF_LEAK_CHECK=ON", ] - if not is_windows() and not is_macos(): # XCode and VS are multi-config by default - flags.append("-G Ninja Multi-Config") - self.run("cmake", self.ogdf_src_dir, *flags) + + 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", + ]) + 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() - self.run("cmake", "--build", ".") - self.run("cmake", "--install", ".") - self.dump_files(self.directory) self.dump_files(self.root) @@ -158,5 +172,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 cc2148d..638f5dc 160000 --- a/ogdf +++ b/ogdf @@ -1 +1 @@ -Subproject commit cc2148dc4f6f552fcc94b58be992300dce5b611c +Subproject commit 638f5dcb8007cf021cb2f142be4eba37648def65 diff --git a/test_contents.py b/test_contents.py index 256367e..d516425 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,7 +110,8 @@ 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/"] check = check_diff @@ -109,7 +120,11 @@ def check_wheel(wheelp, ogdfp, name, tag): 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 +136,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="lib/cmake/.*\\.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]) + ign_a=ign_meta+f"|{name}.data/data/lib(64)?/lib.*\\.so\\.[0-9]+\\.[0-9]+", + exp_a=expand_suffix("libOGDF{suffix}.so", "libCOIN{suffix}.so", pre=name + ".data/data/lib/") + + exp_lic) def check_sdist(sdistp, ogdff): @@ -162,7 +188,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 +221,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) From 37630f10913c4011106b14fbf65260570d045344 Mon Sep 17 00:00:00 2001 From: Simon D Fink Date: Mon, 27 Oct 2025 21:31:35 +0100 Subject: [PATCH 16/21] update OGDF to foxglove --- ogdf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ogdf b/ogdf index 638f5dc..5b67956 160000 --- a/ogdf +++ b/ogdf @@ -1 +1 @@ -Subproject commit 638f5dcb8007cf021cb2f142be4eba37648def65 +Subproject commit 5b6795655399b9d8e2921afec9d97bab9107d5ee From 9ae472418e623112bcbc1d50b814348f9e4f60e6 Mon Sep 17 00:00:00 2001 From: Simon D Fink Date: Mon, 27 Oct 2025 21:31:49 +0100 Subject: [PATCH 17/21] bugfixes --- README.md | 11 +++++++++++ hatch_build.py | 8 ++++++++ test_contents.py | 14 ++++++++------ 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 824c681..d43cb54 100644 --- a/README.md +++ b/README.md @@ -12,3 +12,14 @@ The CI does neither automatically build new OGDF versions nor directly publishes - 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. + +## Building the 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/hatch_build.py b/hatch_build.py index c8ae9e5..f7b2d1f 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 @@ -122,6 +123,13 @@ def initialize(self, version, build_data): pprint(build_data) pprint(self.build_config.__dict__) + # 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) + flags = [ "-DBUILD_SHARED_LIBS=ON", "-DCMAKE_INSTALL_PREFIX=%s" % self.cmake_install_dir, diff --git a/test_contents.py b/test_contents.py index d516425..4b3d5a7 100644 --- a/test_contents.py +++ b/test_contents.py @@ -113,7 +113,8 @@ def check_wheel(wheelp, ogdfp, name, tag, config): # _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 @@ -124,7 +125,8 @@ def check_wheel(wheelp, ogdfp, name, tag, 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"]) + 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, {}) @@ -148,8 +150,8 @@ def expand_suffix(*paths, pre=""): 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)" + ('(-debug)' if config != 'release' else '') - + ('' if config else '?') + "\\.lib", + 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: @@ -159,8 +161,8 @@ def expand_suffix(*paths, pre=""): + exp_lic) else: check("wheel rest [linux]", wheelp[""], {}, - ign_a=ign_meta+f"|{name}.data/data/lib(64)?/lib.*\\.so\\.[0-9]+\\.[0-9]+", - exp_a=expand_suffix("libOGDF{suffix}.so", "libCOIN{suffix}.so", pre=name + ".data/data/lib/") + ign_a=ign_meta, + exp_a=expand_suffix("libOGDF{suffix}.so", "libCOIN{suffix}.so", pre=name + ".data/data/lib64/") + exp_lic) From ab8347c49eb20dc5d02666ed54408ea2c4395d4e Mon Sep 17 00:00:00 2001 From: Simon D Fink Date: Tue, 28 Oct 2025 10:17:35 +0100 Subject: [PATCH 18/21] list file locations installed from wheel --- .github/workflows/wheels.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index e1f71db..99ba457 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -121,6 +121,9 @@ jobs: - 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 From ca959e0ec16beec5c9c35a09218ce82a0c568ac1 Mon Sep 17 00:00:00 2001 From: Simon D Fink Date: Tue, 28 Oct 2025 11:10:04 +0100 Subject: [PATCH 19/21] use lib instead of lib64 --- hatch_build.py | 1 + test_contents.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/hatch_build.py b/hatch_build.py index f7b2d1f..e845117 100644 --- a/hatch_build.py +++ b/hatch_build.py @@ -136,6 +136,7 @@ def initialize(self, version, build_data): "-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", ] diff --git a/test_contents.py b/test_contents.py index 4b3d5a7..e8ed376 100644 --- a/test_contents.py +++ b/test_contents.py @@ -162,7 +162,7 @@ def expand_suffix(*paths, pre=""): else: check("wheel rest [linux]", wheelp[""], {}, ign_a=ign_meta, - exp_a=expand_suffix("libOGDF{suffix}.so", "libCOIN{suffix}.so", pre=name + ".data/data/lib64/") + exp_a=expand_suffix("libOGDF{suffix}.so", "libCOIN{suffix}.so", pre=name + ".data/data/lib/") + exp_lic) From b36af56435ff085f1a0f1bafd73e95602f148499 Mon Sep 17 00:00:00 2001 From: Simon D Fink Date: Fri, 31 Oct 2025 16:11:59 +0100 Subject: [PATCH 20/21] update OS versions and minor fixes --- .github/workflows/wheels.yml | 6 +++--- README.md | 5 +++-- pyproject.toml | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index 99ba457..e736cbe 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -9,7 +9,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ ubuntu-latest, macos-latest, 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 @@ -84,7 +84,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ ubuntu-latest, macos-latest, macos-13, windows-latest ] + os: [ ubuntu-latest, macos-14, macos-15-intel, windows-latest ] steps: - uses: actions/checkout@v4 @@ -104,7 +104,7 @@ jobs: - name: Configure MacOS if: runner.os == 'macOS' run: | - brew install zstd + # 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 diff --git a/README.md b/README.md index d43cb54..45aedcd 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # 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`. +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 @@ -13,7 +14,7 @@ The CI does neither automatically build new OGDF versions nor directly publishes - Download the resulting `.whl` files. - Use [`twine`](https://twine.readthedocs.io/en/stable/index.html) to upload the files to PyPi. -## Building the sdist locally +## Building a clean sdist locally ```bash cd /tmp diff --git a/pyproject.toml b/pyproject.toml index 1e568a3..e8f7c0d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -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" From c222712304810aaaa1e45692c67a2fde12cee59f Mon Sep 17 00:00:00 2001 From: Simon D Fink Date: Mon, 3 Nov 2025 15:59:39 +0100 Subject: [PATCH 21/21] bump versions --- README.md | 3 ++- pyproject.toml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 45aedcd..07ac1a8 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # 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`. +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 @@ -12,7 +13,7 @@ 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 diff --git a/pyproject.toml b/pyproject.toml index e8f7c0d..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 = [