From b279eb9263139cd7eb485447001db8d6c20125f4 Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Thu, 9 Jul 2026 13:56:16 +0200 Subject: [PATCH 01/17] pkg-config further experiments --- cpp/dolfinx/CMakeLists.txt | 11 ++++++++++- cpp/test/pkgconfig-test/main.cpp | 24 ++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 cpp/test/pkgconfig-test/main.cpp diff --git a/cpp/dolfinx/CMakeLists.txt b/cpp/dolfinx/CMakeLists.txt index 50c0a6da93..b3054fd5e5 100644 --- a/cpp/dolfinx/CMakeLists.txt +++ b/cpp/dolfinx/CMakeLists.txt @@ -271,7 +271,16 @@ install( # Generate pkg-config file and install it # Define packages that should be required by pkg-config file -set(PKG_REQUIRES "") +set(PKG_REQUIRES "spdlog") + +if(TARGET PkgConfig::PETSC) + list(APPEND PKG_REQUIRES ${PETSC_MODULE_NAME}) +endif() +if(TARGET PkgConfig::SLEPC) + list(APPEND PKG_REQUIRES ${SLEPC_MODULE_NAME}) +endif() + +string(REPLACE ";" " " PKG_REQUIRES "${PKG_REQUIRES}") # Get link libraries and includes get_target_property( diff --git a/cpp/test/pkgconfig-test/main.cpp b/cpp/test/pkgconfig-test/main.cpp new file mode 100644 index 0000000000..7b8d8aed4a --- /dev/null +++ b/cpp/test/pkgconfig-test/main.cpp @@ -0,0 +1,24 @@ +// Copyright (C) 2025 Jack S. Hale +// +// This file is part of DOLFINx (https://www.fenicsproject.org) +// +// SPDX-License-Identifier: LGPL-3.0-or-later + +#include +#include +#include + +int main(int argc, char* argv[]) +{ + MPI_Init(&argc, &argv); + dolfinx::init_logging(argc, argv); + + { + auto mesh = dolfinx::mesh::create_rectangle( + MPI_COMM_WORLD, {{{0.0, 0.0}, {1.0, 1.0}}}, {8, 8}, + dolfinx::mesh::CellType::triangle); + } + + MPI_Finalize(); + return 0; +} From 194600065b94f5dcccc51fe020ff3d3abfe891dd Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Thu, 9 Jul 2026 16:37:45 +0200 Subject: [PATCH 02/17] pc-config test runs --- cpp/cmake/templates/dolfinx.pc.in | 2 +- cpp/dolfinx/CMakeLists.txt | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/cpp/cmake/templates/dolfinx.pc.in b/cpp/cmake/templates/dolfinx.pc.in index b2648c195e..2020e71019 100644 --- a/cpp/cmake/templates/dolfinx.pc.in +++ b/cpp/cmake/templates/dolfinx.pc.in @@ -12,4 +12,4 @@ Version: @DOLFINX_VERSION@ Requires: @PKG_REQUIRES@ Conflicts: Libs: @PKG_LINKFLAGS@ -L${libdir} -ldolfinx -Cflags: @PKG_CXXFLAGS@ -DDOLFINX_VERSION=\"@DOLFINX_VERSION@\" ${definitions} -I${includedir} @PKG_INCLUDES@ +Cflags: @PKG_CXXFLAGS@ ${definitions} -I${includedir} @PKG_INCLUDES@ diff --git a/cpp/dolfinx/CMakeLists.txt b/cpp/dolfinx/CMakeLists.txt index b3054fd5e5..9c65d16ef9 100644 --- a/cpp/dolfinx/CMakeLists.txt +++ b/cpp/dolfinx/CMakeLists.txt @@ -291,8 +291,13 @@ get_target_property( get_target_property( PKGCONFIG_DOLFINX_INCLUDE_DIRECTORIES dolfinx - INTERFACE_SYSTEM_INCLUDE_DIRECTORIES + INTERFACE_INCLUDE_DIRECTORIES ) +if(PKGCONFIG_DOLFINX_INCLUDE_DIRECTORIES) + list(FILTER PKGCONFIG_DOLFINX_INCLUDE_DIRECTORIES EXCLUDE REGEX "^\\$<|>$") +else() + set(PKGCONFIG_DOLFINX_INCLUDE_DIRECTORIES "") +endif() # Add imported targets to lists for creating pkg-config file set(PKGCONFIG_DOLFINX_LIBS) From 4b3e7000a2ee5f1277a5954c607fe33e4a0ce575 Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Thu, 9 Jul 2026 16:46:13 +0200 Subject: [PATCH 03/17] Get right C++ standard --- cpp/dolfinx/CMakeLists.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/cpp/dolfinx/CMakeLists.txt b/cpp/dolfinx/CMakeLists.txt index 9c65d16ef9..a52f77ac1c 100644 --- a/cpp/dolfinx/CMakeLists.txt +++ b/cpp/dolfinx/CMakeLists.txt @@ -279,6 +279,9 @@ endif() if(TARGET PkgConfig::SLEPC) list(APPEND PKG_REQUIRES ${SLEPC_MODULE_NAME}) endif() +if(TARGET PkgConfig::SUPERLU_DIST) + list(APPEND PKG_REQUIRES ${SUPERLU_DIST_MODULE_NAME}) +endif() string(REPLACE ";" " " PKG_REQUIRES "${PKG_REQUIRES}") @@ -377,6 +380,10 @@ endforeach() # Convert compiler flags and definitions into space separated strings string(REPLACE ";" " " PKG_CXXFLAGS "${CMAKE_CXX_FLAGS}") +get_target_property(_cxx_standard dolfinx CXX_STANDARD) +if(_cxx_standard) + string(APPEND PKG_CXXFLAGS " -std=c++${_cxx_standard}") +endif() string(REPLACE ";" " " PKG_LINKFLAGS "${CMAKE_EXE_LINKER_FLAGS}") # Convert libraries to -L -l form From c3556cbb04a0db96e9c28f79f76c9478c75a5f17 Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Thu, 9 Jul 2026 16:50:16 +0200 Subject: [PATCH 04/17] Add unit testing --- .github/workflows/ccpp.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/.github/workflows/ccpp.yml b/.github/workflows/ccpp.yml index a3c1070b66..99c8676a9e 100644 --- a/.github/workflows/ccpp.yml +++ b/.github/workflows/ccpp.yml @@ -124,6 +124,12 @@ jobs: sudo cmake --install . sudo ldconfig + - name: Run pkg-config test (C++) + working-directory: cpp/test/pkgconfig-test + run: | + make + make run + - name: Run tests via target (C++, serial and parallel) working-directory: cpp/build run: cmake --build . --target test @@ -222,6 +228,13 @@ jobs: cmake -B build -S . -DCMAKE_BUILD_TYPE=Developer -GNinja cmake --build build + - name: Run pkg-config test (C++) + working-directory: cpp/test/pkgconfig-test + run: | + export PKG_CONFIG_PATH=$PETSC_DIR/$PETSC_ARCH/lib/pkgconfig:$PKG_CONFIG_PATH + make + make run + - name: Run tests (C++, serial) working-directory: cpp/test/build run: ctest -V --output-on-failure -R unittests_np_1 From dd77ae2328b371a1404cfbfba76fa668208cde1f Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Thu, 9 Jul 2026 17:21:24 +0200 Subject: [PATCH 05/17] Rename folder --- cpp/test/{pkgconfig-test => pkgconfig}/main.cpp | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename cpp/test/{pkgconfig-test => pkgconfig}/main.cpp (100%) diff --git a/cpp/test/pkgconfig-test/main.cpp b/cpp/test/pkgconfig/main.cpp similarity index 100% rename from cpp/test/pkgconfig-test/main.cpp rename to cpp/test/pkgconfig/main.cpp From dffec995421e8e0db4a9a22905df958731ffeecd Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Thu, 9 Jul 2026 17:21:37 +0200 Subject: [PATCH 06/17] Add Makefile --- cpp/test/pkgconfig/Makefile | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 cpp/test/pkgconfig/Makefile diff --git a/cpp/test/pkgconfig/Makefile b/cpp/test/pkgconfig/Makefile new file mode 100644 index 0000000000..7569c63d4e --- /dev/null +++ b/cpp/test/pkgconfig/Makefile @@ -0,0 +1,14 @@ +CXX = mpicxx +CXXFLAGS = $(shell pkg-config --cflags dolfinx) +LDFLAGS = $(shell pkg-config --libs dolfinx) -Wl,-rpath,$(shell pkg-config --variable=libdir dolfinx) + +main: main.cpp + $(CXX) $(CXXFLAGS) $< -o $@ $(LDFLAGS) + +run: main + mpiexec -np 1 ./main + +clean: + rm -f main + +.PHONY: run clean From bdfd56d201ae758c75d3881b603784f1bade30a4 Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Thu, 9 Jul 2026 17:25:27 +0200 Subject: [PATCH 07/17] Split out into build and link steps --- cpp/test/pkgconfig/Makefile | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/cpp/test/pkgconfig/Makefile b/cpp/test/pkgconfig/Makefile index 7569c63d4e..8daaac6f66 100644 --- a/cpp/test/pkgconfig/Makefile +++ b/cpp/test/pkgconfig/Makefile @@ -1,14 +1,18 @@ CXX = mpicxx CXXFLAGS = $(shell pkg-config --cflags dolfinx) -LDFLAGS = $(shell pkg-config --libs dolfinx) -Wl,-rpath,$(shell pkg-config --variable=libdir dolfinx) +LDLIBS = $(shell pkg-config --libs dolfinx) +LDFLAGS = -Wl,-rpath,$(shell pkg-config --variable=libdir dolfinx) -main: main.cpp - $(CXX) $(CXXFLAGS) $< -o $@ $(LDFLAGS) +main.o: main.cpp + $(CXX) $(CXXFLAGS) -c $< -o $@ + +main: main.o + $(CXX) $(LDFLAGS) $< -o $@ $(LDLIBS) run: main mpiexec -np 1 ./main clean: - rm -f main + rm -f main main.o .PHONY: run clean From 65bce81c37f24ce6c78e3ca8daa6958a5a3f3781 Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Thu, 9 Jul 2026 20:03:11 +0200 Subject: [PATCH 08/17] Get compiler from pkgconfig --- cpp/test/pkgconfig/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/test/pkgconfig/Makefile b/cpp/test/pkgconfig/Makefile index 8daaac6f66..7be00ea9f3 100644 --- a/cpp/test/pkgconfig/Makefile +++ b/cpp/test/pkgconfig/Makefile @@ -1,4 +1,4 @@ -CXX = mpicxx +CXX = $(shell pkg-config --variable compiler dolfinx) CXXFLAGS = $(shell pkg-config --cflags dolfinx) LDLIBS = $(shell pkg-config --libs dolfinx) LDFLAGS = -Wl,-rpath,$(shell pkg-config --variable=libdir dolfinx) From 9d6ceaf62434da91822ebb7eff59247a5af21818 Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Thu, 9 Jul 2026 20:10:31 +0200 Subject: [PATCH 09/17] fix path --- .github/workflows/ccpp.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ccpp.yml b/.github/workflows/ccpp.yml index 99c8676a9e..c7054b4935 100644 --- a/.github/workflows/ccpp.yml +++ b/.github/workflows/ccpp.yml @@ -125,7 +125,7 @@ jobs: sudo ldconfig - name: Run pkg-config test (C++) - working-directory: cpp/test/pkgconfig-test + working-directory: cpp/test/pkgconfig run: | make make run @@ -229,7 +229,7 @@ jobs: cmake --build build - name: Run pkg-config test (C++) - working-directory: cpp/test/pkgconfig-test + working-directory: cpp/test/pkgconfig run: | export PKG_CONFIG_PATH=$PETSC_DIR/$PETSC_ARCH/lib/pkgconfig:$PKG_CONFIG_PATH make From 4e4dee69a836a8659705f32888b42f2711c37768 Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Thu, 9 Jul 2026 20:33:30 +0200 Subject: [PATCH 10/17] Add SLEPc package config path --- .github/workflows/ccpp.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ccpp.yml b/.github/workflows/ccpp.yml index c7054b4935..b49aef479c 100644 --- a/.github/workflows/ccpp.yml +++ b/.github/workflows/ccpp.yml @@ -231,7 +231,7 @@ jobs: - name: Run pkg-config test (C++) working-directory: cpp/test/pkgconfig run: | - export PKG_CONFIG_PATH=$PETSC_DIR/$PETSC_ARCH/lib/pkgconfig:$PKG_CONFIG_PATH + export PKG_CONFIG_PATH=$PETSC_DIR/$PETSC_ARCH/lib/pkgconfig:$SLEPC_DIR/$PETSC_ARCH/lib/pkgconfig:$PKG_CONFIG_PATH make make run From 64a469320aff33eaf0a13c769188576576732f8d Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Thu, 9 Jul 2026 22:20:38 +0200 Subject: [PATCH 11/17] Use Basix pkgconfig --- cpp/dolfinx/CMakeLists.txt | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/cpp/dolfinx/CMakeLists.txt b/cpp/dolfinx/CMakeLists.txt index a52f77ac1c..fef9f074eb 100644 --- a/cpp/dolfinx/CMakeLists.txt +++ b/cpp/dolfinx/CMakeLists.txt @@ -272,6 +272,7 @@ install( # Define packages that should be required by pkg-config file set(PKG_REQUIRES "spdlog") +list(APPEND PKG_REQUIRES "basix") if(TARGET PkgConfig::PETSC) list(APPEND PKG_REQUIRES ${PETSC_MODULE_NAME}) @@ -365,15 +366,6 @@ foreach(_def ${PKG_DOLFINX_DEFINITIONS}) set(PKG_DEFINITIONS "${PKG_DEFINITIONS} -D${_def}") endforeach() -# Get basix definitions (this is required to propagate Basix definition to the -# pkg-config file, in the future Basix should create its own basix.pc file, see -# https://github.com/FEniCS/basix/issues/204) -get_target_property( - PKG_BASIX_DEFINITIONS - Basix::basix - INTERFACE_COMPILE_DEFINITIONS -) - foreach(_def ${PKG_BASIX_DEFINITIONS}) set(PKG_DEFINITIONS "${PKG_DEFINITIONS} -D${_def}") endforeach() From e21c18cf489db7af699dc106f027e0d18f1d6678 Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Thu, 9 Jul 2026 22:21:19 +0200 Subject: [PATCH 12/17] Use basix pc file --- .github/workflows/fenicsx-refs.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/fenicsx-refs.env b/.github/workflows/fenicsx-refs.env index 22c7e44a7e..6bb88a4bfb 100644 --- a/.github/workflows/fenicsx-refs.env +++ b/.github/workflows/fenicsx-refs.env @@ -1,5 +1,5 @@ basix_repository=FEniCS/basix -basix_ref=main +basix_ref=jhale/add-pkgconfig ufl_repository=FEniCS/ufl ufl_ref=main ffcx_repository=FEniCS/ffcx From 9ea2d5d83ff7626ff53b2a5aaff6d1d3c2b8edb1 Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Thu, 9 Jul 2026 22:25:47 +0200 Subject: [PATCH 13/17] Remove basix hacks --- cpp/dolfinx/CMakeLists.txt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/cpp/dolfinx/CMakeLists.txt b/cpp/dolfinx/CMakeLists.txt index fef9f074eb..09bc42a486 100644 --- a/cpp/dolfinx/CMakeLists.txt +++ b/cpp/dolfinx/CMakeLists.txt @@ -366,10 +366,6 @@ foreach(_def ${PKG_DOLFINX_DEFINITIONS}) set(PKG_DEFINITIONS "${PKG_DEFINITIONS} -D${_def}") endforeach() -foreach(_def ${PKG_BASIX_DEFINITIONS}) - set(PKG_DEFINITIONS "${PKG_DEFINITIONS} -D${_def}") -endforeach() - # Convert compiler flags and definitions into space separated strings string(REPLACE ";" " " PKG_CXXFLAGS "${CMAKE_CXX_FLAGS}") get_target_property(_cxx_standard dolfinx CXX_STANDARD) From 1fa7073b3184a7e5951a6b16e3d06552534b4254 Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Thu, 9 Jul 2026 22:32:30 +0200 Subject: [PATCH 14/17] Handle ADIOS2 --- cpp/dolfinx/CMakeLists.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/cpp/dolfinx/CMakeLists.txt b/cpp/dolfinx/CMakeLists.txt index 09bc42a486..30fad2ee4b 100644 --- a/cpp/dolfinx/CMakeLists.txt +++ b/cpp/dolfinx/CMakeLists.txt @@ -341,6 +341,16 @@ foreach(_target ${PKGCONFIG_DOLFINX_TARGET_LINK_LIBRARIES}) list(APPEND PKGCONFIG_DOLFINX_LIBS ${_libs}) endif() endif() + + # Special handling for ADIOS2 imported targets which expose + # IMPORTED_LOCATION_RELEASE rather than INTERFACE_LINK_LIBRARIES + if("${_target}" MATCHES "^.*adios2::.*$") + get_target_property(_libs ${_target} IMPORTED_LOCATION_RELEASE) + + if(_libs) + list(APPEND PKGCONFIG_DOLFINX_LIBS ${_libs}) + endif() + endif() endif() endforeach() From f83f1b0225933796efb2a342052a74e45d9d01fa Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Thu, 9 Jul 2026 22:40:05 +0200 Subject: [PATCH 15/17] Fix HDF5 and ADIOS2 --- cpp/dolfinx/CMakeLists.txt | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/cpp/dolfinx/CMakeLists.txt b/cpp/dolfinx/CMakeLists.txt index 30fad2ee4b..5c2e8ce115 100644 --- a/cpp/dolfinx/CMakeLists.txt +++ b/cpp/dolfinx/CMakeLists.txt @@ -342,11 +342,16 @@ foreach(_target ${PKGCONFIG_DOLFINX_TARGET_LINK_LIBRARIES}) endif() endif() - # Special handling for ADIOS2 imported targets which expose - # IMPORTED_LOCATION_RELEASE rather than INTERFACE_LINK_LIBRARIES - if("${_target}" MATCHES "^.*adios2::.*$") + # Special handling for ADIOS2 and HDF5 imported targets which expose + # IMPORTED_LOCATION_RELEASE (or IMPORTED_LOCATION) rather than + # INTERFACE_LINK_LIBRARIES + if("${_target}" MATCHES "^.*adios2::.*$" OR "${_target}" MATCHES "^.*hdf5::.*$") get_target_property(_libs ${_target} IMPORTED_LOCATION_RELEASE) + if(NOT _libs) + get_target_property(_libs ${_target} IMPORTED_LOCATION) + endif() + if(_libs) list(APPEND PKGCONFIG_DOLFINX_LIBS ${_libs}) endif() From f8e199912bb10d241e213950bedb0125e56fc152 Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Thu, 9 Jul 2026 22:43:16 +0200 Subject: [PATCH 16/17] Add pugixml --- cpp/dolfinx/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/cpp/dolfinx/CMakeLists.txt b/cpp/dolfinx/CMakeLists.txt index 5c2e8ce115..f37ddb63b2 100644 --- a/cpp/dolfinx/CMakeLists.txt +++ b/cpp/dolfinx/CMakeLists.txt @@ -273,6 +273,7 @@ install( # Define packages that should be required by pkg-config file set(PKG_REQUIRES "spdlog") list(APPEND PKG_REQUIRES "basix") +list(APPEND PKG_REQUIRES "pugixml") if(TARGET PkgConfig::PETSC) list(APPEND PKG_REQUIRES ${PETSC_MODULE_NAME}) From ea62e2edb9d1aeea83c5e8ca1e78c40ef94fd34a Mon Sep 17 00:00:00 2001 From: "Jack S. Hale" Date: Thu, 9 Jul 2026 22:53:12 +0200 Subject: [PATCH 17/17] Fix --- cpp/dolfinx/CMakeLists.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cpp/dolfinx/CMakeLists.txt b/cpp/dolfinx/CMakeLists.txt index f37ddb63b2..1831a31b79 100644 --- a/cpp/dolfinx/CMakeLists.txt +++ b/cpp/dolfinx/CMakeLists.txt @@ -346,7 +346,10 @@ foreach(_target ${PKGCONFIG_DOLFINX_TARGET_LINK_LIBRARIES}) # Special handling for ADIOS2 and HDF5 imported targets which expose # IMPORTED_LOCATION_RELEASE (or IMPORTED_LOCATION) rather than # INTERFACE_LINK_LIBRARIES - if("${_target}" MATCHES "^.*adios2::.*$" OR "${_target}" MATCHES "^.*hdf5::.*$") + if( + "${_target}" MATCHES "^.*adios2::.*$" + OR "${_target}" MATCHES "^.*hdf5::.*$" + ) get_target_property(_libs ${_target} IMPORTED_LOCATION_RELEASE) if(NOT _libs)