# CMake build system for exiv2 library and executables # Copyright 2008 by Patrick Spendrin # Copyright 2010 by Gilles Caulier # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above # copyright notice, this list of conditions and the following # disclaimer in the documentation and/or other materials provided # with the distribution. # 3. The name of the author may not be used to endorse or promote # products derived from this software without specific prior # written permission. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # ConfigureChecks for exiv2 SET( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/config ) INCLUDE( CheckIncludeFile ) INCLUDE( CheckFunctionExists ) INCLUDE( CheckSymbolExists ) INCLUDE( CheckCSourceCompiles ) INCLUDE( CheckCXXSourceCompiles ) INCLUDE( FindIconv ) SET( STDC_HEADERS ON ) SET( HAVE_DECL_STRERROR_R 0 ) SET( HAVE_PRINTUCS2 ${EXIV2_ENABLE_PRINTUCS2} ) SET( HAVE_LENSDATA ${EXIV2_ENABLE_LENSDATA} ) INCLUDE_DIRECTORIES( ${CMAKE_INCLUDE_PATH} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/xmpsdk/include ) LINK_DIRECTORIES( ${CMAKE_LIBRARY_PATH} ) SET( CMAKE_REQUIRED_INCLUDES ${CMAKE_INCLUDE_PATH} ) IF( EXIV2_ENABLE_PNG ) FIND_PACKAGE( ZLIB ) INCLUDE_DIRECTORIES( ${ZLIB_INCLUDE_DIR} ) SET (HAVE_LIBZ ${ZLIB_FOUND}) ENDIF( EXIV2_ENABLE_PNG ) IF (EXIV2_ENABLE_XMP) FIND_PACKAGE(EXPAT) INCLUDE_DIRECTORIES(${EXPAT_INCLUDE_DIR}) # FindEXPAT.cmake doesn't check for REQUIRED flags - so we need to check ourselves IF( MINGW OR UNIX ) IF (NOT EXPAT_FOUND) MESSAGE(FATAL_ERROR "missing library expat required for XMP") ENDIF( NOT EXPAT_FOUND ) ENDIF( MINGW OR UNIX ) ENDIF (EXIV2_ENABLE_XMP) IF( EXIV2_ENABLE_SHARED ) ADD_DEFINITIONS( -DEXV_HAVE_DLL ) SET( STATIC_FLAG SHARED ) ELSE( EXIV2_ENABLE_SHARED ) SET( STATIC_FLAG STATIC ) ENDIF( EXIV2_ENABLE_SHARED ) IF( EXIV2_ENABLE_NLS ) IF( NOT LOCALEDIR ) SET( LOCALEDIR "${CMAKE_INSTALL_PREFIX}/share/locale" ) IF( WIN32 ) STRING( REPLACE "/" "\\\\" LOCALEDIR ${LOCALEDIR} ) ENDIF( WIN32 ) ENDIF( NOT LOCALEDIR ) ADD_DEFINITIONS( -DEXV_LOCALEDIR=${LOCALEDIR} ) ENDIF( EXIV2_ENABLE_NLS ) IF( EXIV2_ENABLE_COMMERCIAL ) ADD_DEFINITIONS( -DEXV_COMMERCIAL_VERSION ) ENDIF( EXIV2_ENABLE_COMMERCIAL ) FIND_PACKAGE(Iconv) IF( ICONV_FOUND ) SET( HAVE_ICONV 1 ) INCLUDE_DIRECTORIES(${ICONV_INCLUDE_DIR}) MESSAGE ( "-- ICONV_LIBRARIES : " ${ICONV_LIBRARIES} ) ENDIF( ICONV_FOUND ) IF( ICONV_ACCEPTS_CONST_INPUT ) MESSAGE ( "ICONV_ACCEPTS_CONST_INPUT : yes" ) ENDIF( ICONV_ACCEPTS_CONST_INPUT ) FIND_PACKAGE(MSGFMT) IF(MSGFMT_FOUND) MESSAGE(STATUS "Program msgfmt found (${MSGFMT_EXECUTABLE})") SET( EXIV2_BUILD_PO 1 ) ENDIF(MSGFMT_FOUND) # checking for Header files check_include_file( "inttypes.h" have_inttypes_h ) check_include_file( "libintl.h" HAVE_LIBINTL_H ) check_include_file( "malloc.h" HAVE_MALLOC_H ) check_include_file( "memory.h" HAVE_MEMORY_H ) check_include_file( "iconv.h" HAVE_ICONV_H ) check_include_file( "stdbool.h" HAVE_STDBOOL_H ) check_include_file( "stdint.h" HAVE_STDINT_H ) check_include_file( "stdlib.h" HAVE_STDLIB_H ) check_include_file( "string.h" HAVE_STRING_H ) check_include_file( "strings.h" HAVE_STRINGS_H ) check_include_file( "unistd.h" HAVE_UNISTD_H ) check_include_file( "wchar.h" HAVE_WCHAR_H ) check_include_file( "sys/stat.h" HAVE_SYS_STAT_H ) check_include_file( "sys/time.h" HAVE_SYS_TIME_H ) check_include_file( "sys/types.h" HAVE_SYS_TYPES_H ) check_include_file( "sys/mman.h" HAVE_SYS_MMAN_H ) check_include_file( "process.h" HAVE_PROCESS_H ) check_function_exists( alarm HAVE_ALARM ) check_function_exists( gmtime_r HAVE_GMTIME_R ) check_function_exists( malloc HAVE_MALLOC ) check_function_exists( memset HAVE_MEMSET ) check_function_exists( mmap HAVE_MMAP ) check_function_exists( munmap HAVE_MUNMAP ) check_function_exists( realloc HAVE_REALLOC ) check_function_exists( strchr HAVE_STRCHR ) check_function_exists( strchr_r HAVE_STRCHR_R ) check_function_exists( strerror HAVE_STRERROR ) check_function_exists( strerror_r HAVE_STRERROR_R ) check_function_exists( strtol HAVE_STRTOL ) check_function_exists( timegm HAVE_TIMEGM ) check_function_exists( vprintf HAVE_VPRINTF ) MESSAGE( STATUS "None: ${CMAKE_CXX_FLAGS}" ) MESSAGE( STATUS "Debug: ${CMAKE_CXX_FLAGS_DEBUG}" ) MESSAGE( STATUS "Release: ${CMAKE_CXX_FLAGS_RELEASE}" ) MESSAGE( STATUS "RelWithDebInfo: ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}" ) MESSAGE( STATUS "MinSizeRel: ${CMAKE_CXX_FLAGS_MINSIZEREL}" ) IF( HAVE_STDBOOL_H ) CHECK_SYMBOL_EXISTS( "_Bool" stdbool.h HAVE__BOOL ) ENDIF( HAVE_STDBOOL_H ) # struct tm in sys/time.h IF( HAVE_SYS_TIME_H ) CHECK_C_SOURCE_COMPILES( "#include int main() { struct tm t; return 0; }" TM_IN_SYS_TIME ) ENDIF( HAVE_SYS_TIME_H ) ##################################################################################### # strerror_r returns char* # NOTE : reverting commit #2041, which break compilation under linux and windows CHECK_C_SOURCE_COMPILES( "#include int main() { char * c; c = strerror_r(0,c,0); return 0; }" STRERROR_R_CHAR_P ) # function is declared with the above IF( STRERROR_R_CHAR_P ) SET( HAVE_DECL_STRERROR_R 1 ) ENDIF( STRERROR_R_CHAR_P ) ##################################################################################### # time.h and sys/time.h can be included in the same file CHECK_C_SOURCE_COMPILES( "#include #include int main() { return 0; }" TIME_WITH_SYS_TIME ) # for msvc define to int in exv_conf.h IF( NOT MSVC ) SET( HAVE_PID_T TRUE ) ENDIF( NOT MSVC ) SET( EXV_SYMBOLS ENABLE_NLS HAVE_ALARM HAVE_DECL_STRERROR_R HAVE_GMTIME_R HAVE_ICONV HAVE_ICONV_H HAVE_INTTYPES_H HAVE_LENSDATA HAVE_LIBINTL_H HAVE_LIBZ HAVE_MALLOC_H HAVE_MEMORY_H HAVE_MEMSET HAVE_MMAP HAVE_MUNMAP HAVE_PRINTUCS2 HAVE_PROCESS_H HAVE_REALLOC HAVE_STDBOOL_H HAVE_STDINT_H HAVE_STDLIB_H HAVE_STRCHR HAVE_STRCHR_R HAVE_STRERROR HAVE_STRERROR_R HAVE_STRINGS_H HAVE_STRING_H HAVE_STRTOL HAVE_SYS_MMAN_H HAVE_SYS_STAT_H HAVE_SYS_TIME_H HAVE_SYS_TYPES_H HAVE_TIMEGM HAVE_UNISTD_H HAVE_VPRINTF HAVE_WCHAR_H HAVE_XMP_TOOLKIT HAVE__BOOL PACKAGE PACKAGE_BUGREPORT PACKAGE_NAME PACKAGE_STRING PACKAGE_TARNAME PACKAGE_VERSION STRERROR_R_CHAR_P ) FOREACH( entry ${EXV_SYMBOLS} ) SET( EXV_${entry} ${${entry}} ) # NOTE: to hack... # MESSAGE( EXV_${entry} " : " ${${entry}} ) ENDFOREACH( entry ${EXV_SYMBOLS} ) CONFIGURE_FILE( config/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/exv_conf.h ) CONFIGURE_FILE( config/exv_msvc.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/exv_msvc.h COPYONLY ) INSTALL( FILES ${CMAKE_CURRENT_BINARY_DIR}/exv_conf.h DESTINATION include/exiv2 ) INSTALL( FILES ${CMAKE_CURRENT_BINARY_DIR}/exv_msvc.h DESTINATION include/exiv2 ) CONFIGURE_FILE(config/exiv2_uninstall.cmake ${CMAKE_BINARY_DIR}/cmake_uninstall.cmake COPYONLY) ADD_CUSTOM_TARGET(uninstall "${CMAKE_COMMAND}" -P "${CMAKE_BINARY_DIR}/cmake_uninstall.cmake") IF( NOT MSVC ) CONFIGURE_FILE( config/exiv2.pc.cmake ${CMAKE_CURRENT_BINARY_DIR}/exiv2.pc @ONLY ) INSTALL( FILES ${CMAKE_CURRENT_BINARY_DIR}/exiv2.pc DESTINATION lib/pkgconfig ) CONFIGURE_FILE( config/exiv2.lsm.cmake ${CMAKE_CURRENT_BINARY_DIR}/exiv2.lsm) INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/exiv2.lsm DESTINATION lib/pkgconfig ) ENDIF( NOT MSVC ) # ****************************************************************************** # output chosen build options MACRO( OptionOutput _outputstring ) IF( ${ARGN} ) SET( _var "YES" ) ELSE( ${ARGN} ) SET( _var "NO" ) ENDIF( ${ARGN} ) MESSAGE( STATUS "${_outputstring}${_var}" ) ENDMACRO( OptionOutput _outputstring ) MESSAGE( STATUS "------------------------------------------------------------------" ) MESSAGE( STATUS "${PACKAGE_STRING} configure results <${PACKAGE_URL}>" ) OptionOutput( "Building PNG support: " EXIV2_ENABLE_PNG AND ZLIB_FOUND ) OptionOutput( "Building shared library: " EXIV2_ENABLE_SHARED ) OptionOutput( "XMP metadata support: " EXIV2_ENABLE_XMP ) OptionOutput( "Building static libxmp: " EXIV2_ENABLE_LIBXMP ) OptionOutput( "Native language support: " EXIV2_ENABLE_NLS ) OptionOutput( "Conversion of Windows XP tags: " EXIV2_ENABLE_PRINTUCS2 ) OptionOutput( "Nikon lens database: " EXIV2_ENABLE_LENSDATA ) OptionOutput( "Commercial build: " EXIV2_ENABLE_COMMERCIAL ) OptionOutput( "Build the unit tests: " EXIV2_ENABLE_BUILD_SAMPLES ) OptionOutput( "Building translations files: " EXIV2_ENABLE_BUILD_PO ) MESSAGE( STATUS "------------------------------------------------------------------" )