CMakeLists.txt 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  1. CMAKE_MINIMUM_REQUIRED(VERSION 2.4)
  2. IF(COMMAND CMAKE_POLICY)
  3. CMAKE_POLICY(SET CMP0003 NEW)
  4. ENDIF(COMMAND CMAKE_POLICY)
  5. PROJECT(LIBTAR C)
  6. INCLUDE_REGULAR_EXPRESSION("^.*$")
  7. # We need ansi c-flags, especially on HP
  8. SET(CMAKE_C_FLAGS "${CMAKE_ANSI_CFLAGS} ${CMAKE_C_FLAGS}")
  9. SET(CMAKE_REQUIRED_FLAGS ${CMAKE_ANSI_CFLAGS})
  10. # Disable warnings on Borland to avoid changing 3rd party code.
  11. IF(BORLAND)
  12. SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w-")
  13. ENDIF(BORLAND)
  14. # If we are on AIX, do the _ALL_SOURCE magic
  15. IF(${CMAKE_SYSTEM_NAME} MATCHES AIX)
  16. SET(_ALL_SOURCE 1)
  17. ENDIF(${CMAKE_SYSTEM_NAME} MATCHES AIX)
  18. # Include all the necessary files for macros
  19. #SET(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMake")
  20. # Include all the necessary files for macros
  21. INCLUDE (CheckIncludeFiles)
  22. INCLUDE (CheckFunctionExists)
  23. INCLUDE (CheckTypeSize)
  24. INCLUDE (CheckSymbolExists)
  25. INCLUDE (TestBigEndian)
  26. MACRO(MANGLE_VARIABLE_NAME str var prefix)
  27. STRING(TOUPPER "${str}" mangle_variable_name_var)
  28. STRING(REGEX REPLACE "[/. ]" "_" mangle_variable_name_var "${mangle_variable_name_var}")
  29. SET(${var} "${prefix}${mangle_variable_name_var}")
  30. ENDMACRO(MANGLE_VARIABLE_NAME str var)
  31. # Check if header file exists and add it to the list.
  32. MACRO(CHECK_INCLUDE_FILE_CONCAT FILE)
  33. MANGLE_VARIABLE_NAME("${FILE}" "CHECK_INCLUDE_FILE_CONCAT_VAR" "HAVE_")
  34. CHECK_INCLUDE_FILES("${HEADER_INCLUDES};${FILE}" ${CHECK_INCLUDE_FILE_CONCAT_VAR})
  35. IF(${CHECK_INCLUDE_FILE_CONCAT_VAR})
  36. SET(HEADER_INCLUDES ${HEADER_INCLUDES} ${FILE})
  37. ENDIF(${CHECK_INCLUDE_FILE_CONCAT_VAR})
  38. ENDMACRO(CHECK_INCLUDE_FILE_CONCAT)
  39. MACRO(CHECK_FUNCTION_EXISTS_EX FUNC)
  40. MANGLE_VARIABLE_NAME("${FUNC}" "CHECK_FUNCTION_EXISTS_EX_VAR" "HAVE_")
  41. CHECK_FUNCTION_EXISTS("${FUNC}" "${CHECK_FUNCTION_EXISTS_EX_VAR}")
  42. ENDMACRO(CHECK_FUNCTION_EXISTS_EX)
  43. MACRO(CHECK_SYMBOL_EXISTS_EX SYM)
  44. MANGLE_VARIABLE_NAME("${SYM}" "CHECK_SYMBOL_EXISTS_EX_VAR" "HAVE_")
  45. CHECK_SYMBOL_EXISTS("${SYM}" "${HEADER_INCLUDES}" "${CHECK_SYMBOL_EXISTS_EX_VAR}")
  46. ENDMACRO(CHECK_SYMBOL_EXISTS_EX)
  47. #MACRO(CHECK_TYPE_SIZE_EX type defualt_size)
  48. # MANGLE_VARIABLE_NAME("${type}" "check_type_size_var" "")
  49. # CHECK_TYPE_SIZE("${type}" "SIZEOF_${check_type_size_var}")
  50. # IF(HAVE_${check_type_size_var})
  51. # SET("HAVE_${check_type_size_var}" 1)
  52. # ELSE(HAVE_${check_type_size_var})
  53. # ENDIF(HAVE_${check_type_size_var})
  54. #ENDMACRO(CHECK_TYPE_SIZE_EX)
  55. INCLUDE_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}")
  56. #check for stdc headers
  57. CHECK_INCLUDE_FILES("stdlib.h;stdarg.h;string.h;float.h" STDC_HEADERS)
  58. #check for other headers used by the program
  59. FOREACH(file
  60. "ctype.h"
  61. "fnmatch.h"
  62. "inttypes.h"
  63. "io.h"
  64. "libgen.h"
  65. "memory.h"
  66. "sys/mkdev.h"
  67. "stdint.h"
  68. "stdlib.h"
  69. "stdio.h"
  70. "string.h"
  71. "strings.h"
  72. "sys/param.h"
  73. "sys/types.h"
  74. "sys/stat.h"
  75. "unistd.h"
  76. "glob.h"
  77. "dirent.h"
  78. "sys/sysmacros.h"
  79. )
  80. CHECK_INCLUDE_FILE_CONCAT("${file}")
  81. ENDFOREACH(file)
  82. #check for the functions used by the program
  83. FOREACH(func
  84. basename
  85. dirname
  86. fnmatch
  87. lchown
  88. snprintf
  89. strlcpy
  90. strmode
  91. strsep
  92. strdup
  93. strftime
  94. vsnprintf
  95. glob
  96. major
  97. minor
  98. makedev
  99. )
  100. CHECK_SYMBOL_EXISTS_EX("${func}")
  101. ENDFOREACH(func)
  102. # on Syllable lchown() is there, but always returns "Not implemented"
  103. IF("${CMAKE_SYSTEM_NAME}" MATCHES syllable)
  104. SET(HAVE_LCHOWN 0)
  105. ENDIF("${CMAKE_SYSTEM_NAME}" MATCHES syllable)
  106. CHECK_TYPE_SIZE("dev_t" SIZEOF_DEV_T)
  107. IF(HAVE_SIZEOF_DEV_T)
  108. SET (HAVE_DEV_T 1)
  109. ELSE(HAVE_SIZEOF_DEV_T)
  110. SET (HAVE_DEV_T 0)
  111. SET (dev_t "unsigned long")
  112. ENDIF(HAVE_SIZEOF_DEV_T)
  113. CHECK_TYPE_SIZE("major_t" SIZEOF_MAJOR_T)
  114. IF(HAVE_SIZEOF_MAJOR_T)
  115. SET (HAVE_MAJOR_T 1)
  116. ELSE(HAVE_SIZEOF_MAJOR_T)
  117. SET (HAVE_MAJOR_T 0)
  118. SET (major_t "unsigned int")
  119. ENDIF(HAVE_SIZEOF_MAJOR_T)
  120. CHECK_TYPE_SIZE("minor_t" SIZEOF_MINOR_T)
  121. IF(HAVE_SIZEOF_MINOR_T)
  122. SET (HAVE_MINOR_T 1)
  123. ELSE(HAVE_SIZEOF_MINOR_T)
  124. SET (HAVE_MINOR_T 0)
  125. SET (minor_t "unsigned int")
  126. ENDIF(HAVE_SIZEOF_MINOR_T)
  127. CHECK_TYPE_SIZE("nlink_t" SIZEOF_NLINK_T)
  128. IF(HAVE_SIZEOF_NLINK_T)
  129. SET (HAVE_NLINK_T 1)
  130. ELSE(HAVE_SIZEOF_NLINK_T)
  131. SET (HAVE_NLINK_T 0)
  132. SET (nlink_t "unsigned short")
  133. ENDIF(HAVE_SIZEOF_NLINK_T)
  134. CHECK_TYPE_SIZE("uint64_t" SIZEOF_UINT64_T)
  135. IF(HAVE_SIZEOF_UINT64_T)
  136. SET (HAVE_UINT64_T 1)
  137. ELSE(HAVE_SIZEOF_UINT64_T)
  138. SET (HAVE_UINT64_T 0)
  139. SET (uint64_t "long long")
  140. ENDIF(HAVE_SIZEOF_UINT64_T)
  141. CHECK_TYPE_SIZE("gid_t" SIZEOF_GID_T)
  142. IF(HAVE_SIZEOF_GID_T)
  143. SET (HAVE_GID_T 1)
  144. ELSE(HAVE_SIZEOF_GID_T)
  145. SET (HAVE_GID_T 0)
  146. SET (gid_t "int")
  147. ENDIF(HAVE_SIZEOF_GID_T)
  148. CHECK_TYPE_SIZE("mode_t" SIZEOF_MODE_T)
  149. IF(HAVE_SIZEOF_MODE_T)
  150. SET (HAVE_MODE_T 1)
  151. ELSE(HAVE_SIZEOF_MODE_T)
  152. SET (HAVE_MODE_T 0)
  153. SET (mode_t "int")
  154. ENDIF(HAVE_SIZEOF_MODE_T)
  155. CHECK_TYPE_SIZE("off_t" SIZEOF_OFF_T)
  156. IF(HAVE_SIZEOF_OFF_T)
  157. SET (HAVE_OFF_T 1)
  158. ELSE(HAVE_SIZEOF_OFF_T)
  159. SET (HAVE_OFF_T 0)
  160. SET (off_t "long")
  161. ENDIF(HAVE_SIZEOF_OFF_T)
  162. CHECK_TYPE_SIZE("size_t" SIZEOF_SIZE_T)
  163. IF(HAVE_SIZEOF_SIZE_T)
  164. SET (HAVE_SIZE_T 1)
  165. ELSE(HAVE_SIZEOF_SIZE_T)
  166. SET (HAVE_SIZE_T 0)
  167. SET (size_t "unsigned")
  168. ENDIF(HAVE_SIZEOF_SIZE_T)
  169. CHECK_TYPE_SIZE("ssize_t" SIZEOF_SSIZE_T)
  170. IF(HAVE_SIZEOF_SSIZE_T)
  171. SET (HAVE_SSIZE_T 1)
  172. ELSE(HAVE_SIZEOF_SSIZE_T)
  173. SET (HAVE_SSIZE_T 0)
  174. CHECK_TYPE_SIZE("long" SIZEOF_LONG)
  175. CHECK_TYPE_SIZE("__int64" SIZEOF___INT64)
  176. IF(SIZEOF_LONG EQUAL SIZEOF_SIZE_T)
  177. SET(ssize_t "long")
  178. ENDIF(SIZEOF_LONG EQUAL SIZEOF_SIZE_T)
  179. IF(NOT ssize_t AND SIZEOF___INT64 EQUAL SIZEOF_SIZE_T)
  180. SET(ssize_t "__int64")
  181. ENDIF(NOT ssize_t AND SIZEOF___INT64 EQUAL SIZEOF_SIZE_T)
  182. ENDIF(HAVE_SIZEOF_SSIZE_T)
  183. CHECK_TYPE_SIZE("uid_t" SIZEOF_UID_T)
  184. IF(HAVE_SIZEOF_UID_T)
  185. SET (HAVE_UID_T 1)
  186. ELSE(HAVE_SIZEOF_UID_T)
  187. SET (HAVE_UID_T 0)
  188. SET (uid_t "int")
  189. ENDIF(HAVE_SIZEOF_UID_T)
  190. #SET (HAVE_BASENAME 0)
  191. SET (HAVE_CTYPE_H 1) # all our platforms have <ctype.h>
  192. #SET (HAVE_DEV_T 1)
  193. #SET (HAVE_DIRNAME 0)
  194. #SET (HAVE_FNMATCH 1)
  195. #SET (HAVE_FNMATCH_H 1)
  196. #SET (HAVE_INTTYPES_H 1)
  197. #SET (HAVE_LCHOWN 1)
  198. #SET (HAVE_LIBGEN_H 1)
  199. SET (HAVE_LIBZ 1)
  200. #SET (HAVE_MAJOR_T 0)
  201. #SET (HAVE_MEMORY_H 1)
  202. #SET (HAVE_MINOR_T 0)
  203. #SET (HAVE_NLINK_T 1)
  204. #SET (HAVE_SNPRINTF 1)
  205. #SET (HAVE_STDINT_H 1)
  206. #SET (HAVE_STDLIB_H 1)
  207. #SET (HAVE_STRDUP 1)
  208. #SET (HAVE_STRFTIME 1)
  209. #SET (HAVE_STRINGS_H 1)
  210. #SET (HAVE_STRING_H 1)
  211. #SET (HAVE_STRLCPY 0)
  212. #SET (HAVE_STRMODE 0)
  213. #SET (HAVE_STRSEP 1)
  214. #SET (HAVE_SYS_STAT_H 1)
  215. #SET (HAVE_SYS_TYPES_H 1)
  216. #SET (HAVE_UINT64_T 1)
  217. #SET (HAVE_UNISTD_H 1)
  218. SET (MAJOR_IN_MKDEV 0)
  219. SET (MAJOR_IN_SYSMACROS 0)
  220. # for most systems makedev is two args on qnx it is three
  221. # try run is nothing but trouble so just hard code it
  222. SET (MAKEDEV_THREE_ARGS 0)
  223. IF(QNXNTO)
  224. SET(MAKEDEV_THREE_ARGS 1)
  225. ENDIF(QNXNTO)
  226. #SET (NEED_BASENAME 0)
  227. #SET (NEED_DIRNAME 0)
  228. #SET (NEED_FNMATCH 1)
  229. IF(UNIX)
  230. SET (NEED_MAKEDEV 1)
  231. ENDIF(UNIX)
  232. #SET (NEED_SNPRINTF 0)
  233. #SET (NEED_STRDUP 0)
  234. #SET (NEED_STRLCPY 0)
  235. #SET (NEED_STRMODE 1)
  236. #SET (NEED_STRSEP 0)
  237. SET (PACKAGE_BUGREPORT "")
  238. SET (PACKAGE_NAME "\"libtar\"")
  239. SET (PACKAGE_STRING "\"libtar 1.2.11\"")
  240. SET (PACKAGE_TARNAME "\"libtar\"")
  241. SET (PACKAGE_VERSION "\"1.2.11\"")
  242. #SET (STDC_HEADERS 1)
  243. SET (const 0)
  244. #SET (dev_t 0)
  245. #SET (gid_t 0)
  246. #SET (major_t "unsigned int")
  247. #SET (minor_t "unsigned int")
  248. #SET (mode_t 0)
  249. #SET (nlink_t 0)
  250. #SET (off_t 0)
  251. #SET (size_t 0)
  252. #SET (uid_t 0)
  253. #SET (uint64_t 0)
  254. SET (LISTHASH_PREFIX "libtar")
  255. CONFIGURE_FILE(${LIBTAR_SOURCE_DIR}/listhash/listhash.h.in
  256. ${LIBTAR_BINARY_DIR}/libtar/libtar_listhash.h @ONLY IMMEDIATE)
  257. CONFIGURE_FILE(${LIBTAR_SOURCE_DIR}/listhash/list.c.in
  258. ${LIBTAR_BINARY_DIR}/listhash/libtar_list.c @ONLY IMMEDIATE)
  259. CONFIGURE_FILE(${LIBTAR_SOURCE_DIR}/listhash/hash.c.in
  260. ${LIBTAR_BINARY_DIR}/listhash/libtar_hash.c @ONLY IMMEDIATE)
  261. FOREACH(hfile libtar.h tar.h compat/compat.h)
  262. GET_FILENAME_COMPONENT(outname "${hfile}" NAME)
  263. CONFIGURE_FILE(${LIBTAR_SOURCE_DIR}/${hfile}
  264. ${LIBTAR_BINARY_DIR}/libtar/${outname} @ONLY IMMEDIATE)
  265. ENDFOREACH(hfile)
  266. FOREACH(hfile internal.h filesystem.h)
  267. GET_FILENAME_COMPONENT(outname "${hfile}" NAME)
  268. CONFIGURE_FILE(${LIBTAR_SOURCE_DIR}/${hfile}
  269. ${LIBTAR_BINARY_DIR}/libtarint/${outname} @ONLY IMMEDIATE)
  270. ENDFOREACH(hfile)
  271. SET(libtar_SRC
  272. append.c
  273. block.c
  274. decode.c
  275. encode.c
  276. extract.c
  277. handle.c
  278. ${LIBTAR_BINARY_DIR}/listhash/libtar_hash.c
  279. ${LIBTAR_BINARY_DIR}/listhash/libtar_list.c
  280. output.c
  281. util.c
  282. wrapper.c
  283. internal.h
  284. ${LIBTAR_BINARY_DIR}/libtar/config.h
  285. config.h.in
  286. tar.h
  287. libtar.h
  288. compat/compat.h
  289. # compat/strlcpy.c
  290. # compat/basename.c
  291. # compat/dirname.c
  292. # compat/strmode.c
  293. # compat/strsep.c
  294. )
  295. IF(NOT HAVE_DIRENT_H)
  296. SET(libtar_SRC
  297. ${libtar_SRC}
  298. filesystem.c filesystem.h)
  299. ENDIF(NOT HAVE_DIRENT_H)
  300. IF(NOT HAVE_STRLCPY)
  301. SET(libtar_SRC ${libtar_SRC} compat/strlcpy.c)
  302. SET(NEED_STRLCPY 1)
  303. ENDIF(NOT HAVE_STRLCPY)
  304. IF(NOT HAVE_STRMODE)
  305. SET(libtar_SRC ${libtar_SRC} compat/strmode.c)
  306. SET(NEED_STRMODE 1)
  307. ENDIF(NOT HAVE_STRMODE)
  308. IF(WIN32)
  309. IF(NOT HAVE_SNPRINTF OR NOT HAVE_VSNPRINTF)
  310. SET(libtar_SRC ${libtar_SRC} compat/snprintf.c)
  311. SET(NEED_SNPRINTF 1)
  312. ENDIF(NOT HAVE_SNPRINTF OR NOT HAVE_VSNPRINTF)
  313. ENDIF(WIN32)
  314. IF(NOT HAVE_DIRNAME)
  315. SET(libtar_SRC ${libtar_SRC} compat/dirname.c)
  316. SET(NEED_DIRNAME 1)
  317. ENDIF(NOT HAVE_DIRNAME)
  318. IF(NOT HAVE_STRSEP)
  319. SET(libtar_SRC ${libtar_SRC} compat/strsep.c)
  320. SET(NEED_STRSEP 1)
  321. ENDIF(NOT HAVE_STRSEP)
  322. IF(NOT HAVE_BASENAME)
  323. SET(libtar_SRC ${libtar_SRC} compat/basename.c)
  324. SET(NEED_BASENAME 1)
  325. ENDIF(NOT HAVE_BASENAME)
  326. IF(NOT HAVE_FNMATCH)
  327. SET(libtar_SRC ${libtar_SRC} compat/fnmatch.c)
  328. SET(NEED_FNMATCH 1)
  329. ENDIF(NOT HAVE_FNMATCH)
  330. #IF(NOT HAVE_GLOB)
  331. #SET(libtar_SRC ${libtar_SRC} compat/glob.c)
  332. #SET(NEED_GLOB 1)
  333. #ENDIF(NOT HAVE_GLOB)
  334. # Setup zlib.
  335. IF(NOT CMTAR_ZLIB_LIBRARIES)
  336. MESSAGE(FATAL_ERROR "Parent project must set CMTAR_ZLIB_LIBRARIES.")
  337. ENDIF(NOT CMTAR_ZLIB_LIBRARIES)
  338. IF(NOT CMTAR_ZLIB_HEADER)
  339. MESSAGE(FATAL_ERROR "Parent project must set CMTAR_ZLIB_HEADER.")
  340. ENDIF(NOT CMTAR_ZLIB_HEADER)
  341. INCLUDE_DIRECTORIES(${CMTAR_ZLIB_INCLUDE_DIRS})
  342. CONFIGURE_FILE(${LIBTAR_SOURCE_DIR}/config.h.in
  343. ${LIBTAR_BINARY_DIR}/libtar/config.h)
  344. ADD_LIBRARY(cmtar STATIC ${libtar_SRC})
  345. ADD_EXECUTABLE(tartest libtar.c)
  346. TARGET_LINK_LIBRARIES(tartest cmtar ${CMTAR_ZLIB_LIBRARIES})