# CMakeLists.txt #################################################### # Written by JackCarterSmith, 2022 # This code is released under the RDI license. #################################################### # CMake requirement and general configuration cmake_minimum_required(VERSION 3.15) cmake_policy(VERSION 3.15) set(CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR}) if(DEFINED ENV{MS_COMPATIBLE}) set(CMAKE_GNUtoMS ON) # Enable compatibility level to exported libraries endif() # Project definition if(DEFINED ENV{CI}) # Jenkins CI integration mode project(rdi VERSION $ENV{CI_VERSION}.$ENV{CI_BUILD_NUMBER} DESCRIPTION "Rogue Data Interface" LANGUAGES C CXX) set(RDI_NAME $ENV{CI_OUTPUT_NAME}) else() # Standalone project mode, should not be used for release. project(rdi VERSION 1.0.0 DESCRIPTION "Rogue Data Interface" LANGUAGES C CXX) set(RDI_NAME RDI) endif() #set(RDI_LIB_NAME RDI${PROJECT_VERSION_MAJOR}${PROJECT_VERSION_MINOR}) set(RDI_LIB_NAME RDI) if(NOT MSVC) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") else() set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Wall") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Wall") endif() set(INSTALL_BIN_DIR "${CMAKE_INSTALL_PREFIX}/bin" CACHE PATH "Installation directory for executables") set(INSTALL_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib" CACHE PATH "Installation directory for libraries") set(INSTALL_INC_DIR "${CMAKE_INSTALL_PREFIX}/include" CACHE PATH "Installation directory for headers") # Compilation option option(RDI_SHARED "Build shared lib" ON) option(RDI_STATIC "Build static lib" ON) option(BUILD_TOOLS "Build lib tools" ON) # Import needed packages and references their include path find_package(RSPModel 2.3 REQUIRED) include_directories(${RSPModel_INCLUDE_DIR}) find_package(RSPTerrain 2.0 REQUIRED) include_directories(${RSPTerrain_INCLUDE_DIR}) find_package(RSPTexture 2.1 REQUIRED) include_directories(${RSPTexture_INCLUDE_DIR}) find_package(Boost 1.81.0 REQUIRED) include_directories(${Boost_INCLUDE_DIR}) add_definitions(-DBOOST_ALL_NO_LIB) # Push compile infos to source configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_SOURCE_DIR}/src/config.h @ONLY) # The project is divided in two parts: # - RDI library to interface with RS3D data files. On windows system, it's can use registry to find RS3D install folder. # - Some testing and debugging tools (WIP) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) unset(RDI_TARGETS_LIST) # Define src/headers files file(GLOB_RECURSE RDI_LIB_SOURCES ./src/*.cpp ./src/*.c) source_group("Source Files" FILES ${RDI_LIB_SOURCES}) file(GLOB_RECURSE RSP_LIB_PUBLIC_HRDS ./include/*.hpp ./include/*.h) # Building instructions for RSP-Texture library if(DEFINED ENV{CI}) set(CMAKE_BUILD_TYPE RELEASE) endif() # Declare the shared library instance if(RDI_SHARED) add_library(rdi-lib SHARED ${RDI_LIB_SOURCES}) set_property(TARGET rdi-lib PROPERTY C_STANDARD 17) set_property(TARGET rdi-lib PROPERTY CXX_STANDARD 17) set_property(TARGET rdi-lib PROPERTY C_STANDARD_REQUIRED ON) set_property(TARGET rdi-lib PROPERTY CXX_STANDARD_REQUIRED ON) set_property(TARGET rdi-lib PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>DLL") set_target_properties(rdi-lib PROPERTIES VERSION 1.0.0) target_include_directories(rdi-lib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) set_target_properties(rdi-lib PROPERTIES OUTPUT_NAME "${RDI_LIB_NAME}") # As GNU-GCC have different runtime lib, we statically link them for this type of build if (NOT MSVC) target_link_libraries(rdi-lib PRIVATE -static-libgcc -static-libstdc++ ) endif() target_link_libraries(rdi-lib PRIVATE ${RSPModel_LIBRARIES} ${RSPTerrain_LIBRARIES} ${RSPTexture_LIBRARIES} ${Boost_LIBRARIES} ) if(WIN32) # remove lib prefix on windows system when building dll file set_target_properties(rdi-lib PROPERTIES PREFIX "") set_target_properties(rdi-lib PROPERTIES DEFINE_SYMBOL RDI_DLL) endif() list(APPEND RDI_TARGETS_LIST rdi-lib) # msvc does not append 'lib' - do it here to have consistent name if(MSVC) # only for import library, not the shared one set_target_properties(rdi-lib PROPERTIES IMPORT_PREFIX "lib") endif() endif() # Declare the static library instance if(RDI_STATIC) add_library(rdi-libstatic STATIC ${RDI_LIB_SOURCES}) set_property(TARGET rdi-libstatic PROPERTY C_STANDARD 17) set_property(TARGET rdi-libstatic PROPERTY CXX_STANDARD 17) set_property(TARGET rdi-libstatic PROPERTY C_STANDARD_REQUIRED ON) set_property(TARGET rdi-libstatic PROPERTY CXX_STANDARD_REQUIRED ON) set_property(TARGET rdi-libstatic PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>DLL") set_target_properties(rdi-libstatic PROPERTIES VERSION 1.0.0) target_include_directories(rdi-libstatic PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) # As GNU-GCC have different runtime lib, we statically link them for this type of build if (NOT MSVC) target_link_libraries(rdi-libstatic PRIVATE -static-libgcc -static-libstdc++ ) endif() target_link_libraries(rdi-libstatic PRIVATE ${RSPModel_LIBRARIES} ${RSPTerrain_LIBRARIES} ${RSPTexture_LIBRARIES} ${Boost_LIBRARIES} ) list(APPEND RDI_TARGETS_LIST rdi-libstatic) # MSVC doesn't use a different file extension for shared vs. static # libs. We are able to change OUTPUT_NAME to remove the _static # for all other platforms. if(NOT MSVC) set_target_properties(rdi-libstatic PROPERTIES OUTPUT_NAME "${RDI_LIB_NAME}") set_target_properties(rdi-libstatic PROPERTIES CLEAN_DIRECT_OUTPUT 1) else() set_target_properties(rdi-libstatic PROPERTIES OUTPUT_NAME "${RDI_LIB_NAME}_static") set_target_properties(rdi-libstatic PROPERTIES CLEAN_DIRECT_OUTPUT 1) endif() # MSVC does not append 'lib' - do it here to have consistent name if(MSVC) set_target_properties(rdi-libstatic PROPERTIES PREFIX "lib") endif() endif() if(NOT RDI_TARGETS_LIST) message(SEND_ERROR "No library variant selected to build. " "Please enable at least one of the following options: " "RDI_STATIC, RDI_SHARED") endif() if(BUILD_TOOLS) # Add lib debug tool to buildchain #file(GLOB_RECURSE RDI_TOOLS_SOURCES ./tools/*.cpp ./tools/*.c) #source_group("Tools src files" FILES ${RDI_TOOLS_SOURCES}) #add_executable(rdi-debug-tools ${RDI_TOOLS_SOURCES}) add_executable(rdi-debug-tools ./tools/RDIDebug.cpp) set_property(TARGET rdi-debug-tools PROPERTY C_STANDARD 17) set_property(TARGET rdi-debug-tools PROPERTY CXX_STANDARD 17) set_property(TARGET rdi-debug-tools PROPERTY C_STANDARD_REQUIRED ON) set_property(TARGET rdi-debug-tools PROPERTY CXX_STANDARD_REQUIRED ON) set_target_properties(rdi-debug-tools PROPERTIES OUTPUT_NAME "RDI-debug") list(APPEND RDI_TARGETS_LIST rdi-debug-tools) add_executable(erso-debug-tools ./tools/ErsoDebug.cpp) set_property(TARGET erso-debug-tools PROPERTY C_STANDARD 17) set_property(TARGET erso-debug-tools PROPERTY CXX_STANDARD 17) #set_property(TARGET erso-debug-tools PROPERTY C_STANDARD_REQUIRED ON) #set_property(TARGET erso-debug-tools PROPERTY CXX_STANDARD_REQUIRED ON) set_target_properties(erso-debug-tools PROPERTIES OUTPUT_NAME "Erso-debug") list(APPEND RDI_TARGETS_LIST erso-debug-tools) add_executable(krennic-debug-tools ./tools/KrennicDebug.cpp) set_property(TARGET krennic-debug-tools PROPERTY C_STANDARD 17) set_property(TARGET krennic-debug-tools PROPERTY CXX_STANDARD 17) #set_property(TARGET krennic-debug-tools PROPERTY C_STANDARD_REQUIRED ON) #set_property(TARGET krennic-debug-tools PROPERTY CXX_STANDARD_REQUIRED ON) set_target_properties(krennic-debug-tools PROPERTIES OUTPUT_NAME "Krennic-debug") list(APPEND RDI_TARGETS_LIST krennic-debug-tools) if(MSVC) # msvc does not append 'lib' - do it here to have consistent name set_target_properties(rdi-debug-tools PROPERTIES IMPORT_PREFIX "lib") set_target_properties(erso-debug-tools PROPERTIES IMPORT_PREFIX "lib") set_target_properties(krennic-debug-tools PROPERTIES IMPORT_PREFIX "lib") endif() # Static libgcc and libstdc++ already linked in library if(RDI_SHARED) target_link_libraries(rdi-debug-tools PRIVATE rdi-lib ${Boost_LIBRARIES}) target_link_libraries(erso-debug-tools PRIVATE rdi-lib) target_link_libraries(krennic-debug-tools PRIVATE rdi-lib) elseif(RDI_STATIC) target_link_libraries(rdi-debug-tools PRIVATE rdi-libstatic ${Boost_LIBRARIES}) target_link_libraries(erso-debug-tools PRIVATE rdi-libstatic) target_link_libraries(krennic-debug-tools PRIVATE rdi-libstatic) endif() endif() # GPG signature custom command #add_custom_command( # OUTPUT "" # COMMAND gpg --batch --detach-sign # -o ${RSE_MOD_NAME}_${CI_SYS_TARGET}.gpg # ${RSE_MOD_NAME} # DEPENDS ${RSE_MOD_NAME} # VERBATIM #) # Install dependancies #install(FILES ${PROJECT_BINARY_DIR}/bin/libpng16.dll # DESTINATION ${INSTALL_BIN_DIR}) # Install library includes install(FILES ${RSP_LIB_PUBLIC_HRDS} DESTINATION ${INSTALL_INC_DIR}) # Install project artifacts install(TARGETS ${RDI_TARGETS_LIST} RUNTIME DESTINATION ${INSTALL_BIN_DIR} LIBRARY DESTINATION ${INSTALL_LIB_DIR} ARCHIVE DESTINATION ${INSTALL_LIB_DIR} )