CMakeLists.txt 25 KB

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