diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e2cae22 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/build/ +/dist/ diff --git a/CMakeLists.txt b/CMakeLists.txt index 94d6c2c..67f9c11 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,9 +10,15 @@ DEAL_II_INITIALIZE_CACHED_VARIABLES() # Uses the FindBoost module of CMake find_package(Boost 1.83 COMPONENTS filesystem REQUIRED) -find_package(yaml-cpp 0.6 REQUIRED) +find_package(yaml-cpp 0.8 REQUIRED) add_library(cpackexamplelib filesystem/filesystem.cpp fem/fem.cpp flatset/flatset.cpp yamlParser/yamlParser.cpp) + + +set_target_properties(cpackexamplelib PROPERTIES + PUBLIC_HEADER "fem/fem.hpp;filesystem/filesystem.hpp;flatset/flatset.hpp;yamlParser/yamlParser.hpp" +) + add_executable("${PROJECT_NAME}" main.cpp) target_link_libraries("${PROJECT_NAME}" cpackexamplelib) @@ -20,3 +26,61 @@ target_link_libraries(cpackexamplelib Boost::filesystem ${YAML_CPP_LIBRARIES}) DEAL_II_SETUP_TARGET("${PROJECT_NAME}") DEAL_II_SETUP_TARGET(cpackexamplelib) + + +include(GNUInstallDirs) + +set(LICENSE_FILE "${CMAKE_SOURCE_DIR}/LICENSE") +install( + FILES "${LICENSE_FILE}" + DESTINATION "${CMAKE_INSTALL_DOCDIR}" + RENAME "copyright" + COMPONENT doc +) + + +set(DEB_CHANGELOG_SRC "${CMAKE_SOURCE_DIR}/changelog") +set(DEB_CHANGELOG_GZ "${CMAKE_BINARY_DIR}/changelog.gz") + +add_custom_command( + OUTPUT "${DEB_CHANGELOG_GZ}" + COMMAND ${CMAKE_COMMAND} -E env SOURCE_DATE_EPOCH=0 GZIP=-9 sh -c + "gzip -n -c '${DEB_CHANGELOG_SRC}' > '${DEB_CHANGELOG_GZ}'" + DEPENDS "${DEB_CHANGELOG_SRC}" + VERBATIM + ) + add_custom_target(gen_deb_changelog ALL DEPENDS "${DEB_CHANGELOG_GZ}") + + install( + FILES "${DEB_CHANGELOG_GZ}" + DESTINATION "${CMAKE_INSTALL_DOCDIR}" + RENAME "changelog.gz" + ) + +set(DEB_MANPAGE_SRC "${CMAKE_SOURCE_DIR}/man/cpackexample.1") +set(DEB_MANPAGE_GZ "${CMAKE_BINARY_DIR}/cpackexample.1.gz") + +add_custom_command( + OUTPUT "${DEB_MANPAGE_GZ}" + COMMAND ${CMAKE_COMMAND} -E env SOURCE_DATE_EPOCH=0 GZIP=-9 sh -c + "gzip -n -c '${DEB_MANPAGE_SRC}' > '${DEB_MANPAGE_GZ}'" + DEPENDS "${DEB_MANPAGE_SRC}" + VERBATIM + ) + add_custom_target(gen_deb_manpage ALL DEPENDS "${DEB_MANPAGE_GZ}") + + install( + FILES "${DEB_MANPAGE_GZ}" + DESTINATION "${CMAKE_INSTALL_MANDIR}/man1" + ) + + +install(TARGETS cpackexample cpackexamplelib + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/cpackexamplelib + INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/cpackexamplelib + ) + +include(cmake/CPackConfig.cmake) diff --git a/Dockerfile b/Dockerfile index bd5207d..60875c1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,17 +12,18 @@ RUN apt-get -qq update && \ vim \ tree \ lintian \ - unzip + unzip \ + libyaml-cpp-dev -# Get, unpack, build, and install yaml-cpp -RUN mkdir software && cd software && \ - wget https://github.com/jbeder/yaml-cpp/archive/refs/tags/yaml-cpp-0.6.3.zip && unzip yaml-cpp-0.6.3.zip && \ - cd yaml-cpp-yaml-cpp-0.6.3 && mkdir build && cd build && \ - cmake -DYAML_BUILD_SHARED_LIBS=ON .. && make -j4 && make install # This is some strange Docker feature. Normally, you don't need to add /usr/local to these ENV LIBRARY_PATH $LIBRARY_PATH:/usr/local/lib/ ENV LD_LIBRARY_PATH $LD_LIBRARY_PATH:/usr/local/lib/ ENV PATH $PATH:/usr/local/bin/ -CMD ["/bin/bash"] +RUN mkdir -p /src /out +COPY --chmod=755 docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh +ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"] + +# CMD ["/bin/bash"] + diff --git a/changelog b/changelog new file mode 100644 index 0000000..b29985e --- /dev/null +++ b/changelog @@ -0,0 +1,5 @@ +cpackexample (0.1.0) unstable; urgency=medium + + * Initial release. + + -- Felix Kimmerle Thu, 04 Dec 2025 12:00:00 +0100 diff --git a/cmake/CPackConfig.cmake b/cmake/CPackConfig.cmake new file mode 100644 index 0000000..0520fd0 --- /dev/null +++ b/cmake/CPackConfig.cmake @@ -0,0 +1,25 @@ +set(CPACK_PACKAGE_NAME ${PROJECT_NAME}) + + +set(CPACK_DEBIAN_PACKAGE_DESCRIPTION +"SSE artificial cpack example +This package demonstrates packaging with CMake/CPack to TGZ and DEB. +It installs a small binary and a library and ships docs under +/usr/share/doc/${CPACK_PACKAGE_NAME}/." +) +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "" + CACHE STRING "Very extensive description of the cpack example module") + +set(CPACK_PACKAGE_VENDOR "Felix Kimmerle") +set(CPACK_PACKAGE_CONTACT "FelixKimmerle@hotmail.com") +set(CPACK_PACKAGE_MAINTAINER "FelixKimmerle <${CPACK_PACKAGE_CONTACT}>") +set(CPACK_PACKAGE_HOMEPAGE_URL "https://github.com/FelixKimmerle/cpack-exercise-wt2526") + +set(CPACK_STRIP_FILES "TRUE") +set(CPACK_GENERATOR "TGZ;DEB") +set(CPACK_DEBIAN_FILE_NAME "DEB-DEFAULT") +set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS YES) +# set(CPACK_DEBIAN_PACKAGE_VERSION 1) +set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Felix Kimmerle <${CPACK_PACKAGE_CONTACT}>") + +include(CPack) diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh new file mode 100755 index 0000000..6d2de59 --- /dev/null +++ b/docker-entrypoint.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash +set -euo pipefail +shopt -s nullglob + +SRC_DIR="/src" +OUT_DIR="/out" +BUILD_DIR="/tmp/build" + +mkdir -p "$BUILD_DIR" +mkdir -p "$OUT_DIR" + + +cmake -S "$SRC_DIR" -B "$BUILD_DIR" \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_SHARED_LIBS=ON \ + -DCPACK_PACKAGE_DIRECTORY="$BUILD_DIR" + +make -C "$BUILD_DIR" -j"$(nproc)" package + +artifacts=( + "$BUILD_DIR"/*.tar.gz + "$BUILD_DIR"/*.deb +) + +for f in "${artifacts[@]}"; do + cp -f "$f" "$OUT_DIR/" +done + +ls -l "$OUT_DIR" diff --git a/man/cpackexample.1 b/man/cpackexample.1 new file mode 100644 index 0000000..33f66f7 --- /dev/null +++ b/man/cpackexample.1 @@ -0,0 +1,7 @@ +.TH cpackexample 1 "Dec 2025" "cpackexample 0.1.0" "User Commands" +.SH NAME +cpackexample \- demo binary +.SH SYNOPSIS +.B cpackexample +.SH DESCRIPTION +Demo program for CMake/CPack packaging.