Skip to content
Merged
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
86 changes: 86 additions & 0 deletions .github/workflows/trx-cpp-tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
name: trx-cpp tests

on:
push:
paths:
- "**"
pull_request:
paths:
- "**"

jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y \
cmake \
g++ \
zlib1g-dev \
libeigen3-dev \
nlohmann-json3-dev \
libspdlog-dev

- name: Fetch mio
run: |
git clone --depth 1 https://github.com/mandreyel/mio.git deps/mio

- name: Build and install libzip (with tools)
run: |
git clone --depth 1 https://github.com/nih-at/libzip.git deps/libzip
cmake -S deps/libzip -B deps/libzip/build \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_TOOLS=ON \
-DBUILD_SHARED_LIBS=ON \
-DCMAKE_INSTALL_PREFIX=${GITHUB_WORKSPACE}/deps/libzip/install
cmake --build deps/libzip/build --target install

- name: Build and install GoogleTest
run: |
git clone --depth 1 https://github.com/google/googletest.git deps/googletest
cmake -S deps/googletest -B deps/googletest/build \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=${GITHUB_WORKSPACE}/deps/googletest/install
cmake --build deps/googletest/build --target install

- name: Configure trx-cpp
run: |
cmake -S . -B build \
-DTRX_BUILD_TESTS=ON \
-DMIO_INCLUDE_DIR=${GITHUB_WORKSPACE}/deps/mio/include \
-DGTest_DIR=${GITHUB_WORKSPACE}/deps/googletest/install/lib/cmake/GTest \
-DCMAKE_PREFIX_PATH=${GITHUB_WORKSPACE}/deps/libzip/install

- name: Build
run: cmake --build build

- name: Test
run: ctest --test-dir build --output-on-failure

conan-create:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Install build tooling
run: |
sudo apt-get update
sudo apt-get install -y cmake ninja-build g++

- name: Install Conan
run: |
python3 -m pip install --upgrade pip
python3 -m pip install "conan>=2.0,<3.0"

- name: Conan create (with tests)
env:
CONAN_HOME: ${{ runner.temp }}/.conan2
run: |
conan profile detect --force
conan create . --build=missing -o with_tests=True -s build_type=Release
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,8 @@
libtrx.a
tests/data
.vscode
test_package/build/
test_package/CMakeUserPresets.json

test_package/build
test_package/CMakeUserPresets.json
141 changes: 129 additions & 12 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,28 +1,145 @@
cmake_minimum_required(VERSION 3.0.0)
cmake_minimum_required(VERSION 3.10)
cmake_policy(SET CMP0074 NEW)
cmake_policy(SET CMP0079 NEW)

project(trx VERSION 0.1.0)
set (CMAKE_CXX_STANDARD 11)

#set(CMAKE_BUILD_TYPE RelWithDebInfo)
set(CMAKE_BUILD_TYPE Debug)
include(GNUInstallDirs)
include(CMakePackageConfigHelpers)

set(CMAKE_CXX_STANDARD 17)
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
set(CMAKE_BUILD_TYPE Debug)
endif()

option(TRX_USE_CONAN "Should Conan package manager be used?" ON)
option(TRX_BUILD_TESTS "Build trx tests" ON)

find_package(libzip REQUIRED)
find_package (Eigen3 CONFIG REQUIRED)
set(TRX_LIBZIP_TARGET "")
if(TARGET libzip::libzip)
set(TRX_LIBZIP_TARGET libzip::libzip)
elseif(TARGET libzip::zip)
set(TRX_LIBZIP_TARGET libzip::zip)
elseif(TARGET zip::zip)
set(TRX_LIBZIP_TARGET zip::zip)
else()
message(FATAL_ERROR "No suitable libzip target (expected libzip::libzip or zip::zip)")
endif()
find_package(Eigen3 CONFIG QUIET)
if (NOT Eigen3_FOUND)
find_package(Eigen3 REQUIRED) # try module mode
endif()
# Create an imported target if the package did not provide one (module mode)
if (NOT TARGET Eigen3::Eigen AND EXISTS "${EIGEN3_INCLUDE_DIR}")
add_library(Eigen3::Eigen INTERFACE IMPORTED)
set_target_properties(Eigen3::Eigen PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${EIGEN3_INCLUDE_DIR}"
)
endif()
find_package(nlohmann_json CONFIG REQUIRED)
find_package(spdlog CONFIG REQUIRED)
find_package(mio CONFIG QUIET)
if(TARGET mio::mio)
set(TRX_HAVE_MIO_TARGET ON)
else()
find_path(MIO_INCLUDE_DIR mio/mmap.hpp PATH_SUFFIXES include)
if (NOT MIO_INCLUDE_DIR)
message(FATAL_ERROR "mio headers not found. Set MIO_INCLUDE_DIR to the folder containing mio/mmap.hpp.")
endif()
endif()

