Skip to content

Commit 5c1776f

Browse files
Fix macOS build configuration
1 parent 2be231f commit 5c1776f

2 files changed

Lines changed: 44 additions & 24 deletions

File tree

.github/workflows/pytest-coverage.yml

Lines changed: 31 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -33,28 +33,21 @@ jobs:
3333
with:
3434
submodules: recursive
3535

36-
- name: (MacOs only) Install GNU GCC.
36+
- name: (MacOs only) Install build dependencies
3737
if: matrix.os == 'macos-latest'
3838
run: |
39-
brew install gcc libomp
40-
41-
- name: (MacOs only) Set CC/CXX environment variables to GNU GCC
42-
if: matrix.os == 'macos-latest'
43-
run: |
44-
45-
# Check GCC installation path. Brew installs GCC in /opt/homebrew/bin on Apple Silicon and /usr/local/bin on Intel.
46-
if [[ $(uname -m) = "arm64" ]]; then BREW_GCC_PATH="/opt/homebrew/bin"; else BREW_GCC_PATH="/usr/local/bin"; fi
47-
echo "GCC installed at $BREW_GCC_PATH"
48-
49-
# Set CC/CXX environment variables to GNU GCC
50-
echo "CC=$BREW_GCC_PATH/$(ls $BREW_GCC_PATH | grep ^gcc-[0-9] | sort -V -r | head -n 1)" >> $GITHUB_ENV
51-
echo "CXX=$BREW_GCC_PATH/$(ls $BREW_GCC_PATH | grep ^g++-[0-9] | sort -V -r | head -n 1)" >> $GITHUB_ENV
52-
echo "CC=${{ env.CC }}"
53-
echo "CXX=${{ env.CXX }}"
54-
55-
# Set MACOSX_DEPLOYMENT_TARGET to avoid version mismatch warnings
39+
# Install Homebrew LLVM toolchain with OpenMP support
40+
brew install llvm libomp
41+
if [[ $(uname -m) == "arm64" ]]; then BREW_PREFIX="/opt/homebrew"; else BREW_PREFIX="/usr/local"; fi
42+
echo "PATH=$BREW_PREFIX/opt/llvm/bin:$PATH" >> $GITHUB_ENV
43+
echo "CC=$BREW_PREFIX/opt/llvm/bin/clang" >> $GITHUB_ENV
44+
echo "CXX=$BREW_PREFIX/opt/llvm/bin/clang++" >> $GITHUB_ENV
45+
echo "LDFLAGS=-L$BREW_PREFIX/opt/libomp/lib" >> $GITHUB_ENV
46+
echo "CPPFLAGS=-I$BREW_PREFIX/opt/libomp/include" >> $GITHUB_ENV
47+
# Build only for the host architecture to avoid missing x86_64 libraries
48+
echo "ARCHFLAGS=-arch $(uname -m)" >> $GITHUB_ENV
49+
echo "CMAKE_OSX_ARCHITECTURES=$(uname -m)" >> $GITHUB_ENV
5650
echo "MACOSX_DEPLOYMENT_TARGET=$(sw_vers -productVersion)" >> $GITHUB_ENV
57-
echo "MACOSX_DEPLOYMENT_TARGET=${{ env.MACOSX_DEPLOYMENT_TARGET }}"
5851
5952
- name: Set up Python ${{ matrix.python-version }}
6053
uses: actions/setup-python@v4
@@ -70,13 +63,30 @@ jobs:
7063
run: python -m pip install --upgrade pip
7164

7265
- name: Install package verbosely
66+
env:
67+
CC: ${{ env.CC }}
68+
CXX: ${{ env.CXX }}
69+
LDFLAGS: ${{ env.LDFLAGS }}
70+
CPPFLAGS: ${{ env.CPPFLAGS }}
71+
PATH: ${{ env.PATH }}
72+
ARCHFLAGS: ${{ env.ARCHFLAGS }}
73+
CMAKE_OSX_ARCHITECTURES: ${{ env.CMAKE_OSX_ARCHITECTURES }}
74+
MACOSX_DEPLOYMENT_TARGET: ${{ env.MACOSX_DEPLOYMENT_TARGET }}
7375
run: |
74-
75-
touch .cov # Create a .cov file to trigger Cython compilation with coverage support
76+
touch .cov # Create a .cov file to trigger Cython compilation with coverage support
7677
ls
7778
python -m pip install -v -v .
7879
7980
- name: Test with pytest
81+
env:
82+
CC: ${{ env.CC }}
83+
CXX: ${{ env.CXX }}
84+
LDFLAGS: ${{ env.LDFLAGS }}
85+
CPPFLAGS: ${{ env.CPPFLAGS }}
86+
PATH: ${{ env.PATH }}
87+
ARCHFLAGS: ${{ env.ARCHFLAGS }}
88+
CMAKE_OSX_ARCHITECTURES: ${{ env.CMAKE_OSX_ARCHITECTURES }}
89+
MACOSX_DEPLOYMENT_TARGET: ${{ env.MACOSX_DEPLOYMENT_TARGET }}
8090
run: |
8191
python -m pip install cython==3.0.2 pytest-cov
8292
pytest --cov .

setup.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -400,10 +400,17 @@ def build_shared_lib(self, lib_name, build_info):
400400
lib_file = f"{get_lib_prefix()}{lib_name}{get_lib_suffix('shared')}"
401401

402402
if platform_system == 'Darwin':
403-
build_info['extra_link_args'].append(f"-Wl,-install_name,@loader_path/{lib_file}")
404-
self.compiler.linker_so = ['-dynamiclib' if val=='-bundle' else val for val in self.compiler.linker_so]
403+
orig_linker_so = self.compiler.linker_so
404+
self.compiler.linker_so = [
405+
'-dynamiclib' if val == '-bundle' else val
406+
for val in orig_linker_so
407+
]
408+
build_info['extra_link_args'].append(
409+
f"-Wl,-install_name,@loader_path/{lib_file}"
410+
)
411+
405412
self.compiler.link_shared_object(
406-
objects,
413+
objects,
407414
lib_file,
408415
output_dir = self.build_clib,
409416
target_lang = language,
@@ -412,6 +419,9 @@ def build_shared_lib(self, lib_name, build_info):
412419
extra_postargs = build_info['extra_link_args'],
413420
build_temp = self.build_temp,
414421
)
422+
423+
if platform_system == 'Darwin':
424+
self.compiler.linker_so = orig_linker_so
415425
# Post build
416426
build_info.update({
417427
'built_lib_files': [str(Path(self.build_clib).absolute() / lib_file)]

0 commit comments

Comments
 (0)