Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CMake: add tigervnc library #1920

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
build*/
*.[ao]
*.mo
*.la
*.lo
*.user
.deps
.libs

Expand Down
3 changes: 3 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ include(CheckTypeSize)
include(CheckCSourceCompiles)
include(CheckCXXSourceCompiles)
include(CheckCSourceRuns)
include(CMakePackageConfigHelpers)
include(CMakeParseArguments)
include(GenerateExportHeader)

include(CMakeMacroLibtoolFile)

Expand Down
130 changes: 87 additions & 43 deletions cmake/Modules/CMakeMacroLibtoolFile.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,59 @@ function(libtool_generate_control_file _target)
PROPERTY INTERFACE_LINK_DIRECTORIES)

foreach(library ${target_libs})
get_target_dependency_libs(TARGET ${library} OUT_DEPEND _target_depend)
set(_target_dependency_libs ${_target_depend})
endforeach()

get_target_property(_binary_dir ${_target} BINARY_DIR)

# Write the libtool control file for the static library
set(_lname ${CMAKE_STATIC_LIBRARY_PREFIX}${_target})
set(_laname ${_binary_dir}/${_lname}.la)

file(WRITE ${_laname} "# ${_lname}.la - a libtool library file\n# Generated by ltmain.sh (GNU libtool) 2.2.6b\n")
file(APPEND ${_laname} "dlname=''\n\n")
file(APPEND ${_laname} "library_names=''\n\n")
file(APPEND ${_laname} "old_library='${_lname}${CMAKE_STATIC_LIBRARY_SUFFIX}'\n\n")
file(APPEND ${_laname} "inherited_linker_flags=''\n\n")
file(APPEND ${_laname} "dependency_libs=' ${_target_dependency_libs}'\n\n")
file(APPEND ${_laname} "weak_library_names=''\n\n")
file(APPEND ${_laname} "current=\n")
file(APPEND ${_laname} "age=\n")
file(APPEND ${_laname} "revision=\n\n")
file(APPEND ${_laname} "installed=no\n\n")
file(APPEND ${_laname} "shouldnotlink=no\n\n")
file(APPEND ${_laname} "dlopen=''\n")
file(APPEND ${_laname} "dlpreopen=''\n\n")
file(APPEND ${_laname} "libdir='/usr/lib'\n\n")

# Make sure the timestamp is updated to trigger other make invocations
set(_lamarker ${_binary_dir}/.${_lname}.la.fresh)
add_custom_command(OUTPUT "${_lamarker}" DEPENDS ${_target}
COMMENT "Updating timestamp on ${_lname}.la"
COMMAND "${CMAKE_COMMAND}" -E touch "${_lamarker}"
COMMAND "${CMAKE_COMMAND}" -E touch "${_laname}")

# Add custom command to symlink the static library so that autotools finds
# the library in .libs. These are executed after the specified target build.
set(_libname ${_binary_dir}/.libs/${_lname}${CMAKE_STATIC_LIBRARY_SUFFIX})
add_custom_command(OUTPUT "${_libname}" DEPENDS ${_target}
COMMENT "Creating symlink .libs/${_lname}${CMAKE_STATIC_LIBRARY_SUFFIX}"
COMMAND "${CMAKE_COMMAND}" -E make_directory "${_binary_dir}/.libs"
COMMAND "${CMAKE_COMMAND}" -E create_symlink ../${_lname}${CMAKE_STATIC_LIBRARY_SUFFIX} "${_libname}")

add_custom_target(${_target}.la ALL
DEPENDS "${_lamarker}" "${_libname}")
endfunction()

function(get_target_dependency_libs)
cmake_parse_arguments(PARA "" "OUT_DEPEND;TARGET" "" ${ARGN})

if(NOT PARA_TARGET)
return()
endif()

