diff --git a/.github/workflows/build_cmake_tarball.yml b/.github/workflows/build_cmake_tarball.yml new file mode 100644 index 0000000000..2f50850e86 --- /dev/null +++ b/.github/workflows/build_cmake_tarball.yml @@ -0,0 +1,165 @@ +name: CMake Tarball + +# This file is part of t8code. +# t8code is a C library to manage a collection (a forest) of multiple +# connected adaptive space-trees of general element types in parallel. +# +# Copyright (C) 2024 the developers +# +# t8code is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# t8code is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with t8code; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# +# This github CI script constructs a tarball and checks if it is build correctly. +# + +env: + MAKEFLAGS: "-j2 V=0" + + +on: + push: + branches: + - main + - develop + - CI-*tarball* # for testing this script, all feature branches with "tarball" in their name + pull_request: + branches: + - main + - develop + workflow_dispatch: + +jobs: + build: + + if: (github.event_name == 'schedule' && github.repository == 'DLR-AMR/t8code') || (github.event_name != 'schedule') + runs-on: ubuntu-20.04 + container: dlramr/t8code-ubuntu:t8-dependencies + timeout-minutes: 90 + steps: +# +# Setup and bootstrap +# + - uses: actions/checkout@v4 + with: + fetch-tags: true # required to get version tags + fetch-depth: 0 # required to get all history, especially the version tags + - name: install sudo + run: apt update && apt install sudo + # On the github Ubuntu 20.04, sudo is not available by default + # we need it, however, to update/upgrade our packages. + - name: Update packages + run: sudo apt-get update && sudo apt-get upgrade -y + # This step is necessary to get the newest package data + - name: disable ownership checks + run: git config --global --add safe.directory '*' + - name: init submodules + run: git submodule init + - name: update submodules + run: git submodule update + - name: bootstrap + run: ./bootstrap +# +# T8CODE +# with p4est and sc as internal dependencies which is needed for make dist +# +# + - name: less-test option + if: ${{ inputs.LESS_TESTS }} + run: export LESS_TEST_OPTION="-DT8CODE_ENABLE_LESS_TESTS=ON" + && echo LESS_TEST_OPTION="$LESS_TEST_OPTION" >> $GITHUB_ENV + - name: build config variables + run: export CONFIG_OPTIONS="${LESS_TEST_OPTION} -GNinja -DT8CODE_USE_SYSTEM_SC=OFF -DT8CODE_USE_SYSTEM_P4EST=OFF -DT8CODE_BUILD_PEDANTIC=ON -DT8CODE_ENABLE_MPI=$MPI -DCMAKE_BUILD_TYPE=$BUILD_TYPE" + && echo CONFIG_OPTIONS="$CONFIG_OPTIONS" >> $GITHUB_ENV + - name: cmake + run: mkdir build && cd build && cmake ../ $CONFIG_OPTIONS + - name: OnFailUploadLog + if: failure() + uses: actions/upload-artifact@v4 + with: + name: config.log + path: build/config.log +# Start building tarball + - name: Install pandoc + uses: nikeee/setup-pandoc@v1 + - name: Test pandoc + run: pandoc --version +# Build the tarball + - name: Make tarball + run: cd build && ninja GenerateVersionFile && ninja package_source && mkdir tarballs && mv package/*Source.tar.gz tarballs +# Upload the tarball + - name: upload tarball + uses: actions/upload-artifact@v4 + with: + name: tarballs + path: build/tarballs + + test-tarball: + needs: build + runs-on: ubuntu-20.04 + container: dlramr/t8code-ubuntu:t8-dependencies + timeout-minutes: 90 + steps: + - name: install sudo + run: apt update && apt install sudo + # On the github Ubuntu 20.04, sudo is not available by default + # we need it, however, to update/upgrade our packages. + - name: Update packages + run: sudo apt-get update && sudo apt-get upgrade -y + # This step is necessary to get the newest package data + - name: Download tarball + uses: actions/download-artifact@v4 + with: + name: tarballs + path: tarballs + - name: Extract tarball + run: tar xzf tarballs/*.tar.gz -C $RUNNER_TEMP + - name: update Github_env + run: export TAR_DIR="$RUNNER_TEMP/`basename tarballs/*.tar.gz .tar.gz`" && + echo TAR_DIR="$TAR_DIR" >>$GITHUB_ENV + +# build config vars + - name: less-test-option + if: github.event_name == 'pull_request' + run: export LESS_TEST_OPTION="-DT8CODE_ENABLE_LESS_TESTS=ON" + && echo LESS_TEST_OPTION="$LESS_TEST_OPTION" >> $GITHUB_ENV + - name: build config variables + run: export CONFIG_OPTIONS="${LESS_TEST_OPTION} -GNinja -DT8CODE_USE_SYSTEM_SC=OFF -DT8CODE_USE_SYSTEM_P4EST=OFF -DT8CODE_BUILD_PEDANTIC=ON -DT8CODE_ENABLE_MPI=$MPI -DCMAKE_BUILD_TYPE=$BUILD_TYPE" + && echo CONFIG_OPTIONS="$CONFIG_OPTIONS" >> $GITHUB_ENV + - name: Check vars + run: echo "[$CONFIG_DEBUG]" + - name: configure from Tarball + run: mkdir build_tar && cd build_tar && cmake $TAR_DIR $CONFIG_OPTIONS + - name: OnFailUploadLog + if: failure() + uses: actions/upload-artifact@v4 + with: + name: build_tar.log + path: build_tar/config.log + - name: build + run: cd build_tar && ninja + - name: install + run: cd build_tar && ninja install + - name: check serial + run: cd build_tar && ctest -R _serial + - name: check parallel + run: cd build_tar && ctest -R _parallel + - name: OnFailUploadLog + if: failure() + uses: actions/upload-artifact@v4 + with: + name: build_tar.log + path: build_tar/test-suite.log + + diff --git a/CMakeLists.txt b/CMakeLists.txt index 90dd8cdcb2..ee2e6f03f6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -136,3 +136,5 @@ endif() if ( T8CODE_BUILD_DOCUMENTATION ) add_subdirectory( ${CMAKE_CURRENT_LIST_DIR}/doc ) endif() + +include (cmake/CPackConfig.cmake) \ No newline at end of file diff --git a/cmake/CPackConfig.cmake b/cmake/CPackConfig.cmake new file mode 100644 index 0000000000..0d87a38539 --- /dev/null +++ b/cmake/CPackConfig.cmake @@ -0,0 +1,51 @@ +set(CPACK_PACKAGE_VENDOR "DLR-SC AMR") +set(CPACK_PACKAGE_NAME "T8CODE") +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Parallel algorithms and data structures for tree-based AMR with arbitrary element shapes.") +set(CPACK_PACKAGE_VERSION_MAJOR ${T8CODE_VERSION_MAJOR}) +set(CPACK_PACKAGE_VERSION_MINOR ${T8CODE_VERSION_MINOR}) +set(CPACK_PACKAGE_VERSION_PATCH ${T8CODE_VERSION_PATCH}) +set(CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/README.md") +set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/COPYING") +set(CPACK_PACKAGE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/package) +set(CPACK_PACKAGE_ICON ${CMAKE_CURRENT_SOURCE_DIR}/t8code_logo.png) + +# Define a variable for the version file +set(VERSION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/version.txt") + + +# Custom command to generate the version file +add_custom_command( + OUTPUT ${VERSION_FILE} + COMMAND ${CMAKE_COMMAND} -E echo "Version ${T8CODE_VERSION_MAJOR}.${T8CODE_VERSION_MINOR}.${T8CODE_VERSION_PATCH}" > ${VERSION_FILE} + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt # Change as needed + ) + +# Create a custom target to ensure the version file is generated +add_custom_target(GenerateVersionFile ALL DEPENDS ${VERSION_FILE}) + +set(CPACK_SOURCE_GENERATOR "TGZ;ZIP") +set(CPACK_SOURCE_INCLUDE_FILES ${VERSION_FILE}) +set(CPACK_SOURCE_IGNORE_FILES .git/ .github/ .vscode/ _CPack_Packages/ +.gitmodules .gitignore +${PROJECT_BINARY_DIR}/ +Makefile.in +aclocal.m4 +autom4te.cache/ +build/ +bin/ +configure +DartConfiguration.tcl +CMakeCache.txt +build/ +build-aux/ +configure +config.log +compile_commands.json +) + +set(CPACK_PACKAGE_NAME "T8CODE") +set(CPACK_VERBATIM_VARIABLES TRUE) + + +include(CPack) + diff --git a/cmake/GitProjectVersion.cmake b/cmake/GitProjectVersion.cmake index c92ce991da..1e6f227d28 100644 --- a/cmake/GitProjectVersion.cmake +++ b/cmake/GitProjectVersion.cmake @@ -1,32 +1,54 @@ find_package( Git REQUIRED ) -# See `scr/t8_version.h` for the documentation of following definitions. +if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git") + # See `scr/t8_version.h` for the documentation of following definitions. + + execute_process( COMMAND ${GIT_EXECUTABLE} describe --tags --dirty + COMMAND cut -c 2- + WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} + OUTPUT_VARIABLE T8CODE_VERSION_RAW + OUTPUT_STRIP_TRAILING_WHITESPACE ) + execute_process( COMMAND echo ${T8CODE_VERSION_RAW} + COMMAND cut -d- -f1 + OUTPUT_VARIABLE T8CODE_VERSION_NUMBERS + OUTPUT_STRIP_TRAILING_WHITESPACE ) + execute_process( COMMAND echo ${T8CODE_VERSION_RAW} + COMMAND cut -d- -f2- + OUTPUT_VARIABLE T8CODE_VERSION_POINT + OUTPUT_STRIP_TRAILING_WHITESPACE ) + + # To reuse the version in other CMakeLists. + else() + if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/version.txt") + file(READ "${CMAKE_CURRENT_SOURCE_DIR}/version.txt" VERSION_CONTENT) + # Extract the version number + string(REGEX MATCH "Version ([0-9])\.([0-9]+)\.([0-9]+)" VERSION_MATCH "${VERSION_CONTENT}" ) + if (VERSION_MATCH) + # The version number will be in ${CMAKE_MATCH_1} + set(T8CODE_VERSION_NUMBERS "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}.${CMAKE_MATCH_3}") + set(T8CODE_VERSION_RAW "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}.${CMAKE_MATCH_3}") + message(STATUS "Extracted Version: ${T8CODE_VERSION_NUMBERS}") + else() + message(WARNING "Version number not found in version.txt") + endif() + else() + message(WARNING "Version information not found") + endif() +endif() + -execute_process( COMMAND ${GIT_EXECUTABLE} describe --tags --dirty - COMMAND cut -c 2- - WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} - OUTPUT_VARIABLE T8CODE_VERSION_RAW - OUTPUT_STRIP_TRAILING_WHITESPACE ) -execute_process( COMMAND echo ${T8CODE_VERSION_RAW} - COMMAND cut -d- -f1 - OUTPUT_VARIABLE T8CODE_VERSION_NUMBERS - OUTPUT_STRIP_TRAILING_WHITESPACE ) -execute_process( COMMAND echo ${T8CODE_VERSION_RAW} - COMMAND cut -d- -f2- - OUTPUT_VARIABLE T8CODE_VERSION_POINT - OUTPUT_STRIP_TRAILING_WHITESPACE ) execute_process( COMMAND echo ${T8CODE_VERSION_NUMBERS} - COMMAND cut -d. -f1 - OUTPUT_VARIABLE T8CODE_VERSION_MAJOR - OUTPUT_STRIP_TRAILING_WHITESPACE ) + COMMAND cut -d. -f1 + OUTPUT_VARIABLE T8CODE_VERSION_MAJOR + OUTPUT_STRIP_TRAILING_WHITESPACE ) execute_process( COMMAND echo ${T8CODE_VERSION_NUMBERS} - COMMAND cut -d. -f2 - OUTPUT_VARIABLE T8CODE_VERSION_MINOR - OUTPUT_STRIP_TRAILING_WHITESPACE ) + COMMAND cut -d. -f2 + OUTPUT_VARIABLE T8CODE_VERSION_MINOR + OUTPUT_STRIP_TRAILING_WHITESPACE ) execute_process( COMMAND echo ${T8CODE_VERSION_NUMBERS} - COMMAND cut -d. -f3 - OUTPUT_VARIABLE T8CODE_VERSION_PATCH - OUTPUT_STRIP_TRAILING_WHITESPACE ) - -# To reuse the version in other CMakeLists. + COMMAND cut -d. -f3 + OUTPUT_VARIABLE T8CODE_VERSION_PATCH + OUTPUT_STRIP_TRAILING_WHITESPACE ) set(T8_VERSION ${T8CODE_VERSION_NUMBERS} CACHE INTERNAL "") + +