diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 57c93619..b12de263 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -9,7 +9,7 @@ jobs: build: strategy: matrix: - os: [ubuntu-latest, windows-latest] + os: [ubuntu-latest, windows-latest, macos-latest] ida_sdk: [74, 77, 80, 81, 82, 83] include: - ida_sdk: 74 @@ -28,18 +28,24 @@ jobs: ext: so - os: windows-latest ext: dll + - os: macos-latest + ext: dylib + exclude: + # We exclude these because ARM libraries were not available in 7.4 and the latest macos runner on GitHub are Mx machines + - os: macos-latest + ida_sdk: 74 runs-on: ${{ matrix.os }} steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4.1.1 - name: Setup cmake - uses: jwlawson/actions-setup-cmake@v1.12 + uses: jwlawson/actions-setup-cmake@959f1116cf9f1ae42fff8ec1a4aaae6d4a0e348b #v2.0.1 - - name: Install Ninja (Linux only) - if: ${{ matrix.os == 'ubuntu-latest' }} - uses: seanmiddleditch/gha-setup-ninja@master + - name: Install Ninja (Linux / MacOS) + if: ${{ matrix.os == 'ubuntu-latest' || matrix.os == 'macos-latest' }} + uses: seanmiddleditch/gha-setup-ninja@v4 - name: Prepare build environment (Linux) if: ${{ matrix.os == 'ubuntu-latest' }} @@ -52,6 +58,24 @@ jobs: [ -f third_party/$IDA_SDK_VERSION/include/regex.h ] && mv third_party/$IDA_SDK_VERSION/include/regex.h third_party/$IDA_SDK_VERSION/include/regex.bak cmake -B $CMAKE_BUILD_DIR -S $GITHUB_WORKSPACE -G Ninja -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DIdaSdk_ROOT_DIR=${GITHUB_WORKSPACE}/third_party/$IDA_SDK_VERSION + # We need to differentiate MacOS build from Linux because we want to use a specific compiler on MacOS + - name: Prepare build environment (MacOS) + if: ${{ matrix.os == 'macos-latest' }} + env: + IDA_SDK_VERSION: idasdk${{ matrix.ida_sdk }} + IDA_SDK_PASSWORD: ${{ secrets[matrix.sdk_password] }} + CMAKE_BUILD_DIR: build${{ matrix.ida_sdk }} + run: | + [ ! -d third_party/$IDA_SDK_VERSION ] && unzip -d third_party -P $IDA_SDK_PASSWORD third_party/$IDA_SDK_VERSION.zip + [ -f third_party/$IDA_SDK_VERSION/include/regex.h ] && mv third_party/$IDA_SDK_VERSION/include/regex.h third_party/$IDA_SDK_VERSION/include/regex.bak + cmake -B $CMAKE_BUILD_DIR \ + -S $GITHUB_WORKSPACE \ + -G Ninja \ + -DCMAKE_BUILD_TYPE=${BUILD_TYPE} \ + -DIdaSdk_ROOT_DIR=${GITHUB_WORKSPACE}/third_party/$IDA_SDK_VERSION \ + -DCMAKE_C_COMPILER=$(brew --prefix llvm@15)/bin/clang \ + -DCMAKE_CXX_COMPILER=$(brew --prefix llvm@15)/bin/clang++ + - name: Prepare build environment (Windows) if: ${{ matrix.os == 'windows-latest' }} env: @@ -80,19 +104,18 @@ jobs: # We need one action per file # See https://github.com/actions/upload-artifact/issues/331 - name: Upload Artifacts (64) - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v4.3.1 with: name: idaplugin-${{ matrix.os }}-${{ matrix.ida_sdk }} path: ${{ matrix.ida_sdk }}-quokka_plugin0064.${{ matrix.ext }} if-no-files-found: error - name: Upload Artifacts (32) - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v4.3.1 with: name: idaplugin-${{ matrix.os }}-${{ matrix.ida_sdk }}-32 path: ${{ matrix.ida_sdk }}-quokka_plugin0032.${{ matrix.ext }} if-no-files-found: error - upload: name: Upload artifacts for Release @@ -102,21 +125,28 @@ jobs: strategy: matrix: - os: [ubuntu-latest, windows-latest] + os: [ubuntu-latest, windows-latest, macos-latest] ida_sdk: [74, 77, 80, 81, 82, 83] + bitness: ['', '-32'] include: - os: windows-latest ext: dll - os: ubuntu-latest ext: so + - os: macos-latest + ext: dylib + exclude: + - os: macos-latest + ida_sdk: 74 + steps: - name: Download Artefact - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4.1.4 with: - name: idaplugin-${{ matrix.os }}-${{ matrix.ida_sdk }} + name: idaplugin-${{ matrix.os }}-${{ matrix.ida_sdk }}${{ matrix.bitness }} - name: Release - uses: softprops/action-gh-release@v0.1.14 + uses: softprops/action-gh-release@9d7c94cfd0a1f3ed45544c887983e9fa900f0564 #v2.0.4 with: files: ${{ matrix.ida_sdk }}-quokka_* fail_on_unmatched_files: true diff --git a/CMakeLists.txt b/CMakeLists.txt index a16e7341..e80f4c0a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,7 +18,7 @@ project(quokka list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) include(FetchContent) -include(CMakePrintHelpers) +include(CheckLinkerFlag) include(GoogleTest) if (PROJECT_SOURCE_DIR STREQUAL PROJECT_BINARY_DIR) @@ -49,12 +49,17 @@ if (UNIX) -gfull -Wno-nullability-completeness ) + + # Originates from google/binexport + # https://github.com/google/binexport/blob/85c89a4ab96febcccc4cdc01ca5fc6c005e9a2cf/cmake/CompileOptions.cmake#L71-L74 + check_linker_flag(CXX "LINKER:-ld_classic" _ld_classic_supported) + if(_ld_classic_supported) + add_link_options(LINKER:-ld_classic) + endif() + add_link_options( -dead_strip - # Work around assertion failure with LTO symbols - # https://developer.apple.com/documentation/xcode-release-notes/xcode-15-release-notes#Linking - LINKER:-ld_classic - ) + ) else() endif() elseif(WIN32)