set(library ${PARA_TARGET})
if(FRAMEWORK)
set(_target_dependency_libs "${_target_dependency_libs} -framework ${library}")
set(FRAMEWORK OFF)
Expand Down Expand Up @@ -80,11 +133,17 @@ function(libtool_generate_control_file _target)
# No shared library extension matched. Check whether target is a CMake
# target.
if(TARGET ${library})
# Target is a CMake target, so assume it is a static library and
# build a reference to it
get_target_property(library_path ${library} BINARY_DIR)
set(library ${library_path}/${CMAKE_STATIC_LIBRARY_PREFIX}${library}.la)
set(_target_dependency_libs "${_target_dependency_libs} ${library}")
get_target_property(_library_type ${library} TYPE)
if("${_library_type}" MATCHES "^OBJECT_LIBRARY$")
get_object_dependency_libs(TARGET ${library}
OUT_DEPEND _target_dependency_libs)
else()
# Target is a CMake target, so assume it is a static library and
# build a reference to it
get_target_property(library_path ${library} BINARY_DIR)
set(library ${library_path}/${CMAKE_STATIC_LIBRARY_PREFIX}${library}.la)
set(_target_dependency_libs "${_target_dependency_libs} ${library}")
endif()
elseif(${library} STREQUAL "-Wl,-Bstatic")
# All following libraries should be static
set(STATIC_MODE ON)
Expand Down Expand Up @@ -155,45 +214,30 @@ function(libtool_generate_control_file _target)
unset(FL CACHE)
endif()
endif()
endforeach()

get_target_property(_binary_dir ${_target} BINARY_DIR)

# Write the libtool control file for the static library
set(_lname ${CMAKE_STATIC_LIBRARY_PREFIX}${_target})
set(_laname ${_binary_dir}/${_lname}.la)

file(WRITE ${_laname} "# ${_lname}.la - a libtool library file\n# Generated by ltmain.sh (GNU libtool) 2.2.6b\n")
file(APPEND ${_laname} "dlname=''\n\n")
file(APPEND ${_laname} "library_names=''\n\n")
file(APPEND ${_laname} "old_library='${_lname}${CMAKE_STATIC_LIBRARY_SUFFIX}'\n\n")
file(APPEND ${_laname} "inherited_linker_flags=''\n\n")
file(APPEND ${_laname} "dependency_libs=' ${_target_dependency_libs}'\n\n")
file(APPEND ${_laname} "weak_library_names=''\n\n")
file(APPEND ${_laname} "current=\n")
file(APPEND ${_laname} "age=\n")
file(APPEND ${_laname} "revision=\n\n")
file(APPEND ${_laname} "installed=no\n\n")
file(APPEND ${_laname} "shouldnotlink=no\n\n")
file(APPEND ${_laname} "dlopen=''\n")
file(APPEND ${_laname} "dlpreopen=''\n\n")
file(APPEND ${_laname} "libdir='/usr/lib'\n\n")
set(${PARA_OUT_DEPEND} ${_target_dependency_libs} PARENT_SCOPE)
endfunction()

# Make sure the timestamp is updated to trigger other make invocations
set(_lamarker ${_binary_dir}/.${_lname}.la.fresh)
add_custom_command(OUTPUT "${_lamarker}" DEPENDS ${_target}
COMMENT "Updating timestamp on ${_lname}.la"
COMMAND "${CMAKE_COMMAND}" -E touch "${_lamarker}"
COMMAND "${CMAKE_COMMAND}" -E touch "${_laname}")
function(get_object_dependency_libs)
cmake_parse_arguments(PARA "" "OUT_DEPEND;TARGET" "" ${ARGN})

