mirror of
https://github.com/morgan9e/FreeRDP
synced 2026-04-15 00:44:19 +09:00
[cmake] unify windows resource file generation
* use a macro to add resource files for executables and shared libraries * use that macro to declare targets * use that macro to set library/binary versioning * use that macro to set target output name * use a macro to create manpages and names
This commit is contained in:
120
cmake/AddTargetWithResourceFile.cmake
Normal file
120
cmake/AddTargetWithResourceFile.cmake
Normal file
@@ -0,0 +1,120 @@
|
||||
set(add_resource_macro_internal_dir ${CMAKE_CURRENT_LIST_DIR} CACHE INTERNAL "")
|
||||
|
||||
macro(AddTargetWithResourceFile nameAndTarget is_exe version sources)
|
||||
list(LENGTH ${nameAndTarget} target_length)
|
||||
if (target_length GREATER 1)
|
||||
list(GET ${nameAndTarget} 1 name)
|
||||
list(GET ${nameAndTarget} 0 target)
|
||||
else()
|
||||
set(name ${nameAndTarget})
|
||||
set(target ${nameAndTarget})
|
||||
endif()
|
||||
|
||||
set(VERSIONING OFF)
|
||||
set(IS_EXE OFF)
|
||||
if ("${is_exe}" MATCHES "TRUE")
|
||||
set(IS_EXE ON)
|
||||
elseif ("${is_exe}" MATCHES "WIN32")
|
||||
set(IS_EXE ON)
|
||||
set(exe_options "WIN32")
|
||||
elseif ("${is_exe}" MATCHES "SHARED")
|
||||
set(lib_options "SHARED")
|
||||
elseif ("${is_exe}" MATCHES "STATIC")
|
||||
set(lib_options "STATIC")
|
||||
endif()
|
||||
|
||||
if (IS_EXE AND WITH_BINARY_VERSIONING)
|
||||
set(VERSIONING ON)
|
||||
elseif (NOT IS_EXE AND WITH_LIBRARY_VERSIONING)
|
||||
set(VERSIONING ON)
|
||||
endif()
|
||||
if (${ARGC} GREATER 4)
|
||||
set(VERSIONING ${ARGV5})
|
||||
endif()
|
||||
|
||||
string(REGEX MATCH "^([0-9]+)\\.([0-9]+)\\.([0-9]+).*"
|
||||
RC_PROGRAM_VERSION_MATCH ${version})
|
||||
set (RC_VERSION_MAJOR ${CMAKE_MATCH_1})
|
||||
set (RC_VERSION_MINOR ${CMAKE_MATCH_2})
|
||||
set (RC_VERSION_BUILD ${CMAKE_MATCH_3})
|
||||
|
||||
if (WIN32)
|
||||
if (IS_EXE)
|
||||
if (VERSIONING)
|
||||
set (RC_VERSION_FILE "${name}${RC_VERSION_MAJOR}${CMAKE_EXECUTABLE_SUFFIX}" )
|
||||
else()
|
||||
set (RC_VERSION_FILE "${name}${CMAKE_EXECUTABLE_SUFFIX}" )
|
||||
endif()
|
||||
else()
|
||||
if (VERSIONING)
|
||||
set (RC_VERSION_FILE "${CMAKE_SHARED_LIBRARY_PREFIX}${name}${RC_VERSION_MAJOR}${CMAKE_SHARED_LIBRARY_SUFFIX}" )
|
||||
else()
|
||||
set (RC_VERSION_FILE "${CMAKE_SHARED_LIBRARY_PREFIX}${name}${CMAKE_SHARED_LIBRARY_SUFFIX}" )
|
||||
endif()
|
||||
endif()
|
||||
|
||||
configure_file(
|
||||
${add_resource_macro_internal_dir}/WindowsDLLVersion.rc.in
|
||||
${CMAKE_CURRENT_BINARY_DIR}/version.rc
|
||||
@ONLY
|
||||
)
|
||||
|
||||
list(APPEND ${sources} ${CMAKE_CURRENT_BINARY_DIR}/version.rc)
|
||||
endif()
|
||||
|
||||
set(OUTPUT_FILENAME "${name}")
|
||||
if (VERSIONING)
|
||||
set(OUTPUT_FILENAME "${name}${RC_VERSION_MAJOR}")
|
||||
endif()
|
||||
|
||||
if (IS_EXE)
|
||||
message("add_executable(${target}) [${exe_options}]")
|
||||
add_executable(
|
||||
${target}
|
||||
${exe_options}
|
||||
${${sources}}
|
||||
)
|
||||
|
||||
set_target_properties(
|
||||
${target}
|
||||
PROPERTIES
|
||||
OUTPUT_NAME ${OUTPUT_FILENAME}
|
||||
)
|
||||
set (OUTPUT_FILENAME "${OUTPUT_FILENAME}${CMAKE_EXECUTABLE_SUFFIX}" )
|
||||
else()
|
||||
message("add_library(${target}) [${lib_options}]")
|
||||
add_library(${target}
|
||||
${lib_options}
|
||||
${${sources}})
|
||||
|
||||
if (VERSIONING)
|
||||
set_target_properties(
|
||||
${target}
|
||||
PROPERTIES
|
||||
VERSION ${version}
|
||||
SOVERSION ${RC_VERSION_MAJOR}
|
||||
)
|
||||
else()
|
||||
set_target_properties(${target} PROPERTIES PREFIX "")
|
||||
set_target_properties(${target} PROPERTIES NO_SONAME 1)
|
||||
endif()
|
||||
|
||||
set_target_properties(
|
||||
${target}
|
||||
PROPERTIES
|
||||
OUTPUT_NAME ${OUTPUT_FILENAME}
|
||||
)
|
||||
set (OUTPUT_FILENAME "${CMAKE_SHARED_LIBRARY_PREFIX}${OUTPUT_FILENAME}${CMAKE_SHARED_LIBRARY_SUFFIX}" )
|
||||
endif()
|
||||
|
||||
|
||||
if (WITH_DEBUG_SYMBOLS AND MSVC AND (is_exe OR BUILD_SHARED_LIBS))
|
||||
message("add PDB for ${OUTPUT_FILENAME}")
|
||||
set_target_properties(
|
||||
${target}
|
||||
PROPERTIES
|
||||
PDB_NAME ${OUTPUT_FILENAME}
|
||||
)
|
||||
install(FILES $<TARGET_PDB_FILE:${target}> DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT symbols)
|
||||
endif()
|
||||
endmacro()
|
||||
@@ -34,4 +34,4 @@ include(GNUInstallDirsWrapper)
|
||||
include(MSVCRuntime)
|
||||
include(ConfigureRPATH)
|
||||
include(ClangTidy)
|
||||
|
||||
include(AddTargetWithResourceFile)
|
||||
|
||||
@@ -80,6 +80,7 @@ endif()
|
||||
option(WITH_THIRD_PARTY "Build third-party components" OFF)
|
||||
|
||||
option(WITH_CLIENT_INTERFACE "Build clients as a library with an interface" OFF)
|
||||
CMAKE_DEPENDENT_OPTION(CLIENT_INTERFACE_SHARED "Build clients as a shared library with an interface" OFF "WITH_CLIENT_INTERFACE" OFF)
|
||||
option(WITH_SERVER_INTERFACE "Build servers as a library with an interface" ON)
|
||||
|
||||
option(WITH_DEBUG_ALL "Print all debug messages." OFF)
|
||||
|
||||
@@ -3,14 +3,14 @@ option(CMAKE_SKIP_BUILD_RPATH "skip build RPATH" OFF)
|
||||
option(CMAKE_BUILD_WITH_INSTALL_RPATH "build with install RPATH" OFF)
|
||||
option(CMAKE_INSTALL_RPATH_USE_LINK_PATH "build with link RPATH" OFF)
|
||||
|
||||
if (BUILD_SHARED_LIBS)
|
||||
option(CMAKE_MACOSX_RPATH "MacOSX RPATH" ON)
|
||||
endif()
|
||||
|
||||
if (APPLE)
|
||||
if (BUILD_SHARED_LIBS)
|
||||
option(CMAKE_MACOSX_RPATH "MacOSX RPATH" ON)
|
||||
endif()
|
||||
|
||||
file(RELATIVE_PATH FRAMEWORK_PATH ${CMAKE_INSTALL_FULL_BINDIR} ${CMAKE_INSTALL_FULL_LIBDIR})
|
||||
set(CFG_INSTALL_RPATH "@loader_path/${FRAMEWORK_PATH}")
|
||||
else (APPLE)
|
||||
elseif(NOT WIN32)
|
||||
if (NOT FREEBSD)
|
||||
option(WITH_ADD_PLUGIN_TO_RPATH "Add extension and plugin path to RPATH" OFF)
|
||||
if (WITH_ADD_PLUGIN_TO_RPATH)
|
||||
|
||||
@@ -7,11 +7,27 @@ function(install_freerdp_man manpage section)
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(generate_and_install_freerdp_man_from_xml template manpage dependencies)
|
||||
function(generate_and_install_freerdp_man_from_template name_base section api)
|
||||
if(WITH_MANPAGES)
|
||||
find_program(XSLTPROC_EXECUTABLE NAMES xsltproc REQUIRED)
|
||||
if (NOT DOCBOOKXSL_FOUND)
|
||||
message(FATAL_ERROR "docbook xsl not found but required for manpage generation")
|
||||
if (WITH_BINARY_VERSIONING)
|
||||
set(manpage "${CMAKE_CURRENT_BINARY_DIR}/${name_base}${api}.${section}")
|
||||
else()
|
||||
set(manpage "${CMAKE_CURRENT_BINARY_DIR}/${name_base}.${section}")
|
||||
endif()
|
||||
configure_file(${name_base}.${section}.in ${manpage})
|
||||
install_freerdp_man(${manpage} ${section})
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(generate_and_install_freerdp_man_from_xml name_base section api dependencies)
|
||||
if(WITH_MANPAGES)
|
||||
set(template "${name_base}.${section}")
|
||||
if (WITH_BINARY_VERSIONING)
|
||||
set(MANPAGE_NAME "${name_base}${api}")
|
||||
set(manpage "${name_base}${api}.${section}")
|
||||
else()
|
||||
set(MANPAGE_NAME "${name_base}")
|
||||
set(manpage "${name_base}.${section}")
|
||||
endif()
|
||||
|
||||
# We need the variable ${MAN_TODAY} to contain the current date in ISO
|
||||
@@ -34,8 +50,13 @@ function(generate_and_install_freerdp_man_from_xml template manpage dependencies
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
find_program(XSLTPROC_EXECUTABLE NAMES xsltproc REQUIRED)
|
||||
if (NOT DOCBOOKXSL_FOUND)
|
||||
message(FATAL_ERROR "docbook xsl not found but required for manpage generation")
|
||||
endif()
|
||||
|
||||
add_custom_command(
|
||||
OUTPUT ${manpage}
|
||||
OUTPUT "${manpage}"
|
||||
COMMAND ${CMAKE_BINARY_DIR}/client/common/man/generate_argument_docbook
|
||||
COMMAND ${XSLTPROC_EXECUTABLE} --path "${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}" ${DOCBOOKXSL_DIR}/manpages/docbook.xsl ${manpage}.xml
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
||||
@@ -50,6 +71,6 @@ function(generate_and_install_freerdp_man_from_xml template manpage dependencies
|
||||
DEPENDS
|
||||
${manpage}
|
||||
)
|
||||
install_freerdp_man(${CMAKE_CURRENT_BINARY_DIR}/${manpage} 1)
|
||||
install_freerdp_man(${CMAKE_CURRENT_BINARY_DIR}/${manpage} ${section})
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
Reference in New Issue
Block a user