CMakeLists.txt 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. # WinPR: Windows Portable Runtime
  2. # winpr cmake build script
  3. #
  4. # Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com>
  5. #
  6. # Licensed under the Apache License, Version 2.0 (the "License");
  7. # you may not use this file except in compliance with the License.
  8. # You may obtain a copy of the License at
  9. #
  10. # http://www.apache.org/licenses/LICENSE-2.0
  11. #
  12. # Unless required by applicable law or agreed to in writing, software
  13. # distributed under the License is distributed on an "AS IS" BASIS,
  14. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. # See the License for the specific language governing permissions and
  16. # limitations under the License.
  17. include(CheckFunctionExists)
  18. set(WINPR_DIR ${CMAKE_CURRENT_SOURCE_DIR})
  19. set(WINPR_SRCS "")
  20. set(WINPR_LIBS_PRIVATE "")
  21. set(WINPR_LIBS_PUBLIC "")
  22. set(WINPR_INCLUDES "")
  23. set(WINPR_DEFINITIONS "")
  24. macro (winpr_module_add)
  25. file (RELATIVE_PATH _relPath "${WINPR_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}")
  26. foreach (_src ${ARGN})
  27. if (_relPath)
  28. list (APPEND WINPR_SRCS "${_relPath}/${_src}")
  29. else()
  30. list (APPEND WINPR_SRCS "${_src}")
  31. endif()
  32. endforeach()
  33. if (_relPath)
  34. set (WINPR_SRCS ${WINPR_SRCS} PARENT_SCOPE)
  35. endif()
  36. endmacro()
  37. macro (winpr_include_directory_add)
  38. file (RELATIVE_PATH _relPath "${WINPR_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}")
  39. foreach (_inc ${ARGN})
  40. if (IS_ABSOLUTE ${_inc})
  41. list (APPEND WINPR_INCLUDES "${_inc}")
  42. else()
  43. if (_relPath)
  44. list (APPEND WINPR_INCLUDES "${_relPath}/${_inc}")
  45. else()
  46. list (APPEND WINPR_INCLUDES "${_inc}")
  47. endif()
  48. endif()
  49. endforeach()
  50. if (_relPath)
  51. set (WINPR_INCLUDES ${WINPR_INCLUDES} PARENT_SCOPE)
  52. endif()
  53. endmacro()
  54. macro (winpr_library_add_private)
  55. foreach (_lib ${ARGN})
  56. list (APPEND WINPR_LIBS_PRIVATE "${_lib}")
  57. endforeach()
  58. set (WINPR_LIBS_PRIVATE ${WINPR_LIBS_PRIVATE} PARENT_SCOPE)
  59. endmacro()
  60. macro (winpr_library_add_public)
  61. foreach (_lib ${ARGN})
  62. list (APPEND WINPR_LIBS_PUBLIC "${_lib}")
  63. endforeach()
  64. set (WINPR_LIBS_PUBLIC ${WINPR_LIBS_PUBLIC} PARENT_SCOPE)
  65. endmacro()
  66. macro (winpr_definition_add)
  67. foreach (_define ${ARGN})
  68. list (APPEND WINPR_DEFINITIONS "${_define}")
  69. endforeach()
  70. set (WINPR_DEFINITIONS ${WINPR_DEFINITIONS} PARENT_SCOPE)
  71. endmacro()
  72. set(CMAKE_REQUIRED_LIBRARIES rt)
  73. check_function_exists(timer_create TIMER_CREATE)
  74. check_function_exists(timer_delete TIMER_DELETE)
  75. check_function_exists(timer_settime TIMER_SETTIME)
  76. check_function_exists(timer_gettime TIMER_GETTIME)
  77. if (TIMER_CREATE AND TIMER_DELETE AND TIMER_SETTIME AND TIMER_GETTIME)
  78. add_definitions(-DWITH_POSIX_TIMER)
  79. winpr_library_add_private(rt)
  80. endif()
  81. if (ANDROID)
  82. winpr_library_add_private(log)
  83. endif()
  84. # Level "1" API as defined for MinCore.lib
  85. set(WINPR_CORE synch locale library file comm pipe interlocked security
  86. environment crypto registry credentials path io memory input shell
  87. heap utils error timezone sysinfo pool handle thread)
  88. foreach(DIR ${WINPR_CORE})
  89. add_subdirectory(${DIR})
  90. source_group("${DIR}" REGULAR_EXPRESSION "${DIR}/.*\\.[ch]")
  91. endforeach()
  92. set(WINPR_LEVEL2 winsock sspi winhttp asn1 sspicli crt bcrypt rpc credui
  93. wtsapi dsparse wnd smartcard nt clipboard)
  94. foreach(DIR ${WINPR_LEVEL2})
  95. add_subdirectory(${DIR})
  96. source_group("${DIR}" REGULAR_EXPRESSION "${DIR}/.*\\.[ch]")
  97. endforeach()
  98. set(MODULE_NAME winpr)
  99. list(REMOVE_DUPLICATES WINPR_DEFINITIONS)
  100. list(REMOVE_DUPLICATES WINPR_LIBS_PRIVATE)
  101. list(REMOVE_DUPLICATES WINPR_LIBS_PUBLIC)
  102. list(REMOVE_DUPLICATES WINPR_INCLUDES)
  103. include_directories(${WINPR_INCLUDES})
  104. # On windows create dll version information.
  105. # Vendor, product and year are already set in top level CMakeLists.txt
  106. if (WIN32)
  107. set (RC_VERSION_MAJOR ${WINPR_VERSION_MAJOR})
  108. set (RC_VERSION_MINOR ${WINPR_VERSION_MINOR})
  109. set (RC_VERSION_BUILD ${WINPR_VERSION_REVISION})
  110. set (RC_VERSION_FILE "${CMAKE_SHARED_LIBRARY_PREFIX}${MODULE_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}" )
  111. configure_file(
  112. ${CMAKE_SOURCE_DIR}/addin/cmake/WindowsDLLVersion.rc.in
  113. ${CMAKE_CURRENT_BINARY_DIR}/version.rc
  114. @ONLY)
  115. set (WINPR_SRCS ${WINPR_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/version.rc)
  116. winpr_library_add_public("shlwapi")
  117. endif()
  118. add_library(${MODULE_NAME} ${WINPR_SRCS})
  119. set_target_properties(${MODULE_NAME} PROPERTIES LINKER_LANGUAGE C)
  120. set_target_properties(${MODULE_NAME} PROPERTIES OUTPUT_NAME ${MODULE_NAME}${WINPR_API_VERSION})
  121. if (WITH_LIBRARY_VERSIONING)
  122. set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${WINPR_VERSION} SOVERSION ${WINPR_API_VERSION})
  123. endif()
  124. add_definitions(${WINPR_DEFINITIONS})
  125. message(STATUS "private key: ${PRIVATE_KEYWORD}")
  126. target_link_libraries(${MODULE_NAME} ${PRIVATE_KEYWORD} ${WINPR_LIBS_PRIVATE} ${PUBLIC_KEYWORD} ${WINPR_LIBS_PUBLIC})
  127. if(MSVC)
  128. install(TARGETS ${MODULE_NAME}
  129. RUNTIME DESTINATION "${RVC_RUNTIME_PATH}" COMPONENT libraries
  130. ARCHIVE DESTINATION "${RVC_LIBRARY_PATH}" COMPONENT develops EXCLUDE_FROM_ALL
  131. LIBRARY DESTINATION "${RVC_LIBRARY_PATH}" COMPONENT libraries
  132. )
  133. else()
  134. install(TARGETS ${MODULE_NAME}
  135. RUNTIME DESTINATION "${RVC_RUNTIME_PATH}"
  136. ARCHIVE DESTINATION "${RVC_LIBRARY_PATH}"
  137. LIBRARY DESTINATION "${RVC_RUNTIME_PATH}"
  138. COMPONENT libraries)
  139. endif(MSVC)
  140. if (WITH_PDB_SAVE AND MSVC AND BUILD_SHARED_LIBS)
  141. get_target_property(OUTPUT_FILENAME ${MODULE_NAME} OUTPUT_NAME)
  142. install(FILES ${RVC_PDB_BINARY_DIR}/${OUTPUT_FILENAME}.pdb DESTINATION ${RVC_PDBSAVE_PATH} COMPONENT symbols)
  143. endif()
  144. set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "WinPR/libwinpr")