add_library(trx src/trx.cpp include/trx/trx.h include/trx/trx.tpp)
add_library(trx-cpp::trx ALIAS trx)

if(TRX_USE_CONAN AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/cmake/ConanSetup.cmake")
include(cmake/ConanSetup.cmake)
elseif(TRX_USE_CONAN)
message(STATUS "TRX_USE_CONAN enabled but cmake/ConanSetup.cmake not found; skipping Conan.")
endif()

add_library(trx src/trx.cpp src/trx.tpp src/trx.h)
# Fallback for libzip packages that don't expose include dirs via CMake targets.
set(TRX_LIBZIP_INCLUDE_DIR "")
get_target_property(_trx_libzip_includes ${TRX_LIBZIP_TARGET} INTERFACE_INCLUDE_DIRECTORIES)
if(NOT _trx_libzip_includes)
find_path(TRX_LIBZIP_INCLUDE_DIR zip.h)
if(NOT TRX_LIBZIP_INCLUDE_DIR)
message(FATAL_ERROR "libzip headers not found. Set TRX_LIBZIP_INCLUDE_DIR or fix libzip CMake targets.")
endif()
endif()

TARGET_LINK_LIBRARIES(trx
PRIVATE
nlohmann_json::nlohmann_json
libzip::zip
Eigen3::Eigen
spdlog::spdlog
spdlog::spdlog_header_only
PUBLIC
nlohmann_json::nlohmann_json
${TRX_LIBZIP_TARGET}
Eigen3::Eigen
spdlog::spdlog
$<$<BOOL:${TRX_HAVE_MIO_TARGET}>:mio::mio>
)
target_include_directories(trx
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
$<$<NOT:$<BOOL:${TRX_HAVE_MIO_TARGET}>>:$<BUILD_INTERFACE:${MIO_INCLUDE_DIR}>>
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/src
)
if(TRX_LIBZIP_INCLUDE_DIR)
target_include_directories(trx PUBLIC
$<BUILD_INTERFACE:${TRX_LIBZIP_INCLUDE_DIR}>
$<INSTALL_INTERFACE:${TRX_LIBZIP_INCLUDE_DIR}>
)
endif()

if(TRX_BUILD_TESTS)
find_package(GTest CONFIG QUIET)
if(NOT GTest_FOUND)
find_package(GTest QUIET)
endif()
if(GTest_FOUND)
enable_testing()
add_subdirectory(tests)
else()
message(STATUS "GTest not found; skipping tests. Set GTest_DIR to a config path to enable.")
endif()
endif()

# Installation and package config
set(TRX_INSTALL_CONFIGDIR "${CMAKE_INSTALL_LIBDIR}/cmake/trx-cpp")

install(TARGETS trx
EXPORT trx-cppTargets
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)

install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})

install(EXPORT trx-cppTargets
FILE trx-cppTargets.cmake
NAMESPACE trx-cpp::
DESTINATION ${TRX_INSTALL_CONFIGDIR}
)

configure_package_config_file(
cmake/trx-cppConfig.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/trx-cppConfig.cmake
INSTALL_DESTINATION ${TRX_INSTALL_CONFIGDIR}
)

write_basic_package_version_file(
${CMAKE_CURRENT_BINARY_DIR}/trx-cppConfigVersion.cmake
VERSION ${PROJECT_VERSION}
COMPATIBILITY SameMinorVersion
)

install(FILES
${CMAKE_CURRENT_BINARY_DIR}/trx-cppConfig.cmake
${CMAKE_CURRENT_BINARY_DIR}/trx-cppConfigVersion.cmake
DESTINATION ${TRX_INSTALL_CONFIGDIR}
)

set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
Expand Down
13 changes: 13 additions & 0 deletions cmake/trx-cppConfig.cmake.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
@PACKAGE_INIT@

include(CMakeFindDependencyMacro)
find_dependency(libzip)
find_dependency(Eigen3)
find_dependency(nlohmann_json)
find_dependency(spdlog)
# mio is header-only; try to locate if packaged
find_dependency(mio QUIET)

include("${CMAKE_CURRENT_LIST_DIR}/trx-cppTargets.cmake")

check_required_components("trx-cpp")
Loading