diff --git a/CMakeLists.txt b/CMakeLists.txt index 5fc4a95..cf688c9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.11) +cmake_minimum_required(VERSION 3.21) project(ArgumentManagerProject VERSION 1.0 LANGUAGES CXX) @@ -108,6 +108,48 @@ add_custom_target(format-check WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" COMMENT "Verify clang-format compliance") +# ============ +# INSTALL +# ============ +include(GNUInstallDirs) + +if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + set_target_properties(ctrace PROPERTIES + INSTALL_RPATH "$ORIGIN/../lib" + ) + + install(TARGETS ctrace + RUNTIME_DEPENDENCY_SET ctrace_deps + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + ) + + install(RUNTIME_DEPENDENCY_SET ctrace_deps + PRE_EXCLUDE_REGEXES + "^libc\\.so" + "^libm\\.so" + "^libdl\\.so" + "^librt\\.so" + "^libpthread\\.so" + "^ld-linux" + "^libstdc\\+\\+" + "^libgcc_s" + DIRECTORIES + "/usr/lib/llvm-20/lib" + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ) +else() + install(TARGETS ctrace + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + ) +endif() + +install(DIRECTORY ${CMAKE_SOURCE_DIR}/config/ + DESTINATION config + FILES_MATCHING + PATTERN "*.json" + PATTERN "*.txt" +) + # ============ # TESTS # ============ diff --git a/Dockerfile.release-binaries b/Dockerfile.release-binaries index 046763f..299571c 100644 --- a/Dockerfile.release-binaries +++ b/Dockerfile.release-binaries @@ -17,6 +17,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ python3 \ git \ tar \ + patchelf \ && rm -rf /var/lib/apt/lists/* RUN curl -fsSL https://apt.llvm.org/llvm.sh -o /tmp/llvm.sh \ @@ -44,6 +45,7 @@ RUN cmake -S . -B build -G Ninja \ -DPARSER_TYPE=CLI11 \ -DUSE_THREAD_SANITIZER=OFF \ -DUSE_ADDRESS_SANITIZER=OFF \ + -DCLANG_LINK_CLANG_DYLIB=ON \ -DLLVM_DIR=/usr/lib/llvm-${LLVM_VERSION}/lib/cmake/llvm \ -DClang_DIR=/usr/lib/llvm-${LLVM_VERSION}/lib/cmake/clang \ && cmake --build build -j"$(nproc)" \ @@ -56,6 +58,7 @@ ARG TARGETARCH ARG PROJECT_NAME=coretrace ARG BINARY_NAME=ctrace +SHELL ["/bin/bash", "-o", "pipefail", "-c"] RUN set -eux; \ case "${TARGETARCH}" in \ amd64) arch_label="amd64" ;; \ @@ -63,13 +66,27 @@ RUN set -eux; \ *) echo "unsupported TARGETARCH: ${TARGETARCH}" >&2; exit 1 ;; \ esac; \ package_name="${PROJECT_NAME}-${VERSION}-linux-${arch_label}"; \ - mkdir -p "/out/${package_name}"; \ - install -m 0755 "/repo/build/${BINARY_NAME}" "/out/${package_name}/${BINARY_NAME}"; \ - install -m 0644 /repo/README.md "/out/${package_name}/README.md"; \ - install -m 0644 /repo/LICENSE "/out/${package_name}/LICENSE"; \ - tar -C /out -czf "/out/${package_name}.tar.gz" "${package_name}"; \ + staging="/staging/${package_name}"; \ + \ + # Install via CMake (binary in bin/, shared libs in lib/, config in share/) \ + cmake --install build --prefix "${staging}" --strip; \ + \ + # Patch RPATH on bundled shared libs so they resolve each other \ + find "${staging}/lib" -name '*.so*' -type f -exec \ + patchelf --set-rpath '$ORIGIN' {} \; ; \ + \ + # Verify all shared libraries resolve via RPATH alone (no LD_LIBRARY_PATH) \ + ldd "${staging}/bin/${BINARY_NAME}" | { ! grep 'not found'; }; \ + \ + # Add metadata files \ + install -m 0644 /repo/README.md "${staging}/README.md"; \ + install -m 0644 /repo/LICENSE "${staging}/LICENSE"; \ + \ + # Create archive and checksum \ + mkdir -p /out; \ + tar -C /staging -czf "/out/${package_name}.tar.gz" "${package_name}"; \ (cd /out && sha256sum "${package_name}.tar.gz" > "${package_name}.tar.gz.sha256"); \ - rm -rf "/out/${package_name}" + rm -rf /staging FROM scratch AS artifacts diff --git a/cmake/FetchNlohmannJson.cmake b/cmake/FetchNlohmannJson.cmake index 78430dd..850fd43 100644 --- a/cmake/FetchNlohmannJson.cmake +++ b/cmake/FetchNlohmannJson.cmake @@ -6,4 +6,8 @@ FetchContent_Declare( DOWNLOAD_EXTRACT_TIMESTAMP FALSE ) -FetchContent_MakeAvailable(json) +FetchContent_GetProperties(json) +if(NOT json_POPULATED) + FetchContent_Populate(json) + add_subdirectory(${json_SOURCE_DIR} ${json_BINARY_DIR} EXCLUDE_FROM_ALL) +endif() diff --git a/cmake/httpLib.cmake b/cmake/httpLib.cmake index 0b5381a..f799356 100644 --- a/cmake/httpLib.cmake +++ b/cmake/httpLib.cmake @@ -6,4 +6,8 @@ FetchContent_Declare( GIT_TAG v0.14.3 ) -FetchContent_MakeAvailable(cpp_httplib) +FetchContent_GetProperties(cpp_httplib) +if(NOT cpp_httplib_POPULATED) + FetchContent_Populate(cpp_httplib) + add_subdirectory(${cpp_httplib_SOURCE_DIR} ${cpp_httplib_BINARY_DIR} EXCLUDE_FROM_ALL) +endif() diff --git a/cmake/logger/coretraceLog.cmake b/cmake/logger/coretraceLog.cmake index 60a470b..f0d1b91 100644 --- a/cmake/logger/coretraceLog.cmake +++ b/cmake/logger/coretraceLog.cmake @@ -7,4 +7,8 @@ FetchContent_Declare(coretrace-logger GIT_REPOSITORY https://github.com/CoreTrace/coretrace-log.git GIT_TAG main ) -FetchContent_MakeAvailable(coretrace-logger) +FetchContent_GetProperties(coretrace-logger) +if(NOT coretrace-logger_POPULATED) + FetchContent_Populate(coretrace-logger) + add_subdirectory(${coretrace-logger_SOURCE_DIR} ${coretrace-logger_BINARY_DIR} EXCLUDE_FROM_ALL) +endif() diff --git a/cmake/stackUsageAnalyzer.cmake b/cmake/stackUsageAnalyzer.cmake index 72ec0cd..48c703f 100644 --- a/cmake/stackUsageAnalyzer.cmake +++ b/cmake/stackUsageAnalyzer.cmake @@ -6,7 +6,11 @@ FetchContent_Declare( GIT_TAG v0.17.0 ) -FetchContent_MakeAvailable(stack_analyzer) +FetchContent_GetProperties(stack_analyzer) +if(NOT stack_analyzer_POPULATED) + FetchContent_Populate(stack_analyzer) + add_subdirectory(${stack_analyzer_SOURCE_DIR} ${stack_analyzer_BINARY_DIR} EXCLUDE_FROM_ALL) +endif() # Copy upstream default models into config/models/ so that tool-config.json # can reference them with paths relative to the config directory, without