mirror of
https://github.com/brechtsanders/xlsxio
synced 2025-03-28 21:13:24 +00:00
289 lines
12 KiB
CMake
289 lines
12 KiB
CMake
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
|
|
|
|
PROJECT(xlsxio DESCRIPTION "C libraries for reading and writing .xlsx files")
|
|
|
|
# get version number
|
|
FILE(READ "include/xlsxio_version.h" VERFILE)
|
|
STRING(REGEX MATCH "#define XLSXIO_VERSION_MAJOR ([0-9]*)" DUMMYVAR ${VERFILE})
|
|
SET(XLSXIO_VER_MAJOR ${CMAKE_MATCH_1})
|
|
STRING(REGEX MATCH "#define XLSXIO_VERSION_MINOR ([0-9]*)" DUMMYVAR ${VERFILE})
|
|
SET(XLSXIO_VER_MINOR ${CMAKE_MATCH_1})
|
|
STRING(REGEX MATCH "#define XLSXIO_VERSION_MICRO ([0-9]*)" DUMMYVAR ${VERFILE})
|
|
SET(XLSXIO_VER_MICRO ${CMAKE_MATCH_1})
|
|
SET(XLSXIO_VER "${XLSXIO_VER_MAJOR}.${XLSXIO_VER_MINOR}.${XLSXIO_VER_MICRO}")
|
|
UNSET(DUMMYVAR)
|
|
UNSET(VERFILE)
|
|
MESSAGE(STATUS "XLSX I/O library version: ${XLSXIO_VER}")
|
|
|
|
# parameters
|
|
OPTION(BUILD_STATIC "Build static libraries" ON)
|
|
OPTION(BUILD_SHARED "Build shared libraries" ON)
|
|
OPTION(BUILD_PC_FILES "Build pkg-config .pc" ON)
|
|
OPTION(BUILD_TOOLS "Build tools" ON)
|
|
OPTION(BUILD_EXAMPLES "Build examples" ON)
|
|
OPTION(WITH_LIBZIP "Use libzip instead of Minizip" OFF)
|
|
OPTION(WITH_MINIZIP_NG "Use Minizip NG" OFF)
|
|
SET(MINIZIP_NG_SUFFIX "" CACHE STRING "Minizip NG suffix (default is empty)")
|
|
OPTION(WITH_WIDE "Also build UTF-16 library (libxlsxio_readw)" OFF)
|
|
SET(ZLIB_DIR "" CACHE PATH "Path to the zlib library")
|
|
IF(WITH_LIBZIP)
|
|
SET(LIBZIP_DIR "" CACHE PATH "Path to the libzip library")
|
|
ELSE()
|
|
SET(MINIZIP_DIR "" CACHE PATH "Path to the Minizip library")
|
|
ENDIF()
|
|
SET(EXPAT_DIR "" CACHE PATH "Path to the Expat library")
|
|
|
|
# check conditions
|
|
IF(NOT BUILD_STATIC AND NOT BUILD_SHARED)
|
|
MESSAGE(FATAL_ERROR "Cannot build with both BUILD_STATIC and BUILD_SHARED disabled")
|
|
ENDIF()
|
|
|
|
# dependencies
|
|
SET(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMake" ${CMAKE_MODULE_PATH})
|
|
# dependency: zlib (dependency of libzip/Minizip, should be detected there)
|
|
IF(ZLIB_DIR)
|
|
SET(ZLIB_ROOT ${ZLIB_DIR})
|
|
ENDIF()
|
|
#FIND_PACKAGE(ZLIB REQUIRED)
|
|
# dependency: libzip/minizip/minizip-ng
|
|
IF(WITH_LIBZIP)
|
|
FIND_PACKAGE(LibZip REQUIRED)
|
|
SET(ANYZIP_INCLUDE_DIRS ${LIBZIP_INCLUDE_DIRS})
|
|
SET(ANYZIP_LIBRARIES ${LIBZIP_LIBRARIES})
|
|
SET(ANYZIP_DEF USE_LIBZIP)
|
|
ELSEIF(WITH_MINIZIP_NG)
|
|
FIND_PACKAGE(minizip${MINIZIP_NG_SUFFIX} REQUIRED)
|
|
SET(ANYZIP_INCLUDE_DIRS "${minizip-ng_DIR}/../../../include/minizip${MINIZIP_NG_SUFFIX}")
|
|
SET(ANYZIP_LIBRARIES minizip${MINIZIP_NG_SUFFIX})
|
|
SET(ANYZIP_DEF USE_MINIZIP;USE_MINIZIP_NG)
|
|
ELSE()
|
|
FIND_PACKAGE(Minizip REQUIRED)
|
|
SET(ANYZIP_INCLUDE_DIRS ${MINIZIP_INCLUDE_DIRS})
|
|
SET(ANYZIP_LIBRARIES ${MINIZIP_LIBRARIES})
|
|
SET(ANYZIP_DEF USE_MINIZIP)
|
|
ENDIF()
|
|
# dependency: expat
|
|
IF(EXPAT_DIR)
|
|
#FIND_PACKAGE(EXPAT MODULE REQUIRED NO_DEFAULT_PATH PATHS ${EXPAT_DIR})
|
|
FIND_PATH(EXPAT_INCLUDE_DIR NAMES expat.h NO_DEFAULT_PATH PATHS ${EXPAT_DIR}/include ${EXPAT_DIR})
|
|
FIND_LIBRARY(EXPAT_LIBRARIES NAMES expat libexpat NO_DEFAULT_PATH PATHS ${EXPAT_DIR}/lib ${EXPAT_DIR})
|
|
ELSE()
|
|
FIND_PACKAGE(EXPAT REQUIRED)
|
|
ENDIF()
|
|
# dependency: expatw (if wide library was requested)
|
|
IF(WITH_WIDE)
|
|
IF(EXPAT_DIR)
|
|
FIND_LIBRARY(EXPATW_LIBRARIES NAMES expatw libexpatw NO_DEFAULT_PATH PATHS ${EXPAT_DIR}/lib ${EXPAT_DIR})
|
|
ELSE()
|
|
FIND_LIBRARY(EXPATW_LIBRARIES NAMES expatw)
|
|
ENDIF()
|
|
ENDIF()
|
|
|
|
# Doxygen
|
|
FIND_PACKAGE(Doxygen)
|
|
OPTION(BUILD_DOCUMENTATION "Create and install API documentation (requires Doxygen)" ${DOXYGEN_FOUND})
|
|
|
|
# build parameters
|
|
#SET(CMAKE_CXX_FLAGS "-g -Wall")
|
|
#ADD_SUBDIRECTORY(src)
|
|
|
|
IF(NOT WIN32 AND NOT APPLE)
|
|
SET(THREADLIB "-pthread")
|
|
ENDIF()
|
|
|
|
INCLUDE_DIRECTORIES(include)
|
|
INCLUDE_DIRECTORIES(${ANYZIP_INCLUDE_DIRS})
|
|
INCLUDE_DIRECTORIES(${EXPAT_INCLUDE_DIR})
|
|
|
|
# build definitions
|
|
SET(ALLTARGETS_LIB)
|
|
SET(ALLTARGETS_EXE)
|
|
SET(LINKTYPES)
|
|
IF(BUILD_STATIC)
|
|
LIST(APPEND LINKTYPES "STATIC")
|
|
ENDIF()
|
|
IF(BUILD_SHARED)
|
|
LIST(APPEND LINKTYPES "SHARED")
|
|
ENDIF()
|
|
|
|
FOREACH(LINKTYPE ${LINKTYPES})
|
|
ADD_LIBRARY(xlsxio_read_${LINKTYPE} ${LINKTYPE} lib/xlsxio_read.c lib/xlsxio_read_sharedstrings.c)
|
|
SET_TARGET_PROPERTIES(xlsxio_read_${LINKTYPE} PROPERTIES COMPILE_DEFINITIONS "BUILD_XLSXIO;${ANYZIP_DEF};BUILD_XLSXIO_${LINKTYPE}")
|
|
SET_TARGET_PROPERTIES(xlsxio_read_${LINKTYPE} PROPERTIES OUTPUT_NAME xlsxio_read)
|
|
IF(MINGW AND LINKTYPE STREQUAL "SHARED")
|
|
SET_TARGET_PROPERTIES(xlsxio_read_${LINKTYPE} PROPERTIES LINK_FLAGS "-Wl,--output-def=libxlsxio_read.def")
|
|
SET_SOURCE_FILES_PROPERTIES(xlsxio_read.def PROPERTIES HEADER_FILE_ONLY TRUE)
|
|
ENDIF()
|
|
TARGET_INCLUDE_DIRECTORIES(xlsxio_read_${LINKTYPE} PRIVATE lib)
|
|
TARGET_LINK_LIBRARIES(xlsxio_read_${LINKTYPE} ${ANYZIP_LIBRARIES} ${EXPAT_LIBRARIES})
|
|
SET(ALLTARGETS_LIB ${ALLTARGETS_LIB} xlsxio_read_${LINKTYPE})
|
|
|
|
ADD_LIBRARY(xlsxio_write_${LINKTYPE} ${LINKTYPE} lib/xlsxio_write.c)
|
|
SET_TARGET_PROPERTIES(xlsxio_write_${LINKTYPE} PROPERTIES COMPILE_DEFINITIONS "BUILD_XLSXIO;${ANYZIP_DEF};BUILD_XLSXIO_${LINKTYPE}")
|
|
SET_TARGET_PROPERTIES(xlsxio_write_${LINKTYPE} PROPERTIES OUTPUT_NAME xlsxio_write)
|
|
IF(MINGW AND LINKTYPE STREQUAL "SHARED")
|
|
SET_TARGET_PROPERTIES(xlsxio_write_${LINKTYPE} PROPERTIES LINK_FLAGS "-Wl,--output-def=libxlsxio_write.def")
|
|
ENDIF()
|
|
TARGET_LINK_LIBRARIES(xlsxio_write_${LINKTYPE} ${ANYZIP_LIBRARIES} ${THREADLIB})
|
|
SET(ALLTARGETS_LIB ${ALLTARGETS_LIB} xlsxio_write_${LINKTYPE})
|
|
|
|
IF(WITH_WIDE)
|
|
ADD_LIBRARY(xlsxio_readw_${LINKTYPE} ${LINKTYPE} lib/xlsxio_read.c lib/xlsxio_read_sharedstrings.c)
|
|
SET_TARGET_PROPERTIES(xlsxio_readw_${LINKTYPE} PROPERTIES DEFINE_SYMBOL "BUILD_XLSXIO_DLL")
|
|
SET_TARGET_PROPERTIES(xlsxio_readw_${LINKTYPE} PROPERTIES COMPILE_DEFINITIONS "XML_UNICODE;BUILD_XLSXIO;${ANYZIP_DEF}")
|
|
SET_TARGET_PROPERTIES(xlsxio_readw_${LINKTYPE} PROPERTIES OUTPUT_NAME xlsxio_readw)
|
|
IF(MINGW AND LINKTYPE STREQUAL "SHARED")
|
|
SET_TARGET_PROPERTIES(xlsxio_readw_${LINKTYPE} PROPERTIES LINK_FLAGS "-Wl,--output-def=libxlsxio_readw.def")
|
|
ENDIF()
|
|
TARGET_INCLUDE_DIRECTORIES(xlsxio_readw_${LINKTYPE} PRIVATE lib)
|
|
TARGET_LINK_LIBRARIES(xlsxio_readw_${LINKTYPE} ${ANYZIP_LIBRARIES} ${EXPATW_LIBRARIES})
|
|
SET(ALLTARGETS_LIB ${ALLTARGETS_LIB} xlsxio_readw_${LINKTYPE})
|
|
|
|
#ADD_LIBRARY(xlsxio_writew_${LINKTYPE} ${LINKTYPE} lib/xlsxio_write.c)
|
|
#SET_TARGET_PROPERTIES(xlsxio_writew_${LINKTYPE} PROPERTIES DEFINE_SYMBOL "BUILD_XLSXIO_DLL")
|
|
#SET_TARGET_PROPERTIES(xlsxio_writew_${LINKTYPE} PROPERTIES COMPILE_DEFINITIONS "XML_UNICODE;BUILD_XLSXIO;${ANYZIP_DEF}")
|
|
#SET_TARGET_PROPERTIES(xlsxio_writew_${LINKTYPE} PROPERTIES OUTPUT_NAME xlsxio_write_w)
|
|
#IF(MINGW AND LINKTYPE STREQUAL "SHARED")
|
|
# SET_TARGET_PROPERTIES(xlsxio_writew_${LINKTYPE} PROPERTIES LINK_FLAGS "-Wl,--output-def=libxlsxio_writew.def")
|
|
#ENDIF()
|
|
#TARGET_LINK_LIBRARIES(xlsxio_writew_${LINKTYPE} ${ANYZIP_LIBRARIES} ${THREADLIB})
|
|
#SET(ALLTARGETS_LIB ${ALLTARGETS_LIB} xlsxio_writew_${LINKTYPE})
|
|
ENDIF()
|
|
|
|
SET(EXELINKTYPE ${LINKTYPE})
|
|
ENDFOREACH()
|
|
#SET_TARGET_PROPERTIES(xlsxio_read_SHARED PROPERTIES DEFINE_SYMBOL "BUILD_XLSXIO_DLL")
|
|
#SET_TARGET_PROPERTIES(xlsxio_write_SHARED PROPERTIES DEFINE_SYMBOL "BUILD_XLSXIO_DLL")
|
|
|
|
IF(BUILD_TOOLS)
|
|
ADD_EXECUTABLE(xlsxio_xlsx2csv src/xlsxio_xlsx2csv.c)
|
|
TARGET_LINK_LIBRARIES(xlsxio_xlsx2csv xlsxio_read_${EXELINKTYPE})
|
|
SET(ALLTARGETS_EXE ${ALLTARGETS_EXE} xlsxio_xlsx2csv)
|
|
|
|
ADD_EXECUTABLE(xlsxio_csv2xlsx src/xlsxio_csv2xlsx.c)
|
|
TARGET_LINK_LIBRARIES(xlsxio_csv2xlsx xlsxio_write_${EXELINKTYPE})
|
|
SET(ALLTARGETS_EXE ${ALLTARGETS_EXE} xlsxio_csv2xlsx)
|
|
ENDIF()
|
|
|
|
IF(BUILD_EXAMPLES)
|
|
ADD_EXECUTABLE(example_xlsxio_write_getversion examples/example_xlsxio_write_getversion.c)
|
|
TARGET_LINK_LIBRARIES(example_xlsxio_write_getversion xlsxio_write_${EXELINKTYPE})
|
|
SET(ALLTARGETS_EXE ${ALLTARGETS_EXE} example_xlsxio_write_getversion)
|
|
|
|
ADD_EXECUTABLE(example_xlsxio_write examples/example_xlsxio_write.c)
|
|
TARGET_LINK_LIBRARIES(example_xlsxio_write xlsxio_write_${EXELINKTYPE})
|
|
SET(ALLTARGETS_EXE ${ALLTARGETS_EXE} example_xlsxio_write)
|
|
|
|
ADD_EXECUTABLE(example_xlsxio_read examples/example_xlsxio_read.c)
|
|
TARGET_LINK_LIBRARIES(example_xlsxio_read xlsxio_read_${EXELINKTYPE})
|
|
SET(ALLTARGETS_EXE ${ALLTARGETS_EXE} example_xlsxio_read)
|
|
|
|
ADD_EXECUTABLE(example_xlsxio_read_advanced examples/example_xlsxio_read_advanced.c)
|
|
TARGET_LINK_LIBRARIES(example_xlsxio_read_advanced xlsxio_read_${EXELINKTYPE})
|
|
SET(ALLTARGETS_EXE ${ALLTARGETS_EXE} example_xlsxio_read_advanced)
|
|
|
|
IF(WITH_WIDE)
|
|
ADD_EXECUTABLE(example_xlsxio_readw examples/example_xlsxio_read.c)
|
|
SET_TARGET_PROPERTIES(example_xlsxio_readw PROPERTIES COMPILE_DEFINITIONS "XML_UNICODE")
|
|
TARGET_LINK_LIBRARIES(example_xlsxio_readw xlsxio_readw_${EXELINKTYPE})
|
|
SET(ALLTARGETS_EXE ${ALLTARGETS_EXE} example_xlsxio_readw)
|
|
ENDIF()
|
|
ENDIF()
|
|
|
|
IF(BUILD_DOCUMENTATION)
|
|
IF(NOT DOXYGEN_FOUND)
|
|
MESSAGE(FATAL_ERROR "Doxygen is needed to build the documentation.")
|
|
ENDIF()
|
|
ADD_CUSTOM_TARGET(doc ALL
|
|
COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/doc/Doxyfile
|
|
#WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
|
COMMENT "Generating API documentation with Doxygen"
|
|
VERBATIM
|
|
)
|
|
INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/doc/man
|
|
DESTINATION .
|
|
)
|
|
INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/doc/html
|
|
DESTINATION share/xlsxio
|
|
)
|
|
ENDIF()
|
|
|
|
# installation specifications
|
|
INSTALL(TARGETS ${ALLTARGETS_LIB}
|
|
EXPORT xlsxioTargets
|
|
ARCHIVE DESTINATION lib
|
|
LIBRARY DESTINATION lib
|
|
RUNTIME DESTINATION bin
|
|
)
|
|
INSTALL(EXPORT xlsxioTargets
|
|
NAMESPACE xlsxio::
|
|
DESTINATION cmake
|
|
)
|
|
FILE(WRITE "${CMAKE_CURRENT_BINARY_DIR}/xlsxio-config.cmake.in"
|
|
[[INCLUDE(CMakeFindDependencyMacro)
|
|
IF (@WITH_LIBZIP@)
|
|
FIND_DEPENDENCY(LibZip)
|
|
ELSE()
|
|
FIND_DEPENDENCY(minizip CONFIG)
|
|
ENDIF()
|
|
IF (@EXPAT_DIR@)
|
|
FIND_PATH(EXPAT_INCLUDE_DIR NAMES expat.h NO_DEFAULT_PATH PATHS ${EXPAT_DIR}/include ${EXPAT_DIR})
|
|
FIND_LIBRARY(EXPAT_LIBRARIES NAMES expat libexpat NO_DEFAULT_PATH PATHS ${EXPAT_DIR}/lib ${EXPAT_DIR})
|
|
ELSE()
|
|
FIND_DEPENDENCY(EXPAT)
|
|
ENDIF()
|
|
|
|
IF(@WITH_WIDE@)
|
|
IF(@EXPAT_DIR@)
|
|
FIND_LIBRARY(EXPATW_LIBRARIES NAMES expatw libexpatw NO_DEFAULT_PATH PATHS ${EXPAT_DIR}/lib ${EXPAT_DIR})
|
|
ELSE()
|
|
FIND_LIBRARY(EXPATW_LIBRARIES NAMES expatw)
|
|
ENDIF()
|
|
ENDIF()
|
|
|
|
INCLUDE("${CMAKE_CURRENT_LIST_DIR}/xlsxioTargets.cmake")
|
|
]])
|
|
CONFIGURE_FILE("${CMAKE_CURRENT_BINARY_DIR}/xlsxio-config.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/xlsxio-config.cmake" @ONLY)
|
|
INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/xlsxio-config.cmake" DESTINATION cmake)
|
|
|
|
INSTALL(TARGETS ${ALLTARGETS_EXE}
|
|
ARCHIVE DESTINATION lib
|
|
LIBRARY DESTINATION lib
|
|
RUNTIME DESTINATION bin
|
|
)
|
|
INSTALL(DIRECTORY include/
|
|
DESTINATION include
|
|
FILES_MATCHING PATTERN "xlsxio*.h"
|
|
)
|
|
IF(MINGW AND BUILD_SHARED)
|
|
INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/libxlsxio_read.def" DESTINATION lib)
|
|
INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/libxlsxio_write.def" DESTINATION lib)
|
|
IF(WITH_WIDE)
|
|
INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/libxlsxio_readw.def" DESTINATION lib)
|
|
#INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/libxlsxio_writew.def" DESTINATION lib)
|
|
ENDIF()
|
|
ENDIF()
|
|
|
|
# generate .cmake and .pc files
|
|
MACRO(generate_and_install_config_files _NAME _DESC _LIBS _HEADER)
|
|
SET(XLSXIO_NAME "${_NAME}")
|
|
SET(XLSXIO_DESC "${_DESC}")
|
|
SET(XLSXIO_HEADER "${_HEADER}")
|
|
STRING(REGEX REPLACE "^lib\([^ ]*\)" "\\1" XLSXIO_LIB "${XLSXIO_NAME}")
|
|
STRING(REPLACE ";" " " XLSXIO_LDFLAGS "-l${XLSXIO_LIB} ${_LIBS}")
|
|
STRING(REGEX REPLACE "\([^ ]*\)[/\\]lib([^ /\\.]*).[^ ]*" "-L\\1 -l\\2" XLSXIO_LDFLAGS "${XLSXIO_LDFLAGS}")
|
|
CONFIGURE_FILE(templateConfig.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/${XLSXIO_NAME}Config.cmake" @ONLY)
|
|
CONFIGURE_FILE(templateConfigVersion.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/${XLSXIO_NAME}ConfigVersion.cmake" @ONLY)
|
|
INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/${XLSXIO_NAME}Config.cmake" "${CMAKE_CURRENT_BINARY_DIR}/${XLSXIO_NAME}ConfigVersion.cmake" DESTINATION cmake)
|
|
IF (BUILD_PC_FILES)
|
|
CONFIGURE_FILE(template.pc.in "${CMAKE_CURRENT_BINARY_DIR}/${XLSXIO_NAME}.pc" @ONLY)
|
|
INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/${XLSXIO_NAME}.pc" DESTINATION lib/pkgconfig)
|
|
ENDIF()
|
|
ENDMACRO()
|
|
generate_and_install_config_files("libxlsxio_write" "C library for writing .xlsx files" "${ANYZIP_LIBRARIES} ${THREADLIB}" "xlsxio_write.h")
|
|
generate_and_install_config_files("libxlsxio_read" "C library for writing .xlsx files" "${ANYZIP_LIBRARIES} ${EXPAT_LIBRARIES}" "xlsxio_read.h")
|
|
IF(WITH_WIDE)
|
|
generate_and_install_config_files("libxlsxio_readw" "C library for reading .xlsx files using wide characters" "${ANYZIP_LIBRARIES} ${EXPAT_LIBRARIES}" "xlsxio_read.h")
|
|
ENDIF()
|