315 lines
12 KiB
CMake
315 lines
12 KiB
CMake
cmake_minimum_required(VERSION 3.13)
|
|
project(apostol-dm)
|
|
|
|
set(CMAKE_CXX_STANDARD 14)
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc -static-libstdc++ -rdynamic")
|
|
|
|
set(PROJECT_NAME "dm")
|
|
set(PROJECT_DESCRIPTION "Bitcoin Payment Service (Deal Module)")
|
|
|
|
message(STATUS "Project name: ${PROJECT_NAME}")
|
|
message(STATUS "Project description: ${PROJECT_DESCRIPTION}")
|
|
|
|
# Settings
|
|
# ----------------------------------------------------------------------------------------------------------------------
|
|
set(INSTALL_AS_ROOT ON CACHE BOOL "Install as root")
|
|
set(USE_SYSTEMD ON CACHE BOOL "Use systemd")
|
|
set(WITH_POSTGRESQL OFF CACHE BOOL "Build with PostgreSQL")
|
|
set(WITH_SSL ON CACHE BOOL "Build with SSL")
|
|
set(WITH_SQLITE3 OFF CACHE BOOL "Build with Sqlite3")
|
|
set(WITH_CURL OFF CACHE BOOL "Build with cURL")
|
|
set(WITH_BITCOIN_CLIENT ON CACHE BOOL "Build with libbitcoin-client")
|
|
set(USE_SIGNATURE ON CACHE BOOL "Using signature in HTTP headers")
|
|
# ----------------------------------------------------------------------------------------------------------------------
|
|
|
|
if (INSTALL_AS_ROOT)
|
|
set(INSTALL_BIN_PATH "/usr/sbin")
|
|
set(PROJECT_PREFIX "/etc/${PROJECT_NAME}")
|
|
else()
|
|
set(INSTALL_BIN_PATH "/usr/local/sbin")
|
|
set(PROJECT_PREFIX "$ENV{HOME}/.config/${PROJECT_NAME}")
|
|
endif()
|
|
|
|
list( APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake-modules" )
|
|
|
|
add_compile_options("$<$<CONFIG:DEBUG>:-D_DEBUG>")
|
|
|
|
set(CORE_LIB_NAME apostol-core)
|
|
#set(MODULES_LIB_NAME apostol-modules)
|
|
|
|
add_custom_target(
|
|
auto_increment_version
|
|
${CMAKE_COMMAND}
|
|
-D VERSION_FILE=${CMAKE_SOURCE_DIR}/version.h
|
|
-P ${CMAKE_MODULE_PATH}/AutoVersion.cmake
|
|
)
|
|
|
|
set(PROJECT_LIB_DIR "src/lib")
|
|
|
|
# Delphi classes for C++
|
|
# ----------------------------------------------------------------------------------------------------------------------
|
|
set(DELPHI_LIB_NAME delphi)
|
|
set(DELPHI_LIB_DIR "${PROJECT_LIB_DIR}/${DELPHI_LIB_NAME}")
|
|
|
|
# -Iinclude
|
|
include_directories(${DELPHI_LIB_DIR}/include)
|
|
include_directories(${DELPHI_LIB_DIR}/src)
|
|
|
|
add_compile_options("-DDELPHI_LIB_EXPORTS")
|
|
add_compile_options(-DWWWServerName="${PROJECT_DESCRIPTION}")
|
|
|
|
if (WITH_POSTGRESQL)
|
|
set(PQ_LIB_NAME "pq")
|
|
add_compile_options("-DWITH_POSTGRESQL")
|
|
endif()
|
|
|
|
if (WITH_SSL)
|
|
set(SSL_LIB_NAME "ssl")
|
|
add_compile_options("-DWITH_SSL")
|
|
endif()
|
|
|
|
if (WITH_SQLITE3)
|
|
set(SQLITE3_LIB_NAME "sqlite3")
|
|
add_compile_options("-DWITH_SQLITE3")
|
|
endif()
|
|
|
|
if (WITH_CURL)
|
|
set(CURL_LIB_NAME "curl")
|
|
add_compile_options("-DWITH_CURL")
|
|
endif()
|
|
|
|
if (USE_SIGNATURE)
|
|
add_compile_options("-DCALL_SIGNATURE_FETCH")
|
|
endif()
|
|
|
|
add_subdirectory(${DELPHI_LIB_DIR})
|
|
|
|
# Find PkgConfig
|
|
#------------------------------------------------------------------------------
|
|
find_package( PkgConfig REQUIRED )
|
|
|
|
set( prefix "${CMAKE_PREFIX_PATH}" )
|
|
set( exec_prefix "\${prefix}" )
|
|
set( libdir "\${exec_prefix}/lib" )
|
|
set( includedir "\${exec_prefix}/include" )
|
|
|
|
set( pkgconfigdir "${libdir}/pkgconfig" CACHE PATH "Path to pkgconfig directory." )
|
|
|
|
# Find dl
|
|
#------------------------------------------------------------------------------
|
|
if ((${CMAKE_SYSTEM_NAME} MATCHES "Linux"))
|
|
find_package( Dl REQUIRED )
|
|
|
|
message(STATUS "Dl libs: ${dl_LIBS}")
|
|
message(STATUS "Dl libraries: ${dl_LIBRARIES}")
|
|
endif()
|
|
|
|
# rapidxml
|
|
# ----------------------------------------------------------------------------------------------------------------------
|
|
include_directories(${PROJECT_LIB_DIR}/rapidxml)
|
|
file(GLOB lib_files ${lib_files} ${PROJECT_LIB_DIR}/rapidxml/*.hpp)
|
|
|
|
# picojson
|
|
# ----------------------------------------------------------------------------------------------------------------------
|
|
include_directories(${PROJECT_LIB_DIR}/picojson)
|
|
file(GLOB lib_files ${lib_files} ${PROJECT_LIB_DIR}/picojson/*.h)
|
|
|
|
# jwt-cpp
|
|
# ----------------------------------------------------------------------------------------------------------------------
|
|
include_directories(${PROJECT_LIB_DIR}/jwt-cpp)
|
|
file(GLOB lib_files ${lib_files} ${PROJECT_LIB_DIR}/jwt-cpp/*.h)
|
|
|
|
set(JWT_JSON_TRAITS_OPTIONS boost-json danielaparker-jsoncons kazuho-picojson nlohmann-json)
|
|
foreach(traits ${JWT_JSON_TRAITS_OPTIONS})
|
|
list(APPEND lib_files ${PROJECT_LIB_DIR}/jwt-cpp/traits/${traits}/defaults.h ${PROJECT_LIB_DIR}/jwt-cpp/traits/${traits}/traits.h)
|
|
endforeach()
|
|
|
|
# Find boost
|
|
#------------------------------------------------------------------------------
|
|
find_package(Boost 1.62.0 REQUIRED COMPONENTS)
|
|
|
|
set( Boost_LIBRARY_DIR "${Boost_LIBRARY_DIR_RELEASE}" )
|
|
|
|
set( boost_CPPFLAGS "-I${Boost_INCLUDE_DIR}" )
|
|
set( boost_LDFLAGS "-L${Boost_LIBRARY_DIR}" )
|
|
|
|
# Find OpenPGP
|
|
#------------------------------------------------------------------------------
|
|
find_package(OpenPGP REQUIRED)
|
|
|
|
message(STATUS "OpenPGP headers: ${openpgp_INCLUDE_DIRS}")
|
|
message(STATUS "OpenPGP directory: ${openpgp_LIBRARY_DIRS}")
|
|
message(STATUS "OpenPGP libraries: ${openpgp_LIBRARIES}")
|
|
|
|
add_definitions( -DOPENSSL_RNG )
|
|
add_definitions( -DGPG_COMPATIBLE )
|
|
|
|
# Find Bitcoin
|
|
#------------------------------------------------------------------------------
|
|
|
|
#set(BITCOIN_VERSION "3.6.0")
|
|
set(BITCOIN_VERSION "3.7.0")
|
|
#set(BITCOIN_VERSION "4.0.0")
|
|
|
|
#add_definitions( -DWITH_ICU )
|
|
|
|
if ( ${BITCOIN_VERSION} VERSION_LESS "3.7.0" )
|
|
|
|
set(BITCOIN_LIB_NAME bitcoin)
|
|
|
|
find_package(Bitcoin ${BITCOIN_VERSION} REQUIRED)
|
|
|
|
message(STATUS "Bitcoin headers: ${bitcoin_INCLUDE_DIRS}")
|
|
message(STATUS "Bitcoin directory: ${bitcoin_LIBRARY_DIRS}")
|
|
message(STATUS "Bitcoin libraries: ${bitcoin_LIBRARIES}")
|
|
|
|
else()
|
|
|
|
if ( ${BITCOIN_VERSION} VERSION_EQUAL "4.0.0" )
|
|
add_definitions(-DBITCOIN_VERSION_4)
|
|
else()
|
|
add_definitions(-DBITCOIN_VERSION_3_7_x)
|
|
endif()
|
|
|
|
add_definitions(-DBITCOIN_LIB_NAME="bitcoin-system")
|
|
set(BITCOIN_LIB_NAME bitcoin-system)
|
|
|
|
find_package(Bitcoin-System ${BITCOIN_VERSION} REQUIRED)
|
|
|
|
message(STATUS "Bitcoin-System headers: ${bitcoin_system_INCLUDE_DIRS}")
|
|
message(STATUS "Bitcoin-System directory: ${bitcoin_system_LIBRARY_DIRS}")
|
|
message(STATUS "Bitcoin-System libraries: ${bitcoin_system_LIBRARIES}")
|
|
|
|
endif()
|
|
|
|
# Find Bitcoin-Client
|
|
#------------------------------------------------------------------------------
|
|
if (WITH_BITCOIN_CLIENT)
|
|
add_compile_options("-DWITH_BITCOIN_CLIENT")
|
|
|
|
find_package(Bitcoin-Client ${BITCOIN_VERSION} REQUIRED)
|
|
|
|
message(STATUS "Bitcoin-Client headers: ${bitcoin_client_INCLUDE_DIRS}")
|
|
message(STATUS "Bitcoin-Client directory: ${bitcoin_client_LIBRARY_DIRS}")
|
|
message(STATUS "Bitcoin-Client libraries: ${bitcoin_client_LIBRARIES}")
|
|
endif()
|
|
|
|
# Define project common includes directories
|
|
#------------------------------------------------------------------------------
|
|
include_directories( SYSTEM
|
|
${bitcoin_INCLUDE_DIRS}
|
|
${bitcoin_system_INCLUDE_DIRS}
|
|
${bitcoin_client_INCLUDE_DIRS}
|
|
${openpgp_INCLUDE_DIRS}
|
|
${dl_INCLUDE_DIRS}
|
|
)
|
|
|
|
# Define project common library directories
|
|
#------------------------------------------------------------------------------
|
|
link_directories(
|
|
${bitcoin_LIBRARY_DIRS}
|
|
${bitcoin_system_LIBRARY_DIRS}
|
|
${bitcoin_client_LIBRARY_DIRS}
|
|
${openpgp_LIBRARY_DIRS}
|
|
${dl_LIBRARY_DIRS}
|
|
)
|
|
|
|
# Define project common libraries/linker flags.
|
|
#------------------------------------------------------------------------------
|
|
link_libraries(
|
|
"-fstack-protector"
|
|
"-fstack-protector-all"
|
|
${bitcoin_LIBRARIES}
|
|
${bitcoin_system_LIBRARIES}
|
|
${bitcoin_client_LIBRARIES}
|
|
${openpgp_LIBRARIES}
|
|
${dl_LIBRARIES}
|
|
)
|
|
|
|
# Apostol
|
|
# ----------------------------------------------------------------------------------------------------------------------
|
|
include_directories(src/app src/core src/modules src/modules/Workers src/modules/Helpers src/processes)
|
|
|
|
file(GLOB app_files version.h src/app/*.hpp src/app/*.cpp)
|
|
file(GLOB core_files src/core/*.hpp src/core/*.cpp)
|
|
file(GLOB modules_files src/modules/Modules.hpp src/modules/*/*.hpp src/modules/*/*/*.hpp src/modules/*/*/*.cpp)
|
|
file(GLOB processes_files src/processes/Processes.hpp src/processes/*/*.hpp src/processes/*/*.cpp)
|
|
|
|
# Apostol Core
|
|
# ----------------------------------------------------------------------------------------------------------------------
|
|
add_library(${CORE_LIB_NAME} STATIC
|
|
$<TARGET_OBJECTS:delphi>
|
|
${lib_files}
|
|
${core_files}
|
|
${modules_files}
|
|
${processes_files}
|
|
)
|
|
|
|
target_compile_definitions(${CORE_LIB_NAME} PUBLIC
|
|
APP_NAME="${PROJECT_NAME}"
|
|
APP_DESCRIPTION="${PROJECT_DESCRIPTION}"
|
|
APP_DEFAULT_LOCALE="en_US.UTF-8"
|
|
APP_VAR="${PROJECT_NAME}"
|
|
APP_OLDPID_EXT=".oldbin"
|
|
APP_DEFAULT_USER="nobody"
|
|
APP_DEFAULT_GROUP="nogroup"
|
|
APP_DEFAULT_LISTEN="0.0.0.0"
|
|
APP_PREFIX="${PROJECT_PREFIX}/"
|
|
APP_CONF_PREFIX="conf/"
|
|
APP_CACHE_PREFIX="cache/"
|
|
APP_SBIN_PATH="sbin/${PROJECT_NAME}"
|
|
APP_CONF_FILE="${PROJECT_NAME}.conf"
|
|
APP_PID_FILE="logs/${PROJECT_NAME}.pid"
|
|
APP_LOCK_FILE="logs/${PROJECT_NAME}.lock"
|
|
APP_ERROR_LOG_FILE="logs/error.log"
|
|
APP_ACCESS_LOG_FILE="logs/access.log"
|
|
APP_POSTGRES_LOG_FILE="logs/postgres.log"
|
|
APP_STREAM_LOG_FILE="logs/stream.log"
|
|
APP_DOC_ROOT="www/"
|
|
)
|
|
|
|
target_link_libraries(${CORE_LIB_NAME} pthread ${PQ_LIB_NAME} ${SQLITE3_LIB_NAME} ${CURL_LIB_NAME} ${SSL_LIB_NAME} yaml-cpp crypto)
|
|
|
|
# Apostol modules
|
|
# ----------------------------------------------------------------------------------------------------------------------
|
|
#add_library(${MODULES_LIB_NAME} STATIC ${modules_files})
|
|
#target_link_libraries(${MODULES_LIB_NAME} ${CORE_LIB_NAME})
|
|
|
|
# BitDeals Payment Service (Deal Module)
|
|
# ----------------------------------------------------------------------------------------------------------------------
|
|
add_executable(${PROJECT_NAME} ${app_files})
|
|
target_link_libraries(${PROJECT_NAME} ${CORE_LIB_NAME})
|
|
|
|
add_dependencies(${PROJECT_NAME} auto_increment_version)
|
|
# ----------------------------------------------------------------------------------------------------------------------
|
|
|
|
# Install
|
|
# ----------------------------------------------------------------------------------------------------------------------
|
|
set(INSTALL_PATH "${PROJECT_PREFIX}")
|
|
|
|
install(TARGETS ${PROJECT_NAME} DESTINATION ${INSTALL_BIN_PATH})
|
|
|
|
install(DIRECTORY DESTINATION ${INSTALL_PATH})
|
|
install(DIRECTORY DESTINATION ${INSTALL_PATH}/oauth2)
|
|
install(DIRECTORY DESTINATION ${INSTALL_PATH}/conf)
|
|
install(DIRECTORY DESTINATION ${INSTALL_PATH}/logs)
|
|
install(DIRECTORY DESTINATION ${INSTALL_PATH}/sites)
|
|
install(DIRECTORY conf/oauth2/ DESTINATION ${INSTALL_PATH}/oauth2)
|
|
install(DIRECTORY conf/sites/ DESTINATION ${INSTALL_PATH}/sites)
|
|
install(DIRECTORY www/ DESTINATION ${INSTALL_PATH}/www)
|
|
install(FILES conf/default.conf DESTINATION ${INSTALL_PATH}/conf)
|
|
install(FILES conf/oauth2.conf DESTINATION ${INSTALL_PATH}/conf)
|
|
install(FILES conf/sites.conf DESTINATION ${INSTALL_PATH}/conf)
|
|
install(FILES conf/bitcoin.conf DESTINATION ${INSTALL_PATH}/conf)
|
|
install(FILES conf/default.conf DESTINATION ${INSTALL_PATH} RENAME ${PROJECT_NAME}.conf)
|
|
|
|
if (INSTALL_AS_ROOT)
|
|
if (USE_SYSTEMD)
|
|
install(FILES auto/unit.service DESTINATION /etc/systemd/system RENAME ${PROJECT_NAME}.service PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ)
|
|
install(CODE "execute_process(COMMAND systemctl enable ${PROJECT_NAME}.service)")
|
|
else()
|
|
install(FILES auto/daemon DESTINATION /etc/init.d RENAME ${PROJECT_NAME} PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
|
|
install(CODE "execute_process(COMMAND update-rc.d ${PROJECT_NAME} defaults)")
|
|
endif()
|
|
endif()
|