diff --git a/CMakeLists.txt b/CMakeLists.txt index 1209c5e..d85be60 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,92 +1,62 @@ cmake_minimum_required(VERSION 3.16) -# Generate version from current date -execute_process( - COMMAND date "+%Y.%m%d.%H%M" - OUTPUT_VARIABLE PROJECT_VERSION - OUTPUT_STRIP_TRAILING_WHITESPACE -) - # Project setup if(NOT DEFINED PROJECT_NAME) message(FATAL_ERROR "PROJECT_NAME is not defined. Pass it via -DPROJECT_NAME=") endif() +string(TIMESTAMP PROJECT_VERSION "%Y.%m%d.%H%M") project(${PROJECT_NAME} VERSION ${PROJECT_VERSION} LANGUAGES CXX) -# C++ standard and build configuration +# Build configuration set(CMAKE_CXX_STANDARD 23) set(CMAKE_CXX_STANDARD_REQUIRED ON) - -# Static linking configuration set(CMAKE_EXE_LINKER_FLAGS "-static -Wl,--allow-multiple-definition") set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") set(BUILD_SHARED_LIBS OFF) -# Configure version.hpp -configure_file( - "${CMAKE_CURRENT_SOURCE_DIR}/src/version.hpp.in" - "${CMAKE_CURRENT_BINARY_DIR}/src/autogen/version.hpp" - @ONLY -) - -# Pre-build script -add_custom_target(run_prebuild_script ALL +# Configure version.hpp and create executable +configure_file("src/version.hpp.in" "src/autogen/version.hpp" @ONLY) +add_custom_target(run_prebuild_script ALL COMMAND bash ${CMAKE_CURRENT_SOURCE_DIR}/cmake_prebuild.sh - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} -) + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) -# Source files file(GLOB_RECURSE SOURCES "src/*.cpp") -set_source_files_properties(${SOURCES} PROPERTIES GENERATED TRUE) - -# Create executable add_executable(${PROJECT_NAME} ${SOURCES}) add_dependencies(${PROJECT_NAME} run_prebuild_script) - -# Include directories target_include_directories(${PROJECT_NAME} PRIVATE - ${CMAKE_CURRENT_BINARY_DIR}/src/autogen - ${CMAKE_CURRENT_SOURCE_DIR}/src -) + ${CMAKE_CURRENT_BINARY_DIR}/src/autogen src) # Find packages set(CMAKE_PREFIX_PATH /usr/local) find_package(OpenSSL REQUIRED) +find_package(Drogon CONFIG REQUIRED) +find_package(nlohmann_json REQUIRED) -# Create OpenSSL targets if they don't exist (for cross-compilation) +# Create OpenSSL targets for cross-compilation if missing if(NOT TARGET OpenSSL::SSL) add_library(OpenSSL::SSL STATIC IMPORTED) set_target_properties(OpenSSL::SSL PROPERTIES IMPORTED_LOCATION "/usr/local/lib64/libssl.a" - INTERFACE_INCLUDE_DIRECTORIES "/usr/local/include" - ) + INTERFACE_INCLUDE_DIRECTORIES "/usr/local/include") endif() if(NOT TARGET OpenSSL::Crypto) add_library(OpenSSL::Crypto STATIC IMPORTED) set_target_properties(OpenSSL::Crypto PROPERTIES IMPORTED_LOCATION "/usr/local/lib64/libcrypto.a" - INTERFACE_INCLUDE_DIRECTORIES "/usr/local/include" - ) + INTERFACE_INCLUDE_DIRECTORIES "/usr/local/include") endif() -find_package(Drogon CONFIG REQUIRED) -find_package(nlohmann_json REQUIRED) +# Determine architecture-specific libunwind +if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(x86_64|AMD64)$") + set(LIBUNWIND_ARCH "x86_64") +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64|arm64)$") + set(LIBUNWIND_ARCH "aarch64") +endif() # Link libraries target_link_libraries(${PROJECT_NAME} PRIVATE - nlohmann_json::nlohmann_json - Drogon::Drogon - /usr/lib/libunwind.a - /usr/local/lib/libpgcommon.a - /usr/local/lib/libpgport.a - lzma - dl -) - -# Add architecture-specific libunwind -if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "AMD64") - target_link_libraries(${PROJECT_NAME} PRIVATE /usr/lib/libunwind-x86_64.a) -elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64") - target_link_libraries(${PROJECT_NAME} PRIVATE /usr/lib/libunwind-aarch64.a) -endif() \ No newline at end of file + nlohmann_json::nlohmann_json Drogon::Drogon + /usr/lib/libunwind.a /usr/lib/libunwind-${LIBUNWIND_ARCH}.a + /usr/local/lib/libpgcommon.a /usr/local/lib/libpgport.a + lzma dl) \ No newline at end of file