diff options
-rw-r--r-- | .github/workflows/ccpp.yml | 351 | ||||
-rw-r--r-- | ArcWelder/CMakeLists.txt | 2 | ||||
-rw-r--r-- | ArcWelderConsole/CMakeLists.txt | 2 | ||||
-rw-r--r-- | ArcWelderInverseProcessor/CMakeLists.txt | 2 | ||||
-rw-r--r-- | ArcWelderLib.sln | 10 | ||||
-rw-r--r-- | GcodeProcessorLib/CMakeLists.txt | 2 | ||||
-rw-r--r-- | PyArcWelder/CMakeLists.txt | 2 |
7 files changed, 315 insertions, 56 deletions
diff --git a/.github/workflows/ccpp.yml b/.github/workflows/ccpp.yml index 75826ef..494c974 100644 --- a/.github/workflows/ccpp.yml +++ b/.github/workflows/ccpp.yml @@ -1,65 +1,304 @@ -name: C/C++ CI - -on: - push: - branches: - - master - - rc/maintenance - - rc/devel - - devel - pull_request: - branches: - - master - - rc/maintenance - - rc/devel - - devel +name: CMake Build Matrix + +on: [push, pull_request] + +env: + CMAKE_VERSION: 3.17.2 + NINJA_VERSION: 1.9.0 + BUILD_TYPE: Release + CCACHE_VERSION: 3.7.7 jobs: - build-ubuntu: - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v2 - - name: configure - run: ./configure - - name: make - run: make - - name: make check - run: make check - - name: make distcheck - run: make distcheck - - build-windows: - - runs-on: ${{ matrix.os }} + build: + name: ${{ matrix.config.name }} + runs-on: ${{ matrix.config.os }} strategy: + fail-fast: false matrix: - os: [windows-latest] + config: + - { + name: "Windows Latest MSVC", artifact: "C:\Program Files\PowerShell\7\pwsh.EXE -command", + os: windows-latest, + cc: "cl", cxx: "cl", + environment_script: "C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Auxiliary/Build/vcvars64.bat" + } + - { + name: "Windows Latest MinGW", artifact: "Windows-MinGW.tar.xz", + os: windows-latest, + cc: "gcc", cxx: "g++" + } + - { + name: "Ubuntu Latest GCC", artifact: "Linux.tar.xz", + os: ubuntu-latest, + cc: "gcc", cxx: "g++" + } + - { + name: "macOS Latest Clang", artifact: "macOS.tar.xz", + os: macos-latest, + cc: "clang", cxx: "clang++" + } + steps: - uses: actions/checkout@v1 - - name: configure - run: ./configure - - name: make - run: make - - name: make check - run: make check - - name: make distcheck - run: make distcheck - - build-macos: - - runs-on: ${{ matrix.os }} + + - name: Download Ninja and CMake + id: cmake_and_ninja + shell: cmake -P {0} + run: | + set(cmake_version $ENV{CMAKE_VERSION}) + set(ninja_version $ENV{NINJA_VERSION}) + + message(STATUS "Using host CMake version: ${CMAKE_VERSION}") + + if ("${{ runner.os }}" STREQUAL "Windows") + set(ninja_suffix "win.zip") + set(cmake_suffix "win64-x64.zip") + set(cmake_dir "cmake-${cmake_version}-win64-x64/bin") + elseif ("${{ runner.os }}" STREQUAL "Linux") + set(ninja_suffix "linux.zip") + set(cmake_suffix "Linux-x86_64.tar.gz") + set(cmake_dir "cmake-${cmake_version}-Linux-x86_64/bin") + elseif ("${{ runner.os }}" STREQUAL "macOS") + set(ninja_suffix "mac.zip") + set(cmake_suffix "Darwin-x86_64.tar.gz") + set(cmake_dir "cmake-${cmake_version}-Darwin-x86_64/CMake.app/Contents/bin") + endif() + + set(ninja_url "https://github.com/ninja-build/ninja/releases/download/v${ninja_version}/ninja-${ninja_suffix}") + file(DOWNLOAD "${ninja_url}" ./ninja.zip SHOW_PROGRESS) + execute_process(COMMAND ${CMAKE_COMMAND} -E tar xvf ./ninja.zip) + + set(cmake_url "https://github.com/Kitware/CMake/releases/download/v${cmake_version}/cmake-${cmake_version}-${cmake_suffix}") + file(DOWNLOAD "${cmake_url}" ./cmake.zip SHOW_PROGRESS) + execute_process(COMMAND ${CMAKE_COMMAND} -E tar xvf ./cmake.zip) + + # Save the path for other steps + file(TO_CMAKE_PATH "$ENV{GITHUB_WORKSPACE}/${cmake_dir}" cmake_dir) + message("::set-output name=cmake_dir::${cmake_dir}") + + if (NOT "${{ runner.os }}" STREQUAL "Windows") + execute_process( + COMMAND chmod +x ninja + COMMAND chmod +x ${cmake_dir}/cmake + ) + endif() + + - name: Download ccache + id: ccache + shell: cmake -P {0} + run: | + set(ccache_url "https://github.com/cristianadam/ccache/releases/download/v$ENV{CCACHE_VERSION}/${{ runner.os }}.tar.xz") + file(DOWNLOAD "${ccache_url}" ./ccache.tar.xz SHOW_PROGRESS) + execute_process(COMMAND ${CMAKE_COMMAND} -E tar xvf ./ccache.tar.xz) + + - name: Prepare ccache timestamp + id: ccache_cache_timestamp + shell: cmake -P {0} + run: | + string(TIMESTAMP current_date "%Y-%m-%d-%H;%M;%S" UTC) + message("::set-output name=timestamp::${current_date}") + + - name: ccache cache files + uses: actions/cache@v1.1.0 + with: + path: .ccache + key: ${{ matrix.config.name }}-ccache-${{ steps.ccache_cache_timestamp.outputs.timestamp }} + restore-keys: | + ${{ matrix.config.name }}-ccache- + + - name: Configure + shell: cmake -P {0} + run: | + set(ENV{CC} ${{ matrix.config.cc }}) + set(ENV{CXX} ${{ matrix.config.cxx }}) + + if ("${{ runner.os }}" STREQUAL "Windows" AND NOT "x${{ matrix.config.environment_script }}" STREQUAL "x") + execute_process( + COMMAND "${{ matrix.config.environment_script }}" && set + OUTPUT_FILE environment_script_output.txt + ) + file(STRINGS environment_script_output.txt output_lines) + foreach(line IN LISTS output_lines) + if (line MATCHES "^([a-zA-Z0-9_-]+)=(.*)$") + set(ENV{${CMAKE_MATCH_1}} "${CMAKE_MATCH_2}") + endif() + endforeach() + endif() + + set(path_separator ":") + if ("${{ runner.os }}" STREQUAL "Windows") + set(path_separator ";") + endif() + set(ENV{PATH} "$ENV{GITHUB_WORKSPACE}${path_separator}$ENV{PATH}") + + execute_process( + COMMAND ${{ steps.cmake_and_ninja.outputs.cmake_dir }}/cmake + -S . + -B build + -D CMAKE_BUILD_TYPE=$ENV{BUILD_TYPE} + -G Ninja + -D CMAKE_MAKE_PROGRAM=ninja + -D CMAKE_C_COMPILER_LAUNCHER=ccache + -D CMAKE_CXX_COMPILER_LAUNCHER=ccache + RESULT_VARIABLE result + ) + if (NOT result EQUAL 0) + message(FATAL_ERROR "Bad exit status") + endif() + + + - name: Build + shell: cmake -P {0} + run: | + set(ENV{NINJA_STATUS} "[%f/%t %o/sec] ") + + if ("${{ runner.os }}" STREQUAL "Windows" AND NOT "x${{ matrix.config.environment_script }}" STREQUAL "x") + file(STRINGS environment_script_output.txt output_lines) + foreach(line IN LISTS output_lines) + if (line MATCHES "^([a-zA-Z0-9_-]+)=(.*)$") + set(ENV{${CMAKE_MATCH_1}} "${CMAKE_MATCH_2}") + endif() + endforeach() + endif() + + set(path_separator ":") + if ("${{ runner.os }}" STREQUAL "Windows") + set(path_separator ";") + endif() + set(ENV{PATH} "$ENV{GITHUB_WORKSPACE}${path_separator}$ENV{PATH}") + + file(TO_CMAKE_PATH "$ENV{GITHUB_WORKSPACE}" ccache_basedir) + set(ENV{CCACHE_BASEDIR} "${ccache_basedir}") + set(ENV{CCACHE_DIR} "${ccache_basedir}/.ccache") + set(ENV{CCACHE_COMPRESS} "true") + set(ENV{CCACHE_COMPRESSLEVEL} "6") + set(ENV{CCACHE_MAXSIZE} "400M") + if ("${{ matrix.config.cxx }}" STREQUAL "cl") + set(ENV{CCACHE_MAXSIZE} "600M") + endif() + + execute_process(COMMAND ccache -p) + execute_process(COMMAND ccache -z) + + execute_process( + COMMAND ${{ steps.cmake_and_ninja.outputs.cmake_dir }}/cmake --build build + RESULT_VARIABLE result + ) + if (NOT result EQUAL 0) + message(FATAL_ERROR "Bad exit status") + endif() + + execute_process(COMMAND ccache -s) + + - name: Run tests + shell: cmake -P {0} + run: | + include(ProcessorCount) + ProcessorCount(N) + + set(ENV{CTEST_OUTPUT_ON_FAILURE} "ON") + + execute_process( + COMMAND ${{ steps.cmake_and_ninja.outputs.cmake_dir }}/ctest -j ${N} + WORKING_DIRECTORY build + RESULT_VARIABLE result + ) + if (NOT result EQUAL 0) + message(FATAL_ERROR "Running tests failed!") + endif() + + + - name: Install Strip + run: ${{ steps.cmake_and_ninja.outputs.cmake_dir }}/cmake --install build --prefix instdir --strip + + + - name: Pack + working-directory: instdir + run: ${{ steps.cmake_and_ninja.outputs.cmake_dir }}/cmake -E tar cJfv ../${{ matrix.config.artifact }} . + + + - name: Upload + uses: actions/upload-artifact@v1 + with: + path: ./${{ matrix.config.artifact }} + name: ${{ matrix.config.artifact }} + + release: + if: contains(github.ref, 'tags/v') + runs-on: ubuntu-latest + needs: build + + steps: + - name: Create Release + id: create_release + uses: actions/create-release@v1.0.0 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ github.ref }} + release_name: Release ${{ github.ref }} + draft: false + prerelease: false + + - name: Store Release url + run: | + echo "${{ steps.create_release.outputs.upload_url }}" > ./upload_url + + - uses: actions/upload-artifact@v1 + with: + path: ./upload_url + name: upload_url + + publish: + if: contains(github.ref, 'tags/v') + name: ${{ matrix.config.name }} + runs-on: ${{ matrix.config.os }} strategy: + fail-fast: false matrix: - os: [macos-latest] + config: + - { + name: "Windows Latest MSVC", artifact: "Windows-MSVC.tar.xz", + os: ubuntu-latest + } + - { + name: "Windows Latest MinGW", artifact: "Windows-MinGW.tar.xz", + os: ubuntu-latest + } + - { + name: "Ubuntu Latest GCC", artifact: "Linux.tar.xz", + os: ubuntu-latest + } + - { + name: "macOS Latest Clang", artifact: "macOS.tar.xz", + os: ubuntu-latest + } + needs: release + steps: - - uses: actions/checkout@v1 - - name: configure - run: ./configure - - name: make - run: make - - name: make check - run: make check - - name: make distcheck - run: make distcheck + - name: Download artifact + uses: actions/download-artifact@v1 + with: + name: ${{ matrix.config.artifact }} + path: ./ + + - name: Download URL + uses: actions/download-artifact@v1 + with: + name: upload_url + path: ./ + - id: set_upload_url + run: | + upload_url=`cat ./upload_url` + echo ::set-output name=upload_url::$upload_url + + - name: Upload to Release + id: upload_to_release + uses: actions/upload-release-asset@v1.0.1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.set_upload_url.outputs.upload_url }} + asset_path: ./${{ matrix.config.artifact }} + asset_name: ${{ matrix.config.artifact }} + asset_content_type: application/x-gtar
\ No newline at end of file diff --git a/ArcWelder/CMakeLists.txt b/ArcWelder/CMakeLists.txt index 822dee3..f467537 100644 --- a/ArcWelder/CMakeLists.txt +++ b/ArcWelder/CMakeLists.txt @@ -15,6 +15,8 @@ include(sourcelist.cmake) # Add a library using our ArcWelderSources variable from our sourcelist file add_library(${PROJECT_NAME} STATIC ${ArcWelderSources}) +install(TARGETS ${PROJECT_NAME}) + # Link the GcodeProcessorLib target_link_libraries(${PROJECT_NAME} GcodeProcessorLib) diff --git a/ArcWelderConsole/CMakeLists.txt b/ArcWelderConsole/CMakeLists.txt index 84058ec..e197aac 100644 --- a/ArcWelderConsole/CMakeLists.txt +++ b/ArcWelderConsole/CMakeLists.txt @@ -15,5 +15,7 @@ include(sourcelist.cmake) # Add an executable our ArcWelderConsoleSources variable from our sourcelist file add_executable(${PROJECT_NAME} ${ArcWelderConsoleSources}) +install(TARGETS ${PROJECT_NAME}) + # specify linking to the GcodeProcessorLib and ArcWelder libraries target_link_libraries(${PROJECT_NAME} GcodeProcessorLib ArcWelder) diff --git a/ArcWelderInverseProcessor/CMakeLists.txt b/ArcWelderInverseProcessor/CMakeLists.txt index ba8e2a6..f0fb19c 100644 --- a/ArcWelderInverseProcessor/CMakeLists.txt +++ b/ArcWelderInverseProcessor/CMakeLists.txt @@ -15,5 +15,7 @@ include(sourcelist.cmake) # Add an executable our ArcWelderConsoleSources variable from our sourcelist file add_executable(${PROJECT_NAME} ${ArcWelderInverseProcessorSources}) +install(TARGETS ${PROJECT_NAME}) + # specify linking to the GcodeProcessorLib and ArcWelder libraries target_link_libraries(${PROJECT_NAME} GcodeProcessorLib ArcWelder) diff --git a/ArcWelderLib.sln b/ArcWelderLib.sln index 6776791..e20aabb 100644 --- a/ArcWelderLib.sln +++ b/ArcWelderLib.sln @@ -23,6 +23,13 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution sourcelist.cmake = sourcelist.cmake EndProjectSection EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".github", ".github", "{704AE839-EEF5-4277-900D-91FA4DBB17EB}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{87F36EEF-E3D6-4B1D-815C-DEEB369BAB98}" + ProjectSection(SolutionItems) = preProject + .github\workflows\ccpp.yml = .github\workflows\ccpp.yml + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 @@ -83,6 +90,9 @@ Global GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {87F36EEF-E3D6-4B1D-815C-DEEB369BAB98} = {704AE839-EEF5-4277-900D-91FA4DBB17EB} + EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {46059DE8-A2F4-453F-9F33-F12ABC8010EF} EndGlobalSection diff --git a/GcodeProcessorLib/CMakeLists.txt b/GcodeProcessorLib/CMakeLists.txt index 7df5acc..16cf7a7 100644 --- a/GcodeProcessorLib/CMakeLists.txt +++ b/GcodeProcessorLib/CMakeLists.txt @@ -9,6 +9,8 @@ include(sourcelist.cmake) # Add a library using our GcodeProcessorLibSources variable from our sourcelist file add_library(${PROJECT_NAME} STATIC ${GcodeProcessorLibSources}) +install(TARGETS ${PROJECT_NAME}) + # Required on Unix OS family to be able to be linked into shared libraries. set_target_properties(${PROJECT_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON) diff --git a/PyArcWelder/CMakeLists.txt b/PyArcWelder/CMakeLists.txt index a26340d..88631a0 100644 --- a/PyArcWelder/CMakeLists.txt +++ b/PyArcWelder/CMakeLists.txt @@ -18,6 +18,8 @@ include(sourcelist.cmake) # Create our library add_library(${PROJECT_NAME} SHARED ${PyArcWelderSources}) +install(TARGETS ${PROJECT_NAME}) + set_target_properties( ${PROJECT_NAME} PROPERTIES |