397 lines
10 KiB
CMake
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)
|