From eafb0680fe366087cc22d5061089321108c0829c Mon Sep 17 00:00:00 2001 From: JackCarterSmith Date: Wed, 7 Sep 2022 19:07:12 +0200 Subject: [PATCH] Added conan package support --- CMakeLists.txt | 44 +++++++++++++------ RSEModel/CMakeLists.txt | 17 +++++--- RSPModelLib/CMakeLists.txt | 71 +++++++++++++++++++++++-------- cmake/create_symlink.cmake | 87 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 181 insertions(+), 38 deletions(-) create mode 100644 cmake/create_symlink.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index a30a565..88ea3dd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,8 +26,14 @@ endif() set(RSP_MODEL_LIB_NAME RSPModel${PROJECT_VERSION_MAJOR}${PROJECT_VERSION_MINOR}) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") +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(RSPMODEL_SHARED "Build shared lib" ON) +option(RSPMODEL_STATIC "Build static lib" ON) + # Push compile infos to source configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_SOURCE_DIR}/RSPModelLib/src/config.h @ONLY) @@ -39,6 +45,22 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_SOURCE_DI # It is intended to be used by others apps like rendering engine or others. # - RSEModel is the standalone application of the library, take HOB file in argument and output OBJ/MTL file. # Artists or users can directly use this program to retrieve data in common datas format. +unset(RSE_MODEL_TARGETS_LIST) +if(BUILD_TOOLS) + set(RSE_MODEL_TARGETS_LIST rse-model) +endif() +if(RSPMODEL_SHARED) + list(APPEND RSE_MODEL_TARGETS_LIST rsp-model-lib) +endif() +if(RSPMODEL_STATIC) + list(APPEND RSE_MODEL_TARGETS_LIST rsp-model-libstatic) +endif() +if(NOT RSE_MODEL_TARGETS_LIST) + message(SEND_ERROR + "No library variant selected to build. " + "Please enable at least one of the following options: " + "RSPMODEL_STATIC, RSPMODEL_SHARED") +endif() 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) @@ -57,22 +79,16 @@ add_subdirectory(RSEModel) #) -# Install project executable -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") -if(RSPMODEL_SHARED) - set(RSE_MODEL_TARGETS_LIST rse-model rsp-model-lib rsp-model-libstatic) -else() - set(RSE_MODEL_TARGETS_LIST rse-model rsp-model-libstatic) -endif() +# Install dependancies +install(FILES ${PROJECT_BINARY_DIR}/bin/glew32.dll + DESTINATION ${INSTALL_BIN_DIR}) + +# Install library includes +install(FILES ${RSP_PUBLIC_HRDS} DESTINATION ${INSTALL_INC_DIR}) + +# Install project artifacts install(TARGETS ${RSE_MODEL_TARGETS_LIST} RUNTIME DESTINATION ${INSTALL_BIN_DIR} LIBRARY DESTINATION ${INSTALL_LIB_DIR} ARCHIVE DESTINATION ${INSTALL_LIB_DIR} ) -# Install library includes -install(FILES ${RSP_PUBLIC_HRDS} DESTINATION ${INSTALL_INC_DIR}) -# Install dependancies -install(FILES ${PROJECT_BINARY_DIR}/bin/glew32.dll - DESTINATION ${INSTALL_BIN_DIR}) diff --git a/RSEModel/CMakeLists.txt b/RSEModel/CMakeLists.txt index d58b1f9..3ff590c 100644 --- a/RSEModel/CMakeLists.txt +++ b/RSEModel/CMakeLists.txt @@ -13,8 +13,8 @@ include(CheckCSourceCompiles) add_definitions(-DCONF_NO_GL) # Used for obj-lib to not compile GL part # Import needed packages and references their include path -#find_package(GLEW REQUIRED) # Enable when GL rendering is ready -#include_directories(${GLEW_INCLUDE_DIR}) +find_package(GLEW REQUIRED) # Enable when GL rendering is ready +include_directories(${GLEW_INCLUDE_DIR}) # Define src/headers files @@ -35,11 +35,16 @@ set_property(TARGET rse-model PROPERTY C_STANDARD 90) #target_include_directories(rse-model PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src) set_target_properties(rse-model PROPERTIES OUTPUT_NAME ${RSE_MODEL_NAME}) -# Link externals libraries to the linker if(MSVC) # msvc does not append 'lib' - do it here to have consistent name set_target_properties(rse-model PROPERTIES IMPORT_PREFIX "lib") - target_link_libraries(rse-model PRIVATE rsp-model-libstatic ${GLEW_LIBRARIES}) -else() - target_link_libraries(rse-model PRIVATE rsp-model-libstatic ${GLEW_LIBRARIES} m) +elseif(UNIX) + set(AUX_LIBS m dl)# add math.lib for GL processing and dl.lib for dynamic loading +endif() + +# Link externals libraries to the linker +if(RSPMODEL_SHARED) + target_link_libraries(rse-model PRIVATE rsp-model-lib ${GLEW_LIBRARIES} ${AUX_LIBS}) +elseif(RSPMODEL_STATIC) + target_link_libraries(rse-model PRIVATE rsp-model-libstatic ${GLEW_LIBRARIES} ${AUX_LIBS}) endif() diff --git a/RSPModelLib/CMakeLists.txt b/RSPModelLib/CMakeLists.txt index f6c2206..b8392f5 100644 --- a/RSPModelLib/CMakeLists.txt +++ b/RSPModelLib/CMakeLists.txt @@ -32,14 +32,18 @@ endif() if(RSPMODEL_SHARED) add_library(rsp-model-lib SHARED ${RSP_MOD_SOURCES}) set_property(TARGET rsp-model-lib PROPERTY C_STANDARD 90) + set_target_properties(rsp-model-lib PROPERTIES VERSION 2.1.0) target_include_directories(rsp-model-lib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) - set_target_properties(rsp-model-lib PROPERTIES OUTPUT_NAME ${RSP_MODEL_LIB_NAME}) - set_target_properties(rsp-model-lib PROPERTIES DEFINE_SYMBOL RSPMODEL_DLL) - + set_target_properties(rsp-model-lib PROPERTIES OUTPUT_NAME "${RSP_MODEL_LIB_NAME}") + + if(WIN32) + set_target_properties(rsp-model-lib PROPERTIES DEFINE_SYMBOL RSPMODEL_DLL) + endif() + + # MSVC does not append 'lib' - do it here to have consistent name if(MSVC) - # msvc does not append 'lib' - do it here to have consistent name set_target_properties(rsp-model-lib PROPERTIES PREFIX "lib") set_target_properties(rsp-model-lib PROPERTIES IMPORT_PREFIX "lib") endif() @@ -47,21 +51,52 @@ endif() # Declare the static library instance -add_library(rsp-model-libstatic STATIC ${RSP_MOD_SOURCES}) -set_property(TARGET rsp-model-libstatic PROPERTY C_STANDARD 90) +if(RSPMODEL_STATIC) + add_library(rsp-model-libstatic STATIC ${RSP_MOD_SOURCES}) + set_property(TARGET rsp-model-libstatic PROPERTY C_STANDARD 90) -target_include_directories(rsp-model-libstatic PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) - -if(NOT MSVC) - set_target_properties(rsp-model-libstatic PROPERTIES OUTPUT_NAME "${RSP_MODEL_LIB_NAME}") - set_target_properties(rsp-model-libstatic PROPERTIES CLEAN_DIRECT_OUTPUT 1) -else() - set_target_properties(rsp-model-libstatic PROPERTIES OUTPUT_NAME "${RSP_MODEL_LIB_NAME}_static") - set_target_properties(rsp-model-libstatic PROPERTIES CLEAN_DIRECT_OUTPUT 1) + target_include_directories(rsp-model-libstatic PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) + + # 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(rsp-model-libstatic PROPERTIES OUTPUT_NAME "${RSP_MODEL_LIB_NAME}") + set_target_properties(rsp-model-libstatic PROPERTIES CLEAN_DIRECT_OUTPUT 1) + else() + set_target_properties(rsp-model-libstatic PROPERTIES OUTPUT_NAME "${RSP_MODEL_LIB_NAME}_static") + set_target_properties(rsp-model-libstatic PROPERTIES CLEAN_DIRECT_OUTPUT 1) + endif() + + # MSVC does not append 'lib' - do it here to have consistent name + if(MSVC) + set_target_properties(rsp-model-libstatic PROPERTIES PREFIX "lib") + endif() endif() -if(MSVC) - # msvc does not append 'lib' - do it here to have consistent name - set_target_properties(rsp-model-libstatic PROPERTIES PREFIX "lib") - set_target_properties(rsp-model-libstatic PROPERTIES IMPORT_PREFIX "lib") + +include(${CMAKE_CURRENT_SOURCE_DIR}/../cmake/create_symlink.cmake) + +# Install libraries with OS specific name fix +if(RSPMODEL_SHARED) + # Create a symlink for libRSPModel.dll.a => libRSPModelXX.dll.a on Cygwin/MinGW + if(CYGWIN OR MINGW) + create_lib_symlink(libRSPModel${CMAKE_IMPORT_LIBRARY_SUFFIX} TARGET rsp-model-lib) + install(FILES $/libRSPModel${CMAKE_IMPORT_LIBRARY_SUFFIX} + DESTINATION ${INSTALL_LIB_DIR}) + endif() + + if(NOT WIN32) + create_lib_symlink(libRSPModel${CMAKE_SHARED_LIBRARY_SUFFIX} TARGET rsp-model-lib) + install(FILES $/libRSPModel${CMAKE_SHARED_LIBRARY_SUFFIX} + DESTINATION ${INSTALL_LIB_DIR}) + endif() +endif() + +if(RSPMODEL_STATIC) + if(NOT WIN32 OR CYGWIN OR MINGW) + create_lib_symlink(libRSPModel${CMAKE_STATIC_LIBRARY_SUFFIX} TARGET rsp-model-libstatic) + install(FILES $/libRSPModel${CMAKE_STATIC_LIBRARY_SUFFIX} + DESTINATION ${INSTALL_LIB_DIR}) + endif() endif() diff --git a/cmake/create_symlink.cmake b/cmake/create_symlink.cmake new file mode 100644 index 0000000..122d940 --- /dev/null +++ b/cmake/create_symlink.cmake @@ -0,0 +1,87 @@ +# Set a variable with CMake code which: +# Creates a symlink from src to dest (if possible) or alternatively +# copies if different. +include(CMakeParseArguments) + +function(create_symlink DEST_FILE) + + cmake_parse_arguments(S "" "FILE;TARGET" "" ${ARGN}) + + if(NOT S_TARGET AND NOT S_FILE) + message(FATAL_ERROR "create_symlink: Missing TARGET or FILE argument") + endif() + + if(S_TARGET AND S_FILE) + message(FATAL_ERROR "create_symlink: Both source file ${S_FILE} and build target ${S_TARGET} arguments are present; can only have one.") + endif() + + if(S_FILE) + # If we don't need to symlink something that's coming from a build target, + # we can go ahead and symlink/copy at configure time. + if(CMAKE_HOST_WIN32 AND NOT CYGWIN) + execute_process( + COMMAND "${CMAKE_COMMAND}" -E copy_if_different ${S_FILE} ${DEST_FILE} + WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}") + else() + execute_process( + COMMAND ${CMAKE_COMMAND} -E create_symlink ${S_FILE} ${DEST_FILE} + WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}") + endif() + endif() + + if(S_TARGET) + # We need to use generator expressions, which can be a bit tricky, so for + # simplicity make the symlink a POST_BUILD step and use the TARGET + # signature of add_custom_command. + if(CMAKE_HOST_WIN32 AND NOT CYGWIN) + add_custom_command(TARGET ${S_TARGET} POST_BUILD + COMMAND "${CMAKE_COMMAND}" -E copy_if_different $ $/${DEST_FILE}) + else() + add_custom_command(TARGET ${S_TARGET} POST_BUILD + COMMAND "${CMAKE_COMMAND}" -E create_symlink $ $/${DEST_FILE}) + endif() + endif() + +endfunction() + + +function(create_lib_symlink DEST_FILE) + + cmake_parse_arguments(S "" "FILE;TARGET" "" ${ARGN}) + + if(NOT S_TARGET AND NOT S_FILE) + message(FATAL_ERROR "create_symlink: Missing TARGET or FILE argument") + endif() + + if(S_TARGET AND S_FILE) + message(FATAL_ERROR "create_symlink: Both source file ${S_FILE} and build target ${S_TARGET} arguments are present; can only have one.") + endif() + + if(S_FILE) + # If we don't need to symlink something that's coming from a build target, + # we can go ahead and symlink/copy at configure time. + if(CMAKE_HOST_WIN32 AND NOT CYGWIN) + execute_process( + COMMAND "${CMAKE_COMMAND}" -E copy_if_different ${S_FILE} ${DEST_FILE} + WORKING_DIRECTORY "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}") + else() + execute_process( + COMMAND ${CMAKE_COMMAND} -E create_symlink ${S_FILE} ${DEST_FILE} + WORKING_DIRECTORY "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}") + endif() + endif() + + if(S_TARGET) + # We need to use generator expressions, which can be a bit tricky, so for + # simplicity make the symlink a POST_BUILD step and use the TARGET + # signature of add_custom_command. + if(CMAKE_HOST_WIN32 AND NOT CYGWIN) + add_custom_command(TARGET ${S_TARGET} POST_BUILD + COMMAND "${CMAKE_COMMAND}" -E copy_if_different ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/$ $/${DEST_FILE}) + else() + add_custom_command(TARGET ${S_TARGET} POST_BUILD + COMMAND "${CMAKE_COMMAND}" -E create_symlink ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/$ $/${DEST_FILE}) + endif() + endif() + +endfunction() \ No newline at end of file -- 2.39.5