# Add custom command to symlink the static library so that autotools finds
# the library in .libs. These are executed after the specified target build.
set(_libname ${_binary_dir}/.libs/${_lname}${CMAKE_STATIC_LIBRARY_SUFFIX})
add_custom_command(OUTPUT "${_libname}" DEPENDS ${_target}
COMMENT "Creating symlink .libs/${_lname}${CMAKE_STATIC_LIBRARY_SUFFIX}"
COMMAND "${CMAKE_COMMAND}" -E make_directory "${_binary_dir}/.libs"
COMMAND "${CMAKE_COMMAND}" -E create_symlink ../${_lname}${CMAKE_STATIC_LIBRARY_SUFFIX} "${_libname}")
if(NOT PARA_TARGET)
return()
endif()
get_target_property(_depend_libs ${PARA_TARGET} INTERFACE_LINK_LIBRARIES)
message("${PARA_TARGET} depend libs: ${_depend_libs}")
foreach(_lib ${_depend_libs})
if(TARGET ${_lib})
get_target_property(_target_type ${_lib} TYPE)
message("target: ${_lib}; type: ${_target_type}")
if("${_target_type}" MATCHES "^OBJECT_LIBRARY$")
get_object_dependency_libs(TARGET ${_lib} OUT_DEPEND _depend)
set(_dependency_libs "${_dependency_libs} ${_depend}")
continue()
endif()
endif()
get_target_dependency_libs(TARGET ${_lib} OUT_DEPEND _depend)
set(_dependency_libs "${_dependency_libs} ${_depend}")
endforeach()

add_custom_target(${_target}.la ALL
DEPENDS "${_lamarker}" "${_libname}")
set(${PARA_OUT_DEPEND} ${_dependency_libs} PARENT_SCOPE)
endfunction()
43 changes: 43 additions & 0 deletions common/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,46 @@ if(NOT WIN32)
set_target_properties(core rdr network rfb
PROPERTIES COMPILE_FLAGS -fPIC)
endif()

add_library(tigervnc STATIC
$<TARGET_OBJECTS:core>
$<TARGET_OBJECTS:rdr>
$<TARGET_OBJECTS:network>
$<TARGET_OBJECTS:rfb>)
target_link_libraries(tigervnc PUBLIC rfb)

# cmake version configure file
write_basic_package_version_file(
"${CMAKE_CURRENT_BINARY_DIR}/tigervncConfigVersion.cmake"
VERSION ${VERSION}
COMPATIBILITY AnyNewerVersion)
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/tigervncConfigVersion.cmake"
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/tigervnc"
COMPONENT Development
)

# Generate an export header file, which is required when generating DLLs using msvc
GENERATE_EXPORT_HEADER(tigervnc)
file(COPY ${CMAKE_CURRENT_BINARY_DIR}/tigervnc_export.h
DESTINATION ${CMAKE_BINARY_DIR})
list(APPEND INSTALL_HEAD_FILES ${CMAKE_CURRENT_BINARY_DIR}/tigervnc_export.h)
set_target_properties(tigervnc PROPERTIES
PUBLIC_HEADER "${INSTALL_HEAD_FILES}" # Install head files
)

# Install head files and library
INSTALL(TARGETS tigervnc
EXPORT tigervncConfig
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/tigervnc
COMPONENT Development
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/tigervnc
)
install(EXPORT tigervncConfig
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/tigervnc"
COMPONENT Development
NAMESPACE tigervnc::
)

