CMakeLists.txt 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376
  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. #-----------------------------------------------------------------------------
  63. # If a namespace is not specified, use "kwsys" and enable testing.
  64. # This should be the case only when kwsys is not included inside
  65. # another project and is being tested.
  66. IF(NOT KWSYS_NAMESPACE)
  67. SET(KWSYS_NAMESPACE "kwsys")
  68. SET(KWSYS_STANDALONE 1)
  69. # Enable all components.
  70. SET(KWSYS_USE_Base64 1)
  71. SET(KWSYS_USE_Directory 1)
  72. SET(KWSYS_USE_Process 1)
  73. SET(KWSYS_USE_RegularExpression 1)
  74. SET(KWSYS_USE_SystemTools 1)
  75. ENDIF(NOT KWSYS_NAMESPACE)
  76. #-----------------------------------------------------------------------------
  77. # The project name is that of the specified namespace.
  78. PROJECT(${KWSYS_NAMESPACE})
  79. # Do full dependency headers.
  80. INCLUDE_REGULAR_EXPRESSION("^.*$")
  81. # Work-around for CMake 1.6.7 bug in custom command dependencies when
  82. # there is no executable output path.
  83. IF(NOT EXECUTABLE_OUTPUT_PATH)
  84. SET(EXECUTABLE_OUTPUT_PATH "${PROJECT_BINARY_DIR}" CACHE PATH
  85. "Output directory for executables.")
  86. ENDIF(NOT EXECUTABLE_OUTPUT_PATH)
  87. # Generated source files will need this header.
  88. STRING(COMPARE EQUAL "${PROJECT_SOURCE_DIR}" "${PROJECT_BINARY_DIR}"
  89. KWSYS_IN_SOURCE_BUILD)
  90. IF(NOT KWSYS_IN_SOURCE_BUILD)
  91. CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/kwsysPrivate.h
  92. ${PROJECT_BINARY_DIR}/kwsysPrivate.h COPY_ONLY IMMEDIATE)
  93. ENDIF(NOT KWSYS_IN_SOURCE_BUILD)
  94. #-----------------------------------------------------------------------------
  95. # We require ANSI support from the C compiler. Add any needed flags.
  96. IF(CMAKE_ANSI_CFLAGS)
  97. SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_ANSI_CFLAGS}")
  98. ENDIF(CMAKE_ANSI_CFLAGS)
  99. #-----------------------------------------------------------------------------
  100. # Configure the standard library header wrappers based on compiler's
  101. # capabilities and parent project's request. Enforce 0/1 as only
  102. # possible values for configuration into Configure.hxx.
  103. INCLUDE(${CMAKE_CURRENT_SOURCE_DIR}/kwsysPlatformCxxTests.cmake)
  104. KWSYS_PLATFORM_CXX_TEST(KWSYS_STL_HAVE_STD
  105. "Checking whether STL classes are in std namespace" DIRECT)
  106. IF(KWSYS_IOS_FORCE_OLD)
  107. SET(KWSYS_IOS_USE_ANSI 0)
  108. ELSE(KWSYS_IOS_FORCE_OLD)
  109. KWSYS_PLATFORM_CXX_TEST(KWSYS_IOS_USE_ANSI
  110. "Checking whether ANSI stream headers are available" DIRECT)
  111. ENDIF(KWSYS_IOS_FORCE_OLD)
  112. IF(KWSYS_IOS_USE_ANSI)
  113. KWSYS_PLATFORM_CXX_TEST(KWSYS_IOS_HAVE_STD
  114. "Checking whether ANSI streams are in std namespace" DIRECT)
  115. KWSYS_PLATFORM_CXX_TEST(KWSYS_IOS_USE_SSTREAM
  116. "Checking whether ANSI string stream is available" DIRECT)
  117. ELSE(KWSYS_IOS_USE_ANSI)
  118. SET(KWSYS_IOS_HAVE_STD 0)
  119. SET(KWSYS_IOS_USE_SSTREAM 0)
  120. ENDIF(KWSYS_IOS_USE_ANSI)
  121. IF(KWSYS_IOS_USE_SSTREAM)
  122. SET(KWSYS_IOS_USE_STRSTREAM_H 0)
  123. SET(KWSYS_IOS_USE_STRSTREA_H 0)
  124. ELSE(KWSYS_IOS_USE_SSTREAM)
  125. KWSYS_PLATFORM_CXX_TEST(KWSYS_IOS_USE_STRSTREAM_H
  126. "Checking whether strstream.h is available" DIRECT)
  127. IF(KWSYS_IOS_USE_STRSTREAM_H)
  128. SET(KWSYS_IOS_USE_STRSTREA_H 0)
  129. ELSE(KWSYS_IOS_USE_STRSTREAM_H)
  130. KWSYS_PLATFORM_CXX_TEST(KWSYS_IOS_USE_STRSTREA_H
  131. "Checking whether strstrea.h is available" DIRECT)
  132. ENDIF(KWSYS_IOS_USE_STRSTREAM_H)
  133. ENDIF(KWSYS_IOS_USE_SSTREAM)
  134. IF(KWSYS_NAMESPACE MATCHES "^kwsys$")
  135. SET(KWSYS_NAME_IS_KWSYS 1)
  136. ELSE(KWSYS_NAMESPACE MATCHES "^kwsys$")
  137. SET(KWSYS_NAME_IS_KWSYS 0)
  138. ENDIF(KWSYS_NAMESPACE MATCHES "^kwsys$")
  139. # Choose default shared/static build if not specified.
  140. IF(KWSYS_BUILD_SHARED MATCHES "^KWSYS_BUILD_SHARED$")
  141. SET(KWSYS_BUILD_SHARED ${BUILD_SHARED_LIBS})
  142. ENDIF(KWSYS_BUILD_SHARED MATCHES "^KWSYS_BUILD_SHARED$")
  143. IF(KWSYS_BUILD_SHARED)
  144. SET(KWSYS_BUILD_SHARED 1)
  145. SET(KWSYS_LIBRARY_TYPE SHARED)
  146. ELSE(KWSYS_BUILD_SHARED)
  147. SET(KWSYS_BUILD_SHARED 0)
  148. SET(KWSYS_LIBRARY_TYPE STATIC)
  149. ENDIF(KWSYS_BUILD_SHARED)
  150. #-----------------------------------------------------------------------------
  151. # Choose a directory for the generated headers.
  152. IF(NOT KWSYS_HEADER_ROOT)
  153. SET(KWSYS_HEADER_ROOT "${PROJECT_BINARY_DIR}")
  154. ENDIF(NOT KWSYS_HEADER_ROOT)
  155. SET(KWSYS_HEADER_DIR "${KWSYS_HEADER_ROOT}/${KWSYS_NAMESPACE}")
  156. #-----------------------------------------------------------------------------
  157. # Create STL header wrappers to block warnings in the STL headers and
  158. # give standard names by which they may be included.
  159. FOREACH(header algorithm deque iterator list map numeric queue set stack string
  160. utility vector)
  161. # Configure the header wrapper.
  162. SET(KWSYS_STL_HEADER "${header}")
  163. CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/kwsys_stl.h.in
  164. ${KWSYS_HEADER_DIR}/stl/${header}
  165. @ONLY IMMEDIATE)
  166. # Create an install target for the header wrapper.
  167. IF(KWSYS_HEADER_INSTALL_DIR)
  168. INSTALL_FILES(${KWSYS_HEADER_INSTALL_DIR}/${KWSYS_NAMESPACE}/stl
  169. FILES ${KWSYS_HEADER_DIR}/stl/${header})
  170. ENDIF(KWSYS_HEADER_INSTALL_DIR)
  171. ENDFOREACH(header)
  172. #-----------------------------------------------------------------------------
  173. # Create streams header wrappers to give standard names by which they
  174. # may be included.
  175. FOREACH(header iostream fstream sstream iosfwd)
  176. # Configure the header wrapper.
  177. CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/kwsys_ios_${header}.h.in
  178. ${KWSYS_HEADER_DIR}/ios/${header}
  179. @ONLY IMMEDIATE)
  180. # Create an install target for the header wrapper.
  181. IF(KWSYS_HEADER_INSTALL_DIR)
  182. INSTALL_FILES(${KWSYS_HEADER_INSTALL_DIR}/${KWSYS_NAMESPACE}/ios
  183. FILES ${KWSYS_HEADER_DIR}/ios/${header})
  184. ENDIF(KWSYS_HEADER_INSTALL_DIR)
  185. ENDFOREACH(header)
  186. #-----------------------------------------------------------------------------
  187. # Build a list of classes and headers we need to implement the
  188. # selected components. Initialize with required components.
  189. SET(KWSYS_CLASSES)
  190. SET(KWSYS_H_FILES Configure)
  191. SET(KWSYS_HXX_FILES Configure)
  192. # Enforce component dependencies.
  193. IF(KWSYS_USE_SystemTools)
  194. SET(KWSYS_USE_Directory 1)
  195. ENDIF(KWSYS_USE_SystemTools)
  196. # Add selected C++ classes.
  197. FOREACH(c Directory RegularExpression SystemTools)
  198. IF(KWSYS_USE_${c})
  199. SET(KWSYS_CLASSES ${KWSYS_CLASSES} ${c})
  200. ENDIF(KWSYS_USE_${c})
  201. ENDFOREACH(c)
  202. # Add selected C components.
  203. FOREACH(c Process Base64)
  204. IF(KWSYS_USE_${c})
  205. SET(KWSYS_H_FILES ${KWSYS_H_FILES} ${c})
  206. ENDIF(KWSYS_USE_${c})
  207. ENDFOREACH(c)
  208. #-----------------------------------------------------------------------------
  209. # Build a list of sources for the library based on components that are
  210. # included.
  211. SET(KWSYS_SRCS)
  212. # Add the proper sources for this platform's Process implementation.
  213. IF(KWSYS_USE_Process)
  214. IF(NOT UNIX)
  215. # Use the Windows implementation. We need the encoded forwarding executable.
  216. SET(KWSYS_SRCS ${KWSYS_SRCS} ProcessWin32.c
  217. ${PROJECT_BINARY_DIR}/${KWSYS_NAMESPACE}ProcessFwd9xEnc.c)
  218. SET_SOURCE_FILES_PROPERTIES(
  219. ${PROJECT_BINARY_DIR}/${KWSYS_NAMESPACE}ProcessFwd9xEnc.c
  220. PROPERTIES GENERATED 1)
  221. ELSE(NOT UNIX)
  222. # Use the UNIX implementation.
  223. SET(KWSYS_SRCS ${KWSYS_SRCS} ProcessUNIX.c)
  224. ENDIF(NOT UNIX)
  225. ENDIF(KWSYS_USE_Process)
  226. # Add sources for Base64 encoding.
  227. IF(KWSYS_USE_Base64)
  228. SET(KWSYS_SRCS ${KWSYS_SRCS} Base64.c)
  229. ENDIF(KWSYS_USE_Base64)
  230. # Configure headers of C++ classes and construct the list of sources.
  231. FOREACH(c ${KWSYS_CLASSES})
  232. # Add this source to the list of source files for the library.
  233. SET(KWSYS_SRCS ${KWSYS_SRCS} ${c}.cxx)
  234. # Configure the header for this class.
  235. CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/${c}.hxx.in ${KWSYS_HEADER_DIR}/${c}.hxx
  236. @ONLY IMMEDIATE)
  237. # Create an install target for the header.
  238. IF(KWSYS_HEADER_INSTALL_DIR)
  239. INSTALL_FILES(${KWSYS_HEADER_INSTALL_DIR}/${KWSYS_NAMESPACE}
  240. FILES ${KWSYS_HEADER_DIR}/${c}.hxx)
  241. ENDIF(KWSYS_HEADER_INSTALL_DIR)
  242. ENDFOREACH(c)
  243. # Configure C headers.
  244. FOREACH(h ${KWSYS_H_FILES})
  245. # Configure the header into the given directory.
  246. CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/${h}.h.in ${KWSYS_HEADER_DIR}/${h}.h
  247. @ONLY IMMEDIATE)
  248. # Create an install target for the header.
  249. IF(KWSYS_HEADER_INSTALL_DIR)
  250. INSTALL_FILES(${KWSYS_HEADER_INSTALL_DIR}/${KWSYS_NAMESPACE}
  251. FILES ${KWSYS_HEADER_DIR}/${h}.h)
  252. ENDIF(KWSYS_HEADER_INSTALL_DIR)
  253. ENDFOREACH(h)
  254. # Configure other C++ headers.
  255. FOREACH(h ${KWSYS_HXX_FILES})
  256. # Configure the header into the given directory.
  257. CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/${h}.hxx.in ${KWSYS_HEADER_DIR}/${h}.hxx
  258. @ONLY IMMEDIATE)
  259. # Create an install target for the header.
  260. IF(KWSYS_HEADER_INSTALL_DIR)
  261. INSTALL_FILES(${KWSYS_HEADER_INSTALL_DIR}/${KWSYS_NAMESPACE}
  262. FILES ${KWSYS_HEADER_DIR}/${h}.hxx)
  263. ENDIF(KWSYS_HEADER_INSTALL_DIR)
  264. ENDFOREACH(h)
  265. #-----------------------------------------------------------------------------
  266. # Add the library with the configured name and list of sources.
  267. ADD_LIBRARY(${KWSYS_NAMESPACE} ${KWSYS_LIBRARY_TYPE} ${KWSYS_SRCS})
  268. # Create an install target for the library.
  269. IF(KWSYS_LIBRARY_INSTALL_DIR)
  270. INSTALL_TARGETS(${KWSYS_LIBRARY_INSTALL_DIR} ${KWSYS_NAMESPACE})
  271. ENDIF(KWSYS_LIBRARY_INSTALL_DIR)
  272. # For building kwsys itself, we use a macro defined on the command
  273. # line to configure the namespace in the C and C++ source files.
  274. ADD_DEFINITIONS("-DKWSYS_NAMESPACE=${KWSYS_NAMESPACE}")
  275. #-----------------------------------------------------------------------------
  276. # Process execution on windows needs to build a forwarding executable
  277. # that works around a Win9x bug. We encode the executable into a C
  278. # file and build it into the library. Win9x platforms reproduce the
  279. # executable into a temporary directory when it is needed.
  280. IF(KWSYS_USE_Process)
  281. IF(NOT UNIX)
  282. # Build the forwarding executable itself and a program that will
  283. # encode it into a C file.
  284. ADD_EXECUTABLE(${KWSYS_NAMESPACE}ProcessFwd9x ProcessFwd9x.c)
  285. ADD_EXECUTABLE(${KWSYS_NAMESPACE}EncodeExecutable EncodeExecutable.c)
  286. # Construct the location of the executable to be encoded.
  287. SET(BIN_DIR ${CMAKE_CURRENT_BINARY_DIR})
  288. IF(EXECUTABLE_OUTPUT_PATH)
  289. SET(BIN_DIR ${EXECUTABLE_OUTPUT_PATH})
  290. ENDIF(EXECUTABLE_OUTPUT_PATH)
  291. SET(CFG_INTDIR "/${CMAKE_CFG_INTDIR}")
  292. IF(CMAKE_BUILD_TOOL MATCHES "make")
  293. SET(CFG_INTDIR "")
  294. ENDIF(CMAKE_BUILD_TOOL MATCHES "make")
  295. # Take advantage of a better custom command syntax if possible.
  296. SET(CMD ${BIN_DIR}${CFG_INTDIR}/${KWSYS_NAMESPACE}EncodeExecutable.exe)
  297. SET(FWD ${BIN_DIR}${CFG_INTDIR}/${KWSYS_NAMESPACE}ProcessFwd9x.exe)
  298. IF("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" GREATER 1.6)
  299. ADD_CUSTOM_COMMAND(
  300. OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${KWSYS_NAMESPACE}ProcessFwd9xEnc.c
  301. COMMAND ${CMD}
  302. ARGS ${FWD} ${CMAKE_CURRENT_BINARY_DIR}/${KWSYS_NAMESPACE}ProcessFwd9xEnc.c
  303. ${KWSYS_NAMESPACE} ProcessFwd9x
  304. DEPENDS ${CMD} ${FWD})
  305. ELSE("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" GREATER 1.6)
  306. ADD_CUSTOM_COMMAND(
  307. TARGET ${KWSYS_NAMESPACE}
  308. SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/ProcessFwd9x.c
  309. COMMAND ${CMD}
  310. ARGS ${FWD} ${CMAKE_CURRENT_BINARY_DIR}/${KWSYS_NAMESPACE}ProcessFwd9xEnc.c
  311. ${KWSYS_NAMESPACE} ProcessFwd9x
  312. OUTPUTS ${CMAKE_CURRENT_BINARY_DIR}/${KWSYS_NAMESPACE}ProcessFwd9xEnc.c
  313. DEPENDS ${CMD} ${FWD})
  314. ENDIF("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" GREATER 1.6)
  315. # Make sure build occurs in proper order.
  316. ADD_DEPENDENCIES(${KWSYS_NAMESPACE} ${KWSYS_NAMESPACE}ProcessFwd9x
  317. ${KWSYS_NAMESPACE}EncodeExecutable)
  318. ENDIF(NOT UNIX)
  319. ENDIF(KWSYS_USE_Process)
  320. #-----------------------------------------------------------------------------
  321. # Setup testing if not being built as part of another project.
  322. IF(KWSYS_STANDALONE)
  323. INCLUDE_DIRECTORIES(${KWSYS_HEADER_ROOT})
  324. ADD_EXECUTABLE(testIOS testIOS.cxx)
  325. ADD_EXECUTABLE(testProcess testProcess.c)
  326. ADD_EXECUTABLE(test1 test1.cxx)
  327. TARGET_LINK_LIBRARIES(testIOS ${KWSYS_NAMESPACE})
  328. TARGET_LINK_LIBRARIES(testProcess ${KWSYS_NAMESPACE})
  329. TARGET_LINK_LIBRARIES(test1 ${KWSYS_NAMESPACE})
  330. ENDIF(KWSYS_STANDALONE)