Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 30 additions & 11 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,22 +1,41 @@
cmake_minimum_required(VERSION "3.28")
cmake_minimum_required(VERSION 3.28)

project("cpackexample" VERSION 0.1.0)
project(cpackexample VERSION 0.1.0 LANGUAGES CXX)

FIND_PACKAGE(deal.II 9.5 REQUIRED
find_package(deal.II 9.5 REQUIRED
HINTS ${DEAL_II_DIR} ../ ../../ $ENV{DEAL_II_DIR}
)
)
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)

add_library(cpackexamplelib filesystem/filesystem.cpp fem/fem.cpp flatset/flatset.cpp yamlParser/yamlParser.cpp)
add_executable("${PROJECT_NAME}" main.cpp)
add_library(cpackexamplelib
filesystem/filesystem.cpp
fem/fem.cpp
flatset/flatset.cpp
yamlParser/yamlParser.cpp
)

add_executable(cpackexample main.cpp)

target_link_libraries("${PROJECT_NAME}" cpackexamplelib)
target_link_libraries(cpackexamplelib Boost::filesystem ${YAML_CPP_LIBRARIES})
target_link_libraries(cpackexample cpackexamplelib)
target_link_libraries(cpackexamplelib Boost::filesystem yaml-cpp)

DEAL_II_SETUP_TARGET("${PROJECT_NAME}")
DEAL_II_SETUP_TARGET(cpackexample)
DEAL_II_SETUP_TARGET(cpackexamplelib)

install(TARGETS cpackexample RUNTIME DESTINATION bin)
install(TARGETS cpackexamplelib
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
)
install(FILES
fem/fem.hpp
filesystem/filesystem.hpp
flatset/flatset.hpp
yamlParser/yamlParser.hpp
DESTINATION include/cpackexamplelib
)

include(cmake/CPackConfig.cmake)
56 changes: 33 additions & 23 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,28 +1,38 @@
From ubuntu:24.04
FROM ubuntu:24.04

# Install a few dependencies
# install dependencies
RUN apt-get -qq update && \
apt-get -qq -y install \
build-essential \
cmake \
git \
libboost-all-dev \
wget \
libdeal.ii-dev \
vim \
tree \
lintian \
unzip

# 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/
build-essential \
cmake \
git \
libboost-all-dev \
wget \
libdeal.ii-dev \
vim \
tree \
lintian \
unzip

# yaml-cpp (shared)
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 -j"$(nproc)" && \
make install

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"]

# Copying automation script
COPY docker-build.sh /docker-build.sh
RUN chmod +x /docker-build.sh

# Run packaging automatically
ENTRYPOINT ["/docker-build.sh"]
45 changes: 45 additions & 0 deletions cmake/CPackConfig.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# Basic package information
set(CPACK_PACKAGE_NAME "cpackexample")
set(CPACK_PACKAGE_VENDOR "Nikhil / University Of Stuttgart")
set(CPACK_PACKAGE_CONTACT "n.k.2449837@gmail.com")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY
"Finite Element / Boost / YAML example packaged with CPack"
)

# Debian wants an extended description (not empty)
set(CPACK_DEBIAN_PACKAGE_DESCRIPTION
"Finite element demo application

This package contains a small FEM-based example using deal.II, Boost
and yaml-cpp, packaged with CMake and CPack for the SSE exercise."
)

# Version
set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})

# Homepage / project URL (your fork)
set(CPACK_PACKAGE_HOMEPAGE_URL
"https://github.com/Nikhil-4595/cpack-exercise-wt2526"
)

# Only create TGZ and DEB binaries
set(CPACK_GENERATOR "TGZ;DEB")

# Install into /usr so binary ends up in /usr/bin, etc.
set(CPACK_PACKAGING_INSTALL_PREFIX "/usr")

# Debian-specific fields
# Lintian wants a 'phrase' (Name <email>) as maintainer
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Nikhil <${CPACK_PACKAGE_CONTACT}>")
set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "${CPACK_PACKAGE_HOMEPAGE_URL}")
set(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT)

# Strip binaries in packages -> fixes 'unstripped-binary-or-object'
set(CPACK_STRIP_FILES YES)

# Let Debian tools detect shared-library dependencies
# -> fixes 'undeclared-elf-prerequisites' and adds proper Depends:
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS YES)

# Enable CPack
include(CPack)
34 changes: 34 additions & 0 deletions docker-build.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#!/bin/bash
set -euo pipefail

SRC_DIR=/mnt/cpack-exercise
BUILD_DIR=$(mktemp -d /tmp/cpack-build-XXXXXX)
INSTALL_DIR=$(mktemp -d /tmp/cpack-install-XXXXXX)
OUT_DIR="$SRC_DIR/packages"

echo "Source directory: $SRC_DIR"
echo "Build directory: $BUILD_DIR"
echo "Install prefix: $INSTALL_DIR"
echo "Output directory: $OUT_DIR"

mkdir -p "$OUT_DIR"

echo "Configuring project..."
cmake -S "$SRC_DIR" -B "$BUILD_DIR" \
-DBUILD_SHARED_LIBS=ON \
-DCMAKE_INSTALL_PREFIX="$INSTALL_DIR"cmake -S "$SRC_DIR" -B "$BUILD_DIR" \
-DBUILD_SHARED_LIBS=ON \
-DCMAKE_INSTALL_PREFIX="$INSTALL_DIR"

echo "Building project..."
cmake --build "$BUILD_DIR" -- -j"$(nproc)"

echo "Packaging..."
cmake --build "$BUILD_DIR" --target package

echo "Copying packages to host..."
cp "$BUILD_DIR"/*.deb "$OUT_DIR"/
cp "$BUILD_DIR"/*.tar.gz "$OUT_DIR"/

echo "Done. Packages are available in:"
ls -lh "$OUT_DIR"