if(UNIX)
libtool_create_control_file(tigervnc)
endif()
24 changes: 18 additions & 6 deletions common/core/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
add_library(core STATIC
file(GLOB HEAD_FILES *.h)
set(INSTALL_HEAD_FILES ${HEAD_FILES})
add_library(core OBJECT
${INSTALL_HEAD_FILES}
Configuration.cxx
Exception.cxx
Logger.cxx
Expand All @@ -13,8 +16,10 @@ add_library(core STATIC
time.cxx
xdgdirs.cxx)

target_include_directories(core PUBLIC ${CMAKE_SOURCE_DIR}/common)
target_include_directories(core SYSTEM PUBLIC ${PIXMAN_INCLUDE_DIRS})
target_include_directories(core PRIVATE
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/common>
$<BUILD_INTERFACE:${CMAKE_BINARY_DIR}>)
target_include_directories(core PRIVATE ${PIXMAN_INCLUDE_DIRS})
target_link_libraries(core ${PIXMAN_LIBRARIES})
target_link_directories(core PUBLIC ${PIXMAN_LIBRARY_DIRS})

Expand All @@ -31,6 +36,13 @@ if(UNIX)
target_sources(core PRIVATE Logger_syslog.cxx)
endif()

if(UNIX)
libtool_create_control_file(core)
endif()
# Set install head files
set_target_properties(core PROPERTIES
PUBLIC_HEADER "${INSTALL_HEAD_FILES}")
# Install head files
INSTALL(TARGETS core
EXPORT tigervncConfig
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/tigervnc/core
COMPONENT Development
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/tigervnc
)
27 changes: 20 additions & 7 deletions common/network/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,18 +1,31 @@
add_library(network STATIC
file(GLOB HEAD_FILES *.h)
set(INSTALL_HEAD_FILES ${HEAD_FILES})

add_library(network OBJECT
${INSTALL_HEAD_FILES}
Socket.cxx
TcpSocket.cxx)

if(NOT WIN32)
target_sources(network PRIVATE UnixSocket.cxx)
endif()

target_include_directories(network PUBLIC ${CMAKE_SOURCE_DIR}/common)
target_link_libraries(network core rdr)
target_include_directories(network PRIVATE
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/common>
$<BUILD_INTERFACE:${CMAKE_BINARY_DIR}>)
target_link_libraries(network rdr)

if(WIN32)
target_link_libraries(network ws2_32)
target_link_libraries(network ws2_32)
endif()

if(UNIX)
libtool_create_control_file(network)
endif()
# Set install head files
set_target_properties(network PROPERTIES
PUBLIC_HEADER "${INSTALL_HEAD_FILES}")
# Install head files
INSTALL(TARGETS network
EXPORT tigervncConfig
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/tigervnc/network
COMPONENT Development
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/tigervnc
)
31 changes: 23 additions & 8 deletions common/rdr/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
add_library(rdr STATIC
file(GLOB HEAD_FILES *.h)
set(INSTALL_HEAD_FILES ${HEAD_FILES})
file(GLOB HEAD_FILES *.inl)
list(APPEND INSTALL_HEAD_FILES ${HEAD_FILES})

add_library(rdr OBJECT
${INSTALL_HEAD_FILES}
AESInStream.cxx
AESOutStream.cxx
BufferedInStream.cxx
Expand All @@ -15,24 +21,33 @@ add_library(rdr STATIC
ZlibInStream.cxx
ZlibOutStream.cxx)

target_include_directories(rdr PUBLIC ${CMAKE_SOURCE_DIR}/common)
target_include_directories(rdr SYSTEM PUBLIC ${ZLIB_INCLUDE_DIRS})
target_include_directories(rdr PRIVATE
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/common>
$<BUILD_INTERFACE:${CMAKE_BINARY_DIR}>)
target_include_directories(rdr SYSTEM PRIVATE ${ZLIB_INCLUDE_DIRS})
target_link_libraries(rdr core)
target_link_libraries(rdr ${ZLIB_LIBRARIES})

if(GNUTLS_FOUND)
target_include_directories(rdr SYSTEM PUBLIC ${GNUTLS_INCLUDE_DIR})
target_include_directories(rdr SYSTEM PRIVATE ${GNUTLS_INCLUDE_DIR})
target_link_libraries(rdr ${GNUTLS_LIBRARIES})
endif()
if (NETTLE_FOUND)
target_include_directories(rdr SYSTEM PUBLIC ${NETTLE_INCLUDE_DIRS})
target_include_directories(rdr SYSTEM PRIVATE ${NETTLE_INCLUDE_DIRS})
target_link_libraries(rdr ${NETTLE_LIBRARIES})
target_link_directories(rdr PUBLIC ${NETTLE_LIBRARY_DIRS})
endif()
if(WIN32)
target_link_libraries(rdr ws2_32)
endif()

if(UNIX)
libtool_create_control_file(rdr)
endif()
# Set install head files
set_target_properties(rdr PROPERTIES
PUBLIC_HEADER "${INSTALL_HEAD_FILES}")
# Install head files
INSTALL(TARGETS rdr
EXPORT tigervncConfig
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/tigervnc/rdr
COMPONENT Development
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/tigervnc
)
Loading
Loading