diff --git a/CMakeLists.txt b/CMakeLists.txt index 152d9d7..e1a84bd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,8 +26,14 @@ endif() set(RSP_TEXTURE_LIB_NAME RSPTexture${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(RSPTEXTURE_SHARED "Build shared lib" ON) +option(RSPTEXTURE_STATIC "Build static lib" ON) + # Push compile infos to source configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_SOURCE_DIR}/RSPTextureLib/src/config.h @ONLY) @@ -42,8 +48,24 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_SOURCE_DI 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(RSE_TEXTURE_TARGETS_LIST) add_subdirectory(RSPTextureLib) add_subdirectory(RSETexture) +if(BUILD_TOOLS) + set(RSE_TEXTURE_TARGETS_LIST rse-texture) +endif() +if(RSPTEXTURE_SHARED) + list(APPEND RSE_TEXTURE_TARGETS_LIST rsp-texture-lib) +endif() +if(RSPTEXTURE_STATIC) + list(APPEND RSE_TEXTURE_TARGETS_LIST rsp-texture-libstatic) +endif() +if(NOT RSE_TEXTURE_TARGETS_LIST) + message(SEND_ERROR + "No library variant selected to build. " + "Please enable at least one of the following options: " + "RSPTEXTURE_STATIC, RSPTEXTURE_SHARED") +endif() # GPG signature custom command @@ -57,22 +79,16 @@ add_subdirectory(RSETexture) #) -# 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(RSPTEXTURE_SHARED) - set(RSE_TEXTURE_TARGETS_LIST rse-texture rsp-texture-lib rsp-texture-libstatic) -else() - set(RSE_TEXTURE_TARGETS_LIST rse-texture rsp-texture-libstatic) -endif() +# Install dependancies +install(FILES ${PROJECT_BINARY_DIR}/bin/libpng16.dll + DESTINATION ${INSTALL_BIN_DIR}) + +# Install library includes +install(FILES ${RSP_PUBLIC_HRDS} DESTINATION ${INSTALL_INC_DIR}) + +# Install project artifacts install(TARGETS ${RSE_TEXTURE_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/libpng16.dll - DESTINATION ${INSTALL_BIN_DIR}) diff --git a/RSETexture/CMakeLists.txt b/RSETexture/CMakeLists.txt index 9a49ab8..4c47fb9 100644 --- a/RSETexture/CMakeLists.txt +++ b/RSETexture/CMakeLists.txt @@ -33,11 +33,14 @@ set_property(TARGET rse-texture PROPERTY C_STANDARD 90) #target_include_directories(rse-texture PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src) set_target_properties(rse-texture PROPERTIES OUTPUT_NAME ${RSE_TEXTURE_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-texture PROPERTIES IMPORT_PREFIX "lib") - target_link_libraries(rse-texture PRIVATE rsp-texture-libstatic ${PNG_LIBRARIES}) -else() +endif() + +# Link externals libraries to the linker +if(RSPTEXTURE_SHARED) + target_link_libraries(rse-texture PRIVATE rsp-texture-lib ${PNG_LIBRARIES}) +elseif(RSPTEXTURE_STATIC) target_link_libraries(rse-texture PRIVATE rsp-texture-libstatic ${PNG_LIBRARIES}) endif() diff --git a/RSPTextureLib/CMakeLists.txt b/RSPTextureLib/CMakeLists.txt index 604fcef..651e777 100644 --- a/RSPTextureLib/CMakeLists.txt +++ b/RSPTextureLib/CMakeLists.txt @@ -32,14 +32,18 @@ endif() if(RSPTEXTURE_SHARED) add_library(rsp-texture-lib SHARED ${RSP_TEXTURE_SOURCES}) set_property(TARGET rsp-texture-lib PROPERTY C_STANDARD 90) + set_target_properties(rsp-texture-lib PROPERTIES VERSION 2.1.0) target_include_directories(rsp-texture-lib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) - set_target_properties(rsp-texture-lib PROPERTIES OUTPUT_NAME ${RSP_TEXTURE_LIB_NAME}) - set_target_properties(rsp-texture-lib PROPERTIES DEFINE_SYMBOL RSPTEXTURE_DLL) + set_target_properties(rsp-texture-lib PROPERTIES OUTPUT_NAME "${RSP_TEXTURE_LIB_NAME}") + + if(WIN32) + set_target_properties(rsp-texture-lib PROPERTIES DEFINE_SYMBOL RSPTEXTURE_DLL) + endif() - if(MSVC) - # msvc does not append 'lib' - do it here to have consistent name + # msvc does not append 'lib' - do it here to have consistent name + if(MSVC) set_target_properties(rsp-texture-lib PROPERTIES PREFIX "lib") set_target_properties(rsp-texture-lib PROPERTIES IMPORT_PREFIX "lib") endif() @@ -47,21 +51,52 @@ endif() # Declare the static library instance -add_library(rsp-texture-libstatic STATIC ${RSP_TEXTURE_SOURCES}) -set_property(TARGET rsp-texture-libstatic PROPERTY C_STANDARD 90) +if(RSPTEXTURE_STATIC) + add_library(rsp-texture-libstatic STATIC ${RSP_TEXTURE_SOURCES}) + set_property(TARGET rsp-texture-libstatic PROPERTY C_STANDARD 90) -target_include_directories(rsp-texture-libstatic PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) + target_include_directories(rsp-texture-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-texture-libstatic PROPERTIES OUTPUT_NAME "${RSP_TEXTURE_LIB_NAME}") + set_target_properties(rsp-texture-libstatic PROPERTIES CLEAN_DIRECT_OUTPUT 1) + else() + set_target_properties(rsp-texture-libstatic PROPERTIES OUTPUT_NAME "${RSP_TEXTURE_LIB_NAME}_static") + set_target_properties(rsp-texture-libstatic PROPERTIES CLEAN_DIRECT_OUTPUT 1) + endif() -if(NOT MSVC) - set_target_properties(rsp-texture-libstatic PROPERTIES OUTPUT_NAME "${RSP_TEXTURE_LIB_NAME}") - set_target_properties(rsp-texture-libstatic PROPERTIES CLEAN_DIRECT_OUTPUT 1) -else() - set_target_properties(rsp-texture-libstatic PROPERTIES OUTPUT_NAME "${RSP_TEXTURE_LIB_NAME}_static") - set_target_properties(rsp-texture-libstatic PROPERTIES CLEAN_DIRECT_OUTPUT 1) + # MSVC does not append 'lib' - do it here to have consistent name + if(MSVC) + set_target_properties(rsp-texture-libstatic PROPERTIES PREFIX "lib") + endif() endif() -if(MSVC) - # msvc does not append 'lib' - do it here to have consistent name - set_target_properties(rsp-texture-libstatic PROPERTIES PREFIX "lib") - set_target_properties(rsp-texture-libstatic PROPERTIES IMPORT_PREFIX "lib") + +include(${CMAKE_CURRENT_SOURCE_DIR}/../cmake/create_symlink.cmake) + +# Install libraries with OS specific name fix +if(RSPTEXTURE_SHARED) + # Create a symlink for libRSPTexture.dll.a => libRSPTextureXX.dll.a on Cygwin/MinGW + if(CYGWIN OR MINGW) + create_lib_symlink(libRSPTexture${CMAKE_IMPORT_LIBRARY_SUFFIX} TARGET rsp-texture-lib) + install(FILES $/libRSPTexture${CMAKE_IMPORT_LIBRARY_SUFFIX} + DESTINATION ${INSTALL_LIB_DIR}) + endif() + + if(NOT WIN32) + create_lib_symlink(libRSPTexture${CMAKE_SHARED_LIBRARY_SUFFIX} TARGET rsp-texture-lib) + install(FILES $/libRSPTexture${CMAKE_SHARED_LIBRARY_SUFFIX} + DESTINATION ${INSTALL_LIB_DIR}) + endif() +endif() + +if(RSPTEXTURE_STATIC) + if(NOT WIN32 OR CYGWIN OR MINGW) + create_lib_symlink(libRSPTexture${CMAKE_STATIC_LIBRARY_SUFFIX} TARGET rsp-texture-libstatic) + install(FILES $/libRSPTexture${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