CMakeLists.txt 44 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150
  1. # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. # file Copyright.txt or https://cmake.org/licensing#kwsys for details.
  3. # The Kitware System Library is intended to be included in other
  4. # projects. It is completely configurable in that the library's
  5. # namespace can be configured and the components that are included can
  6. # be selected invididually.
  7. # Typical usage is to import the kwsys directory tree into a
  8. # subdirectory under a parent project and enable the classes that will
  9. # be used. All classes are disabled by default. The CMake listfile
  10. # above this one configures the library as follows:
  11. #
  12. # set(KWSYS_NAMESPACE foosys)
  13. # set(KWSYS_USE_Directory 1) # Enable Directory class.
  14. # add_subdirectory(kwsys)
  15. #
  16. # Optional settings are as follows:
  17. #
  18. # KWSYS_HEADER_ROOT = The directory into which to generate the kwsys headers.
  19. # A directory called "${KWSYS_NAMESPACE}" will be
  20. # created under this root directory to hold the files.
  21. # KWSYS_SPLIT_OBJECTS_FROM_INTERFACE
  22. # = Instead of creating a single ${KWSYS_NAMESPACE} library
  23. # target, create three separate targets:
  24. # ${KWSYS_NAMESPACE}
  25. # - An INTERFACE library only containing usage
  26. # requirements.
  27. # ${KWSYS_NAMESPACE}_objects
  28. # - An OBJECT library for the built kwsys objects.
  29. # Note: This is omitted from the install rules
  30. # ${KWSYS_NAMESPACE}_private
  31. # - An INTERFACE library combining both that is
  32. # appropriate for use with PRIVATE linking in
  33. # target_link_libraries. Because of how interface
  34. # properties propagate, this target is not suitable
  35. # for use with PUBLIC or INTERFACE linking.
  36. # KWSYS_ALIAS_TARGET = The name of an alias target to create to the actual target.
  37. #
  38. # Example:
  39. #
  40. # set(KWSYS_HEADER_ROOT ${PROJECT_BINARY_DIR})
  41. # include_directories(${PROJECT_BINARY_DIR})
  42. #
  43. # KWSYS_CXX_STANDARD = A value for CMAKE_CXX_STANDARD within KWSys.
  44. # Set to empty string to use no default value.
  45. # KWSYS_CXX_COMPILE_FEATURES = target_compile_features arguments for KWSys.
  46. #
  47. # KWSYS_NO_EXECINFO = Do not use execinfo.
  48. #
  49. # Optional settings to setup install rules are as follows:
  50. #
  51. # KWSYS_INSTALL_BIN_DIR = The installation target directories into
  52. # KWSYS_INSTALL_LIB_DIR which the libraries and headers from
  53. # KWSYS_INSTALL_INCLUDE_DIR kwsys should be installed by a "make install".
  54. # The values should be specified relative to
  55. # the installation prefix and NOT start with '/'.
  56. # KWSYS_INSTALL_DOC_DIR = The installation target directory for documentation
  57. # such as copyright information.
  58. #
  59. # KWSYS_INSTALL_COMPONENT_NAME_RUNTIME = Name of runtime and development
  60. # KWSYS_INSTALL_COMPONENT_NAME_DEVELOPMENT installation components.
  61. # If not given the install rules
  62. # will not be in any component.
  63. #
  64. # KWSYS_INSTALL_EXPORT_NAME = The EXPORT option value for install(TARGETS) calls.
  65. #
  66. # Example:
  67. #
  68. # set(KWSYS_INSTALL_BIN_DIR bin)
  69. # set(KWSYS_INSTALL_LIB_DIR lib)
  70. # set(KWSYS_INSTALL_INCLUDE_DIR include)
  71. # set(KWSYS_INSTALL_COMPONENT_NAME_RUNTIME Runtime)
  72. # set(KWSYS_INSTALL_COMPONENT_NAME_DEVELOPMENT Development)
  73. # Once configured, kwsys should be used as follows from C or C++ code:
  74. #
  75. # #include <foosys/Directory.hxx>
  76. # ...
  77. # foosys::Directory directory;
  78. #
  79. # NOTE: This library is intended for internal use by Kitware-driven
  80. # projects. In order to keep it simple no attempt will be made to
  81. # maintain backward compatibility when changes are made to KWSys.
  82. # When an incompatible change is made Kitware's projects that use
  83. # KWSys will be fixed, but no notification will necessarily be sent to
  84. # any outside mailing list and no documentation of the change will be
  85. # written.
  86. cmake_minimum_required(VERSION 3.9...3.22 FATAL_ERROR)
  87. # Some configure checks depend upon the deployment target. Clear checks when
  88. # the deployment target changes.
  89. if (APPLE)
  90. if (NOT CMAKE_OSX_DEPLOYMENT_TARGET STREQUAL KWSYS_LAST_OSX_DEPLOYMENT_TARGET)
  91. unset(KWSYS_CXX_HAS_UTIMENSAT CACHE)
  92. endif ()
  93. set(KWSYS_LAST_OSX_DEPLOYMENT_TARGET "${CMAKE_OSX_DEPLOYMENT_TARGET}"
  94. CACHE INTERNAL "remember the last deployment target to trigger configure rechecks")
  95. endif ()
  96. #-----------------------------------------------------------------------------
  97. # If a namespace is not specified, use "kwsys" and enable testing.
  98. # This should be the case only when kwsys is not included inside
  99. # another project and is being tested.
  100. if(NOT KWSYS_NAMESPACE)
  101. set(KWSYS_NAMESPACE "kwsys")
  102. set(KWSYS_STANDALONE 1)
  103. endif()
  104. #-----------------------------------------------------------------------------
  105. # The project name is that of the specified namespace.
  106. project(${KWSYS_NAMESPACE})
  107. # Tell CMake how to follow dependencies of sources in this directory.
  108. set_property(DIRECTORY
  109. PROPERTY IMPLICIT_DEPENDS_INCLUDE_TRANSFORM
  110. "KWSYS_HEADER(%)=<${KWSYS_NAMESPACE}/%>"
  111. )
  112. if(KWSYS_CXX_STANDARD)
  113. set(CMAKE_CXX_STANDARD "${KWSYS_CXX_STANDARD}")
  114. elseif(NOT DEFINED CMAKE_CXX_STANDARD AND NOT DEFINED KWSYS_CXX_STANDARD)
  115. if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang"
  116. AND CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC"
  117. AND CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "GNU"
  118. )
  119. set(CMAKE_CXX_STANDARD 14)
  120. else()
  121. set(CMAKE_CXX_STANDARD 11)
  122. endif()
  123. endif()
  124. # Select library components.
  125. if(KWSYS_STANDALONE OR CMake_SOURCE_DIR)
  126. set(KWSYS_ENABLE_C 1)
  127. # Enable all components.
  128. set(KWSYS_USE_Base64 1)
  129. set(KWSYS_USE_Directory 1)
  130. set(KWSYS_USE_DynamicLoader 1)
  131. set(KWSYS_USE_Encoding 1)
  132. set(KWSYS_USE_Glob 1)
  133. set(KWSYS_USE_MD5 1)
  134. set(KWSYS_USE_Process 1)
  135. set(KWSYS_USE_RegularExpression 1)
  136. set(KWSYS_USE_Status 1)
  137. set(KWSYS_USE_System 1)
  138. set(KWSYS_USE_SystemTools 1)
  139. set(KWSYS_USE_CommandLineArguments 1)
  140. set(KWSYS_USE_Terminal 1)
  141. set(KWSYS_USE_FStream 1)
  142. set(KWSYS_USE_String 1)
  143. set(KWSYS_USE_SystemInformation 1)
  144. set(KWSYS_USE_ConsoleBuf 1)
  145. endif()
  146. # Enforce component dependencies.
  147. if(KWSYS_USE_SystemTools)
  148. set(KWSYS_USE_Directory 1)
  149. set(KWSYS_USE_FStream 1)
  150. set(KWSYS_USE_Encoding 1)
  151. set(KWSYS_USE_Status 1)
  152. endif()
  153. if(KWSYS_USE_Glob)
  154. set(KWSYS_USE_Directory 1)
  155. set(KWSYS_USE_SystemTools 1)
  156. set(KWSYS_USE_RegularExpression 1)
  157. set(KWSYS_USE_FStream 1)
  158. set(KWSYS_USE_Encoding 1)
  159. endif()
  160. if(KWSYS_USE_Process)
  161. set(KWSYS_USE_System 1)
  162. set(KWSYS_USE_Encoding 1)
  163. endif()
  164. if(KWSYS_USE_SystemInformation)
  165. set(KWSYS_USE_Process 1)
  166. endif()
  167. if(KWSYS_USE_System)
  168. set(KWSYS_USE_Encoding 1)
  169. endif()
  170. if(KWSYS_USE_Directory)
  171. set(KWSYS_USE_Encoding 1)
  172. set(KWSYS_USE_Status 1)
  173. set(KWSYS_USE_SystemTools 1)
  174. endif()
  175. if(KWSYS_USE_DynamicLoader)
  176. set(KWSYS_USE_Encoding 1)
  177. endif()
  178. if(KWSYS_USE_FStream)
  179. set(KWSYS_USE_Encoding 1)
  180. endif()
  181. if(KWSYS_USE_ConsoleBuf)
  182. set(KWSYS_USE_Encoding 1)
  183. endif()
  184. # Specify default 8 bit encoding for Windows
  185. if(NOT KWSYS_ENCODING_DEFAULT_CODEPAGE)
  186. set(KWSYS_ENCODING_DEFAULT_CODEPAGE CP_ACP)
  187. endif()
  188. # Enable testing if building standalone.
  189. if(KWSYS_STANDALONE)
  190. include(Dart)
  191. mark_as_advanced(BUILD_TESTING DART_ROOT TCL_TCLSH)
  192. if(BUILD_TESTING)
  193. enable_testing()
  194. endif()
  195. endif()
  196. # Choose default shared/static build if not specified.
  197. if(NOT DEFINED KWSYS_BUILD_SHARED)
  198. set(KWSYS_BUILD_SHARED ${BUILD_SHARED_LIBS})
  199. endif()
  200. # Include helper macros.
  201. include(${CMAKE_CURRENT_SOURCE_DIR}/kwsysPlatformTests.cmake)
  202. include(CheckTypeSize)
  203. # Do full dependency headers.
  204. include_regular_expression("^.*$")
  205. # Use new KWSYS_INSTALL_*_DIR variable names to control installation.
  206. # Take defaults from the old names. Note that there was no old name
  207. # for the bin dir, so we take the old lib dir name so DLLs will be
  208. # installed in a compatible way for old code.
  209. if(NOT KWSYS_INSTALL_INCLUDE_DIR)
  210. string(REGEX REPLACE "^/" "" KWSYS_INSTALL_INCLUDE_DIR
  211. "${KWSYS_HEADER_INSTALL_DIR}")
  212. endif()
  213. if(NOT KWSYS_INSTALL_LIB_DIR)
  214. string(REGEX REPLACE "^/" "" KWSYS_INSTALL_LIB_DIR
  215. "${KWSYS_LIBRARY_INSTALL_DIR}")
  216. endif()
  217. if(NOT KWSYS_INSTALL_BIN_DIR)
  218. string(REGEX REPLACE "^/" "" KWSYS_INSTALL_BIN_DIR
  219. "${KWSYS_LIBRARY_INSTALL_DIR}")
  220. endif()
  221. # Setup header install rules.
  222. set(KWSYS_INSTALL_INCLUDE_OPTIONS)
  223. if(KWSYS_INSTALL_COMPONENT_NAME_DEVELOPMENT)
  224. set(KWSYS_INSTALL_INCLUDE_OPTIONS ${KWSYS_INSTALL_INCLUDE_OPTIONS}
  225. COMPONENT ${KWSYS_INSTALL_COMPONENT_NAME_DEVELOPMENT}
  226. )
  227. endif()
  228. # Setup library install rules.
  229. set(KWSYS_INSTALL_LIBRARY_RULE)
  230. set(KWSYS_INSTALL_NAMELINK_RULE)
  231. if(KWSYS_INSTALL_LIB_DIR)
  232. if(KWSYS_INSTALL_EXPORT_NAME)
  233. list(APPEND KWSYS_INSTALL_LIBRARY_RULE EXPORT ${KWSYS_INSTALL_EXPORT_NAME})
  234. endif()
  235. # Install the shared library to the lib directory.
  236. set(KWSYS_INSTALL_LIBRARY_RULE ${KWSYS_INSTALL_LIBRARY_RULE}
  237. LIBRARY DESTINATION ${KWSYS_INSTALL_LIB_DIR} NAMELINK_SKIP
  238. )
  239. # Assign the shared library to the runtime component.
  240. if(KWSYS_INSTALL_COMPONENT_NAME_RUNTIME)
  241. set(KWSYS_INSTALL_LIBRARY_RULE ${KWSYS_INSTALL_LIBRARY_RULE}
  242. COMPONENT ${KWSYS_INSTALL_COMPONENT_NAME_RUNTIME}
  243. )
  244. endif()
  245. if(KWSYS_BUILD_SHARED)
  246. set(KWSYS_INSTALL_NAMELINK_RULE ${KWSYS_INSTALL_NAMELINK_RULE}
  247. LIBRARY DESTINATION ${KWSYS_INSTALL_LIB_DIR} NAMELINK_ONLY
  248. )
  249. # Assign the namelink to the development component.
  250. if(KWSYS_INSTALL_COMPONENT_NAME_DEVELOPMENT)
  251. set(KWSYS_INSTALL_NAMELINK_RULE ${KWSYS_INSTALL_NAMELINK_RULE}
  252. COMPONENT ${KWSYS_INSTALL_COMPONENT_NAME_DEVELOPMENT}
  253. )
  254. endif()
  255. endif()
  256. # Install the archive to the lib directory.
  257. set(KWSYS_INSTALL_LIBRARY_RULE ${KWSYS_INSTALL_LIBRARY_RULE}
  258. ARCHIVE DESTINATION ${KWSYS_INSTALL_LIB_DIR}
  259. )
  260. # Assign the archive to the development component.
  261. if(KWSYS_INSTALL_COMPONENT_NAME_DEVELOPMENT)
  262. set(KWSYS_INSTALL_LIBRARY_RULE ${KWSYS_INSTALL_LIBRARY_RULE}
  263. COMPONENT ${KWSYS_INSTALL_COMPONENT_NAME_DEVELOPMENT}
  264. )
  265. endif()
  266. endif()
  267. if(KWSYS_INSTALL_BIN_DIR)
  268. # Install the runtime library to the bin directory.
  269. set(KWSYS_INSTALL_LIBRARY_RULE ${KWSYS_INSTALL_LIBRARY_RULE}
  270. RUNTIME DESTINATION ${KWSYS_INSTALL_BIN_DIR}
  271. )
  272. # Assign the runtime library to the runtime component.
  273. if(KWSYS_INSTALL_COMPONENT_NAME_RUNTIME)
  274. set(KWSYS_INSTALL_LIBRARY_RULE ${KWSYS_INSTALL_LIBRARY_RULE}
  275. COMPONENT ${KWSYS_INSTALL_COMPONENT_NAME_RUNTIME}
  276. )
  277. endif()
  278. endif()
  279. # Do not support old KWSYS_*a_INSTALL_DIR variable names.
  280. set(KWSYS_HEADER_INSTALL_DIR)
  281. set(KWSYS_LIBRARY_INSTALL_DIR)
  282. # Generated source files will need this header.
  283. string(COMPARE EQUAL "${PROJECT_SOURCE_DIR}" "${PROJECT_BINARY_DIR}"
  284. KWSYS_IN_SOURCE_BUILD)
  285. if(NOT KWSYS_IN_SOURCE_BUILD)
  286. configure_file(${PROJECT_SOURCE_DIR}/kwsysPrivate.h
  287. ${PROJECT_BINARY_DIR}/kwsysPrivate.h COPYONLY IMMEDIATE)
  288. endif()
  289. # Select plugin module file name convention.
  290. if(NOT KWSYS_DynamicLoader_PREFIX)
  291. set(KWSYS_DynamicLoader_PREFIX ${CMAKE_SHARED_MODULE_PREFIX})
  292. endif()
  293. if(NOT KWSYS_DynamicLoader_SUFFIX)
  294. set(KWSYS_DynamicLoader_SUFFIX ${CMAKE_SHARED_MODULE_SUFFIX})
  295. endif()
  296. #-----------------------------------------------------------------------------
  297. # We require ANSI support from the C compiler. Add any needed flags.
  298. if(CMAKE_ANSI_CFLAGS)
  299. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_ANSI_CFLAGS}")
  300. endif()
  301. #-----------------------------------------------------------------------------
  302. # Adjust compiler flags for some platforms.
  303. if(NOT CMAKE_COMPILER_IS_GNUCXX)
  304. if(CMAKE_SYSTEM MATCHES "OSF1-V.*")
  305. string(REGEX MATCH "-timplicit_local"
  306. KWSYS_CXX_FLAGS_HAVE_IMPLICIT_LOCAL "${CMAKE_CXX_FLAGS}")
  307. string(REGEX MATCH "-no_implicit_include"
  308. KWSYS_CXX_FLAGS_HAVE_NO_IMPLICIT_INCLUDE "${CMAKE_CXX_FLAGS}")
  309. if(NOT KWSYS_CXX_FLAGS_HAVE_IMPLICIT_LOCAL)
  310. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -timplicit_local")
  311. endif()
  312. if(NOT KWSYS_CXX_FLAGS_HAVE_NO_IMPLICIT_INCLUDE)
  313. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -no_implicit_include")
  314. endif()
  315. endif()
  316. if(CMAKE_SYSTEM MATCHES "HP-UX")
  317. set(KWSYS_PLATFORM_CXX_TEST_EXTRA_FLAGS "+p")
  318. if(CMAKE_CXX_COMPILER_ID MATCHES "HP")
  319. # it is known that version 3.85 fails and 6.25 works without these flags
  320. if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4)
  321. # use new C++ library and improved template support
  322. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -AA +hpxstd98")
  323. endif()
  324. endif()
  325. endif()
  326. endif()
  327. if(KWSYS_STANDALONE)
  328. if(CMAKE_CXX_COMPILER_ID STREQUAL SunPro)
  329. if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.13)
  330. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++03")
  331. else()
  332. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -library=stlport4")
  333. endif()
  334. endif()
  335. endif()
  336. #-----------------------------------------------------------------------------
  337. # Configure the standard library header wrappers based on compiler's
  338. # capabilities and parent project's request. Enforce 0/1 as only
  339. # possible values for configuration into Configure.hxx.
  340. if(KWSYS_USE_Encoding)
  341. # Look for type size helper macros.
  342. KWSYS_PLATFORM_CXX_TEST(KWSYS_STL_HAS_WSTRING
  343. "Checking whether wstring is available" DIRECT)
  344. endif()
  345. if(KWSYS_NAMESPACE MATCHES "^kwsys$")
  346. set(KWSYS_NAME_IS_KWSYS 1)
  347. else()
  348. set(KWSYS_NAME_IS_KWSYS 0)
  349. endif()
  350. if(KWSYS_BUILD_SHARED)
  351. set(KWSYS_BUILD_SHARED 1)
  352. set(KWSYS_LIBRARY_TYPE SHARED)
  353. else()
  354. set(KWSYS_BUILD_SHARED 0)
  355. set(KWSYS_LIBRARY_TYPE STATIC)
  356. endif()
  357. if(NOT DEFINED KWSYS_BUILD_PIC)
  358. set(KWSYS_BUILD_PIC 0)
  359. endif()
  360. #-----------------------------------------------------------------------------
  361. # Configure some implementation details.
  362. KWSYS_PLATFORM_C_TEST(KWSYS_C_HAS_PTRDIFF_T
  363. "Checking whether C compiler has ptrdiff_t in stddef.h" DIRECT)
  364. KWSYS_PLATFORM_C_TEST(KWSYS_C_HAS_SSIZE_T
  365. "Checking whether C compiler has ssize_t in unistd.h" DIRECT)
  366. if(KWSYS_USE_Process)
  367. KWSYS_PLATFORM_C_TEST(KWSYS_C_HAS_CLOCK_GETTIME_MONOTONIC
  368. "Checking whether C compiler has clock_gettime" DIRECT)
  369. endif()
  370. set_source_files_properties(ProcessUNIX.c System.c PROPERTIES
  371. COMPILE_FLAGS "-DKWSYS_C_HAS_PTRDIFF_T=${KWSYS_C_HAS_PTRDIFF_T} -DKWSYS_C_HAS_SSIZE_T=${KWSYS_C_HAS_SSIZE_T} -DKWSYS_C_HAS_CLOCK_GETTIME_MONOTONIC=${KWSYS_C_HAS_CLOCK_GETTIME_MONOTONIC}"
  372. )
  373. if(DEFINED KWSYS_PROCESS_USE_SELECT)
  374. get_property(ProcessUNIX_FLAGS SOURCE ProcessUNIX.c PROPERTY COMPILE_FLAGS)
  375. set_property(SOURCE ProcessUNIX.c PROPERTY COMPILE_FLAGS "${ProcessUNIX_FLAGS} -DKWSYSPE_USE_SELECT=${KWSYSPE_USE_SELECT}")
  376. endif()
  377. if(KWSYS_USE_DynamicLoader)
  378. get_property(KWSYS_SUPPORTS_SHARED_LIBS GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS)
  379. if(KWSYS_SUPPORTS_SHARED_LIBS)
  380. set(KWSYS_SUPPORTS_SHARED_LIBS 1)
  381. else()
  382. set(KWSYS_SUPPORTS_SHARED_LIBS 0)
  383. endif()
  384. set_property(SOURCE DynamicLoader.cxx APPEND PROPERTY COMPILE_DEFINITIONS
  385. KWSYS_SUPPORTS_SHARED_LIBS=${KWSYS_SUPPORTS_SHARED_LIBS})
  386. endif()
  387. if(KWSYS_USE_SystemTools)
  388. if (NOT DEFINED KWSYS_SYSTEMTOOLS_USE_TRANSLATION_MAP)
  389. set(KWSYS_SYSTEMTOOLS_USE_TRANSLATION_MAP 1)
  390. endif ()
  391. if (KWSYS_SYSTEMTOOLS_USE_TRANSLATION_MAP)
  392. set(KWSYS_SYSTEMTOOLS_USE_TRANSLATION_MAP 1)
  393. else ()
  394. set(KWSYS_SYSTEMTOOLS_USE_TRANSLATION_MAP 0)
  395. endif ()
  396. KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_SETENV
  397. "Checking whether CXX compiler has setenv" DIRECT)
  398. KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_UNSETENV
  399. "Checking whether CXX compiler has unsetenv" DIRECT)
  400. KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_ENVIRON_IN_STDLIB_H
  401. "Checking whether CXX compiler has environ in stdlib.h" DIRECT)
  402. KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_UTIMES
  403. "Checking whether CXX compiler has utimes" DIRECT)
  404. KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_UTIMENSAT
  405. "Checking whether CXX compiler has utimensat" DIRECT)
  406. KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_STAT_HAS_ST_MTIM
  407. "Checking whether CXX compiler struct stat has st_mtim member" DIRECT)
  408. KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_STAT_HAS_ST_MTIMESPEC
  409. "Checking whether CXX compiler struct stat has st_mtimespec member" DIRECT)
  410. set_property(SOURCE SystemTools.cxx APPEND PROPERTY COMPILE_DEFINITIONS
  411. KWSYS_CXX_HAS_SETENV=${KWSYS_CXX_HAS_SETENV}
  412. KWSYS_CXX_HAS_UNSETENV=${KWSYS_CXX_HAS_UNSETENV}
  413. KWSYS_CXX_HAS_ENVIRON_IN_STDLIB_H=${KWSYS_CXX_HAS_ENVIRON_IN_STDLIB_H}
  414. KWSYS_CXX_HAS_UTIMES=${KWSYS_CXX_HAS_UTIMES}
  415. KWSYS_CXX_HAS_UTIMENSAT=${KWSYS_CXX_HAS_UTIMENSAT}
  416. KWSYS_CXX_STAT_HAS_ST_MTIM=${KWSYS_CXX_STAT_HAS_ST_MTIM}
  417. KWSYS_CXX_STAT_HAS_ST_MTIMESPEC=${KWSYS_CXX_STAT_HAS_ST_MTIMESPEC}
  418. )
  419. if(NOT WIN32)
  420. if(KWSYS_STANDALONE)
  421. option(KWSYS_SYSTEMTOOLS_SUPPORT_WINDOWS_SLASHES "If true, Windows paths will be supported on Unix as well" ON)
  422. endif()
  423. if(KWSYS_SYSTEMTOOLS_SUPPORT_WINDOWS_SLASHES)
  424. set_property(SOURCE SystemTools.cxx testSystemTools.cxx APPEND PROPERTY COMPILE_DEFINITIONS
  425. KWSYS_SYSTEMTOOLS_SUPPORT_WINDOWS_SLASHES
  426. )
  427. endif()
  428. endif()
  429. # Disable getpwnam for static linux builds since it depends on shared glibc
  430. get_property(SHARED_LIBS_SUPPORTED GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS)
  431. if(CMAKE_SYSTEM_NAME MATCHES "Linux" AND NOT SHARED_LIBS_SUPPORTED)
  432. set_property(SOURCE SystemTools.cxx APPEND PROPERTY COMPILE_DEFINITIONS
  433. HAVE_GETPWNAM=0
  434. )
  435. endif()
  436. endif()
  437. if(KWSYS_USE_SystemInformation)
  438. set_property(SOURCE SystemInformation.cxx APPEND PROPERTY
  439. COMPILE_DEFINITIONS SIZEOF_VOID_P=${CMAKE_SIZEOF_VOID_P})
  440. if(NOT CYGWIN)
  441. include(CheckIncludeFiles)
  442. CHECK_INCLUDE_FILES("sys/types.h;ifaddrs.h" KWSYS_SYS_HAS_IFADDRS_H)
  443. if(KWSYS_SYS_HAS_IFADDRS_H)
  444. set_property(SOURCE SystemInformation.cxx APPEND PROPERTY
  445. COMPILE_DEFINITIONS KWSYS_SYS_HAS_IFADDRS_H=1)
  446. endif()
  447. endif()
  448. if(WIN32)
  449. include(CheckSymbolExists)
  450. set(CMAKE_REQUIRED_LIBRARIES psapi)
  451. CHECK_SYMBOL_EXISTS(GetProcessMemoryInfo "windows.h;psapi.h" KWSYS_SYS_HAS_PSAPI)
  452. unset(CMAKE_REQUIRED_LIBRARIES)
  453. if(KWSYS_SYS_HAS_PSAPI)
  454. set_property(SOURCE SystemInformation.cxx APPEND PROPERTY
  455. COMPILE_DEFINITIONS KWSYS_SYS_HAS_PSAPI=1)
  456. if(MSVC70 OR MSVC71)
  457. # Suppress LNK4089: all references to 'PSAPI.DLL' discarded by /OPT:REF
  458. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /IGNORE:4089")
  459. endif()
  460. endif()
  461. endif()
  462. if(CMAKE_SYSTEM MATCHES "HP-UX")
  463. CHECK_INCLUDE_FILES("sys/mpctl.h" KWSYS_SYS_HAS_MPCTL_H)
  464. if(KWSYS_SYS_HAS_MPCTL_H)
  465. set_property(SOURCE SystemInformation.cxx APPEND PROPERTY
  466. COMPILE_DEFINITIONS KWSYS_SYS_HAS_MPCTL_H=1)
  467. endif()
  468. endif()
  469. if(CMAKE_SYSTEM MATCHES "BSD")
  470. CHECK_INCLUDE_FILES("machine/cpu.h" KWSYS_SYS_HAS_MACHINE_CPU_H)
  471. if(KWSYS_SYS_HAS_MACHINE_CPU_H)
  472. set_property(SOURCE SystemInformation.cxx APPEND PROPERTY
  473. COMPILE_DEFINITIONS KWSYS_SYS_HAS_MACHINE_CPU_H=1)
  474. endif()
  475. endif()
  476. KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_RLIMIT64
  477. "Checking whether CXX compiler has rlimit64" DIRECT)
  478. set(KWSYS_PLATFORM_CXX_TEST_DEFINES)
  479. if(KWSYS_CXX_HAS_RLIMIT64)
  480. set_property(SOURCE SystemInformation.cxx APPEND PROPERTY
  481. COMPILE_DEFINITIONS KWSYS_CXX_HAS_RLIMIT64=1)
  482. endif()
  483. if(UNIX AND NOT KWSYS_NO_EXECINFO)
  484. include(CheckIncludeFileCXX)
  485. # check for simple stack trace
  486. # usually it's in libc but on FreeBSD
  487. # it's in libexecinfo
  488. find_library(EXECINFO_LIB "execinfo")
  489. mark_as_advanced(EXECINFO_LIB)
  490. if (NOT EXECINFO_LIB)
  491. set(EXECINFO_LIB "")
  492. endif()
  493. CHECK_INCLUDE_FILE_CXX("execinfo.h" KWSYS_CXX_HAS_EXECINFOH)
  494. if (KWSYS_CXX_HAS_EXECINFOH)
  495. # we have the backtrace header check if it
  496. # can be used with this compiler
  497. set(KWSYS_PLATFORM_CXX_TEST_LINK_LIBRARIES ${EXECINFO_LIB})
  498. KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_BACKTRACE
  499. "Checking whether backtrace works with this C++ compiler" DIRECT)
  500. set(KWSYS_PLATFORM_CXX_TEST_LINK_LIBRARIES)
  501. if (KWSYS_CXX_HAS_BACKTRACE)
  502. # backtrace is supported by this system and compiler.
  503. # now check for the more advanced capabilities.
  504. set_property(SOURCE SystemInformation.cxx APPEND PROPERTY
  505. COMPILE_DEFINITIONS KWSYS_SYSTEMINFORMATION_HAS_BACKTRACE=1)
  506. # check for symbol lookup using dladdr
  507. CHECK_INCLUDE_FILE_CXX("dlfcn.h" KWSYS_CXX_HAS_DLFCNH)
  508. if (KWSYS_CXX_HAS_DLFCNH)
  509. # we have symbol lookup libraries and headers
  510. # check if they can be used with this compiler
  511. set(KWSYS_PLATFORM_CXX_TEST_LINK_LIBRARIES ${CMAKE_DL_LIBS})
  512. KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_DLADDR
  513. "Checking whether dladdr works with this C++ compiler" DIRECT)
  514. set(KWSYS_PLATFORM_CXX_TEST_LINK_LIBRARIES)
  515. if (KWSYS_CXX_HAS_DLADDR)
  516. # symbol lookup is supported by this system
  517. # and compiler.
  518. set_property(SOURCE SystemInformation.cxx APPEND PROPERTY
  519. COMPILE_DEFINITIONS KWSYS_SYSTEMINFORMATION_HAS_SYMBOL_LOOKUP=1)
  520. endif()
  521. endif()
  522. # c++ demangling support
  523. # check for cxxabi headers
  524. CHECK_INCLUDE_FILE_CXX("cxxabi.h" KWSYS_CXX_HAS_CXXABIH)
  525. if (KWSYS_CXX_HAS_CXXABIH)
  526. # check if cxxabi can be used with this
  527. # system and compiler.
  528. KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_CXXABI
  529. "Checking whether cxxabi works with this C++ compiler" DIRECT)
  530. if (KWSYS_CXX_HAS_CXXABI)
  531. # c++ demangle using cxxabi is supported with
  532. # this system and compiler
  533. set_property(SOURCE SystemInformation.cxx APPEND PROPERTY
  534. COMPILE_DEFINITIONS KWSYS_SYSTEMINFORMATION_HAS_CPP_DEMANGLE=1)
  535. endif()
  536. endif()
  537. # basic backtrace works better with release build
  538. # don't bother with advanced features for release
  539. set_property(SOURCE SystemInformation.cxx APPEND PROPERTY
  540. COMPILE_DEFINITIONS_DEBUG KWSYS_SYSTEMINFORMATION_HAS_DEBUG_BUILD=1)
  541. set_property(SOURCE SystemInformation.cxx APPEND PROPERTY
  542. COMPILE_DEFINITIONS_RELWITHDEBINFO KWSYS_SYSTEMINFORMATION_HAS_DEBUG_BUILD=1)
  543. endif()
  544. endif()
  545. endif()
  546. if(KWSYS_BUILD_SHARED)
  547. set_property(SOURCE SystemInformation.cxx APPEND PROPERTY
  548. COMPILE_DEFINITIONS KWSYS_BUILD_SHARED=1)
  549. endif()
  550. if(UNIX AND NOT CYGWIN)
  551. KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_GETLOADAVG
  552. "Checking whether CXX compiler has getloadavg" DIRECT)
  553. if(KWSYS_CXX_HAS_GETLOADAVG)
  554. set_property(SOURCE SystemInformation.cxx APPEND PROPERTY
  555. COMPILE_DEFINITIONS KWSYS_CXX_HAS_GETLOADAVG=1)
  556. endif()
  557. endif()
  558. endif()
  559. if(KWSYS_USE_FStream)
  560. KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_EXT_STDIO_FILEBUF_H
  561. "Checking whether <ext/stdio_filebuf.h> is available" DIRECT)
  562. endif()
  563. #-----------------------------------------------------------------------------
  564. # Choose a directory for the generated headers.
  565. if(NOT KWSYS_HEADER_ROOT)
  566. set(KWSYS_HEADER_ROOT "${PROJECT_BINARY_DIR}")
  567. endif()
  568. set(KWSYS_HEADER_DIR "${KWSYS_HEADER_ROOT}/${KWSYS_NAMESPACE}")
  569. include_directories(${KWSYS_HEADER_ROOT})
  570. #-----------------------------------------------------------------------------
  571. if(KWSYS_INSTALL_DOC_DIR)
  572. # Assign the license to the runtime component since it must be
  573. # distributed with binary forms of this software.
  574. if(KWSYS_INSTALL_COMPONENT_NAME_RUNTIME)
  575. set(KWSYS_INSTALL_LICENSE_OPTIONS ${KWSYS_INSTALL_LICENSE_OPTIONS}
  576. COMPONENT ${KWSYS_INSTALL_COMPONENT_NAME_RUNTIME}
  577. )
  578. endif()
  579. # Install the license under the documentation directory.
  580. install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/Copyright.txt
  581. DESTINATION ${KWSYS_INSTALL_DOC_DIR}/${KWSYS_NAMESPACE}
  582. ${KWSYS_INSTALL_LICENSE_OPTIONS})
  583. endif()
  584. #-----------------------------------------------------------------------------
  585. # Build a list of classes and headers we need to implement the
  586. # selected components. Initialize with required components.
  587. set(KWSYS_CLASSES)
  588. set(KWSYS_H_FILES Configure SharedForward)
  589. set(KWSYS_HXX_FILES Configure String)
  590. # Add selected C++ classes.
  591. set(cppclasses
  592. Directory DynamicLoader Encoding Glob RegularExpression SystemTools
  593. CommandLineArguments FStream SystemInformation ConsoleBuf Status
  594. )
  595. foreach(cpp ${cppclasses})
  596. if(KWSYS_USE_${cpp})
  597. # Use the corresponding class.
  598. set(KWSYS_CLASSES ${KWSYS_CLASSES} ${cpp})
  599. # Load component-specific CMake code.
  600. if(EXISTS ${PROJECT_SOURCE_DIR}/kwsys${cpp}.cmake)
  601. include(${PROJECT_SOURCE_DIR}/kwsys${cpp}.cmake)
  602. endif()
  603. endif()
  604. endforeach()
  605. # Add selected C components.
  606. foreach(c
  607. Process Base64 Encoding MD5 Terminal System String
  608. )
  609. if(KWSYS_USE_${c})
  610. # Use the corresponding header file.
  611. set(KWSYS_H_FILES ${KWSYS_H_FILES} ${c})
  612. # Load component-specific CMake code.
  613. if(EXISTS ${PROJECT_SOURCE_DIR}/kwsys${c}.cmake)
  614. include(${PROJECT_SOURCE_DIR}/kwsys${c}.cmake)
  615. endif()
  616. endif()
  617. endforeach()
  618. #-----------------------------------------------------------------------------
  619. # Build a list of sources for the library based on components that are
  620. # included.
  621. set(KWSYS_C_SRCS)
  622. set(KWSYS_CXX_SRCS)
  623. # Add the proper sources for this platform's Process implementation.
  624. if(KWSYS_USE_Process)
  625. if(NOT UNIX)
  626. # Use the Windows implementation.
  627. set(KWSYS_C_SRCS ${KWSYS_C_SRCS} ProcessWin32.c)
  628. else()
  629. # Use the UNIX implementation.
  630. set(KWSYS_C_SRCS ${KWSYS_C_SRCS} ProcessUNIX.c)
  631. endif()
  632. endif()
  633. # Add selected C sources.
  634. foreach(c Base64 Encoding MD5 Terminal System String)
  635. if(KWSYS_USE_${c})
  636. if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${c}C.c)
  637. list(APPEND KWSYS_C_SRCS ${c}C.c)
  638. else()
  639. list(APPEND KWSYS_C_SRCS ${c}.c)
  640. endif()
  641. endif()
  642. endforeach()
  643. # Configure headers of C++ classes and construct the list of sources.
  644. foreach(c ${KWSYS_CLASSES})
  645. # Add this source to the list of source files for the library.
  646. if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${c}CXX.cxx)
  647. list(APPEND KWSYS_CXX_SRCS ${c}CXX.cxx)
  648. elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${c}.cxx)
  649. list(APPEND KWSYS_CXX_SRCS ${c}.cxx)
  650. endif()
  651. # Configure the header for this class.
  652. configure_file(${PROJECT_SOURCE_DIR}/${c}.hxx.in ${KWSYS_HEADER_DIR}/${c}.hxx
  653. @ONLY IMMEDIATE)
  654. set(KWSYS_CXX_SRCS ${KWSYS_CXX_SRCS} ${KWSYS_HEADER_DIR}/${c}.hxx)
  655. # Create an install target for the header.
  656. if(KWSYS_INSTALL_INCLUDE_DIR)
  657. install(FILES ${KWSYS_HEADER_DIR}/${c}.hxx
  658. DESTINATION ${KWSYS_INSTALL_INCLUDE_DIR}/${KWSYS_NAMESPACE}
  659. ${KWSYS_INSTALL_INCLUDE_OPTIONS})
  660. endif()
  661. endforeach()
  662. # Configure C headers.
  663. foreach(h ${KWSYS_H_FILES})
  664. # Configure the header into the given directory.
  665. configure_file(${PROJECT_SOURCE_DIR}/${h}.h.in ${KWSYS_HEADER_DIR}/${h}.h
  666. @ONLY IMMEDIATE)
  667. set(KWSYS_C_SRCS ${KWSYS_C_SRCS} ${KWSYS_HEADER_DIR}/${h}.h)
  668. # Create an install target for the header.
  669. if(KWSYS_INSTALL_INCLUDE_DIR)
  670. install(FILES ${KWSYS_HEADER_DIR}/${h}.h
  671. DESTINATION ${KWSYS_INSTALL_INCLUDE_DIR}/${KWSYS_NAMESPACE}
  672. ${KWSYS_INSTALL_INCLUDE_OPTIONS})
  673. endif()
  674. endforeach()
  675. # Configure other C++ headers.
  676. foreach(h ${KWSYS_HXX_FILES})
  677. # Configure the header into the given directory.
  678. configure_file(${PROJECT_SOURCE_DIR}/${h}.hxx.in ${KWSYS_HEADER_DIR}/${h}.hxx
  679. @ONLY IMMEDIATE)
  680. set(KWSYS_CXX_SRCS ${KWSYS_CXX_SRCS} ${KWSYS_HEADER_DIR}/${h}.hxx)
  681. # Create an install target for the header.
  682. if(KWSYS_INSTALL_INCLUDE_DIR)
  683. install(FILES ${KWSYS_HEADER_DIR}/${h}.hxx
  684. DESTINATION ${KWSYS_INSTALL_INCLUDE_DIR}/${KWSYS_NAMESPACE}
  685. ${KWSYS_INSTALL_INCLUDE_OPTIONS})
  686. endif()
  687. endforeach()
  688. #-----------------------------------------------------------------------------
  689. # Add the library with the configured name and list of sources.
  690. if(KWSYS_C_SRCS OR KWSYS_CXX_SRCS)
  691. if(KWSYS_SPLIT_OBJECTS_FROM_INTERFACE)
  692. set(KWSYS_TARGET_INTERFACE ${KWSYS_NAMESPACE})
  693. set(KWSYS_TARGET_OBJECT ${KWSYS_NAMESPACE}_objects)
  694. set(KWSYS_TARGET_LINK ${KWSYS_NAMESPACE}_private)
  695. set(KWSYS_TARGET_INSTALL ${KWSYS_TARGET_INTERFACE} ${KWSYS_TARGET_LINK})
  696. set(KWSYS_LINK_DEPENDENCY INTERFACE)
  697. add_library(${KWSYS_TARGET_OBJECT} OBJECT
  698. ${KWSYS_C_SRCS} ${KWSYS_CXX_SRCS})
  699. if(KWSYS_BUILD_SHARED OR KWSYS_BUILD_PIC)
  700. set_property(TARGET ${KWSYS_TARGET_OBJECT} PROPERTY
  701. POSITION_INDEPENDENT_CODE TRUE)
  702. endif()
  703. add_library(${KWSYS_TARGET_INTERFACE} INTERFACE)
  704. add_library(${KWSYS_TARGET_LINK} INTERFACE)
  705. target_link_libraries(${KWSYS_TARGET_LINK} INTERFACE
  706. ${KWSYS_TARGET_INTERFACE})
  707. target_sources(${KWSYS_TARGET_LINK} INTERFACE
  708. $<TARGET_OBJECTS:${KWSYS_TARGET_OBJECT}>)
  709. target_compile_features(${KWSYS_TARGET_OBJECT} PRIVATE ${KWSYS_CXX_COMPILE_FEATURES})
  710. target_compile_features(${KWSYS_TARGET_INTERFACE} INTERFACE ${KWSYS_CXX_COMPILE_FEATURES})
  711. else()
  712. set(KWSYS_TARGET_INTERFACE ${KWSYS_NAMESPACE})
  713. set(KWSYS_TARGET_OBJECT ${KWSYS_NAMESPACE})
  714. set(KWSYS_TARGET_LINK ${KWSYS_NAMESPACE})
  715. set(KWSYS_TARGET_INSTALL ${KWSYS_TARGET_LINK})
  716. set(KWSYS_LINK_DEPENDENCY PUBLIC)
  717. add_library(${KWSYS_TARGET_INTERFACE} ${KWSYS_LIBRARY_TYPE}
  718. ${KWSYS_C_SRCS} ${KWSYS_CXX_SRCS})
  719. target_compile_features(${KWSYS_TARGET_INTERFACE} PUBLIC ${KWSYS_CXX_COMPILE_FEATURES})
  720. endif()
  721. if (KWSYS_ALIAS_TARGET)
  722. add_library(${KWSYS_ALIAS_TARGET} ALIAS ${KWSYS_TARGET_INTERFACE})
  723. endif ()
  724. set_target_properties(${KWSYS_TARGET_OBJECT} PROPERTIES
  725. C_CLANG_TIDY ""
  726. CXX_CLANG_TIDY ""
  727. C_INCLUDE_WHAT_YOU_USE ""
  728. CXX_INCLUDE_WHAT_YOU_USE ""
  729. LABELS "${KWSYS_LABELS_LIB}")
  730. if(KWSYS_USE_DynamicLoader)
  731. if(UNIX)
  732. target_link_libraries(${KWSYS_TARGET_INTERFACE} ${KWSYS_LINK_DEPENDENCY}
  733. ${CMAKE_DL_LIBS})
  734. endif()
  735. endif()
  736. if(KWSYS_USE_SystemInformation)
  737. if(WIN32)
  738. target_link_libraries(${KWSYS_TARGET_INTERFACE} ${KWSYS_LINK_DEPENDENCY} ws2_32)
  739. # link in dbghelp.dll for symbol lookup if MSVC 1800 or later
  740. # Note that the dbghelp runtime is part of MS Windows OS
  741. if(MSVC_VERSION AND NOT MSVC_VERSION VERSION_LESS 1800)
  742. target_link_libraries(${KWSYS_TARGET_INTERFACE} ${KWSYS_LINK_DEPENDENCY} dbghelp)
  743. endif()
  744. if(KWSYS_SYS_HAS_PSAPI)
  745. target_link_libraries(${KWSYS_TARGET_INTERFACE} ${KWSYS_LINK_DEPENDENCY}
  746. psapi)
  747. endif()
  748. elseif(UNIX)
  749. if (EXECINFO_LIB AND KWSYS_CXX_HAS_BACKTRACE)
  750. # backtrace on FreeBSD is not in libc
  751. target_link_libraries(${KWSYS_TARGET_INTERFACE} ${KWSYS_LINK_DEPENDENCY}
  752. ${EXECINFO_LIB})
  753. endif()
  754. if (KWSYS_CXX_HAS_DLADDR)
  755. # for symbol lookup using dladdr
  756. target_link_libraries(${KWSYS_TARGET_INTERFACE} ${KWSYS_LINK_DEPENDENCY}
  757. ${CMAKE_DL_LIBS})
  758. endif()
  759. if (CMAKE_SYSTEM_NAME STREQUAL "SunOS")
  760. target_link_libraries(${KWSYS_TARGET_INTERFACE} ${KWSYS_LINK_DEPENDENCY}
  761. socket)
  762. endif()
  763. endif()
  764. endif()
  765. # Apply user-defined target properties to the library.
  766. if(KWSYS_PROPERTIES_CXX)
  767. set_target_properties(${KWSYS_TARGET_INTERFACE} PROPERTIES
  768. ${KWSYS_PROPERTIES_CXX})
  769. endif()
  770. # Set up include usage requirement
  771. if(COMMAND TARGET_INCLUDE_DIRECTORIES)
  772. target_include_directories(${KWSYS_TARGET_INTERFACE} INTERFACE
  773. $<BUILD_INTERFACE:${KWSYS_HEADER_ROOT}>)
  774. if(KWSYS_INSTALL_INCLUDE_DIR)
  775. target_include_directories(${KWSYS_TARGET_INTERFACE} INTERFACE
  776. $<INSTALL_INTERFACE:${KWSYS_INSTALL_INCLUDE_DIR}>)
  777. endif()
  778. endif()
  779. # Create an install target for the library.
  780. if(KWSYS_INSTALL_LIBRARY_RULE)
  781. install(TARGETS ${KWSYS_TARGET_INSTALL} ${KWSYS_INSTALL_LIBRARY_RULE})
  782. endif()
  783. if(KWSYS_INSTALL_NAMELINK_RULE)
  784. install(TARGETS ${KWSYS_TARGET_INSTALL} ${KWSYS_INSTALL_NAMELINK_RULE})
  785. endif()
  786. endif()
  787. # Add a C-only library if requested.
  788. if(KWSYS_ENABLE_C AND KWSYS_C_SRCS)
  789. if(KWSYS_SPLIT_OBJECTS_FROM_INTERFACE)
  790. set(KWSYS_TARGET_C_INTERFACE ${KWSYS_NAMESPACE}_c)
  791. set(KWSYS_TARGET_C_OBJECT ${KWSYS_NAMESPACE}_c_objects)
  792. set(KWSYS_TARGET_C_LINK ${KWSYS_NAMESPACE}_c_private)
  793. set(KWSYS_TARGET_C_INSTALL
  794. ${KWSYS_TARGET_C_INTERFACE} ${KWSYS_TARGET_C_LINK})
  795. set(KWSYS_LINK_DEPENDENCY INTERFACE)
  796. add_library(${KWSYS_TARGET_C_OBJECT} OBJECT ${KWSYS_C_SRCS})
  797. if(KWSYS_BUILD_SHARED OR KWSYS_BUILD_PIC)
  798. set_property(TARGET ${KWSYS_TARGET_C_OBJECT} PROPERTY
  799. POSITION_INDEPENDENT_CODE TRUE)
  800. endif()
  801. add_library(${KWSYS_TARGET_C_INTERFACE} INTERFACE)
  802. add_library(${KWSYS_TARGET_C_LINK} INTERFACE)
  803. target_link_libraries(${KWSYS_TARGET_C_LINK} INTERFACE
  804. ${KWSYS_TARGET_C_INTERFACE})
  805. target_sources(${KWSYS_TARGET_C_LINK} INTERFACE
  806. $<TARGET_OBJECTS:${KWSYS_TARGET_C_OBJECT}>)
  807. else()
  808. set(KWSYS_TARGET_C_INTERFACE ${KWSYS_NAMESPACE}_c)
  809. set(KWSYS_TARGET_C_OBJECT ${KWSYS_NAMESPACE}_c)
  810. set(KWSYS_TARGET_C_LINK ${KWSYS_NAMESPACE}_c)
  811. set(KWSYS_TARGET_C_INSTALL ${KWSYS_TARGET_C_LINK})
  812. set(KWSYS_LINK_DEPENDENCY PUBLIC)
  813. add_library(${KWSYS_TARGET_C_INTERFACE} ${KWSYS_LIBRARY_TYPE}
  814. ${KWSYS_C_SRCS})
  815. endif()
  816. set_target_properties(${KWSYS_TARGET_C_OBJECT} PROPERTIES
  817. LABELS "${KWSYS_LABELS_LIB}")
  818. # Apply user-defined target properties to the library.
  819. if(KWSYS_PROPERTIES_C)
  820. set_target_properties(${KWSYS_TARGET_C_INTERFACE} PROPERTIES
  821. ${KWSYS_PROPERTIES_C})
  822. endif()
  823. # Set up include usage requirement
  824. if(COMMAND TARGET_INCLUDE_DIRECTORIES)
  825. target_include_directories(${KWSYS_TARGET_C_INTERFACE} INTERFACE
  826. $<BUILD_INTERFACE:${KWSYS_HEADER_ROOT}>)
  827. if(KWSYS_INSTALL_INCLUDE_DIR)
  828. target_include_directories(${KWSYS_TARGET_C_INTERFACE} INTERFACE
  829. $<INSTALL_INTERFACE:${KWSYS_INSTALL_INCLUDE_DIR}>)
  830. endif()
  831. endif()
  832. # Create an install target for the library.
  833. if(KWSYS_INSTALL_LIBRARY_RULE)
  834. install(TARGETS ${KWSYS_TARGET_C_INSTALL})
  835. endif()
  836. endif()
  837. # For building kwsys itself, we use a macro defined on the command
  838. # line to configure the namespace in the C and C++ source files.
  839. add_definitions("-DKWSYS_NAMESPACE=${KWSYS_NAMESPACE}")
  840. # Disable deprecation warnings for standard C functions.
  841. if(MSVC OR (WIN32 AND (CMAKE_C_COMPILER_ID STREQUAL "Intel" OR
  842. (CMAKE_C_COMPILER_ID STREQUAL "Clang" AND CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC"))))
  843. add_definitions(
  844. -D_CRT_NONSTDC_NO_DEPRECATE
  845. -D_CRT_SECURE_NO_DEPRECATE
  846. -D_CRT_SECURE_NO_WARNINGS
  847. -D_SCL_SECURE_NO_DEPRECATE
  848. )
  849. endif()
  850. if(WIN32)
  851. # Help enforce the use of wide Windows apis.
  852. add_definitions(-DUNICODE -D_UNICODE)
  853. endif()
  854. if(KWSYS_USE_String)
  855. # Activate code in "String.c". See the comment in the source.
  856. set_source_files_properties(String.c PROPERTIES
  857. COMPILE_FLAGS "-DKWSYS_STRING_C")
  858. endif()
  859. if(KWSYS_USE_Encoding)
  860. # Set default 8 bit encoding in "EndcodingC.c".
  861. set_property(SOURCE EncodingC.c EncodingCXX.cxx APPEND PROPERTY COMPILE_DEFINITIONS
  862. KWSYS_ENCODING_DEFAULT_CODEPAGE=${KWSYS_ENCODING_DEFAULT_CODEPAGE})
  863. endif()
  864. #-----------------------------------------------------------------------------
  865. # Setup testing if not being built as part of another project.
  866. if(KWSYS_STANDALONE OR CMake_SOURCE_DIR)
  867. if(BUILD_TESTING)
  868. # Compute the location of executables.
  869. set(EXEC_DIR "${CMAKE_CURRENT_BINARY_DIR}")
  870. if(CMAKE_RUNTIME_OUTPUT_DIRECTORY)
  871. set(EXEC_DIR "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}")
  872. endif()
  873. # C tests
  874. set(KWSYS_C_TESTS
  875. testEncode.c
  876. testTerminal.c
  877. )
  878. if(KWSYS_STANDALONE)
  879. set(KWSYS_C_TESTS ${KWSYS_C_TESTS} testFail.c)
  880. endif()
  881. create_test_sourcelist(
  882. KWSYS_C_TEST_SRCS ${KWSYS_NAMESPACE}TestsC.c
  883. ${KWSYS_C_TESTS}
  884. )
  885. add_executable(${KWSYS_NAMESPACE}TestsC ${KWSYS_C_TEST_SRCS})
  886. set_property(TARGET ${KWSYS_NAMESPACE}TestsC PROPERTY LABELS ${KWSYS_LABELS_EXE})
  887. target_link_libraries(${KWSYS_NAMESPACE}TestsC ${KWSYS_TARGET_C_LINK})
  888. foreach(testfile ${KWSYS_C_TESTS})
  889. get_filename_component(test "${testfile}" NAME_WE)
  890. add_test(kwsys.${test} ${EXEC_DIR}/${KWSYS_NAMESPACE}TestsC ${test} ${KWSYS_TEST_ARGS_${test}})
  891. set_property(TEST kwsys.${test} PROPERTY LABELS ${KWSYS_LABELS_TEST})
  892. endforeach()
  893. # C++ tests
  894. set(KWSYS_CXX_TESTS ${KWSYS_CXX_TESTS}
  895. testConfigure.cxx
  896. testStatus.cxx
  897. testSystemTools.cxx
  898. testCommandLineArguments.cxx
  899. testCommandLineArguments1.cxx
  900. testDirectory.cxx
  901. )
  902. if(KWSYS_STL_HAS_WSTRING)
  903. set(KWSYS_CXX_TESTS ${KWSYS_CXX_TESTS}
  904. testEncoding.cxx
  905. )
  906. endif()
  907. if(KWSYS_USE_FStream)
  908. set(KWSYS_CXX_TESTS ${KWSYS_CXX_TESTS}
  909. testFStream.cxx
  910. )
  911. endif()
  912. if(KWSYS_USE_ConsoleBuf)
  913. add_executable(testConsoleBufChild testConsoleBufChild.cxx)
  914. set_property(TARGET testConsoleBufChild PROPERTY C_CLANG_TIDY "")
  915. set_property(TARGET testConsoleBufChild PROPERTY CXX_CLANG_TIDY "")
  916. set_property(TARGET testConsoleBufChild PROPERTY C_INCLUDE_WHAT_YOU_USE "")
  917. set_property(TARGET testConsoleBufChild PROPERTY CXX_INCLUDE_WHAT_YOU_USE "")
  918. set_property(TARGET testConsoleBufChild PROPERTY LABELS ${KWSYS_LABELS_EXE})
  919. target_link_libraries(testConsoleBufChild ${KWSYS_TARGET_LINK})
  920. set(KWSYS_CXX_TESTS ${KWSYS_CXX_TESTS}
  921. testConsoleBuf.cxx
  922. )
  923. if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC" AND
  924. CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "19.0.23506")
  925. set_property(SOURCE testConsoleBuf.cxx testConsoleBufChild.cxx PROPERTY COMPILE_FLAGS /utf-8)
  926. endif()
  927. set_property(SOURCE testConsoleBuf.cxx APPEND PROPERTY COMPILE_DEFINITIONS
  928. KWSYS_ENCODING_DEFAULT_CODEPAGE=${KWSYS_ENCODING_DEFAULT_CODEPAGE})
  929. endif()
  930. if(KWSYS_USE_SystemInformation)
  931. set(KWSYS_CXX_TESTS ${KWSYS_CXX_TESTS} testSystemInformation.cxx)
  932. endif()
  933. if(KWSYS_USE_DynamicLoader)
  934. set(KWSYS_CXX_TESTS ${KWSYS_CXX_TESTS} testDynamicLoader.cxx)
  935. # If kwsys contains the DynamicLoader, need extra library
  936. add_library(${KWSYS_NAMESPACE}TestDynload MODULE testDynload.c)
  937. set_property(TARGET ${KWSYS_NAMESPACE}TestDynload PROPERTY LABELS ${KWSYS_LABELS_LIB})
  938. add_dependencies(${KWSYS_NAMESPACE}TestDynload ${KWSYS_TARGET_INTERFACE})
  939. if (WIN32)
  940. # Windows tests supported flags.
  941. add_library(${KWSYS_NAMESPACE}TestDynloadImpl SHARED testDynloadImpl.c)
  942. set_property(TARGET ${KWSYS_NAMESPACE}TestDynloadImpl PROPERTY LABELS ${KWSYS_LABELS_LIB})
  943. set_property(TARGET ${KWSYS_NAMESPACE}TestDynloadImpl PROPERTY DEFINE_SYMBOL BUILDING_TestDynloadImpl)
  944. set_property(TARGET ${KWSYS_NAMESPACE}TestDynloadImpl PROPERTY RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/dynloaddir")
  945. add_dependencies(${KWSYS_NAMESPACE}TestDynloadImpl ${KWSYS_TARGET_INTERFACE})
  946. add_library(${KWSYS_NAMESPACE}TestDynloadUse MODULE testDynloadUse.c)
  947. set_property(TARGET ${KWSYS_NAMESPACE}TestDynloadUse PROPERTY LABELS ${KWSYS_LABELS_LIB})
  948. set_property(TARGET ${KWSYS_NAMESPACE}TestDynloadUse PROPERTY LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/dynloaddir")
  949. add_dependencies(${KWSYS_NAMESPACE}TestDynloadUse ${KWSYS_TARGET_INTERFACE})
  950. target_link_libraries(${KWSYS_NAMESPACE}TestDynloadUse PRIVATE ${KWSYS_NAMESPACE}TestDynloadImpl)
  951. endif ()
  952. endif()
  953. create_test_sourcelist(
  954. KWSYS_CXX_TEST_SRCS ${KWSYS_NAMESPACE}TestsCxx.cxx
  955. ${KWSYS_CXX_TESTS}
  956. )
  957. add_executable(${KWSYS_NAMESPACE}TestsCxx ${KWSYS_CXX_TEST_SRCS})
  958. set_property(TARGET ${KWSYS_NAMESPACE}TestsCxx PROPERTY C_CLANG_TIDY "")
  959. set_property(TARGET ${KWSYS_NAMESPACE}TestsCxx PROPERTY CXX_CLANG_TIDY "")
  960. set_property(TARGET ${KWSYS_NAMESPACE}TestsCxx PROPERTY C_INCLUDE_WHAT_YOU_USE "")
  961. set_property(TARGET ${KWSYS_NAMESPACE}TestsCxx PROPERTY CXX_INCLUDE_WHAT_YOU_USE "")
  962. set_property(TARGET ${KWSYS_NAMESPACE}TestsCxx PROPERTY LABELS ${KWSYS_LABELS_EXE})
  963. target_link_libraries(${KWSYS_NAMESPACE}TestsCxx ${KWSYS_TARGET_LINK})
  964. set(TEST_SYSTEMTOOLS_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
  965. set(TEST_SYSTEMTOOLS_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}")
  966. configure_file(
  967. ${PROJECT_SOURCE_DIR}/testSystemTools.h.in
  968. ${PROJECT_BINARY_DIR}/testSystemTools.h)
  969. include_directories(${PROJECT_BINARY_DIR})
  970. if(CTEST_TEST_KWSYS)
  971. configure_file("${CMAKE_CURRENT_SOURCE_DIR}/ExtraTest.cmake.in"
  972. "${CMAKE_CURRENT_BINARY_DIR}/ExtraTest.cmake")
  973. set_directory_properties(PROPERTIES TEST_INCLUDE_FILE "${CMAKE_CURRENT_BINARY_DIR}/ExtraTest.cmake")
  974. endif()
  975. set(KWSYS_TEST_ARGS_testCommandLineArguments
  976. --another-bool-variable
  977. --long3=opt
  978. --set-bool-arg1
  979. -SSS ken brad bill andy
  980. --some-bool-variable=true
  981. --some-double-variable12.5
  982. --some-int-variable 14
  983. "--some-string-variable=test string with space"
  984. --some-multi-argument 5 1 8 3 7 1 3 9 7 1
  985. -N 12.5 -SS=andy -N 1.31 -N 22
  986. -SS=bill -BBtrue -SS=brad
  987. -BBtrue
  988. -BBfalse
  989. -SS=ken
  990. -A
  991. -C=test
  992. --long2 hello
  993. )
  994. set(KWSYS_TEST_ARGS_testCommandLineArguments1
  995. --ignored
  996. -n 24
  997. --second-ignored
  998. "-m=test value"
  999. third-ignored
  1000. -p
  1001. some junk at the end
  1002. )
  1003. foreach(testfile ${KWSYS_CXX_TESTS})
  1004. get_filename_component(test "${testfile}" NAME_WE)
  1005. add_test(kwsys.${test} ${EXEC_DIR}/${KWSYS_NAMESPACE}TestsCxx ${test} ${KWSYS_TEST_ARGS_${test}})
  1006. set_property(TEST kwsys.${test} PROPERTY LABELS ${KWSYS_LABELS_TEST})
  1007. endforeach()
  1008. # Process tests.
  1009. add_executable(${KWSYS_NAMESPACE}TestProcess testProcess.c)
  1010. set_property(TARGET ${KWSYS_NAMESPACE}TestProcess PROPERTY LABELS ${KWSYS_LABELS_EXE})
  1011. target_link_libraries(${KWSYS_NAMESPACE}TestProcess ${KWSYS_TARGET_C_LINK})
  1012. #set(KWSYS_TEST_PROCESS_7 7) # uncomment to run timing-sensitive test locally
  1013. foreach(n 1 2 3 4 5 6 ${KWSYS_TEST_PROCESS_7} 9 10)
  1014. add_test(kwsys.testProcess-${n} ${EXEC_DIR}/${KWSYS_NAMESPACE}TestProcess ${n})
  1015. set_property(TEST kwsys.testProcess-${n} PROPERTY LABELS ${KWSYS_LABELS_TEST})
  1016. set_tests_properties(kwsys.testProcess-${n} PROPERTIES TIMEOUT 120)
  1017. endforeach()
  1018. set(testProcess_COMPILE_FLAGS "")
  1019. # Some Apple compilers produce bad optimizations in this source.
  1020. if(APPLE AND CMAKE_C_COMPILER_ID MATCHES "^(GNU|LLVM)$")
  1021. set(testProcess_COMPILE_FLAGS "${testProcess_COMPILE_FLAGS} -O0")
  1022. elseif(CMAKE_C_COMPILER_ID MATCHES "^(XL|XLClang)$")
  1023. # Tell IBM XL not to warn about our test infinite loop
  1024. if(CMAKE_SYSTEM MATCHES "Linux.*ppc64le"
  1025. AND CMAKE_C_COMPILER_VERSION VERSION_LESS "16.1.0"
  1026. AND NOT CMAKE_C_COMPILER_VERSION VERSION_LESS "13.1.1")
  1027. # v13.1.[1-6] on Linux ppc64le is clang based and does not accept
  1028. # the -qsuppress option, so just suppress all warnings.
  1029. set(testProcess_COMPILE_FLAGS "${testProcess_COMPILE_FLAGS} -w")
  1030. else()
  1031. set(testProcess_COMPILE_FLAGS "${testProcess_COMPILE_FLAGS} -qsuppress=1500-010")
  1032. endif()
  1033. endif()
  1034. if(CMAKE_C_FLAGS MATCHES "-fsanitize=")
  1035. set(testProcess_COMPILE_FLAGS "${testProcess_COMPILE_FLAGS} -DCRASH_USING_ABORT")
  1036. endif()
  1037. set_property(SOURCE testProcess.c PROPERTY COMPILE_FLAGS "${testProcess_COMPILE_FLAGS}")
  1038. # Test SharedForward
  1039. configure_file(${PROJECT_SOURCE_DIR}/testSharedForward.c.in
  1040. ${PROJECT_BINARY_DIR}/testSharedForward.c @ONLY IMMEDIATE)
  1041. add_executable(${KWSYS_NAMESPACE}TestSharedForward
  1042. ${PROJECT_BINARY_DIR}/testSharedForward.c)
  1043. set_property(TARGET ${KWSYS_NAMESPACE}TestSharedForward PROPERTY LABELS ${KWSYS_LABELS_EXE})
  1044. add_dependencies(${KWSYS_NAMESPACE}TestSharedForward ${KWSYS_TARGET_C_LINK})
  1045. add_test(kwsys.testSharedForward ${EXEC_DIR}/${KWSYS_NAMESPACE}TestSharedForward 1)
  1046. set_property(TEST kwsys.testSharedForward PROPERTY LABELS ${KWSYS_LABELS_TEST})
  1047. # Configure some test properties.
  1048. if(KWSYS_STANDALONE)
  1049. # We expect test to fail
  1050. set_tests_properties(kwsys.testFail PROPERTIES WILL_FAIL ON)
  1051. get_test_property(kwsys.testFail WILL_FAIL wfv)
  1052. set_tests_properties(kwsys.testFail PROPERTIES MEASUREMENT "Some Key=Some Value")
  1053. message(STATUS "GET_TEST_PROPERTY returned: ${wfv}")
  1054. endif()
  1055. # Set up ctest custom configuration file.
  1056. configure_file(${PROJECT_SOURCE_DIR}/CTestCustom.cmake.in
  1057. ${PROJECT_BINARY_DIR}/CTestCustom.cmake @ONLY)
  1058. # Suppress known consistent failures on buggy systems.
  1059. if(KWSYS_TEST_BOGUS_FAILURES)
  1060. set_tests_properties(${KWSYS_TEST_BOGUS_FAILURES} PROPERTIES WILL_FAIL ON)
  1061. endif()
  1062. endif()
  1063. endif()