CMake/Utilities/cmtar/CMakeLists.txt
Brad King 9737ea074a Install third-party utility copyright notices
Some of our third-party utilities have licenses that require their
copyright and license notices to be distributed with binary forms.  This
commit adds installation rules to include these notices with installed
CMake documentation.
2009-09-28 11:36:17 -04:00

397 lines
10 KiB
CMake

CMAKE_MINIMUM_REQUIRED(VERSION 2.4)
IF(COMMAND CMAKE_POLICY)
CMAKE_POLICY(SET CMP0003 NEW)
ENDIF(COMMAND CMAKE_POLICY)
PROJECT(LIBTAR C)
INCLUDE_REGULAR_EXPRESSION("^.*$")
# We need ansi c-flags, especially on HP
SET(CMAKE_C_FLAGS "${CMAKE_ANSI_CFLAGS} ${CMAKE_C_FLAGS}")
SET(CMAKE_REQUIRED_FLAGS ${CMAKE_ANSI_CFLAGS})
# Disable warnings on Borland to avoid changing 3rd party code.
IF(BORLAND)
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w-")
ENDIF(BORLAND)
# If we are on AIX, do the _ALL_SOURCE magic
IF(${CMAKE_SYSTEM_NAME} MATCHES AIX)
SET(_ALL_SOURCE 1)
ENDIF(${CMAKE_SYSTEM_NAME} MATCHES AIX)
# Include all the necessary files for macros
#SET(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMake")
# Include all the necessary files for macros
INCLUDE (CheckIncludeFiles)
INCLUDE (CheckFunctionExists)
INCLUDE (CheckTypeSize)
INCLUDE (CheckSymbolExists)
INCLUDE (TestBigEndian)
MACRO(MANGLE_VARIABLE_NAME str var prefix)
STRING(TOUPPER "${str}" mangle_variable_name_var)
STRING(REGEX REPLACE "[/. ]" "_" mangle_variable_name_var "${mangle_variable_name_var}")
SET(${var} "${prefix}${mangle_variable_name_var}")
ENDMACRO(MANGLE_VARIABLE_NAME str var)
# Check if header file exists and add it to the list.
MACRO(CHECK_INCLUDE_FILE_CONCAT FILE)
MANGLE_VARIABLE_NAME("${FILE}" "CHECK_INCLUDE_FILE_CONCAT_VAR" "HAVE_")
CHECK_INCLUDE_FILES("${HEADER_INCLUDES};${FILE}" ${CHECK_INCLUDE_FILE_CONCAT_VAR})
IF(${CHECK_INCLUDE_FILE_CONCAT_VAR})
SET(HEADER_INCLUDES ${HEADER_INCLUDES} ${FILE})
ENDIF(${CHECK_INCLUDE_FILE_CONCAT_VAR})
ENDMACRO(CHECK_INCLUDE_FILE_CONCAT)
MACRO(CHECK_FUNCTION_EXISTS_EX FUNC)
MANGLE_VARIABLE_NAME("${FUNC}" "CHECK_FUNCTION_EXISTS_EX_VAR" "HAVE_")
CHECK_FUNCTION_EXISTS("${FUNC}" "${CHECK_FUNCTION_EXISTS_EX_VAR}")
ENDMACRO(CHECK_FUNCTION_EXISTS_EX)
MACRO(CHECK_SYMBOL_EXISTS_EX SYM)
MANGLE_VARIABLE_NAME("${SYM}" "CHECK_SYMBOL_EXISTS_EX_VAR" "HAVE_")
CHECK_SYMBOL_EXISTS("${SYM}" "${HEADER_INCLUDES}" "${CHECK_SYMBOL_EXISTS_EX_VAR}")
ENDMACRO(CHECK_SYMBOL_EXISTS_EX)
#MACRO(CHECK_TYPE_SIZE_EX type defualt_size)
# MANGLE_VARIABLE_NAME("${type}" "check_type_size_var" "")
# CHECK_TYPE_SIZE("${type}" "SIZEOF_${check_type_size_var}")
# IF(HAVE_${check_type_size_var})
# SET("HAVE_${check_type_size_var}" 1)
# ELSE(HAVE_${check_type_size_var})
# ENDIF(HAVE_${check_type_size_var})
#ENDMACRO(CHECK_TYPE_SIZE_EX)
INCLUDE_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}")
#check for stdc headers
CHECK_INCLUDE_FILES("stdlib.h;stdarg.h;string.h;float.h" STDC_HEADERS)
#check for other headers used by the program
FOREACH(file
"ctype.h"
"fnmatch.h"
"inttypes.h"
"io.h"
"libgen.h"
"memory.h"
"sys/mkdev.h"
"stdint.h"
"stdlib.h"
"stdio.h"
"string.h"
"strings.h"
"sys/param.h"
"sys/types.h"
"sys/stat.h"
"unistd.h"
"glob.h"
"dirent.h"
"sys/sysmacros.h"
)
CHECK_INCLUDE_FILE_CONCAT("${file}")
ENDFOREACH(file)
#check for the functions used by the program
FOREACH(func
basename
dirname
fnmatch
lchown
snprintf
strlcpy
strmode
strsep
strdup
strftime
vsnprintf
glob
major
minor
makedev
)
CHECK_SYMBOL_EXISTS_EX("${func}")
ENDFOREACH(func)
# on Syllable lchown() is there, but always returns "Not implemented"
IF("${CMAKE_SYSTEM_NAME}" MATCHES syllable)
SET(HAVE_LCHOWN 0)
ENDIF("${CMAKE_SYSTEM_NAME}" MATCHES syllable)
CHECK_TYPE_SIZE("dev_t" SIZEOF_DEV_T)
IF(HAVE_SIZEOF_DEV_T)
SET (HAVE_DEV_T 1)
ELSE(HAVE_SIZEOF_DEV_T)
SET (HAVE_DEV_T 0)
SET (dev_t "unsigned long")
ENDIF(HAVE_SIZEOF_DEV_T)
CHECK_TYPE_SIZE("major_t" SIZEOF_MAJOR_T)
IF(HAVE_SIZEOF_MAJOR_T)
SET (HAVE_MAJOR_T 1)
ELSE(HAVE_SIZEOF_MAJOR_T)
SET (HAVE_MAJOR_T 0)
SET (major_t "unsigned int")
ENDIF(HAVE_SIZEOF_MAJOR_T)
CHECK_TYPE_SIZE("minor_t" SIZEOF_MINOR_T)
IF(HAVE_SIZEOF_MINOR_T)
SET (HAVE_MINOR_T 1)
ELSE(HAVE_SIZEOF_MINOR_T)
SET (HAVE_MINOR_T 0)
SET (minor_t "unsigned int")
ENDIF(HAVE_SIZEOF_MINOR_T)
CHECK_TYPE_SIZE("nlink_t" SIZEOF_NLINK_T)
IF(HAVE_SIZEOF_NLINK_T)
SET (HAVE_NLINK_T 1)
ELSE(HAVE_SIZEOF_NLINK_T)
SET (HAVE_NLINK_T 0)
SET (nlink_t "unsigned short")
ENDIF(HAVE_SIZEOF_NLINK_T)
CHECK_TYPE_SIZE("uint64_t" SIZEOF_UINT64_T)
IF(HAVE_SIZEOF_UINT64_T)
SET (HAVE_UINT64_T 1)
ELSE(HAVE_SIZEOF_UINT64_T)
SET (HAVE_UINT64_T 0)
SET (uint64_t "long long")
ENDIF(HAVE_SIZEOF_UINT64_T)
CHECK_TYPE_SIZE("gid_t" SIZEOF_GID_T)
IF(HAVE_SIZEOF_GID_T)
SET (HAVE_GID_T 1)
ELSE(HAVE_SIZEOF_GID_T)
SET (HAVE_GID_T 0)
SET (gid_t "int")
ENDIF(HAVE_SIZEOF_GID_T)
CHECK_TYPE_SIZE("mode_t" SIZEOF_MODE_T)
IF(HAVE_SIZEOF_MODE_T)
SET (HAVE_MODE_T 1)
ELSE(HAVE_SIZEOF_MODE_T)
SET (HAVE_MODE_T 0)
SET (mode_t "int")
ENDIF(HAVE_SIZEOF_MODE_T)
CHECK_TYPE_SIZE("off_t" SIZEOF_OFF_T)
IF(HAVE_SIZEOF_OFF_T)
SET (HAVE_OFF_T 1)
ELSE(HAVE_SIZEOF_OFF_T)
SET (HAVE_OFF_T 0)
SET (off_t "long")
ENDIF(HAVE_SIZEOF_OFF_T)
CHECK_TYPE_SIZE("size_t" SIZEOF_SIZE_T)
IF(HAVE_SIZEOF_SIZE_T)
SET (HAVE_SIZE_T 1)
ELSE(HAVE_SIZEOF_SIZE_T)
SET (HAVE_SIZE_T 0)
SET (size_t "unsigned")
ENDIF(HAVE_SIZEOF_SIZE_T)
CHECK_TYPE_SIZE("ssize_t" SIZEOF_SSIZE_T)
IF(HAVE_SIZEOF_SSIZE_T)
SET (HAVE_SSIZE_T 1)
ELSE(HAVE_SIZEOF_SSIZE_T)
SET (HAVE_SSIZE_T 0)
CHECK_TYPE_SIZE("long" SIZEOF_LONG)
CHECK_TYPE_SIZE("__int64" SIZEOF___INT64)
IF(SIZEOF_LONG EQUAL SIZEOF_SIZE_T)
SET(ssize_t "long")
ENDIF(SIZEOF_LONG EQUAL SIZEOF_SIZE_T)
IF(NOT ssize_t AND SIZEOF___INT64 EQUAL SIZEOF_SIZE_T)
SET(ssize_t "__int64")
ENDIF(NOT ssize_t AND SIZEOF___INT64 EQUAL SIZEOF_SIZE_T)
ENDIF(HAVE_SIZEOF_SSIZE_T)
CHECK_TYPE_SIZE("uid_t" SIZEOF_UID_T)
IF(HAVE_SIZEOF_UID_T)
SET (HAVE_UID_T 1)
ELSE(HAVE_SIZEOF_UID_T)
SET (HAVE_UID_T 0)
SET (uid_t "int")
ENDIF(HAVE_SIZEOF_UID_T)
#SET (HAVE_BASENAME 0)
SET (HAVE_CTYPE_H 1) # all our platforms have <ctype.h>
#SET (HAVE_DEV_T 1)
#SET (HAVE_DIRNAME 0)
#SET (HAVE_FNMATCH 1)
#SET (HAVE_FNMATCH_H 1)
#SET (HAVE_INTTYPES_H 1)
#SET (HAVE_LCHOWN 1)
#SET (HAVE_LIBGEN_H 1)
SET (HAVE_LIBZ 1)
#SET (HAVE_MAJOR_T 0)
#SET (HAVE_MEMORY_H 1)
#SET (HAVE_MINOR_T 0)
#SET (HAVE_NLINK_T 1)
#SET (HAVE_SNPRINTF 1)
#SET (HAVE_STDINT_H 1)
#SET (HAVE_STDLIB_H 1)
#SET (HAVE_STRDUP 1)
#SET (HAVE_STRFTIME 1)
#SET (HAVE_STRINGS_H 1)
#SET (HAVE_STRING_H 1)
#SET (HAVE_STRLCPY 0)
#SET (HAVE_STRMODE 0)
#SET (HAVE_STRSEP 1)
#SET (HAVE_SYS_STAT_H 1)
#SET (HAVE_SYS_TYPES_H 1)
#SET (HAVE_UINT64_T 1)
#SET (HAVE_UNISTD_H 1)
SET (MAJOR_IN_MKDEV 0)
SET (MAJOR_IN_SYSMACROS 0)
# for most systems makedev is two args on qnx it is three
# try run is nothing but trouble so just hard code it
SET (MAKEDEV_THREE_ARGS 0)
IF(QNXNTO)
SET(MAKEDEV_THREE_ARGS 1)
ENDIF(QNXNTO)
#SET (NEED_BASENAME 0)
#SET (NEED_DIRNAME 0)
#SET (NEED_FNMATCH 1)
IF(UNIX)
SET (NEED_MAKEDEV 1)
ENDIF(UNIX)
#SET (NEED_SNPRINTF 0)
#SET (NEED_STRDUP 0)
#SET (NEED_STRLCPY 0)
#SET (NEED_STRMODE 1)
#SET (NEED_STRSEP 0)
SET (PACKAGE_BUGREPORT "")
SET (PACKAGE_NAME "\"libtar\"")
SET (PACKAGE_STRING "\"libtar 1.2.11\"")
SET (PACKAGE_TARNAME "\"libtar\"")
SET (PACKAGE_VERSION "\"1.2.11\"")
#SET (STDC_HEADERS 1)
SET (const 0)
#SET (dev_t 0)
#SET (gid_t 0)
#SET (major_t "unsigned int")
#SET (minor_t "unsigned int")
#SET (mode_t 0)
#SET (nlink_t 0)
#SET (off_t 0)
#SET (size_t 0)
#SET (uid_t 0)
#SET (uint64_t 0)
SET (LISTHASH_PREFIX "libtar")
CONFIGURE_FILE(${LIBTAR_SOURCE_DIR}/listhash/listhash.h.in
${LIBTAR_BINARY_DIR}/libtar/libtar_listhash.h @ONLY IMMEDIATE)
CONFIGURE_FILE(${LIBTAR_SOURCE_DIR}/listhash/list.c.in
${LIBTAR_BINARY_DIR}/listhash/libtar_list.c @ONLY IMMEDIATE)
CONFIGURE_FILE(${LIBTAR_SOURCE_DIR}/listhash/hash.c.in
${LIBTAR_BINARY_DIR}/listhash/libtar_hash.c @ONLY IMMEDIATE)
FOREACH(hfile libtar.h tar.h compat/compat.h)
GET_FILENAME_COMPONENT(outname "${hfile}" NAME)
CONFIGURE_FILE(${LIBTAR_SOURCE_DIR}/${hfile}
${LIBTAR_BINARY_DIR}/libtar/${outname} @ONLY IMMEDIATE)
ENDFOREACH(hfile)
FOREACH(hfile internal.h filesystem.h)
GET_FILENAME_COMPONENT(outname "${hfile}" NAME)
CONFIGURE_FILE(${LIBTAR_SOURCE_DIR}/${hfile}
${LIBTAR_BINARY_DIR}/libtarint/${outname} @ONLY IMMEDIATE)
ENDFOREACH(hfile)
SET(libtar_SRC
append.c
block.c
decode.c
encode.c
extract.c
handle.c
${LIBTAR_BINARY_DIR}/listhash/libtar_hash.c
${LIBTAR_BINARY_DIR}/listhash/libtar_list.c
output.c
util.c
wrapper.c
internal.h
${LIBTAR_BINARY_DIR}/libtar/config.h
config.h.in
tar.h
libtar.h
compat/compat.h
# compat/strlcpy.c
# compat/basename.c
# compat/dirname.c
# compat/strmode.c
# compat/strsep.c
)
IF(NOT HAVE_DIRENT_H)
SET(libtar_SRC
${libtar_SRC}
filesystem.c filesystem.h)
ENDIF(NOT HAVE_DIRENT_H)
IF(NOT HAVE_STRLCPY)
SET(libtar_SRC ${libtar_SRC} compat/strlcpy.c)
SET(NEED_STRLCPY 1)
ENDIF(NOT HAVE_STRLCPY)
IF(NOT HAVE_STRMODE)
SET(libtar_SRC ${libtar_SRC} compat/strmode.c)
SET(NEED_STRMODE 1)
ENDIF(NOT HAVE_STRMODE)
IF(WIN32)
IF(NOT HAVE_SNPRINTF OR NOT HAVE_VSNPRINTF)
SET(libtar_SRC ${libtar_SRC} compat/snprintf.c)
SET(NEED_SNPRINTF 1)
ENDIF(NOT HAVE_SNPRINTF OR NOT HAVE_VSNPRINTF)
ENDIF(WIN32)
IF(NOT HAVE_DIRNAME)
SET(libtar_SRC ${libtar_SRC} compat/dirname.c)
SET(NEED_DIRNAME 1)
ENDIF(NOT HAVE_DIRNAME)
IF(NOT HAVE_STRSEP)
SET(libtar_SRC ${libtar_SRC} compat/strsep.c)
SET(NEED_STRSEP 1)
ENDIF(NOT HAVE_STRSEP)
IF(NOT HAVE_BASENAME)
SET(libtar_SRC ${libtar_SRC} compat/basename.c)
SET(NEED_BASENAME 1)
ENDIF(NOT HAVE_BASENAME)
IF(NOT HAVE_FNMATCH)
SET(libtar_SRC ${libtar_SRC} compat/fnmatch.c)
SET(NEED_FNMATCH 1)
ENDIF(NOT HAVE_FNMATCH)
#IF(NOT HAVE_GLOB)
#SET(libtar_SRC ${libtar_SRC} compat/glob.c)
#SET(NEED_GLOB 1)
#ENDIF(NOT HAVE_GLOB)
# Setup zlib.
IF(NOT CMTAR_ZLIB_LIBRARIES)
MESSAGE(FATAL_ERROR "Parent project must set CMTAR_ZLIB_LIBRARIES.")
ENDIF(NOT CMTAR_ZLIB_LIBRARIES)
IF(NOT CMTAR_ZLIB_HEADER)
MESSAGE(FATAL_ERROR "Parent project must set CMTAR_ZLIB_HEADER.")
ENDIF(NOT CMTAR_ZLIB_HEADER)
INCLUDE_DIRECTORIES(${CMTAR_ZLIB_INCLUDE_DIRS})
CONFIGURE_FILE(${LIBTAR_SOURCE_DIR}/config.h.in
${LIBTAR_BINARY_DIR}/libtar/config.h)
ADD_LIBRARY(cmtar STATIC ${libtar_SRC})
ADD_EXECUTABLE(tartest libtar.c)
TARGET_LINK_LIBRARIES(tartest cmtar ${CMTAR_ZLIB_LIBRARIES})
INSTALL(FILES COPYRIGHT DESTINATION ${CMake_DOC_DEST}/cmtar)