From 031c63c4b2136ec332dfd6ef8d77f5e866cec3c1 Mon Sep 17 00:00:00 2001 From: Tal Regev Date: Fri, 13 Oct 2023 07:45:34 +0300 Subject: [PATCH] Add vcpkg ci --- .github/workflows/linux.yml | 100 ++++++++++++++ .github/workflows/osx.yml | 108 +++++++++++++++ .github/workflows/windows.yml | 124 ++++++++++++++++++ .gitignore | 1 + cmake/HandleMetis.cmake | 7 +- .../cmake/FindGeographicLib.cmake | 15 ++- gtsam/3rdparty/vcpkg/manifest/vcpkg.json | 29 ++++ gtsam/3rdparty/vcpkg/triplets/.gitkeep | 0 8 files changed, 374 insertions(+), 10 deletions(-) create mode 100644 .github/workflows/linux.yml create mode 100644 .github/workflows/osx.yml create mode 100644 .github/workflows/windows.yml create mode 100644 gtsam/3rdparty/vcpkg/manifest/vcpkg.json create mode 100644 gtsam/3rdparty/vcpkg/triplets/.gitkeep diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml new file mode 100644 index 0000000000..8abe053542 --- /dev/null +++ b/.github/workflows/linux.yml @@ -0,0 +1,100 @@ +name: Linux +on: + pull_request: + branches: + - "*" # Pull request for all branches + schedule: + - cron: '10 12 * * 0' + +# Every time you make a push to your PR, it cancel immediately the previous checks, +# and start a new one. The other runner will be available more quickly to your PR. +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + build: + name: vcpkg-ubuntu-${{ matrix.type }} + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + include: + - type: x64 + BUILD_DIR: gtsam/3rdparty/vcpkg/cache + VCPKG_ROOT: gtsam/3rdparty/vcpkg/cache/vcpkg + VCPKG_LINK: https://github.com/microsoft/vcpkg/ + VCPKG_CONFIGS: gtsam/3rdparty/vcpkg + BINARY_CACHE: gtsam/3rdparty/cache/linux + env: + BUILD_DIR: ${{ matrix.BUILD_DIR }} + VCPKG_ROOT: ${{ matrix.VCPKG_ROOT }} + VCPKG_LINK: ${{ matrix.VCPKG_LINK }} + VCPKG_CONFIGS: ${{ matrix.VCPKG_CONFIGS }} + BINARY_CACHE: ${{ matrix.BINARY_CACHE }} + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Cache dependencies + uses: actions/cache/restore@v3 + with: + path: | + ${{ matrix.BINARY_CACHE }} + key: linux-${{ hashFiles('.github/workflows/linux.yml') }} + restore-keys: linux-${{ hashFiles('.github/workflows/linux.yml') }} + + - name: Install ninja + if: success() + run: | + sudo apt install -y ninja-build + ninja --version + whereis ninja + + - name: Init vcpkg + if: success() + run: | + mkdir -p $BUILD_DIR + git -C $BUILD_DIR clone $VCPKG_LINK + + - name: Vcpkg build & cmake config + if: success() + run: | + export VCPKG_BINARY_SOURCES="clear;files,$PWD/$BINARY_CACHE,readwrite;" + mkdir -p $BINARY_CACHE + export CMAKE_GENERATOR=Ninja + cmake . -B build \ + -DCMAKE_TOOLCHAIN_FILE=$VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake \ + -DVCPKG_MANIFEST_DIR=$VCPKG_CONFIGS/manifest \ + -DVCPKG_INSTALLED_DIR=$VCPKG_ROOT/installed \ + -DVCPKG_OVERLAY_TRIPLETS=$VCPKG_CONFIGS/triplets \ + -DVCPKG_TARGET_TRIPLET=x64-linux-release \ + -DVCPKG_INSTALL_OPTIONS=--clean-after-build \ + -DGTSAM_BUILD_EXAMPLES_ALWAYS=ON \ + -DGTSAM_ROT3_EXPMAP=ON \ + -DGTSAM_POSE3_EXPMAP=ON \ + -DGTSAM_BUILD_PYTHON=ON \ + -DGTSAM_BUILD_TESTS=ON \ + -DGTSAM_BUILD_UNSTABLE=ON \ + -DGTSAM_USE_SYSTEM_EIGEN=ON \ + -DGTSAM_USE_SYSTEM_METIS=ON \ + -DGTSAM_SUPPORT_NESTED_DISSECTION=ON + + - name: Save cache dependencies + id: cache-save + uses: actions/cache/save@v3 + with: + path: | + ${{ matrix.BINARY_CACHE }} + key: linux-${{ hashFiles('.github/workflows/linux.yml') }}-${{ hashFiles('gtsam/3rdparty/vcpkg/cache/vcpkg/installed/vcpkg/updates/*') }} + + + - name: Cmake build + if: success() + run: | + cmake --build build --config Release -j 2 + + - name: Run tests + if: success() + run: | + cmake --build build --target check -j 2 diff --git a/.github/workflows/osx.yml b/.github/workflows/osx.yml new file mode 100644 index 0000000000..b8e98bb4e9 --- /dev/null +++ b/.github/workflows/osx.yml @@ -0,0 +1,108 @@ +name: OSX +on: + pull_request: + branches: + - "*" # Pull request for all branches + schedule: + - cron: '10 12 * * 0' + +# Every time you make a push to your PR, it cancel immediately the previous checks, +# and start a new one. The other runner will be available more quickly to your PR. +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + build: + name: vcpkg-macos-${{ matrix.type }} + runs-on: macos-latest + strategy: + fail-fast: false + matrix: + include: + - type: x64 + BUILD_DIR: gtsam/3rdparty/vcpkg/cache + VCPKG_ROOT: gtsam/3rdparty/vcpkg/cache/vcpkg + VCPKG_LINK: https://github.com/microsoft/vcpkg/ + VCPKG_CONFIGS: gtsam/3rdparty/vcpkg + BINARY_CACHE: gtsam/3rdparty/cache/osx + env: + BUILD_DIR: ${{ matrix.BUILD_DIR }} + VCPKG_ROOT: ${{ matrix.VCPKG_ROOT }} + VCPKG_LINK: ${{ matrix.VCPKG_LINK }} + VCPKG_CONFIGS: ${{ matrix.VCPKG_CONFIGS }} + BINARY_CACHE: ${{ matrix.BINARY_CACHE }} + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Cache dependencies + uses: actions/cache/restore@v3 + with: + path: | + ${{ matrix.BINARY_CACHE }} + key: osx-${{ hashFiles('.github/workflows/osx.yml') }} + restore-keys: osx-${{ hashFiles('.github/workflows/osx.yml') }} + + - name: Install Dependencies + run: | + sudo xcode-select -switch /Applications/Xcode.app + + - name: Install python packages + if: success() + run: | + pip3 install pyparsing + + - name: Install ninja + if: success() + run: | + brew install ninja + ninja --version + whereis ninja + + - name: Init vcpkg + if: success() + run: | + mkdir -p $BUILD_DIR + git -C $BUILD_DIR clone $VCPKG_LINK + + - name: Vcpkg build & cmake config + if: success() + run: | + export VCPKG_BINARY_SOURCES="clear;files,$PWD/$BINARY_CACHE,readwrite;" + mkdir -p $BINARY_CACHE + export CMAKE_GENERATOR=Ninja + cmake . -B build \ + -DCMAKE_TOOLCHAIN_FILE=$VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake \ + -DVCPKG_MANIFEST_DIR=$VCPKG_CONFIGS/manifest \ + -DVCPKG_INSTALLED_DIR=$VCPKG_ROOT/installed \ + -DVCPKG_OVERLAY_TRIPLETS=$VCPKG_CONFIGS/triplets \ + -DVCPKG_TARGET_TRIPLET=x64-osx-release \ + -DVCPKG_INSTALL_OPTIONS=--clean-after-build \ + -DGTSAM_BUILD_EXAMPLES_ALWAYS=ON \ + -DGTSAM_ROT3_EXPMAP=ON \ + -DGTSAM_POSE3_EXPMAP=ON \ + -DGTSAM_BUILD_PYTHON=ON \ + -DGTSAM_BUILD_TESTS=ON \ + -DGTSAM_BUILD_UNSTABLE=ON \ + -DGTSAM_USE_SYSTEM_EIGEN=ON \ + -DGTSAM_USE_SYSTEM_METIS=ON \ + -DGTSAM_SUPPORT_NESTED_DISSECTION=ON + + - name: Save cache dependencies + id: cache-save + uses: actions/cache/save@v3 + with: + path: | + ${{ matrix.BINARY_CACHE }} + key: osx-${{ hashFiles('.github/workflows/osx.yml') }}-${{ hashFiles('gtsam/3rdparty/vcpkg/cache/vcpkg/installed/vcpkg/updates/*') }} + + - name: Cmake build + if: success() + run: | + cmake --build build --config Release -j 2 + + - name: Run tests + if: success() + run: | + cmake --build build --target check -j 2 diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml new file mode 100644 index 0000000000..fb2abffed6 --- /dev/null +++ b/.github/workflows/windows.yml @@ -0,0 +1,124 @@ +name: Windows +on: + pull_request: + branches: + - "*" # Pull request for all branches + schedule: + - cron: '10 12 * * 0' + +# Every time you make a push to your PR, it cancel immediately the previous checks, +# and start a new one. The other runner will be available more quickly to your PR. +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + build: + name: vcpkg-windows-${{ matrix.type }} + runs-on: windows-latest + strategy: + fail-fast: false + matrix: + include: + - type: x64 + BUILD_DIR: gtsam\3rdparty\vcpkg\cache + VCPKG_ROOT: gtsam\3rdparty\vcpkg\cache\vcpkg + VCPKG_LINK: https://github.com/microsoft/vcpkg/ + VCPKG_CONFIGS: gtsam\3rdparty\vcpkg + BINARY_CACHE: gtsam\3rdparty\vcpkg\cache\windows + env: + BUILD_DIR: ${{ matrix.BUILD_DIR }} + VCPKG_ROOT: ${{ matrix.VCPKG_ROOT }} + VCPKG_LINK: ${{ matrix.VCPKG_LINK }} + VCPKG_CONFIGS: ${{ matrix.VCPKG_CONFIGS }} + BINARY_CACHE: ${{ matrix.BINARY_CACHE }} + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Restore cache dependencies + uses: actions/cache/restore@v3 + with: + path: | + ${{ matrix.BINARY_CACHE }} + key: windows-${{ hashFiles('.github/workflows/windows.yml') }} + restore-keys: windows-${{ hashFiles('.github/workflows/windows.yml') }} + + - name: Setup msbuild + uses: ilammy/msvc-dev-cmd@v1 + with: + arch: x64 + + - name: Install python packages + if: success() + shell: cmd + run: | + choco install python311 + where python3.11.exe + C:\ProgramData\Chocolatey\bin\python3.11.exe -m pip --version + C:\ProgramData\chocolatey\bin\python3.11.exe -m pip install pyparsing + + - name: Install ninja + if: success() + shell: cmd + run: | + choco install ninja + ninja --version + where ninja + + - name: Fix vcpkg + run: vcpkg.exe integrate remove + + - name: Init vcpkg + if: success() + shell: cmd + run: | + mkdir -p %BUILD_DIR% + git -C %BUILD_DIR% clone %VCPKG_LINK% + + - name: Vcpkg build & cmake config + if: success() + shell: cmd + run: | + set VCPKG_ROOT=${{ matrix.VCPKG_ROOT }} + set VCPKG_BINARY_SOURCES=clear;files,%CD%\%BINARY_CACHE%,readwrite; + mkdir %BINARY_CACHE% + set CMAKE_GENERATOR=Ninja + set CL=-openmp:experimental + cmake . -B build ^ + -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%\scripts\buildsystems\vcpkg.cmake ^ + -DVCPKG_MANIFEST_DIR=%VCPKG_CONFIGS%\manifest ^ + -DVCPKG_INSTALLED_DIR=%VCPKG_ROOT%\installed ^ + -DVCPKG_OVERLAY_TRIPLETS=%VCPKG_CONFIGS%\triplets ^ + -DVCPKG_TARGET_TRIPLET=x64-windows ^ + -DVCPKG_INSTALL_OPTIONS=--clean-after-build ^ + -DGTSAM_BUILD_EXAMPLES_ALWAYS=ON ^ + -DGTSAM_ROT3_EXPMAP=ON ^ + -DGTSAM_POSE3_EXPMAP=ON ^ + -DGTSAM_BUILD_PYTHON=OFF ^ + -DGTSAM_BUILD_TESTS=ON ^ + -DGTSAM_BUILD_UNSTABLE=OFF ^ + -DGTSAM_USE_SYSTEM_EIGEN=ON ^ + -DGTSAM_USE_SYSTEM_METIS=ON ^ + -DGTSAM_SUPPORT_NESTED_DISSECTION=ON + + - name: Save cache dependencies + id: cache-save + uses: actions/cache/save@v3 + with: + path: | + ${{ matrix.BINARY_CACHE }} + key: windows-${{ hashFiles('.github/workflows/windows.yml') }}-${{ hashFiles('gtsam\3rdparty\vcpkg\cache\vcpkg\installed\vcpkg\updates\*') }} + + - name: Cmake build + if: success() + shell: cmd + run: | + cmake --build build --config Release -j 2 + + - name: Run tests + if: success() + shell: cmd + run: | + :: Tests compile for windows and some of them fail. Need to be fixed and can remove this comments. + cmake --build build --target check -j 1 diff --git a/.gitignore b/.gitignore index e3f7613fee..2db05da938 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,4 @@ CMakeLists.txt.user* xcode/ /Dockerfile /python/gtsam/notebooks/.ipynb_checkpoints/ellipses-checkpoint.ipynb +gtsam/3rdparty/vcpkg/cache diff --git a/cmake/HandleMetis.cmake b/cmake/HandleMetis.cmake index 5cbec4ff58..10dbb53de5 100644 --- a/cmake/HandleMetis.cmake +++ b/cmake/HandleMetis.cmake @@ -13,10 +13,9 @@ option(GTSAM_USE_SYSTEM_METIS "Find and use system-installed libmetis. If 'off', if(GTSAM_USE_SYSTEM_METIS) # Debian package: libmetis-dev - find_path(METIS_INCLUDE_DIR metis.h REQUIRED) - find_library(METIS_LIBRARY metis REQUIRED) + find_package(metis CONFIG REQUIRED) - if(METIS_INCLUDE_DIR AND METIS_LIBRARY) + if(metis_FOUND) mark_as_advanced(METIS_INCLUDE_DIR) mark_as_advanced(METIS_LIBRARY) @@ -27,7 +26,7 @@ if(GTSAM_USE_SYSTEM_METIS) $ $ ) - target_link_libraries(metis-gtsam-if INTERFACE ${METIS_LIBRARY}) + target_link_libraries(metis-gtsam-if INTERFACE ${METIS_LIBRARY} metis) endif() else() # Bundled version: diff --git a/gtsam/3rdparty/GeographicLib/cmake/FindGeographicLib.cmake b/gtsam/3rdparty/GeographicLib/cmake/FindGeographicLib.cmake index 58932cc70f..0d27617ee3 100644 --- a/gtsam/3rdparty/GeographicLib/cmake/FindGeographicLib.cmake +++ b/gtsam/3rdparty/GeographicLib/cmake/FindGeographicLib.cmake @@ -6,8 +6,11 @@ # GeographicLib_LIBRARIES = /usr/local/lib/libGeographic.so # GeographicLib_LIBRARY_DIRS = /usr/local/lib -find_library (GeographicLib_LIBRARIES Geographic - PATHS "${CMAKE_INSTALL_PREFIX}/../GeographicLib/lib") +find_package(GeographicLib CONFIG) +if(NOT GeographicLib_FOUND) + find_library (GeographicLib_LIBRARIES Geographic + PATHS "${CMAKE_INSTALL_PREFIX}/../GeographicLib/lib") +endif() if (GeographicLib_LIBRARIES) get_filename_component (GeographicLib_LIBRARY_DIRS @@ -32,9 +35,9 @@ if (GeographicLib_LIBRARIES) unset (_ROOT_DIR) endif () -include (FindPackageHandleStandardArgs) -find_package_handle_standard_args (GeographicLib DEFAULT_MSG - GeographicLib_LIBRARY_DIRS GeographicLib_LIBRARIES - GeographicLib_INCLUDE_DIRS) +# include (FindPackageHandleStandardArgs) +# find_package_handle_standard_args (GeographicLib DEFAULT_MSG +# GeographicLib_LIBRARY_DIRS GeographicLib_LIBRARIES +# GeographicLib_INCLUDE_DIRS) mark_as_advanced (GeographicLib_LIBRARY_DIRS GeographicLib_LIBRARIES GeographicLib_INCLUDE_DIRS) diff --git a/gtsam/3rdparty/vcpkg/manifest/vcpkg.json b/gtsam/3rdparty/vcpkg/manifest/vcpkg.json new file mode 100644 index 0000000000..fee414ea7b --- /dev/null +++ b/gtsam/3rdparty/vcpkg/manifest/vcpkg.json @@ -0,0 +1,29 @@ +{ + "name": "gtsam", + "description": "Georgia Tech Smoothing and Mapping Library.", + "homepage": "gtsam.org", + "dependencies": [ + "boost-assign", + "boost-bimap", + "boost-chrono", + "boost-date-time", + "boost-filesystem", + "boost-format", + "boost-graph", + "boost-math", + "boost-program-options", + "boost-regex", + "boost-serialization", + "boost-system", + "boost-thread", + "boost-timer", + "eigen3", + "metis", + "tbb", + "geographiclib", + { + "name":"intel-mkl", + "platform": "!windows" + } + ] +} diff --git a/gtsam/3rdparty/vcpkg/triplets/.gitkeep b/gtsam/3rdparty/vcpkg/triplets/.gitkeep new file mode 100644 index 0000000000..e69de29bb2