Add CMake infrastructure, including CTest support.

Open points:
pkgconfig file not yet built.
installation not tested.
Problems generating html pages.
distribution tarball not checked for unwanted/missing content.

--HG--
branch : HEAD
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..51b8bb0
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,92 @@
+# $NiH$
+
+PROJECT(libzip C)
+
+INCLUDE(CheckFunctionExists)
+INCLUDE(CheckIncludeFiles)
+INCLUDE(CheckSymbolExists)
+
+SET(PACKAGE "libzip")
+SET(PACKAGE_NAME ${PACKAGE})
+SET(PACKAGE_VERSION_MAJOR "0")
+SET(PACKAGE_VERSION_MINOR "7")
+SET(PACKAGE_VERSION_PATCH "1")
+SET(VERSION "${PACKAGE_VERSION_MAJOR}.${PACKAGE_VERSION_MINOR}.${PACKAGE_VERSION_PATCH}")
+SET(PACKAGE_VERSION ${VERSION})
+SET(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
+
+ADD_SUBDIRECTORY(lib)
+ADD_SUBDIRECTORY(man)
+ADD_SUBDIRECTORY(src)
+ADD_SUBDIRECTORY(regress)
+
+# Checks
+
+CHECK_FUNCTION_EXISTS(fseeko HAVE_FSEEKO)
+CHECK_FUNCTION_EXISTS(MoveFileEx HAVE_MOVEFILEEX)
+CHECK_FUNCTION_EXISTS(mkstemp HAVE_MKSTEMP)
+CHECK_INCLUDE_FILES(unistd.h HAVE_UNISTD_H)
+
+INCLUDE(FindZLIB)
+CHECK_SYMBOL_EXISTS(ZEXPORT zlib.h HAVE_ZEXPORT)
+IF(NOT HAVE_ZEXPORT)
+  MESSAGE(FATAL_ERROR "-- ZLIB version too old, please install at least v1.1.2")
+ENDIF(NOT HAVE_ZEXPORT)
+
+# Targets
+
+# XXX: pkgconfig file
+
+# installation
+
+# XXX: pkgconfig file
+
+# packaging
+
+SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "library for manipulating zip archives")
+SET(CPACK_PACKAGE_VENDOR "Dieter Baron <dillo@giga.or.at> and Thomas Klausner <tk@giga.or.at>")
+SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README")
+# XXX: provide a license file
+#SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/COPYING")
+SET(CPACK_PACKAGE_VERSION_MAJOR ${PACKAGE_VERSION_MAJOR})
+SET(CPACK_PACKAGE_VERSION_MINOR ${PACKAGE_VERSION_MINOR})
+SET(CPACK_PACKAGE_VERSION_PATCH ${PACKAGE_VERSION_PATCH})
+SET(CPACK_SOURCE_PACKAGE_FILE_NAME ${PACKAGE_NAME}-${PACKAGE_VERSION})
+SET(CPACK_GENERATOR "TGZ")
+SET(CPACK_SOURCE_GENERATOR "TGZ")
+SET(CPACK_SOURCE_IGNORE_FILES
+  ".a$"
+  ".cmake$"
+  ".o$"
+  ".so$"
+  "/.deps/"
+  "/.libs/"
+  "/CMakeFiles/"
+  "/CVS/"
+  "/autom4te.cache/"
+  "/build"
+  "/broken"
+  "/docs/"
+  "AdditionalInfo.txt$"
+  "CMakeCache.txt$"
+  "Makefile$"
+  "\\\\.sh$"
+  "_CPack_"
+  "config.h$"
+  "config.log$"
+  "config.status$"
+  "dccsend$"
+  "dccserver$"
+  "html$"
+  "install_manifest.txt$"
+  "stamp-h1$"
+  "tar.bz2"
+  "tar.gz"
+  "~$"
+)
+SET(CPACK_SOURCE_STRIP_FILES "")
+INCLUDE(CPack)
+
+# write out config file
+CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/cmake-config.h.in
+  ${CMAKE_CURRENT_BINARY_DIR}/config.h)
diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt
new file mode 100644
index 0000000..feb4935
--- /dev/null
+++ b/lib/CMakeLists.txt
@@ -0,0 +1,127 @@
+INCLUDE(CheckFunctionExists)
+
+INSTALL(FILES zip.h DESTINATION include)
+
+# from http://www.cmake.org/Wiki/CMakeMacroLibtoolFile
+MACRO(GET_TARGET_PROPERTY_WITH_DEFAULT _variable _target _property _default_value)
+  
+  GET_TARGET_PROPERTY (${_variable} ${_target} ${_property})
+  IF (${_variable} STREQUAL NOTFOUND)
+    SET (${_variable} ${_default_value})
+  ENDIF (${_variable} STREQUAL NOTFOUND)
+  
+ENDMACRO (GET_TARGET_PROPERTY_WITH_DEFAULT)
+  
+MACRO(CREATE_LIBTOOL_FILE _target _install_DIR)
+  GET_TARGET_PROPERTY(_target_location ${_target} LOCATION)
+  GET_TARGET_PROPERTY_WITH_DEFAULT(_target_static_lib ${_target} STATIC_LIB "")
+  GET_TARGET_PROPERTY_WITH_DEFAULT(_target_dependency_libs ${_target} LT_DEPENDENCY_LIBS "")
+  GET_TARGET_PROPERTY_WITH_DEFAULT(_target_current ${_target} LT_VERSION_CURRENT 0)
+  GET_TARGET_PROPERTY_WITH_DEFAULT(_target_age ${_target} LT_VERSION_AGE 0)
+  GET_TARGET_PROPERTY_WITH_DEFAULT(_target_revision ${_target} LT_VERSION_REVISION 0)
+  GET_TARGET_PROPERTY_WITH_DEFAULT(_target_installed ${_target} LT_INSTALLED yes)
+  GET_TARGET_PROPERTY_WITH_DEFAULT(_target_shouldnotlink ${_target} LT_SHOULDNOTLINK yes)
+  GET_TARGET_PROPERTY_WITH_DEFAULT(_target_dlopen ${_target} LT_DLOPEN "")
+  GET_TARGET_PROPERTY_WITH_DEFAULT(_target_dlpreopen ${_target} LT_DLPREOPEN "")
+  GET_FILENAME_COMPONENT(_laname ${_target_location} NAME_WE)
+  GET_FILENAME_COMPONENT(_soname ${_target_location} NAME)
+  SET(_laname ${_laname}.la)
+  FILE(WRITE ${_laname} "# ${_laname} - a libtool library file, generated by cmake \n")
+  FILE(APPEND ${_laname} "# The name that we can dlopen(3).\n")
+  FILE(APPEND ${_laname} "dlname='${_soname}'\n")
+  FILE(APPEND ${_laname} "# Names of this library\n")
+  FILE(APPEND ${_laname} "library_names='${_soname}.${_target_current}.${_target_age}.${_target_revision} ${_soname}.${_target_current} ${_soname}'\n")
+  FILE(APPEND ${_laname} "# The name of the static archive\n")
+  FILE(APPEND ${_laname} "old_library='${_target_static_lib}'\n")
+  FILE(APPEND ${_laname} "# Libraries that this one depends upon.\n")
+  FILE(APPEND ${_laname} "dependency_libs='${_target_dependency_libs}'\n")
+  FILE(APPEND ${_laname} "# Version information.\n")
+  FILE(APPEND ${_laname} "current=${_target_current}\n")
+  FILE(APPEND ${_laname} "age=${_target_age}\n")
+  FILE(APPEND ${_laname} "revision=${_target_revision}\n")
+  FILE(APPEND ${_laname} "# Is this an already installed library?\n")
+  FILE(APPEND ${_laname} "installed=${_target_installed}\n")
+  FILE(APPEND ${_laname} "# Should we warn about portability when linking against -modules?\n")
+  FILE(APPEND ${_laname} "shouldnotlink=${_target_shouldnotlink}\n")
+  FILE(APPEND ${_laname} "# Files to dlopen/dlpreopen\n")
+  FILE(APPEND ${_laname} "dlopen='${_target_dlopen}'\n")
+  FILE(APPEND ${_laname} "dlpreopen='${_target_dlpreopen}'\n")
+  FILE(APPEND ${_laname} "# Directory that this library needs to be installed in:\n")
+  FILE(APPEND ${_laname} "libdir='${CMAKE_INSTALL_PREFIX}${_install_DIR}'\n")
+  INSTALL( FILES ${_laname} ${_soname}
+    DESTINATION ${CMAKE_INSTALL_PREFIX}${_install_DIR})
+ENDMACRO(CREATE_LIBTOOL_FILE)
+ 
+SET(LIBZIP_SOURCES
+  zip_add.c
+  zip_add_dir.c
+  zip_close.c
+  zip_delete.c
+  zip_dirent.c
+  zip_entry_free.c
+  zip_entry_new.c
+  ${CMAKE_CURRENT_BINARY_DIR}/zip_err_str.c
+  zip_error.c
+  zip_error_clear.c
+  zip_error_get.c
+  zip_error_get_sys_type.c
+  zip_error_strerror.c
+  zip_error_to_str.c
+  zip_fclose.c
+  zip_file_error_clear.c
+  zip_file_error_get.c
+  zip_file_get_offset.c
+  zip_file_strerror.c
+  zip_fopen.c
+  zip_fopen_index.c
+  zip_fread.c
+  zip_free.c
+  zip_get_archive_comment.c
+  zip_get_file_comment.c
+  zip_get_num_files.c
+  zip_get_name.c
+  zip_memdup.c
+  zip_name_locate.c
+  zip_new.c
+  zip_open.c
+  zip_rename.c
+  zip_replace.c
+  zip_set_archive_comment.c
+  zip_set_file_comment.c
+  zip_source_buffer.c
+  zip_source_file.c
+  zip_source_filep.c
+  zip_source_free.c
+  zip_source_function.c
+  zip_source_zip.c
+  zip_set_name.c
+  zip_stat.c
+  zip_stat_index.c
+  zip_stat_init.c
+  zip_strerror.c
+  zip_unchange.c
+  zip_unchange_all.c
+  zip_unchange_archive.c
+  zip_unchange_data.c
+)
+
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}
+  ${CMAKE_CURRENT_BINARY_DIR}/..)
+
+# XXX: distribute instead?
+ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/zip_err_str.c
+  COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/make_zip_err_str.sh
+    ${CMAKE_CURRENT_SOURCE_DIR}/zip.h
+    ${CMAKE_CURRENT_BINARY_DIR}/zip_err_str.c
+  DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/zip.h
+    ${CMAKE_CURRENT_SOURCE_DIR}/make_zip_err_str.sh
+)
+CHECK_FUNCTION_EXISTS(mkstemp HAVE_MKSTEMP)
+IF(NOT HAVE_MKSTEMP)
+  SET(LIBZIP_EXTRA_FILES mkstemp.c)
+ENDIF(NOT HAVE_MKSTEMP)
+
+ADD_LIBRARY(zip SHARED ${LIBZIP_SOURCES} ${LIBZIP_EXTRA_FILES})
+SET_TARGET_PROPERTIES(zip PROPERTIES VERSION 1.0 SOVERSION 1 )
+CREATE_LIBTOOL_FILE(zip lib)
+TARGET_LINK_LIBRARIES(zip z)
diff --git a/man/CMakeLists.txt b/man/CMakeLists.txt
new file mode 100644
index 0000000..8de246d
--- /dev/null
+++ b/man/CMakeLists.txt
@@ -0,0 +1,97 @@
+SET(MDOC3_PAGES
+  libzip.mdoc
+  zip_add.mdoc
+  zip_add_dir.mdoc
+  zip_close.mdoc
+  zip_delete.mdoc
+  zip_error_clear.mdoc
+  zip_error_get.mdoc
+  zip_error_get_sys_type.mdoc
+  zip_error_to_str.mdoc
+  zip_errors.mdoc
+  zip_fclose.mdoc
+  zip_file_strerror.mdoc
+  zip_fopen.mdoc
+  zip_fread.mdoc
+  zip_get_archive_comment.mdoc
+  zip_get_file_comment.mdoc
+  zip_get_name.mdoc
+  zip_get_num_files.mdoc
+  zip_name_locate.mdoc
+  zip_open.mdoc
+  zip_rename.mdoc
+  zip_set_archive_comment.mdoc
+  zip_set_file_comment.mdoc
+  zip_source_buffer.mdoc
+  zip_source_file.mdoc
+  zip_source_filep.mdoc
+  zip_source_free.mdoc
+  zip_source_function.mdoc
+  zip_source_zip.mdoc
+  zip_stat.mdoc
+  zip_stat_init.mdoc
+  zip_unchange.mdoc
+  zip_unchange_all.mdoc
+  zip_unchange_archive.mdoc
+)
+SET(MDOC1_PAGES
+  zipcmp.mdoc
+  zipmerge.mdoc
+)
+SET(MDOC_PAGES ${MDOC1_PAGES} ${MDOC3_PAGES})
+STRING(REGEX REPLACE .mdoc "" MAN1_PAGES "${MDOC1_PAGES}")
+STRING(REGEX REPLACE .mdoc "" MAN3_PAGES "${MDOC3_PAGES}")
+SET(MAN_PAGES ${MAN1_PAGES} ${MAN3_PAGES})
+
+IF(CMAKE_SYSTEM_NAME MATCHES BSD)
+  SET(MANFMT mdoc)
+ELSE(CMAKE_SYSTEM_NAME MATCHES BSD)
+  SET(MANFMT man)
+ENDif(CMAKE_SYSTEM_NAME MATCHES BSD)
+
+# installation
+
+SET(MAN_PATH man)
+
+FOREACH(MAN_PAGE ${MAN1_PAGES})
+  INSTALL(FILES ${MAN_PAGE}.${MANFMT} DESTINATION ${MAN_PATH}/man1
+    RENAME ${MAN_PAGE}.1)
+ENDFOREACH(MAN_PAGE ${PROGRAMS})
+FOREACH(MAN_PAGE ${MAN3_PAGES})
+  INSTALL(FILES ${MAN_PAGE}.${MANFMT} DESTINATION ${MAN_PATH}/man3
+    RENAME ${MAN_PAGE}.3)
+ENDFOREACH(MAN_PAGE ${PROGRAMS})
+
+# custom targets
+
+FOREACH(MAN ${MAN_PAGES})
+  ADD_CUSTOM_TARGET(${MAN}.man
+    DEPENDS ${MAN}.mdoc
+    COMMAND mdoc2man ${CMAKE_CURRENT_SOURCE_DIR}/${MAN}.mdoc > ${MAN}.new
+    COMMAND diff -I NiH ${MAN}.new ${CMAKE_CURRENT_SOURCE_DIR}/${MAN}.man || mv ${MAN}.new ${CMAKE_CURRENT_SOURCE_DIR}/${MAN}.man
+    COMMAND rm -f ${MAN}.new
+    COMMENT Updating man page ${MAN}.man
+    )
+  ADD_CUSTOM_TARGET(${MAN}.html
+    DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${MAN}.mdoc
+    COMMAND nroff -mdoc2html ${CMAKE_CURRENT_SOURCE_DIR}/${MAN}.mdoc | sed -e "s,../html[0-9]/,," > ${MAN}.html
+    COMMENT Updating HTML page ${MAN}.html
+    )
+ENDFOREACH(MAN)
+
+STRING(REGEX REPLACE .mdoc .man MANDEPEND "${MDOC_PAGES}")
+ADD_CUSTOM_TARGET(update-man
+  DEPENDS ${MANDEPEND})
+
+STRING(REGEX REPLACE .mdoc .html HTMLDEPEND "${MDOC_PAGES}")
+ADD_CUSTOM_TARGET(update-html
+  DEPENDS ${HTMLDEPEND})
+
+# XXX: strange error:
+#[ 94%] zipcmp.html
+#[ 97%] Built target zipcmp.html
+#[ 97%] zipmerge.html
+#[100%] Built target zipmerge.html
+#make: don't know how to make zipcmp.html. Stop
+
+# XXX: why are all the man pages rebuilt on a second 'make update-html'?
diff --git a/regress/CMakeLists.txt b/regress/CMakeLists.txt
new file mode 100644
index 0000000..0a589f3
--- /dev/null
+++ b/regress/CMakeLists.txt
@@ -0,0 +1,27 @@
+# $NiH$
+
+ENABLE_TESTING()
+
+SET(TEST_PROGRAMS
+  add_from_buffer
+  add_from_file
+  add_from_filep
+  encrypt
+  fread
+  get_comment
+  name_locate
+  open
+  set_comment_all
+  set_comment_localonly
+  set_comment_removeglobal
+  set_comment_revert
+)
+
+SET(ENV{srcdir} ${CMAKE_CURRENT_SOURCE_DIR})
+FOREACH(PROGRAM ${TEST_PROGRAMS})
+  ADD_EXECUTABLE(${PROGRAM} ${PROGRAM}.c)
+  TARGET_LINK_LIBRARIES(${PROGRAM} zip)
+  ADD_TEST(${PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/runtest ${CMAKE_CURRENT_SOURCE_DIR}/${PROGRAM})
+ENDFOREACH(PROGRAM ${TEST_PROGRAMS})
+
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../lib)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
new file mode 100644
index 0000000..c5b76a4
--- /dev/null
+++ b/src/CMakeLists.txt
@@ -0,0 +1,10 @@
+# $NiH$
+
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../lib
+  ${CMAKE_CURRENT_BINARY_DIR}/..)
+
+ADD_EXECUTABLE(zipcmp zipcmp.c)
+TARGET_LINK_LIBRARIES(zipcmp zip)
+
+ADD_EXECUTABLE(zipmerge zipmerge.c)
+TARGET_LINK_LIBRARIES(zipmerge zip)