diff --git a/.gitignore b/.gitignore index 5cf2f9a..ead7931 100644 --- a/.gitignore +++ b/.gitignore @@ -49,3 +49,8 @@ cmake_install.cmake # vcpkg vcpkg_installed/ + +# debian packaging +*.deb +deb/opt +deb/usr \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 744eccf..ddb8a4e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,9 +18,10 @@ get_directory_property(HAS_PARENT PARENT_DIRECTORY) if(HAS_PARENT) message(STATUS "Configuring as a subproject.") - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/../out/${CMAKE_BUILD_TYPE}/bin/) - set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/../out/${CMAKE_BUILD_TYPE}/lib/) - set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/../out/${CMAKE_BUILD_TYPE}/lib/) + set(BINARY_DIR ${CMAKE_SOURCE_DIR}/../out/${CMAKE_BUILD_TYPE}) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${BINARY_DIR}/bin/) + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${BINARY_DIR}/lib/) + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${BINARY_DIR}/lib/) set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/../env/) if(DEFINED ENV{WORKSPACE}) @@ -31,9 +32,10 @@ if(HAS_PARENT) else() message(STATUS "Configuring as a standalone project.") - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/out/${CMAKE_BUILD_TYPE}/bin/) - set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/out/${CMAKE_BUILD_TYPE}/lib/) - set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/out/${CMAKE_BUILD_TYPE}/lib/) + set(BINARY_DIR ${CMAKE_SOURCE_DIR}/out/${CMAKE_BUILD_TYPE}/) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${BINARY_DIR}/bin/) + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${BINARY_DIR}/lib/) + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${BINARY_DIR}/lib/) endif() #======== Find dependencies ========# @@ -73,38 +75,58 @@ target_link_libraries(aedile PRIVATE plog::plog websocketpp::websocketpp ) -target_include_directories(aedile PUBLIC ${INCLUDE_DIR}) +target_include_directories(aedile PUBLIC $) set_target_properties(aedile PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS YES) -#======== Build the tests ========# -enable_testing() -include(GoogleTest) +file(COPY include DESTINATION ${BINARY_DIR}) -FetchContent_Declare( - googletest - URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip -) +#======== Install Support ========# +# Specify the version of the project +set_target_properties(aedile PROPERTIES VERSION ${PROJECT_VERSION}) +set_target_properties(aedile PROPERTIES SOVERSION 0) + +# Install the library +install(TARGETS ${PROJECT_NAME} + EXPORT ${PROJECT_NAME}Targets + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib) -set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) -FetchContent_MakeAvailable(googletest) +# Install the headers +install(DIRECTORY include/ DESTINATION include) -enable_testing() +#======== Package Support ========# -set(TEST_DIR ./test) -set(TEST_SOURCES - ${TEST_DIR}/nostr_service_test.cpp +# Create a package configuration file +include(CMakePackageConfigHelpers) + +write_basic_package_version_file( + ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake + VERSION ${PROJECT_VERSION} + COMPATIBILITY AnyNewerVersion ) -add_executable(aedile_test ${TEST_SOURCES} ${HEADERS}) -target_link_libraries(aedile_test PRIVATE - GTest::gmock - GTest::gtest - GTest::gtest_main - aedile - plog::plog - websocketpp::websocketpp +configure_package_config_file( + ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${PROJECT_NAME}Config.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake + INSTALL_DESTINATION lib/cmake/${PROJECT_NAME} +) + +# Install the package configuration files +install(FILES + ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake + ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake + DESTINATION lib/cmake/${PROJECT_NAME} ) -target_include_directories(aedile_test PUBLIC ${INCLUDE_DIR}) -set_target_properties(aedile_test PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS YES) -gtest_add_tests(TARGET aedile_test) +# Export targets for use by other projects +install(EXPORT ${PROJECT_NAME}Targets + FILE ${PROJECT_NAME}Targets.cmake + NAMESPACE ${PROJECT_NAME}:: + DESTINATION lib/cmake/${PROJECT_NAME}) + +if(${ENABLE_TESTS}) + enable_testing() + add_subdirectory(test) +else() + add_subdirectory(test EXCLUDE_FROM_ALL) +endif() \ No newline at end of file diff --git a/CMakePresets.json b/CMakePresets.json index d28f1a5..0ca4df0 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -6,7 +6,8 @@ "generator": "Unix Makefiles", "binaryDir": "${sourceDir}/build/linux", "cacheVariables": { - "CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" + "CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake", + "CMAKE_INSTALL_PREFIX": "$env{INSTALL_DIR}" } } ], diff --git a/README.md b/README.md index b2cd674..e086ce5 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ To build the SDK on Linux, run the following commands from the project root: ```bash export VCPKG_ROOT=/path/to/vcpkg/installation -cmake --preset=linux # configuration step +cmake --preset=linux -DENABLE_TESTS=1 # configuration step with tests enabled cmake --build build/linux # compilation or build step ``` @@ -42,4 +42,4 @@ To run unit tests, use the following command: ```bash ctest --preset linux -``` +``` \ No newline at end of file diff --git a/cmake/aedileConfig.cmake.in b/cmake/aedileConfig.cmake.in new file mode 100644 index 0000000..a1c6d45 --- /dev/null +++ b/cmake/aedileConfig.cmake.in @@ -0,0 +1,5 @@ +@PACKAGE_INIT@ + +include("${CMAKE_CURRENT_LIST_DIR}/${PROJECT_NAME}Targets.cmake") + +check_required_components(${PROJECT_NAME}) diff --git a/deb/DEBIAN/control b/deb/DEBIAN/control new file mode 100644 index 0000000..819ffa4 --- /dev/null +++ b/deb/DEBIAN/control @@ -0,0 +1,6 @@ +Package: libaedile +Version: 0.0.2 +Maintainer: MichaelJ +Architecture: amd64 +Description: Plug-and-play Nostr Development Kit +Pre-Depends: dpkg ( >= 1.16.1), libwebsocketpp-dev ( >= 0.8.1-7), nlohmann-json3-dev ( >= 3.7.3-1), libssl-dev ( >= 3.0), libplog-dev ( >= 1.1.10) diff --git a/gen_deb.sh b/gen_deb.sh new file mode 100755 index 0000000..65fe464 --- /dev/null +++ b/gen_deb.sh @@ -0,0 +1,31 @@ +#! /bin/bash + +export PACKAGE_NAME="libaedile-dev" +export VERSION="0.0.2" + +export SRC_ROOT_DIR=$(dirname $(readlink -f ${0})) +export DEB_PACKAGE_ROOT="${SRC_ROOT_DIR}/deb" +export INSTALL_DIR="${DEB_PACKAGE_ROOT}/opt/${PACKAGE_NAME}/usr" + + +rm -rf $INSTALL_DIR +mkdir -p $INSTALL_DIR + +cd "${SRC_ROOT_DIR}" +cmake --preset=linux +cmake --build build/linux +cmake --install build/linux + +rm -rf ${DEB_PACKAGE_ROOT}/usr/ + +mkdir -p ${DEB_PACKAGE_ROOT}/usr/include/aedile/client +mkdir -p ${DEB_PACKAGE_ROOT}/usr/lib + +ln -s ${INSTALL_DIR}/include/nostr.h ${DEB_PACKAGE_ROOT}/usr/include/aedile/nostr.h +ln -s ${INSTALL_DIR}/include/nostr.hpp ${DEB_PACKAGE_ROOT}/usr/include/aedile/nostr.hpp +ln -s ${INSTALL_DIR}/include/client/web_socket_client.hpp ${DEB_PACKAGE_ROOT}/usr/include/aedile/client/web_socket_client.hpp +ln -s ${INSTALL_DIR}/lib/libaedile.a ${DEB_PACKAGE_ROOT}/usr/lib/libaedile.a + +cd "${SRC_ROOT_DIR}" + +dpkg-deb --build deb deb/$PACKAGE_NAME-${VERSION}.deb diff --git a/include/nostr.h b/include/nostr.h new file mode 100644 index 0000000..785a6f1 --- /dev/null +++ b/include/nostr.h @@ -0,0 +1,2 @@ +#include +#include \ No newline at end of file diff --git a/src/client/websocketpp_client.cpp b/src/client/websocketpp_client.cpp index c7504e1..f2c2d5f 100644 --- a/src/client/websocketpp_client.cpp +++ b/src/client/websocketpp_client.cpp @@ -1,4 +1,5 @@ #include "web_socket_client.hpp" +#include using std::error_code; using std::function; diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt new file mode 100644 index 0000000..a78a8f9 --- /dev/null +++ b/test/CMakeLists.txt @@ -0,0 +1,32 @@ +#======== Build the tests ========# +enable_testing() +include(GoogleTest) + +FetchContent_Declare( + googletest + URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip +) + +set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) +FetchContent_MakeAvailable(googletest) + +enable_testing() + +set(TEST_DIR ./) +set(TEST_SOURCES + ${TEST_DIR}/nostr_service_test.cpp +) + +add_executable(aedile_test ${TEST_SOURCES} ${HEADERS}) +target_link_libraries(aedile_test PRIVATE + GTest::gmock + GTest::gtest + GTest::gtest_main + aedile + plog::plog + websocketpp::websocketpp +) +target_include_directories(aedile_test PUBLIC ${INCLUDE_DIR}) +set_target_properties(aedile_test PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS YES) + +gtest_add_tests(TARGET aedile_test)