diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b6004fa0..b6cbbc71 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,4 +1,4 @@ -name: Release Project +name: Add Installers to Release on: push: @@ -8,29 +8,72 @@ env: BUILD_TYPE: Release jobs: - build: - name: Building Debian Ubuntu Packages - runs-on: ubuntu-latest + build_linux: + name: Building Linux Packages + runs-on: ${{matrix.os}} + defaults: + run: + shell: bash strategy: matrix: + os: [ubuntu-latest, ubuntu-24.04-arm] build-variant: [shared, static] + package-type: [debian, rpm] + include: + - package-type: debian + extension: deb + - package-type: rpm + extension: rpm steps: - name: Checkout Respond Repository - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 - - - name: Build Debian Package + uses: actions/checkout@v6 + - name: Run CMake run: | - echo "Building Linux" - cmake --workflow --preset package-release-debian-${{matrix.build-variant}}-workflow - shell: bash - - name: Create a zip file with specific files/folders - shell: powershell + cmake --preset package-${{matrix.build-variant}} && cmake --build --preset package-${{matrix.build-variant}} + - name: Run CPack run: | - Compress-Archive -Path "${{ github.workspace }}/build/${{ matrix.build-variant }}/*.deb" -DestinationPath "${{ matrix.build-variant }}.zip" - - name: Upload Debian Package to Release + cpack --preset ${{matrix.package-type}}-${{matrix.build-variant}} + + - name: Upload Linux Package to Release uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} - file: "${{ matrix.build-variant }}.zip" + file: ${{ github.workspace }}/build/${{ matrix.build-variant }}/*.${{ matrix.extension }} file_glob: true tag: ${{ github.ref }} + +# Currently incurring errors on the workflow: 1) CPack Error: Problem running NSIS command 2) CPack Error: Problem compressing the directory 3) CPack Error: Error when generating package: respond + +# build_windows: +# name: Building Windows Packages +# runs-on: ${{matrix.os}} +# defaults: +# run: +# shell: bash +# strategy: +# matrix: +# os: [windows-latest] +# build-variant: [shared, static] +# package-type: [nsis] +# include: +# - package-type: nsis +# extension: exe +# steps: +# - name: Checkout Respond Repository +# uses: actions/checkout@v6 +# - name: Install NSIS +# run: choco install -y nsis +# - name: Run CMake +# run: | +# cmake --preset package-${{matrix.build-variant}} && cmake --build --preset package-${{matrix.build-variant}} +# - name: Run CPack +# run: | +# cpack --preset ${{matrix.package-type}}-${{matrix.build-variant}} + +# - name: Upload NSIS Package to Release +# uses: svenstaro/upload-release-action@v2 +# with: +# repo_token: ${{ secrets.GITHUB_TOKEN }} +# file: ${{ github.workspace }}/build/${{ matrix.build-variant }}/*.${{ matrix.extension }} +# file_glob: true +# tag: ${{ github.ref }} diff --git a/cmake/InstallRespond.cmake b/cmake/InstallRespond.cmake index ffc9c1d7..27df799f 100644 --- a/cmake/InstallRespond.cmake +++ b/cmake/InstallRespond.cmake @@ -1,49 +1,63 @@ -message(STATUS "Installing respond version ${RESPOND_VERSION}...") +message(STATUS "Installing respond version ${RESPOND_VERSION} to ${CMAKE_INSTALL_FULL_LIBDIR} and ${CMAKE_INSTALL_FULL_INCLUDEDIR}...") -set(export_dest_dir "${CMAKE_INSTALL_LIBDIR}/respond") -set(export_cmake_dir "${CMAKE_INSTALL_LIBDIR}/cmake/respond") -set(version_config_file "${CMAKE_CURRENT_BINARY_DIR}/respondConfigVersion.cmake") - -#------------------------------------------------------------------------------- -# Include files -#------------------------------------------------------------------------------- -message("Installing respond to ${CMAKE_INSTALL_FULL_LIBDIR} and ${CMAKE_INSTALL_FULL_INCLUDEDIR}...") - -install( - TARGETS respond_model +# This defines where things get installed. The default is to install to the +# system level directories (e.g. /usr/lib, /usr/respond/include). We will want +# to change this to allow for user level install too via the +# CMAKE_INSTALL_PREFIX variable. +install(TARGETS respond_model EXPORT respondTargets - FILE_SET HEADERS + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib + RUNTIME DESTINATION bin + INCLUDES DESTINATION include + FILE_SET HEADERS DESTINATION include ) -install( - EXPORT respondTargets - DESTINATION ${export_cmake_dir} - NAMESPACE respond:: +include(CMakePackageConfigHelpers) + +# Setup the Version config file +write_basic_package_version_file( + "${CMAKE_CURRENT_BINARY_DIR}/respond/respondConfigVersion.cmake" + VERSION ${RESPOND_VERSION} # Variable set in root CMakeLists.txt + COMPATIBILITY AnyNewerVersion ) -include(CMakePackageConfigHelpers) +# export the targets to a file and add the prefix. This file is used by the +# config file to find the compiled targets during `find_package(respond)` calls. +export(EXPORT respondTargets + FILE "${CMAKE_CURRENT_BINARY_DIR}/respond/respondTargets.cmake" + NAMESPACE respond:: +) +# Creates the config file necessary for CMake to use `find_package(respond)` # after being installed. configure_file( "${PROJECT_SOURCE_DIR}/cmake/respondConfig.cmake.in" - "${PROJECT_BINARY_DIR}/respondConfig.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/respond/respondConfig.cmake" @ONLY ) -set(project_config "${PROJECT_BINARY_DIR}/respondConfig.cmake") -write_basic_package_version_file( - ${version_config_file} - COMPATIBILITY ExactVersion +# Define where to install the config files and install the targets before the +# config files. This is so that the config files can actually find the targets +set(ConfigPackageLocation lib/cmake/respond) +install( + EXPORT respondTargets + FILE respondTargets.cmake + NAMESPACE respond:: + DESTINATION ${ConfigPackageLocation} ) +# Finally, install the config files install( FILES - ${project_config} - ${version_config_file} - DESTINATION ${export_cmake_dir} + "${CMAKE_CURRENT_BINARY_DIR}/respond/respondConfig.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/respond/respondConfigVersion.cmake" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/respond" ) #------------------------------------------------------------------------------- -# CPack Options for RESPOND +# CPack: This helps us create various installers. All options are controlled in +# the `respondCPackOptions.cmake.in` config file. Please do not change CPack +# itself, only the Options file! #------------------------------------------------------------------------------- configure_file( "${PROJECT_SOURCE_DIR}/cmake/respondCPackOptions.cmake.in" @@ -52,7 +66,4 @@ configure_file( ) set(CPACK_PROJECT_CONFIG_FILE "${PROJECT_BINARY_DIR}/respondCPackOptions.cmake") -#------------------------------------------------------------------------------- -# Support creation of installable packages -#------------------------------------------------------------------------------- include(CPack) diff --git a/cmake/LoadEigen.cmake b/cmake/LoadEigen.cmake index 0c77413c..aa55f4e6 100644 --- a/cmake/LoadEigen.cmake +++ b/cmake/LoadEigen.cmake @@ -8,7 +8,7 @@ FetchContent_Declare( GIT_TAG "3.4.0" GIT_SHALLOW TRUE EXCLUDE_FROM_ALL - # FIND_PACKAGE_ARGS NAMES Eigen3 + FIND_PACKAGE_ARGS NAMES Eigen3 ) # Turn off Eigen Testing and Docs diff --git a/cmake/respondCPackOptions.cmake.in b/cmake/respondCPackOptions.cmake.in index 404fbf90..bbde8c69 100644 --- a/cmake/respondCPackOptions.cmake.in +++ b/cmake/respondCPackOptions.cmake.in @@ -9,7 +9,10 @@ set(CPACK_PROJECT_URL "https://github.com/SyndemicsLab/respond") set(CPACK_PACKAGE_NAME @PROJECT_NAME@) set(CPACK_PACKAGE_VENDOR "Syndemics Lab at Boston Medical Center") set(CPACK_PACKAGE_CONTACT "Benjamin Linas ") -set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "A cohort based Markov model studying various cost impacts in treating substance use disorder.") +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "The RESPOND (Researching Effective Strategies to Prevent Opioid Use Disorder) model library. This library acts as a tool for building decision science Markov models to study the treatment dynamics of substance use disorder.") +set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/License.txt") + + set(CPACK_PACKAGE_VERSION_MAJOR @PROJECT_VERSION_MAJOR@) set(CPACK_PACKAGE_VERSION_MINOR @PROJECT_VERSION_MINOR@) set(CPACK_PACKAGE_VERSION_PATCH @PROJECT_VERSION_PATCH@) @@ -21,29 +24,16 @@ set(CPACK_PACKAGE_VERSION @PROJECT_VERSION_MAJOR@.@PROJECT_VERSION_MINOR@.@PROJE set(CPACK_RPM_PACKAGE_LICENSE "AGPLv3") set(CPACK_RPM_PACKAGE_GROUP "Development/Libraries") set(CPACK_RPM_PACKAGE_URL ${CPACK_PROJECT_URL}) -set(CPACK_RPM_PACKAGE_DESCRIPTION "Syndemics Modeling Library.") -set(CPACK_RPM_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}") +set(CPACK_RPM_PACKAGE_DESCRIPTION "${CPACK_PACKAGE_DESCRIPTION_SUMMARY}") set(CPACK_RPM_PACKAGE_NAME "${CPACK_PACKAGE_NAME}") -if(CPACK_RPM_PACKAGE_RELEASE) - set(CPACK_RPM_FILE_NAME "${CPACK_RPM_FILE_NAME}-${CPACK_RPM_PACKAGE_RELEASE}") -endif() -if(CPACK_RPM_PACKAGE_ARCHITECTURE) - set(CPACK_RPM_FILE_NAME "${CPACK_RPM_FILE_NAME}.${CPACK_RPM_PACKAGE_ARCHITECTURE}") -endif() -set(CPACK_RPM_FILE_NAME "${CPACK_RPM_FILE_NAME}.rpm") +set(CPACK_RPM_FILE_NAME RPM-DEFAULT) #------------------------------------------------------------------------------- # CPack Debian Variables #------------------------------------------------------------------------------- set(CPACK_DEBIAN_PACKAGE_SECTION "libs") +set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON) set(CPACK_DEBIAN_PACKAGE_HOMEPAGE ${CPACK_PROJECT_URL}) -set(CPACK_DEBIAN_PACKAGE_DESCRIPTION "Syndemics Modeling Library.") -set(CPACK_DEBIAN_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}") +set(CPACK_DEBIAN_PACKAGE_DESCRIPTION ${CPACK_PACKAGE_DESCRIPTION_SUMMARY}) set(CPACK_DEBIAN_PACKAGE_NAME "${CPACK_PACKAGE_NAME}") -if(CPACK_DEBIAN_PACKAGE_RELEASE) - set(CPACK_DEBIAN_FILE_NAME "${CPACK_DEBIAN_FILE_NAME}-${CPACK_DEBIAN_PACKAGE_RELEASE}") -endif() -if(CPACK_DEBIAN_PACKAGE_ARCHITECTURE) - set(CPACK_DEBIAN_FILE_NAME "${CPACK_DEBIAN_FILE_NAME}.${${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}}") -endif() -set(CPACK_DEBIAN_FILE_NAME "${CPACK_DEBIAN_FILE_NAME}.deb") \ No newline at end of file +set(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT) \ No newline at end of file diff --git a/cmake/respondConfig.cmake.in b/cmake/respondConfig.cmake.in index d2c98e42..e7093718 100644 --- a/cmake/respondConfig.cmake.in +++ b/cmake/respondConfig.cmake.in @@ -5,8 +5,4 @@ include(CMakeFindDependencyMacro) find_dependency(Eigen3 REQUIRED) find_dependency(spdlog REQUIRED) -if(@RESPOND_BUILD_TESTS@) - find_dependency(GTest REQUIRED) # Only if tests are build -endif() - include("${CMAKE_CURRENT_LIST_DIR}/respondTargets.cmake") diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index d9274605..34bc349c 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -42,9 +42,9 @@ target_include_directories(respond_tests target_link_libraries(respond_tests PUBLIC respond_model - Eigen3::Eigen spdlog::spdlog GTest::gmock_main + Eigen3::Eigen ) gtest_discover_tests(respond_tests