CMakeLists.txt 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663
  1. #=============================================================================
  2. #
  3. # Program: KWSys - Kitware System Library
  4. # Module: $RCSfile$
  5. #
  6. # Copyright (c) Kitware, Inc., Insight Consortium. All rights reserved.
  7. # See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
  8. #
  9. # This software is distributed WITHOUT ANY WARRANTY; without even
  10. # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
  11. # PURPOSE. See the above copyright notices for more information.
  12. #
  13. #=============================================================================
  14. # The Kitware System Library is intended to be included in other
  15. # projects. It is completely configurable in that the library's
  16. # namespace can be configured and the components that are included can
  17. # be selected invididually.
  18. # Typical usage is to import the kwsys directory tree into a
  19. # subdirectory under a parent project and enable the classes that will
  20. # be used. All classes are disabled by default. The CMake listfile
  21. # above this one configures the library as follows:
  22. #
  23. # SET(KWSYS_NAMESPACE foosys)
  24. # SET(KWSYS_USE_Directory 1) # Enable Directory class.
  25. # SUBDIRS(kwsys)
  26. #
  27. # Optional settings are as follows:
  28. #
  29. # KWSYS_HEADER_ROOT = The directory into which to generate the kwsys headers.
  30. # A directory called "${KWSYS_NAMESPACE}" will be
  31. # created under this root directory to hold the files.
  32. #
  33. # Example:
  34. #
  35. # SET(KWSYS_HEADER_ROOT ${PROJECT_BINARY_DIR})
  36. # INCLUDE_DIRECTORIES(${PROJECT_BINARY_DIR})
  37. #
  38. # KWSYS_LIBRARY_INSTALL_DIR = The installation target directories into
  39. # KWSYS_HEADER_INSTALL_DIR which the libraries and headers from
  40. # kwsys should be installed by a "make install".
  41. # The values should be specified relative to
  42. # the installation prefix and start with a '/'.
  43. # Example:
  44. #
  45. # SET(KWSYS_LIBRARY_INSTALL_DIR /lib)
  46. # SET(KWSYS_HEADER_INSTALL_DIR /include)
  47. #
  48. # KWSYS_IOS_FORCE_OLD = Force use of old non-ANSI C++ streams even if
  49. # new streams are available. This may be used
  50. # by projects that cannot configure their
  51. # streams library.
  52. # Example:
  53. #
  54. # SET(KWSYS_IOS_FORCE_OLD 1)
  55. #
  56. # Once configured, kwsys should be used as follows from C or C++ code:
  57. #
  58. # #include <foosys/Directory.hxx>
  59. # ...
  60. # foosys::Directory directory;
  61. #
  62. # NOTE: This library is intended for internal use by Kitware-driven
  63. # projects. In order to keep it simple no attempt will be made to
  64. # maintain backward compatibility when changes are made to KWSys.
  65. # When an incompatible change is made Kitware's projects that use
  66. # KWSys will be fixed, but no notification will necessarily be sent to
  67. # any outside mailing list and no documentation of the change will be
  68. # written.
  69. #-----------------------------------------------------------------------------
  70. # If a namespace is not specified, use "kwsys" and enable testing.
  71. # This should be the case only when kwsys is not included inside
  72. # another project and is being tested.
  73. IF(NOT KWSYS_NAMESPACE)
  74. SET(KWSYS_NAMESPACE "kwsys")
  75. SET(KWSYS_STANDALONE 1)
  76. ENDIF(NOT KWSYS_NAMESPACE)
  77. IF(KWSYS_STANDALONE OR CMake_SOURCE_DIR)
  78. SET(KWSYS_ENABLE_C 1)
  79. # Enable all components.
  80. SET(KWSYS_USE_Base64 1)
  81. SET(KWSYS_USE_Directory 1)
  82. SET(KWSYS_USE_DynamicLoader 1)
  83. SET(KWSYS_USE_Glob 1)
  84. SET(KWSYS_USE_Process 1)
  85. SET(KWSYS_USE_RegularExpression 1)
  86. SET(KWSYS_USE_Registry 1)
  87. SET(KWSYS_USE_SystemTools 1)
  88. SET(KWSYS_USE_CommandLineArguments 1)
  89. SET(KWSYS_USE_FundamentalType 1)
  90. ENDIF(KWSYS_STANDALONE OR CMake_SOURCE_DIR)
  91. #-----------------------------------------------------------------------------
  92. # The project name is that of the specified namespace.
  93. PROJECT(${KWSYS_NAMESPACE})
  94. # Enable testing if building standalone.
  95. IF(KWSYS_STANDALONE)
  96. INCLUDE(Dart)
  97. MARK_AS_ADVANCED(BUILD_TESTING DART_ROOT TCL_TCLSH)
  98. IF(BUILD_TESTING)
  99. ENABLE_TESTING()
  100. ENDIF(BUILD_TESTING)
  101. ENDIF(KWSYS_STANDALONE)
  102. # Do full dependency headers.
  103. INCLUDE_REGULAR_EXPRESSION("^.*$")
  104. # Work-around for CMake 1.6.7 bug in custom command dependencies when
  105. # there is no executable output path.
  106. IF(NOT EXECUTABLE_OUTPUT_PATH)
  107. SET(EXECUTABLE_OUTPUT_PATH "${PROJECT_BINARY_DIR}" CACHE PATH
  108. "Output directory for executables.")
  109. ENDIF(NOT EXECUTABLE_OUTPUT_PATH)
  110. # Generated source files will need this header.
  111. STRING(COMPARE EQUAL "${PROJECT_SOURCE_DIR}" "${PROJECT_BINARY_DIR}"
  112. KWSYS_IN_SOURCE_BUILD)
  113. IF(NOT KWSYS_IN_SOURCE_BUILD)
  114. CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/kwsysPrivate.h
  115. ${PROJECT_BINARY_DIR}/kwsysPrivate.h COPY_ONLY IMMEDIATE)
  116. ENDIF(NOT KWSYS_IN_SOURCE_BUILD)
  117. #-----------------------------------------------------------------------------
  118. # We require ANSI support from the C compiler. Add any needed flags.
  119. IF(CMAKE_ANSI_CFLAGS)
  120. SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_ANSI_CFLAGS}")
  121. ENDIF(CMAKE_ANSI_CFLAGS)
  122. #-----------------------------------------------------------------------------
  123. # Adjust compiler flags for some platforms.
  124. IF(NOT CMAKE_COMPILER_IS_GNUCXX)
  125. IF(CMAKE_SYSTEM MATCHES "OSF1-V.*")
  126. STRING(REGEX MATCH "-timplicit_local"
  127. KWSYS_CXX_FLAGS_HAVE_IMPLICIT_LOCAL "${CMAKE_CXX_FLAGS}")
  128. STRING(REGEX MATCH "-no_implicit_include"
  129. KWSYS_CXX_FLAGS_HAVE_NO_IMPLICIT_INCLUDE "${CMAKE_CXX_FLAGS}")
  130. IF(NOT KWSYS_CXX_FLAGS_HAVE_IMPLICIT_LOCAL)
  131. SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -timplicit_local")
  132. ENDIF(NOT KWSYS_CXX_FLAGS_HAVE_IMPLICIT_LOCAL)
  133. IF(NOT KWSYS_CXX_FLAGS_HAVE_NO_IMPLICIT_INCLUDE)
  134. SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -no_implicit_include")
  135. ENDIF(NOT KWSYS_CXX_FLAGS_HAVE_NO_IMPLICIT_INCLUDE)
  136. ENDIF(CMAKE_SYSTEM MATCHES "OSF1-V.*")
  137. ENDIF(NOT CMAKE_COMPILER_IS_GNUCXX)
  138. #-----------------------------------------------------------------------------
  139. # Configure the standard library header wrappers based on compiler's
  140. # capabilities and parent project's request. Enforce 0/1 as only
  141. # possible values for configuration into Configure.hxx.
  142. INCLUDE(${CMAKE_CURRENT_SOURCE_DIR}/kwsysPlatformCxxTests.cmake)
  143. KWSYS_PLATFORM_CXX_TEST(KWSYS_STL_HAVE_STD
  144. "Checking whether STL classes are in std namespace" DIRECT)
  145. IF(KWSYS_IOS_FORCE_OLD)
  146. SET(KWSYS_IOS_USE_ANSI 0)
  147. ELSE(KWSYS_IOS_FORCE_OLD)
  148. KWSYS_PLATFORM_CXX_TEST(KWSYS_IOS_USE_ANSI
  149. "Checking whether ANSI stream headers are available" DIRECT)
  150. ENDIF(KWSYS_IOS_FORCE_OLD)
  151. IF(KWSYS_IOS_USE_ANSI)
  152. KWSYS_PLATFORM_CXX_TEST(KWSYS_IOS_HAVE_STD
  153. "Checking whether ANSI streams are in std namespace" DIRECT)
  154. KWSYS_PLATFORM_CXX_TEST(KWSYS_IOS_USE_SSTREAM
  155. "Checking whether ANSI string stream is available" DIRECT)
  156. ELSE(KWSYS_IOS_USE_ANSI)
  157. SET(KWSYS_IOS_HAVE_STD 0)
  158. SET(KWSYS_IOS_USE_SSTREAM 0)
  159. ENDIF(KWSYS_IOS_USE_ANSI)
  160. IF(KWSYS_IOS_USE_SSTREAM)
  161. SET(KWSYS_IOS_USE_STRSTREAM_H 0)
  162. SET(KWSYS_IOS_USE_STRSTREA_H 0)
  163. ELSE(KWSYS_IOS_USE_SSTREAM)
  164. KWSYS_PLATFORM_CXX_TEST(KWSYS_IOS_USE_STRSTREAM_H
  165. "Checking whether strstream.h is available" DIRECT)
  166. IF(KWSYS_IOS_USE_STRSTREAM_H)
  167. SET(KWSYS_IOS_USE_STRSTREA_H 0)
  168. ELSE(KWSYS_IOS_USE_STRSTREAM_H)
  169. KWSYS_PLATFORM_CXX_TEST(KWSYS_IOS_USE_STRSTREA_H
  170. "Checking whether strstrea.h is available" DIRECT)
  171. ENDIF(KWSYS_IOS_USE_STRSTREAM_H)
  172. ENDIF(KWSYS_IOS_USE_SSTREAM)
  173. KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_CSTDDEF
  174. "Checking whether header cstddef is available" DIRECT)
  175. SET(KWSYS_PLATFORM_CXX_TEST_DEFINES
  176. -DKWSYS_STL_HAVE_STD=${KWSYS_STL_HAVE_STD})
  177. KWSYS_PLATFORM_CXX_TEST(KWSYS_STL_STRING_HAVE_NEQ_CHAR
  178. "Checking whether stl string has operator!= for char*" DIRECT)
  179. KWSYS_PLATFORM_CXX_TEST(KWSYS_STL_HAS_ITERATOR_TRAITS
  180. "Checking whether stl has iterator_traits" DIRECT)
  181. IF(KWSYS_STL_HAS_ITERATOR_TRAITS)
  182. SET(KWSYS_STL_HAS_ITERATOR_CATEGORY 0)
  183. SET(KWSYS_STL_HAS___ITERATOR_CATEGORY 0)
  184. ELSE(KWSYS_STL_HAS_ITERATOR_TRAITS)
  185. KWSYS_PLATFORM_CXX_TEST(KWSYS_STL_HAS_ITERATOR_CATEGORY
  186. "Checking whether stl has old iterator_category" DIRECT)
  187. IF(KWSYS_STL_HAS_ITERATOR_CATEGORY)
  188. SET(KWSYS_STL_HAS___ITERATOR_CATEGORY 0)
  189. ELSE(KWSYS_STL_HAS_ITERATOR_CATEGORY)
  190. KWSYS_PLATFORM_CXX_TEST(KWSYS_STL_HAS___ITERATOR_CATEGORY
  191. "Checking whether stl has internal __iterator_category" DIRECT)
  192. ENDIF(KWSYS_STL_HAS_ITERATOR_CATEGORY)
  193. ENDIF(KWSYS_STL_HAS_ITERATOR_TRAITS)
  194. KWSYS_PLATFORM_CXX_TEST(KWSYS_STL_HAS_ALLOCATOR_TEMPLATE
  195. "Checking whether stl has standard template allocator" DIRECT)
  196. IF(KWSYS_STL_HAS_ALLOCATOR_TEMPLATE)
  197. SET(KWSYS_STL_HAS_ALLOCATOR_NONTEMPLATE 0)
  198. KWSYS_PLATFORM_CXX_TEST(KWSYS_STL_HAS_ALLOCATOR_REBIND
  199. "Checking for rebind member of stl allocator" DIRECT)
  200. KWSYS_PLATFORM_CXX_TEST(KWSYS_STL_HAS_ALLOCATOR_MAX_SIZE_ARGUMENT
  201. "Checking for non-standard argument to stl allocator<>::max_size" DIRECT)
  202. ELSE(KWSYS_STL_HAS_ALLOCATOR_TEMPLATE)
  203. KWSYS_PLATFORM_CXX_TEST(KWSYS_STL_HAS_ALLOCATOR_NONTEMPLATE
  204. "Checking whether stl has old non-template allocator" DIRECT)
  205. SET(KWSYS_STL_HAS_ALLOCATOR_REBIND 0)
  206. SET(KWSYS_STL_HAS_ALLOCATOR_MAX_SIZE_ARGUMENT 0)
  207. ENDIF(KWSYS_STL_HAS_ALLOCATOR_TEMPLATE)
  208. KWSYS_PLATFORM_CXX_TEST(KWSYS_STL_HAS_ALLOCATOR_OBJECTS
  209. "Checking whether stl containers support allocator objects." DIRECT)
  210. IF(KWSYS_IOS_USE_ANSI)
  211. # ANSI streams always have string operators.
  212. SET(KWSYS_STL_STRING_HAVE_OSTREAM 1)
  213. SET(KWSYS_STL_STRING_HAVE_ISTREAM 1)
  214. ELSE(KWSYS_IOS_USE_ANSI)
  215. # There may not be string operators for old streams.
  216. KWSYS_PLATFORM_CXX_TEST(KWSYS_STL_STRING_HAVE_OSTREAM
  217. "Checking whether stl string has ostream operator<<" DIRECT)
  218. KWSYS_PLATFORM_CXX_TEST(KWSYS_STL_STRING_HAVE_ISTREAM
  219. "Checking whether stl string has istream operator>>" DIRECT)
  220. ENDIF(KWSYS_IOS_USE_ANSI)
  221. SET(KWSYS_PLATFORM_CXX_TEST_DEFINES)
  222. KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_NULL_TEMPLATE_ARGS
  223. "Checking whether \"<>\" is needed for template friends" INVERT)
  224. KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_MEMBER_TEMPLATES
  225. "Checking for member template support" DIRECT)
  226. KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_FULL_SPECIALIZATION
  227. "Checking for standard template specialization syntax" DIRECT)
  228. KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_ARGUMENT_DEPENDENT_LOOKUP
  229. "Checking whether argument dependent lookup is supported" DIRECT)
  230. IF(UNIX)
  231. KWSYS_PLATFORM_CXX_TEST(KWSYS_STAT_HAS_ST_MTIM
  232. "Checking whether struct stat has st_mtim member" DIRECT)
  233. ENDIF(UNIX)
  234. IF(KWSYS_USE_FundamentalType)
  235. # Determine type sizes.
  236. INCLUDE(CheckTypeSize)
  237. CHECK_TYPE_SIZE("char" KWSYS_SIZEOF_CHAR)
  238. CHECK_TYPE_SIZE("short" KWSYS_SIZEOF_SHORT)
  239. CHECK_TYPE_SIZE("int" KWSYS_SIZEOF_INT)
  240. CHECK_TYPE_SIZE("long" KWSYS_SIZEOF_LONG)
  241. CHECK_TYPE_SIZE("long long" KWSYS_SIZEOF_LONG_LONG)
  242. CHECK_TYPE_SIZE("__int64" KWSYS_SIZEOF___INT64)
  243. IF(NOT KWSYS_SIZEOF_LONG_LONG)
  244. SET(KWSYS_SIZEOF_LONG_LONG 0)
  245. ENDIF(NOT KWSYS_SIZEOF_LONG_LONG)
  246. IF(NOT KWSYS_SIZEOF___INT64)
  247. SET(KWSYS_SIZEOF___INT64 0)
  248. ENDIF(NOT KWSYS_SIZEOF___INT64)
  249. # Check uniqueness of types.
  250. IF(KWSYS_SIZEOF___INT64)
  251. KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_SAME_LONG_AND___INT64
  252. "Checking whether long and __int64 are the same type" DIRECT)
  253. IF(KWSYS_SIZEOF_LONG_LONG)
  254. KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_SAME_LONG_LONG_AND___INT64
  255. "Checking whether long long and __int64 are the same type" DIRECT)
  256. ENDIF(KWSYS_SIZEOF_LONG_LONG)
  257. ENDIF(KWSYS_SIZEOF___INT64)
  258. # Enable the "long long" type if it is available. It is standard in
  259. # C99 and C++03 but not in earlier standards.
  260. IF(KWSYS_SIZEOF_LONG_LONG)
  261. SET(KWSYS_USE_LONG_LONG 1)
  262. ELSE(KWSYS_SIZEOF_LONG_LONG)
  263. SET(KWSYS_USE_LONG_LONG 0)
  264. ENDIF(KWSYS_SIZEOF_LONG_LONG)
  265. # Enable the "__int64" type if it is available and unique. It is not
  266. # standard.
  267. SET(KWSYS_USE___INT64 0)
  268. IF(KWSYS_SIZEOF___INT64)
  269. IF(NOT KWSYS_CXX_SAME_LONG_AND___INT64)
  270. IF(NOT KWSYS_CXX_SAME_LONG_LONG_AND___INT64)
  271. SET(KWSYS_USE___INT64 1)
  272. ENDIF(NOT KWSYS_CXX_SAME_LONG_LONG_AND___INT64)
  273. ENDIF(NOT KWSYS_CXX_SAME_LONG_AND___INT64)
  274. ENDIF(KWSYS_SIZEOF___INT64)
  275. IF(KWSYS_USE___INT64)
  276. KWSYS_PLATFORM_CXX_TEST(KWSYS_CAN_CONVERT_UI64_TO_DOUBLE
  277. "Checking whether unsigned __int64 can convert to double" DIRECT)
  278. ELSE(KWSYS_USE___INT64)
  279. SET(KWSYS_CAN_CONVERT_UI64_TO_DOUBLE 1)
  280. ENDIF(KWSYS_USE___INT64)
  281. # Check signedness of "char" type.
  282. IF("KWSYS_CHAR_IS_SIGNED" MATCHES "^KWSYS_CHAR_IS_SIGNED$")
  283. MESSAGE(STATUS "Checking signedness of char")
  284. TRY_RUN(KWSYS_CHAR_IS_SIGNED KWSYS_CHAR_IS_SIGNED_COMPILED
  285. ${CMAKE_CURRENT_BINARY_DIR}
  286. ${CMAKE_CURRENT_SOURCE_DIR}/kwsysPlatformCxxTests.cxx
  287. COMPILE_DEFINITIONS -DTEST_KWSYS_CHAR_IS_SIGNED)
  288. IF(KWSYS_CHAR_IS_SIGNED_COMPILED)
  289. IF(KWSYS_CHAR_IS_SIGNED)
  290. MESSAGE(STATUS "Checking signedness of char -- signed")
  291. SET(KWSYS_CHAR_IS_SIGNED 1 CACHE INTERNAL "Whether char is signed.")
  292. ELSE(KWSYS_CHAR_IS_SIGNED)
  293. MESSAGE(STATUS "Checking signedness of char -- unsigned")
  294. SET(KWSYS_CHAR_IS_SIGNED 0 CACHE INTERNAL "Whether char is signed.")
  295. ENDIF(KWSYS_CHAR_IS_SIGNED)
  296. ELSE(KWSYS_CHAR_IS_SIGNED_COMPILED)
  297. MESSAGE(FATAL_ERROR "Checking signedness of char -- failed")
  298. ENDIF(KWSYS_CHAR_IS_SIGNED_COMPILED)
  299. ENDIF("KWSYS_CHAR_IS_SIGNED" MATCHES "^KWSYS_CHAR_IS_SIGNED$")
  300. ENDIF(KWSYS_USE_FundamentalType)
  301. IF(KWSYS_NAMESPACE MATCHES "^kwsys$")
  302. SET(KWSYS_NAME_IS_KWSYS 1)
  303. ELSE(KWSYS_NAMESPACE MATCHES "^kwsys$")
  304. SET(KWSYS_NAME_IS_KWSYS 0)
  305. ENDIF(KWSYS_NAMESPACE MATCHES "^kwsys$")
  306. # Choose default shared/static build if not specified.
  307. IF(KWSYS_BUILD_SHARED MATCHES "^KWSYS_BUILD_SHARED$")
  308. SET(KWSYS_BUILD_SHARED ${BUILD_SHARED_LIBS})
  309. ENDIF(KWSYS_BUILD_SHARED MATCHES "^KWSYS_BUILD_SHARED$")
  310. IF(KWSYS_BUILD_SHARED)
  311. SET(KWSYS_BUILD_SHARED 1)
  312. SET(KWSYS_LIBRARY_TYPE SHARED)
  313. ELSE(KWSYS_BUILD_SHARED)
  314. SET(KWSYS_BUILD_SHARED 0)
  315. SET(KWSYS_LIBRARY_TYPE STATIC)
  316. ENDIF(KWSYS_BUILD_SHARED)
  317. #-----------------------------------------------------------------------------
  318. # Choose a directory for the generated headers.
  319. IF(NOT KWSYS_HEADER_ROOT)
  320. SET(KWSYS_HEADER_ROOT "${PROJECT_BINARY_DIR}")
  321. ENDIF(NOT KWSYS_HEADER_ROOT)
  322. SET(KWSYS_HEADER_DIR "${KWSYS_HEADER_ROOT}/${KWSYS_NAMESPACE}")
  323. INCLUDE_DIRECTORIES(${KWSYS_HEADER_ROOT})
  324. #-----------------------------------------------------------------------------
  325. # Create STL header wrappers to block warnings in the STL headers and
  326. # give standard names by which they may be included.
  327. SET(KWSYS_STL_HEADER_EXTRA_string 1)
  328. FOREACH(header algorithm deque iterator list map numeric queue set stack string
  329. utility vector memory functional)
  330. # Configure the header wrapper.
  331. SET(KWSYS_STL_HEADER "${header}")
  332. IF(KWSYS_STL_HEADER_EXTRA_${header})
  333. SET(KWSYS_STL_HEADER_EXTRA
  334. "#define ${KWSYS_NAMESPACE}_stl_${header}_including_hxx\n# include <${KWSYS_NAMESPACE}/stl/${header}.hxx>\n#undef ${KWSYS_NAMESPACE}_stl_${header}_including_hxx\n")
  335. CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/kwsys_stl_${header}.hxx.in
  336. ${KWSYS_HEADER_DIR}/stl/${header}.hxx
  337. @ONLY IMMEDIATE)
  338. IF(KWSYS_HEADER_INSTALL_DIR)
  339. INSTALL_FILES(${KWSYS_HEADER_INSTALL_DIR}/${KWSYS_NAMESPACE}/stl
  340. FILES ${KWSYS_HEADER_DIR}/stl/${header}.hxx)
  341. ENDIF(KWSYS_HEADER_INSTALL_DIR)
  342. ELSE(KWSYS_STL_HEADER_EXTRA_${header})
  343. SET(KWSYS_STL_HEADER_EXTRA "")
  344. ENDIF(KWSYS_STL_HEADER_EXTRA_${header})
  345. CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/kwsys_stl.hxx.in
  346. ${KWSYS_HEADER_DIR}/stl/${header}
  347. @ONLY IMMEDIATE)
  348. # Create an install target for the header wrapper.
  349. IF(KWSYS_HEADER_INSTALL_DIR)
  350. INSTALL_FILES(${KWSYS_HEADER_INSTALL_DIR}/${KWSYS_NAMESPACE}/stl
  351. FILES ${KWSYS_HEADER_DIR}/stl/${header})
  352. ENDIF(KWSYS_HEADER_INSTALL_DIR)
  353. ENDFOREACH(header)
  354. # Provide cstddef header.
  355. CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/kwsys_cstddef.hxx.in
  356. ${KWSYS_HEADER_DIR}/cstddef
  357. @ONLY IMMEDIATE)
  358. #-----------------------------------------------------------------------------
  359. # Create streams header wrappers to give standard names by which they
  360. # may be included.
  361. FOREACH(header iostream fstream sstream iosfwd)
  362. # Configure the header wrapper.
  363. CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/kwsys_ios_${header}.h.in
  364. ${KWSYS_HEADER_DIR}/ios/${header}
  365. @ONLY IMMEDIATE)
  366. # Create an install target for the header wrapper.
  367. IF(KWSYS_HEADER_INSTALL_DIR)
  368. INSTALL_FILES(${KWSYS_HEADER_INSTALL_DIR}/${KWSYS_NAMESPACE}/ios
  369. FILES ${KWSYS_HEADER_DIR}/ios/${header})
  370. ENDIF(KWSYS_HEADER_INSTALL_DIR)
  371. ENDFOREACH(header)
  372. #-----------------------------------------------------------------------------
  373. # Build a list of classes and headers we need to implement the
  374. # selected components. Initialize with required components.
  375. SET(KWSYS_CLASSES)
  376. SET(KWSYS_H_FILES Configure SharedForward)
  377. SET(KWSYS_HXX_FILES Configure String hashtable hash_fun hash_map hash_set)
  378. # Enforce component dependencies.
  379. IF(KWSYS_USE_SystemTools)
  380. SET(KWSYS_USE_Directory 1)
  381. ENDIF(KWSYS_USE_SystemTools)
  382. IF(KWSYS_USE_Glob)
  383. SET(KWSYS_USE_Directory 1)
  384. SET(KWSYS_USE_SystemTools 1)
  385. SET(KWSYS_USE_RegularExpression 1)
  386. ENDIF(KWSYS_USE_Glob)
  387. # Add selected C++ classes.
  388. SET(cppclasses Directory DynamicLoader Glob RegularExpression SystemTools CommandLineArguments Registry)
  389. FOREACH(c ${cppclasses})
  390. IF(KWSYS_USE_${c})
  391. SET(KWSYS_CLASSES ${KWSYS_CLASSES} ${c})
  392. ENDIF(KWSYS_USE_${c})
  393. ENDFOREACH(c)
  394. # Add selected C components.
  395. FOREACH(c Process Base64 FundamentalType)
  396. IF(KWSYS_USE_${c})
  397. SET(KWSYS_H_FILES ${KWSYS_H_FILES} ${c})
  398. ENDIF(KWSYS_USE_${c})
  399. ENDFOREACH(c)
  400. #-----------------------------------------------------------------------------
  401. # Build a list of sources for the library based on components that are
  402. # included.
  403. SET(KWSYS_C_SRCS)
  404. SET(KWSYS_CXX_SRCS)
  405. # Add the proper sources for this platform's Process implementation.
  406. IF(KWSYS_USE_Process)
  407. IF(NOT UNIX)
  408. # Use the Windows implementation. We need the encoded forwarding executable.
  409. SET(KWSYS_C_SRCS ${KWSYS_C_SRCS} ProcessWin32.c
  410. ${PROJECT_BINARY_DIR}/${KWSYS_NAMESPACE}ProcessFwd9xEnc.c)
  411. SET_SOURCE_FILES_PROPERTIES(
  412. ${PROJECT_BINARY_DIR}/${KWSYS_NAMESPACE}ProcessFwd9xEnc.c
  413. PROPERTIES GENERATED 1)
  414. ELSE(NOT UNIX)
  415. # Use the UNIX implementation.
  416. SET(KWSYS_C_SRCS ${KWSYS_C_SRCS} ProcessUNIX.c)
  417. ENDIF(NOT UNIX)
  418. ENDIF(KWSYS_USE_Process)
  419. # Add sources for Base64 encoding.
  420. IF(KWSYS_USE_Base64)
  421. SET(KWSYS_C_SRCS ${KWSYS_C_SRCS} Base64.c)
  422. ENDIF(KWSYS_USE_Base64)
  423. # Configure headers of C++ classes and construct the list of sources.
  424. FOREACH(c ${KWSYS_CLASSES})
  425. # Add this source to the list of source files for the library.
  426. SET(KWSYS_CXX_SRCS ${KWSYS_CXX_SRCS} ${c}.cxx)
  427. # Configure the header for this class.
  428. CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/${c}.hxx.in ${KWSYS_HEADER_DIR}/${c}.hxx
  429. @ONLY IMMEDIATE)
  430. # Create an install target for the header.
  431. IF(KWSYS_HEADER_INSTALL_DIR)
  432. INSTALL_FILES(${KWSYS_HEADER_INSTALL_DIR}/${KWSYS_NAMESPACE}
  433. FILES ${KWSYS_HEADER_DIR}/${c}.hxx)
  434. ENDIF(KWSYS_HEADER_INSTALL_DIR)
  435. ENDFOREACH(c)
  436. # Configure C headers.
  437. FOREACH(h ${KWSYS_H_FILES})
  438. # Configure the header into the given directory.
  439. CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/${h}.h.in ${KWSYS_HEADER_DIR}/${h}.h
  440. @ONLY IMMEDIATE)
  441. # Create an install target for the header.
  442. IF(KWSYS_HEADER_INSTALL_DIR)
  443. INSTALL_FILES(${KWSYS_HEADER_INSTALL_DIR}/${KWSYS_NAMESPACE}
  444. FILES ${KWSYS_HEADER_DIR}/${h}.h)
  445. ENDIF(KWSYS_HEADER_INSTALL_DIR)
  446. ENDFOREACH(h)
  447. # Configure other C++ headers.
  448. FOREACH(h ${KWSYS_HXX_FILES})
  449. # Configure the header into the given directory.
  450. CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/${h}.hxx.in ${KWSYS_HEADER_DIR}/${h}.hxx
  451. @ONLY IMMEDIATE)
  452. # Create an install target for the header.
  453. IF(KWSYS_HEADER_INSTALL_DIR)
  454. INSTALL_FILES(${KWSYS_HEADER_INSTALL_DIR}/${KWSYS_NAMESPACE}
  455. FILES ${KWSYS_HEADER_DIR}/${h}.hxx)
  456. ENDIF(KWSYS_HEADER_INSTALL_DIR)
  457. ENDFOREACH(h)
  458. #-----------------------------------------------------------------------------
  459. # Add the library with the configured name and list of sources.
  460. IF(KWSYS_C_SRCS OR KWSYS_CXX_SRCS)
  461. ADD_LIBRARY(${KWSYS_NAMESPACE} ${KWSYS_LIBRARY_TYPE}
  462. ${KWSYS_C_SRCS} ${KWSYS_CXX_SRCS})
  463. # Apply user-defined target properties to the library.
  464. IF(KWSYS_PROPERTIES_CXX)
  465. SET_TARGET_PROPERTIES(${KWSYS_NAMESPACE} PROPERTIES
  466. ${KWSYS_PROPERTIES_CXX}
  467. )
  468. ENDIF(KWSYS_PROPERTIES_CXX)
  469. # Create an install target for the library.
  470. IF(KWSYS_LIBRARY_INSTALL_DIR)
  471. INSTALL_TARGETS(${KWSYS_LIBRARY_INSTALL_DIR} ${KWSYS_NAMESPACE})
  472. ENDIF(KWSYS_LIBRARY_INSTALL_DIR)
  473. ENDIF(KWSYS_C_SRCS OR KWSYS_CXX_SRCS)
  474. # Add a C-only library if requested.
  475. IF(KWSYS_ENABLE_C AND KWSYS_C_SRCS)
  476. ADD_LIBRARY(${KWSYS_NAMESPACE}_c ${KWSYS_LIBRARY_TYPE} ${KWSYS_C_SRCS})
  477. # Apply user-defined target properties to the library.
  478. IF(KWSYS_PROPERTIES_C)
  479. SET_TARGET_PROPERTIES(${KWSYS_NAMESPACE} PROPERTIES
  480. ${KWSYS_PROPERTIES_C}
  481. )
  482. ENDIF(KWSYS_PROPERTIES_C)
  483. # Create an install target for the library.
  484. IF(KWSYS_LIBRARY_INSTALL_DIR)
  485. INSTALL_TARGETS(${KWSYS_LIBRARY_INSTALL_DIR} ${KWSYS_NAMESPACE}_c)
  486. ENDIF(KWSYS_LIBRARY_INSTALL_DIR)
  487. ENDIF(KWSYS_ENABLE_C AND KWSYS_C_SRCS)
  488. # For building kwsys itself, we use a macro defined on the command
  489. # line to configure the namespace in the C and C++ source files.
  490. ADD_DEFINITIONS("-DKWSYS_NAMESPACE=${KWSYS_NAMESPACE}")
  491. #-----------------------------------------------------------------------------
  492. # Process execution on windows needs to build a forwarding executable
  493. # that works around a Win9x bug. We encode the executable into a C
  494. # file and build it into the library. Win9x platforms reproduce the
  495. # executable into a temporary directory when it is needed.
  496. IF(KWSYS_USE_Process)
  497. IF(NOT UNIX)
  498. # Build the forwarding executable itself and a program that will
  499. # encode it into a C file.
  500. ADD_EXECUTABLE(${KWSYS_NAMESPACE}ProcessFwd9x ProcessFwd9x.c)
  501. ADD_EXECUTABLE(${KWSYS_NAMESPACE}EncodeExecutable EncodeExecutable.c)
  502. # Construct the location of the executable to be encoded.
  503. SET(BIN_DIR ${CMAKE_CURRENT_BINARY_DIR})
  504. IF(EXECUTABLE_OUTPUT_PATH)
  505. SET(BIN_DIR ${EXECUTABLE_OUTPUT_PATH})
  506. ENDIF(EXECUTABLE_OUTPUT_PATH)
  507. SET(CFG_INTDIR "/${CMAKE_CFG_INTDIR}")
  508. IF(CMAKE_BUILD_TOOL MATCHES "make")
  509. SET(CFG_INTDIR "")
  510. ENDIF(CMAKE_BUILD_TOOL MATCHES "make")
  511. # Take advantage of a better custom command syntax if possible.
  512. SET(CMD ${BIN_DIR}${CFG_INTDIR}/${KWSYS_NAMESPACE}EncodeExecutable.exe)
  513. SET(FWD ${BIN_DIR}${CFG_INTDIR}/${KWSYS_NAMESPACE}ProcessFwd9x.exe)
  514. IF("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" GREATER 1.6)
  515. ADD_CUSTOM_COMMAND(
  516. OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${KWSYS_NAMESPACE}ProcessFwd9xEnc.c
  517. COMMAND ${CMD}
  518. ARGS ${FWD} ${CMAKE_CURRENT_BINARY_DIR}/${KWSYS_NAMESPACE}ProcessFwd9xEnc.c
  519. ${KWSYS_NAMESPACE} ProcessFwd9x
  520. DEPENDS ${CMD} ${FWD})
  521. ELSE("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" GREATER 1.6)
  522. ADD_CUSTOM_COMMAND(
  523. TARGET ${KWSYS_NAMESPACE}
  524. SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/ProcessFwd9x.c
  525. COMMAND ${CMD}
  526. ARGS ${FWD} ${CMAKE_CURRENT_BINARY_DIR}/${KWSYS_NAMESPACE}ProcessFwd9xEnc.c
  527. ${KWSYS_NAMESPACE} ProcessFwd9x
  528. OUTPUTS ${CMAKE_CURRENT_BINARY_DIR}/${KWSYS_NAMESPACE}ProcessFwd9xEnc.c
  529. DEPENDS ${CMD} ${FWD})
  530. ENDIF("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" GREATER 1.6)
  531. # Make sure build occurs in proper order.
  532. ADD_DEPENDENCIES(${KWSYS_NAMESPACE} ${KWSYS_NAMESPACE}ProcessFwd9x
  533. ${KWSYS_NAMESPACE}EncodeExecutable)
  534. ENDIF(NOT UNIX)
  535. ENDIF(KWSYS_USE_Process)
  536. #-----------------------------------------------------------------------------
  537. # Setup testing if not being built as part of another project.
  538. IF(KWSYS_STANDALONE OR CMake_SOURCE_DIR)
  539. IF(BUILD_TESTING)
  540. # C++ tests
  541. FOREACH(test
  542. testSystemTools
  543. testIOS
  544. testHashSTL
  545. testCommandLineArguments
  546. testRegistry
  547. )
  548. ADD_EXECUTABLE(${test} ${test}.cxx)
  549. TARGET_LINK_LIBRARIES(${test} ${KWSYS_NAMESPACE})
  550. ENDFOREACH(test)
  551. # C tests
  552. FOREACH(test
  553. testProcess
  554. testFail
  555. )
  556. ADD_EXECUTABLE(${test} ${test}.c)
  557. TARGET_LINK_LIBRARIES(${test} ${KWSYS_NAMESPACE}_c)
  558. ENDFOREACH(test)
  559. SET(EXEC_DIR "${CMAKE_CURRENT_BINARY_DIR}")
  560. IF(EXECUTABLE_OUTPUT_PATH)
  561. SET(EXEC_DIR "${EXECUTABLE_OUTPUT_PATH}")
  562. ENDIF(EXECUTABLE_OUTPUT_PATH)
  563. SET(TEST_SYSTEMTOOLS_BIN_FILE
  564. "${CMAKE_CURRENT_SOURCE_DIR}/testSystemTools.bin")
  565. SET(TEST_SYSTEMTOOLS_SRC_FILE
  566. "${CMAKE_CURRENT_SOURCE_DIR}/testSystemTools.cxx")
  567. CONFIGURE_FILE(
  568. ${PROJECT_SOURCE_DIR}/testSystemTools.h.in
  569. ${PROJECT_BINARY_DIR}/testSystemTools.h)
  570. INCLUDE_DIRECTORIES(${PROJECT_BINARY_DIR})
  571. IF(CTEST_TEST_KWSYS)
  572. CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/ExtraTest.cmake.in"
  573. "${CMAKE_CURRENT_BINARY_DIR}/ExtraTest.cmake")
  574. SET_DIRECTORY_PROPERTIES(PROPERTIES TEST_INCLUDE_FILE "${CMAKE_CURRENT_BINARY_DIR}/ExtraTest.cmake")
  575. ENDIF(CTEST_TEST_KWSYS)
  576. ADD_TEST(kwsys.testSystemTools ${EXEC_DIR}/testSystemTools)
  577. ADD_TEST(kwsys.testProcess-1 ${EXEC_DIR}/testProcess 1)
  578. ADD_TEST(kwsys.testProcess-2 ${EXEC_DIR}/testProcess 2)
  579. ADD_TEST(kwsys.testProcess-3 ${EXEC_DIR}/testProcess 3)
  580. ADD_TEST(kwsys.testProcess-4 ${EXEC_DIR}/testProcess 4)
  581. ADD_TEST(kwsys.testProcess-5 ${EXEC_DIR}/testProcess 5)
  582. ADD_TEST(kwsys.testProcess-6 ${EXEC_DIR}/testProcess 6)
  583. ADD_TEST(kwsys.testProcess-7 ${EXEC_DIR}/testProcess 7)
  584. ADD_TEST(kwsys.testHashSTL ${EXEC_DIR}/testHashSTL)
  585. ADD_TEST(kwsys.testRegistry ${EXEC_DIR}/testRegistry)
  586. IF(COMMAND SET_TESTS_PROPERTIES AND COMMAND GET_TEST_PROPERTY AND KWSYS_STANDALONE)
  587. ADD_TEST(kwsys.testFail ${EXEC_DIR}/testFail)
  588. SET_TESTS_PROPERTIES(kwsys.testFail PROPERTIES WILL_FAIL ON)
  589. GET_TEST_PROPERTY(kwsys.testFail WILL_FAIL wfv)
  590. SET_TESTS_PROPERTIES(kwsys.testRegistry PROPERTIES FAIL_REGULAR_EXPRESSION "ERROR;FAIL;Test failed")
  591. SET_TESTS_PROPERTIES(kwsys.testRegistry PROPERTIES PASS_REGULAR_EXPRESSION "Test passed")
  592. MESSAGE(STATUS "GET_TEST_PROPERTY returned: ${wfv}")
  593. ENDIF(COMMAND SET_TESTS_PROPERTIES AND COMMAND GET_TEST_PROPERTY AND KWSYS_STANDALONE)
  594. ENDIF(BUILD_TESTING)
  595. ENDIF(KWSYS_STANDALONE OR CMake_SOURCE_DIR)