From be17b00e09b527991aad3a6697332776f9e2c35c Mon Sep 17 00:00:00 2001 From: kyngchaos Date: Sat, 30 Oct 2010 19:37:00 +0000 Subject: [PATCH] Mac cmake update: cleaner framework detection; optional bundle Qt/PyQt and libraries, and fixup paths git-svn-id: http://svn.osgeo.org/qgis/trunk@14458 c8812cc2-4d05-0410-92ff-de0c093fc19c --- CMakeLists.txt | 53 +++++- cmake/FindGDAL.cmake | 168 +++++++++-------- cmake/FindGEOS.cmake | 164 +++++++++-------- cmake/FindGSL.cmake | 127 +++++++------ cmake/FindProj.cmake | 16 +- cmake/FindPyQt.py | 1 + cmake/FindPyQt4.cmake | 1 + cmake/FindSIP.cmake | 1 + cmake/FindSIP.py | 1 + cmake/FindSPATIALITE.cmake | 21 ++- cmake/FindSqlite3.cmake | 16 +- mac/CMakeLists.txt | 30 +++ mac/cmake/0qgis.cmake.in | 71 +++++++ mac/cmake/1qt.cmake.in | 316 ++++++++++++++++++++++++++++++++ mac/cmake/2lib.cmake.in | 137 ++++++++++++++ src/app/CMakeLists.txt | 26 +-- src/helpviewer/CMakeLists.txt | 3 +- src/mac/Contents/CMakeLists.txt | 2 + src/mac/Contents/Info.plist.in | 12 +- 19 files changed, 929 insertions(+), 237 deletions(-) create mode 100644 mac/CMakeLists.txt create mode 100644 mac/cmake/0qgis.cmake.in create mode 100644 mac/cmake/1qt.cmake.in create mode 100644 mac/cmake/2lib.cmake.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 8c07672fa3d2..fc55cd2d862c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,6 +5,11 @@ SET(COMPLETE_VERSION ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINO SET(RELEASE_NAME "Trunk") SET(PROJECT_VERSION ${COMPLETE_VERSION}) PROJECT(qgis${PROJECT_VERSION}) +IF (APPLE) + SET(QGIS_APP_NAME "QGIS") +ELSE (APPLE) + SET(QGIS_APP_NAME "qgis") +ENDIF (APPLE) # Note the version no is Mmmpp for Major/minor/patch, 0-padded, thus '10100' for 1.1.0 MATH(EXPR QGIS_VERSION_INT "${CPACK_PACKAGE_VERSION_MAJOR}*10000+${CPACK_PACKAGE_VERSION_MINOR}*100+${CPACK_PACKAGE_VERSION_PATCH}") @@ -268,14 +273,43 @@ ELSE (WIN32) IF (APPLE) # for Mac OS X, everything is put inside an application bundle - SET (CMAKE_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX}/${PROJECT_NAME}.app/Contents/MacOS) + SET (QGIS_MACAPP_PREFIX ${CMAKE_INSTALL_PREFIX}/${QGIS_APP_NAME}.app/Contents) + SET (CMAKE_INSTALL_PREFIX ${QGIS_MACAPP_PREFIX}/MacOS) # path for library references SET (CMAKE_INSTALL_NAME_DIR @executable_path/lib) + # 4 bundling levels, each includes previous + # 0 nothing + # 1 Qt frameworks + # 2 non-system libraries, "standard" + # 3 non-system frameworks, "standalone" + SET (QGIS_MACAPP_BUNDLE 0 CACHE STRING "What to bundle into app package") + # if we have @loader_path, >=OSX 10.5 (darwin 9+) + IF (CMAKE_SYSTEM_VERSION VERSION_GREATER 9.0.0 OR CMAKE_SYSTEM_VERSION VERSION_EQUAL 9.0.0) + SET (OSX_HAVE_LOADERPATH 1) + ELSE () + SET (OSX_HAVE_LOADERPATH 0) + ENDIF () #this will define ${APP_SERVICES_LIBRARY} FIND_LIBRARY(APP_SERVICES_LIBRARY ApplicationServices ) - ENDIF (APPLE) - # common for MAC and UNIX + SET (DEFAULT_BIN_SUBDIR bin) + SET (QGIS_BIN_SUBDIR_REV ..) + SET (DEFAULT_CGIBIN_SUBDIR fcgi-bin) + SET (QGIS_CGIBIN_SUBDIR_REV ..) + SET (DEFAULT_LIB_SUBDIR lib) + SET (QGIS_LIB_SUBDIR_REV ..) + SET (QGIS_FW_SUBDIR ../Frameworks) + SET (QGIS_FW_SUBDIR_REV ../MacOS) + SET (DEFAULT_DATA_SUBDIR ../Resources) + SET (QGIS_DATA_SUBDIR_REV ../MacOS) + SET (DEFAULT_LIBEXEC_SUBDIR lib/qgis) + SET (QGIS_LIBEXEC_SUBDIR_REV ../..) + SET (DEFAULT_PLUGIN_SUBDIR ../PlugIns/qgis) + SET (QGIS_PLUGIN_SUBDIR_REV ../../MacOS) + SET (DEFAULT_INCLUDE_SUBDIR include/qgis) + + ELSE (APPLE) + # UNIX SET (DEFAULT_BIN_SUBDIR bin) SET (DEFAULT_CGIBIN_SUBDIR bin) SET (DEFAULT_LIB_SUBDIR lib${LIB_SUFFIX}) @@ -283,6 +317,7 @@ ELSE (WIN32) SET (DEFAULT_LIBEXEC_SUBDIR lib${LIB_SUFFIX}/qgis) SET (DEFAULT_PLUGIN_SUBDIR lib${LIB_SUFFIX}/qgis/plugins) SET (DEFAULT_INCLUDE_SUBDIR include/qgis) + ENDIF (APPLE) ENDIF (WIN32) @@ -334,7 +369,7 @@ SET (QGIS_INCLUDE_SUBDIR ${DEFAULT_INCLUDE_SUBDIR} CACHE STRING "Subdirectory wh # mark *_SUBDIR variables as advanced as this is not something # that an average user would use -MARK_AS_ADVANCED (QGIS_BIN_SUBDIR QGIS_LIB_SUBDIR QGIS_LIBEXEC_SUBDIR QGIS_DATA_SUBDIR QGIS_PLUGIN_SUBDIR QGIS_INCLUDE_SUBDIR) +MARK_AS_ADVANCED (QGIS_BIN_SUBDIR QGIS_CGIBIN_SUBDIR QGIS_LIB_SUBDIR QGIS_LIBEXEC_SUBDIR QGIS_DATA_SUBDIR QGIS_PLUGIN_SUBDIR QGIS_INCLUDE_SUBDIR) # full paths for the installation SET (QGIS_BIN_DIR ${QGIS_BIN_SUBDIR}) @@ -442,6 +477,11 @@ IF (ENABLE_TESTS) SUBDIRS(tests) ENDIF (ENABLE_TESTS) +IF (APPLE) + # must be last for install, so install_name_tool can do its work + SUBDIRS (mac) +ENDIF (APPLE) + ############################################################# # install stuff @@ -449,11 +489,10 @@ INSTALL (FILES AUTHORS CONTRIBUTORS SPONSORS DONORS TRANSLATORS INSTALL CODING DESTINATION ${QGIS_DATA_DIR}/doc) # manual page - makes sense only on unix systems -IF (UNIX) +IF (UNIX AND NOT APPLE) INSTALL (FILES qgis.1 qgis_help.1 DESTINATION ${QGIS_MANUAL_DIR}/man1) -ENDIF (UNIX) - +ENDIF (UNIX AND NOT APPLE) ############################################################# # Uninstall stuff see: http://www.vtk.org/Wiki/CMake_FAQ diff --git a/cmake/FindGDAL.cmake b/cmake/FindGDAL.cmake index b0556b909fb3..eb85512edf53 100644 --- a/cmake/FindGDAL.cmake +++ b/cmake/FindGDAL.cmake @@ -38,98 +38,112 @@ ELSE(WIN32) IF(UNIX) # try to use framework on mac + # want clean framework path, not unix compatibility path IF (APPLE) - SET (GDAL_MAC_PATH /Library/Frameworks/GDAL.framework/Programs) + IF (CMAKE_FIND_FRAMEWORK MATCHES "FIRST" + OR CMAKE_FRAMEWORK_PATH MATCHES "ONLY" + OR NOT CMAKE_FIND_FRAMEWORK) + SET (CMAKE_FIND_FRAMEWORK_save ${CMAKE_FIND_FRAMEWORK} CACHE STRING "" FORCE) + SET (CMAKE_FIND_FRAMEWORK "ONLY" CACHE STRING "" FORCE) + FIND_LIBRARY(GDAL_LIBRARY GDAL) + IF (GDAL_LIBRARY) + # they're all the same in a framework + SET (GDAL_INCLUDE_DIR ${GDAL_LIBRARY}/Headers CACHE PATH "Path to a file.") + SET (GDAL_CONFIG ${GDAL_LIBRARY}/Programs/geos-config CACHE FILEPATH "Path to a program.") + ENDIF (GDAL_LIBRARY) + SET (CMAKE_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK_save} CACHE STRING "" FORCE) + ENDIF () ENDIF (APPLE) - SET(GDAL_CONFIG_PREFER_PATH "$ENV{GDAL_HOME}/bin" CACHE STRING "preferred path to GDAL (gdal-config)") - SET(GDAL_CONFIG_PREFER_FWTOOLS_PATH "$ENV{FWTOOLS_HOME}/bin_safe" CACHE STRING "preferred path to GDAL (gdal-config) from FWTools") - FIND_PROGRAM(GDAL_CONFIG gdal-config - ${GDAL_CONFIG_PREFER_PATH} - ${GDAL_CONFIG_PREFER_FWTOOLS_PATH} - ${GDAL_MAC_PATH} - /usr/local/bin/ - /usr/bin/ - ) - # MESSAGE("DBG GDAL_CONFIG ${GDAL_CONFIG}") + IF (NOT GDAL_INCLUDE_DIR AND NOT GDAL_LIBRARY AND NOT GDAL_CONFIG) + # didn't find OS X framework, and was not set by user + SET(GDAL_CONFIG_PREFER_PATH "$ENV{GDAL_HOME}/bin" CACHE STRING "preferred path to GDAL (gdal-config)") + SET(GDAL_CONFIG_PREFER_FWTOOLS_PATH "$ENV{FWTOOLS_HOME}/bin_safe" CACHE STRING "preferred path to GDAL (gdal-config) from FWTools") + FIND_PROGRAM(GDAL_CONFIG gdal-config + ${GDAL_CONFIG_PREFER_PATH} + ${GDAL_CONFIG_PREFER_FWTOOLS_PATH} + /usr/local/bin/ + /usr/bin/ + ) + # MESSAGE("DBG GDAL_CONFIG ${GDAL_CONFIG}") - IF (GDAL_CONFIG) - - ## extract gdal version - EXEC_PROGRAM(${GDAL_CONFIG} - ARGS --version - OUTPUT_VARIABLE GDAL_VERSION ) - STRING(REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)" "\\1" GDAL_VERSION_MAJOR "${GDAL_VERSION}") - STRING(REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)" "\\2" GDAL_VERSION_MINOR "${GDAL_VERSION}") + IF (GDAL_CONFIG) + + ## extract gdal version + EXEC_PROGRAM(${GDAL_CONFIG} + ARGS --version + OUTPUT_VARIABLE GDAL_VERSION ) + STRING(REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)" "\\1" GDAL_VERSION_MAJOR "${GDAL_VERSION}") + STRING(REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)" "\\2" GDAL_VERSION_MINOR "${GDAL_VERSION}") - # MESSAGE("DBG GDAL_VERSION ${GDAL_VERSION}") - # MESSAGE("DBG GDAL_VERSION_MAJOR ${GDAL_VERSION_MAJOR}") - # MESSAGE("DBG GDAL_VERSION_MINOR ${GDAL_VERSION_MINOR}") + # MESSAGE("DBG GDAL_VERSION ${GDAL_VERSION}") + # MESSAGE("DBG GDAL_VERSION_MAJOR ${GDAL_VERSION_MAJOR}") + # MESSAGE("DBG GDAL_VERSION_MINOR ${GDAL_VERSION_MINOR}") - # check for gdal version - # version 1.2.5 is known NOT to be supported (missing CPL_STDCALL macro) - # According to INSTALL, 1.4.0+ is required - IF (GDAL_VERSION_MAJOR LESS 1 OR GDAL_VERSION_MINOR LESS 4) + # check for gdal version + # version 1.2.5 is known NOT to be supported (missing CPL_STDCALL macro) + # According to INSTALL, 1.4.0+ is required + IF (GDAL_VERSION_MAJOR LESS 1 OR GDAL_VERSION_MINOR LESS 4) MESSAGE (FATAL_ERROR "GDAL version is too old (${GDAL_VERSION}). Use 1.4.0 or higher.") - ENDIF (GDAL_VERSION_MAJOR LESS 1 OR GDAL_VERSION_MINOR LESS 4) - - # set INCLUDE_DIR to prefix+include - EXEC_PROGRAM(${GDAL_CONFIG} - ARGS --prefix - OUTPUT_VARIABLE GDAL_PREFIX) - #SET(GDAL_INCLUDE_DIR ${GDAL_PREFIX}/include CACHE STRING INTERNAL) - FIND_PATH(GDAL_INCLUDE_DIR - gdal.h - ${GDAL_PREFIX}/include/gdal - ${GDAL_PREFIX}/include - /usr/local/include - /usr/include - ) - - ## extract link dirs for rpath - EXEC_PROGRAM(${GDAL_CONFIG} - ARGS --libs - OUTPUT_VARIABLE GDAL_CONFIG_LIBS ) - - ## split off the link dirs (for rpath) - ## use regular expression to match wildcard equivalent "-L*" - ## with is a space or a semicolon - STRING(REGEX MATCHALL "[-][L]([^ ;])+" - GDAL_LINK_DIRECTORIES_WITH_PREFIX - "${GDAL_CONFIG_LIBS}" ) + ENDIF (GDAL_VERSION_MAJOR LESS 1 OR GDAL_VERSION_MINOR LESS 4) + + # set INCLUDE_DIR to prefix+include + EXEC_PROGRAM(${GDAL_CONFIG} + ARGS --prefix + OUTPUT_VARIABLE GDAL_PREFIX) + #SET(GDAL_INCLUDE_DIR ${GDAL_PREFIX}/include CACHE STRING INTERNAL) + FIND_PATH(GDAL_INCLUDE_DIR + gdal.h + ${GDAL_PREFIX}/include/gdal + ${GDAL_PREFIX}/include + /usr/local/include + /usr/include + ) + + ## extract link dirs for rpath + EXEC_PROGRAM(${GDAL_CONFIG} + ARGS --libs + OUTPUT_VARIABLE GDAL_CONFIG_LIBS ) + + ## split off the link dirs (for rpath) + ## use regular expression to match wildcard equivalent "-L*" + ## with is a space or a semicolon + STRING(REGEX MATCHALL "[-][L]([^ ;])+" + GDAL_LINK_DIRECTORIES_WITH_PREFIX + "${GDAL_CONFIG_LIBS}" ) # MESSAGE("DBG GDAL_LINK_DIRECTORIES_WITH_PREFIX=${GDAL_LINK_DIRECTORIES_WITH_PREFIX}") - ## remove prefix -L because we need the pure directory for LINK_DIRECTORIES + ## remove prefix -L because we need the pure directory for LINK_DIRECTORIES - IF (GDAL_LINK_DIRECTORIES_WITH_PREFIX) - STRING(REGEX REPLACE "[-][L]" "" GDAL_LINK_DIRECTORIES ${GDAL_LINK_DIRECTORIES_WITH_PREFIX} ) - ENDIF (GDAL_LINK_DIRECTORIES_WITH_PREFIX) - - ## split off the name - ## use regular expression to match wildcard equivalent "-l*" - ## with is a space or a semicolon - STRING(REGEX MATCHALL "[-][l]([^ ;])+" - GDAL_LIB_NAME_WITH_PREFIX - "${GDAL_CONFIG_LIBS}" ) + IF (GDAL_LINK_DIRECTORIES_WITH_PREFIX) + STRING(REGEX REPLACE "[-][L]" "" GDAL_LINK_DIRECTORIES ${GDAL_LINK_DIRECTORIES_WITH_PREFIX} ) + ENDIF (GDAL_LINK_DIRECTORIES_WITH_PREFIX) + + ## split off the name + ## use regular expression to match wildcard equivalent "-l*" + ## with is a space or a semicolon + STRING(REGEX MATCHALL "[-][l]([^ ;])+" + GDAL_LIB_NAME_WITH_PREFIX + "${GDAL_CONFIG_LIBS}" ) # MESSAGE("DBG GDAL_LIB_NAME_WITH_PREFIX=${GDAL_LIB_NAME_WITH_PREFIX}") - ## remove prefix -l because we need the pure name + ## remove prefix -l because we need the pure name - IF (GDAL_LIB_NAME_WITH_PREFIX) - STRING(REGEX REPLACE "[-][l]" "" GDAL_LIB_NAME ${GDAL_LIB_NAME_WITH_PREFIX} ) - ENDIF (GDAL_LIB_NAME_WITH_PREFIX) - - IF (APPLE) - SET(GDAL_LIBRARY ${GDAL_LINK_DIRECTORIES}/lib${GDAL_LIB_NAME}.dylib CACHE STRING INTERNAL) - ELSE (APPLE) - SET(GDAL_LIBRARY ${GDAL_LINK_DIRECTORIES}/lib${GDAL_LIB_NAME}.so CACHE STRING INTERNAL) - ENDIF (APPLE) + IF (GDAL_LIB_NAME_WITH_PREFIX) + STRING(REGEX REPLACE "[-][l]" "" GDAL_LIB_NAME ${GDAL_LIB_NAME_WITH_PREFIX} ) + ENDIF (GDAL_LIB_NAME_WITH_PREFIX) + + IF (APPLE) + SET(GDAL_LIBRARY ${GDAL_LINK_DIRECTORIES}/lib${GDAL_LIB_NAME}.dylib CACHE STRING INTERNAL) + ELSE (APPLE) + SET(GDAL_LIBRARY ${GDAL_LINK_DIRECTORIES}/lib${GDAL_LIB_NAME}.so CACHE STRING INTERNAL) + ENDIF (APPLE) - ELSE(GDAL_CONFIG) - MESSAGE("FindGDAL.cmake: gdal-config not found. Please set it manually. GDAL_CONFIG=${GDAL_CONFIG}") - ENDIF(GDAL_CONFIG) - + ELSE(GDAL_CONFIG) + MESSAGE("FindGDAL.cmake: gdal-config not found. Please set it manually. GDAL_CONFIG=${GDAL_CONFIG}") + ENDIF(GDAL_CONFIG) + ENDIF (NOT GDAL_INCLUDE_DIR AND NOT GDAL_LIBRARY AND NOT GDAL_CONFIG) ENDIF(UNIX) ENDIF(WIN32) diff --git a/cmake/FindGEOS.cmake b/cmake/FindGEOS.cmake index 6cce0a0bc473..cc55b67cfc0e 100644 --- a/cmake/FindGEOS.cmake +++ b/cmake/FindGEOS.cmake @@ -43,91 +43,105 @@ ELSE(WIN32) IF(UNIX) # try to use framework on mac + # want clean framework path, not unix compatibility path IF (APPLE) - SET (GEOS_MAC_PATH /Library/Frameworks/GEOS.framework/unix/bin) + IF (CMAKE_FIND_FRAMEWORK MATCHES "FIRST" + OR CMAKE_FRAMEWORK_PATH MATCHES "ONLY" + OR NOT CMAKE_FIND_FRAMEWORK) + SET (CMAKE_FIND_FRAMEWORK_save ${CMAKE_FIND_FRAMEWORK} CACHE STRING "" FORCE) + SET (CMAKE_FIND_FRAMEWORK "ONLY" CACHE STRING "" FORCE) + FIND_LIBRARY(GEOS_LIBRARY GEOS) + IF (GEOS_LIBRARY) + # they're all the same in a framework + SET (GEOS_INCLUDE_DIR ${GEOS_LIBRARY}/Headers CACHE PATH "Path to a file.") + SET (GEOS_CONFIG ${GEOS_LIBRARY}/Programs/geos-config CACHE FILEPATH "Path to a program.") + ENDIF (GEOS_LIBRARY) + SET (CMAKE_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK_save} CACHE STRING "" FORCE) + ENDIF () ENDIF (APPLE) - SET(GEOS_CONFIG_PREFER_PATH "$ENV{GEOS_HOME}/bin" CACHE STRING "preferred path to GEOS (geos-config)") - FIND_PROGRAM(GEOS_CONFIG geos-config - ${GEOS_CONFIG_PREFER_PATH} - ${GEOS_MAC_PATH} - /usr/local/bin/ - /usr/bin/ - ) - #MESSAGE("DBG GEOS_CONFIG ${GEOS_CONFIG}") - - IF (GEOS_CONFIG) + IF (NOT GEOS_INCLUDE_DIR AND NOT GEOS_LIBRARY AND NOT GEOS_CONFIG) + # didn't find OS X framework, and was not set by user + SET(GEOS_CONFIG_PREFER_PATH "$ENV{GEOS_HOME}/bin" CACHE STRING "preferred path to GEOS (geos-config)") + FIND_PROGRAM(GEOS_CONFIG geos-config + ${GEOS_CONFIG_PREFER_PATH} + /usr/local/bin/ + /usr/bin/ + ) + #MESSAGE("DBG GEOS_CONFIG ${GEOS_CONFIG}") + + IF (GEOS_CONFIG) - EXEC_PROGRAM(${GEOS_CONFIG} - ARGS --version - OUTPUT_VARIABLE GEOS_VERSION) - STRING(REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)" "\\1" GEOS_VERSION_MAJOR "${GEOS_VERSION}") - STRING(REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)" "\\2" GEOS_VERSION_MINOR "${GEOS_VERSION}") + EXEC_PROGRAM(${GEOS_CONFIG} + ARGS --version + OUTPUT_VARIABLE GEOS_VERSION) + STRING(REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)" "\\1" GEOS_VERSION_MAJOR "${GEOS_VERSION}") + STRING(REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)" "\\2" GEOS_VERSION_MINOR "${GEOS_VERSION}") - IF (GEOS_VERSION_MAJOR LESS 3) + IF (GEOS_VERSION_MAJOR LESS 3) MESSAGE (FATAL_ERROR "GEOS version is too old (${GEOS_VERSION}). Use 3.0.0 or higher.") - ENDIF (GEOS_VERSION_MAJOR LESS 3) + ENDIF (GEOS_VERSION_MAJOR LESS 3) - # set INCLUDE_DIR to prefix+include - EXEC_PROGRAM(${GEOS_CONFIG} - ARGS --prefix - OUTPUT_VARIABLE GEOS_PREFIX) - - FIND_PATH(GEOS_INCLUDE_DIR - geos_c.h - ${GEOS_PREFIX}/include - /usr/local/include - /usr/include - ) - - ## extract link dirs for rpath - EXEC_PROGRAM(${GEOS_CONFIG} - ARGS --libs - OUTPUT_VARIABLE GEOS_CONFIG_LIBS ) - - ## split off the link dirs (for rpath) - ## use regular expression to match wildcard equivalent "-L*" - ## with is a space or a semicolon - STRING(REGEX MATCHALL "[-][L]([^ ;])+" - GEOS_LINK_DIRECTORIES_WITH_PREFIX - "${GEOS_CONFIG_LIBS}" ) - #MESSAGE("DBG GEOS_LINK_DIRECTORIES_WITH_PREFIX=${GEOS_LINK_DIRECTORIES_WITH_PREFIX}") - - ## remove prefix -L because we need the pure directory for LINK_DIRECTORIES + # set INCLUDE_DIR to prefix+include + EXEC_PROGRAM(${GEOS_CONFIG} + ARGS --prefix + OUTPUT_VARIABLE GEOS_PREFIX) + + FIND_PATH(GEOS_INCLUDE_DIR + geos_c.h + ${GEOS_PREFIX}/include + /usr/local/include + /usr/include + ) + + ## extract link dirs for rpath + EXEC_PROGRAM(${GEOS_CONFIG} + ARGS --libs + OUTPUT_VARIABLE GEOS_CONFIG_LIBS ) + + ## split off the link dirs (for rpath) + ## use regular expression to match wildcard equivalent "-L*" + ## with is a space or a semicolon + STRING(REGEX MATCHALL "[-][L]([^ ;])+" + GEOS_LINK_DIRECTORIES_WITH_PREFIX + "${GEOS_CONFIG_LIBS}" ) + #MESSAGE("DBG GEOS_LINK_DIRECTORIES_WITH_PREFIX=${GEOS_LINK_DIRECTORIES_WITH_PREFIX}") + + ## remove prefix -L because we need the pure directory for LINK_DIRECTORIES - IF (GEOS_LINK_DIRECTORIES_WITH_PREFIX) - STRING(REGEX REPLACE "[-][L]" "" GEOS_LINK_DIRECTORIES ${GEOS_LINK_DIRECTORIES_WITH_PREFIX} ) - ENDIF (GEOS_LINK_DIRECTORIES_WITH_PREFIX) - - ### XXX - mloskot: geos-config --libs does not return -lgeos_c, so set it manually - ## split off the name - ## use regular expression to match wildcard equivalent "-l*" - ## with is a space or a semicolon - #STRING(REGEX MATCHALL "[-][l]([^ ;])+" - # GEOS_LIB_NAME_WITH_PREFIX - # "${GEOS_CONFIG_LIBS}" ) - #MESSAGE("DBG GEOS_CONFIG_LIBS=${GEOS_CONFIG_LIBS}") - #MESSAGE("DBG GEOS_LIB_NAME_WITH_PREFIX=${GEOS_LIB_NAME_WITH_PREFIX}") - SET(GEOS_LIB_NAME_WITH_PREFIX -lgeos_c CACHE STRING INTERNAL) - - ## remove prefix -l because we need the pure name + IF (GEOS_LINK_DIRECTORIES_WITH_PREFIX) + STRING(REGEX REPLACE "[-][L]" "" GEOS_LINK_DIRECTORIES ${GEOS_LINK_DIRECTORIES_WITH_PREFIX} ) + ENDIF (GEOS_LINK_DIRECTORIES_WITH_PREFIX) + + ### XXX - mloskot: geos-config --libs does not return -lgeos_c, so set it manually + ## split off the name + ## use regular expression to match wildcard equivalent "-l*" + ## with is a space or a semicolon + #STRING(REGEX MATCHALL "[-][l]([^ ;])+" + # GEOS_LIB_NAME_WITH_PREFIX + # "${GEOS_CONFIG_LIBS}" ) + #MESSAGE("DBG GEOS_CONFIG_LIBS=${GEOS_CONFIG_LIBS}") + #MESSAGE("DBG GEOS_LIB_NAME_WITH_PREFIX=${GEOS_LIB_NAME_WITH_PREFIX}") + SET(GEOS_LIB_NAME_WITH_PREFIX -lgeos_c CACHE STRING INTERNAL) + + ## remove prefix -l because we need the pure name - IF (GEOS_LIB_NAME_WITH_PREFIX) - STRING(REGEX REPLACE "[-][l]" "" GEOS_LIB_NAME ${GEOS_LIB_NAME_WITH_PREFIX} ) - ENDIF (GEOS_LIB_NAME_WITH_PREFIX) - #MESSAGE("DBG GEOS_LIB_NAME=${GEOS_LIB_NAME}") - - IF (APPLE) - SET(GEOS_LIBRARY ${GEOS_LINK_DIRECTORIES}/lib${GEOS_LIB_NAME}.dylib CACHE STRING INTERNAL) - ELSE (APPLE) - SET(GEOS_LIBRARY ${GEOS_LINK_DIRECTORIES}/lib${GEOS_LIB_NAME}.so CACHE STRING INTERNAL) - ENDIF (APPLE) - #MESSAGE("DBG GEOS_LIBRARY=${GEOS_LIBRARY}") + IF (GEOS_LIB_NAME_WITH_PREFIX) + STRING(REGEX REPLACE "[-][l]" "" GEOS_LIB_NAME ${GEOS_LIB_NAME_WITH_PREFIX} ) + ENDIF (GEOS_LIB_NAME_WITH_PREFIX) + #MESSAGE("DBG GEOS_LIB_NAME=${GEOS_LIB_NAME}") + + IF (APPLE) + SET(GEOS_LIBRARY ${GEOS_LINK_DIRECTORIES}/lib${GEOS_LIB_NAME}.dylib CACHE STRING INTERNAL) + ELSE (APPLE) + SET(GEOS_LIBRARY ${GEOS_LINK_DIRECTORIES}/lib${GEOS_LIB_NAME}.so CACHE STRING INTERNAL) + ENDIF (APPLE) + #MESSAGE("DBG GEOS_LIBRARY=${GEOS_LIBRARY}") - ELSE(GEOS_CONFIG) - MESSAGE("FindGEOS.cmake: geos-config not found. Please set it manually. GEOS_CONFIG=${GEOS_CONFIG}") - ENDIF(GEOS_CONFIG) - + ELSE(GEOS_CONFIG) + MESSAGE("FindGEOS.cmake: geos-config not found. Please set it manually. GEOS_CONFIG=${GEOS_CONFIG}") + ENDIF(GEOS_CONFIG) + ENDIF(NOT GEOS_INCLUDE_DIR AND NOT GEOS_LIBRARY AND NOT GEOS_CONFIG) ENDIF(UNIX) ENDIF(WIN32) diff --git a/cmake/FindGSL.cmake b/cmake/FindGSL.cmake index 35334e578d02..7d218f032247 100644 --- a/cmake/FindGSL.cmake +++ b/cmake/FindGSL.cmake @@ -49,70 +49,87 @@ IF(WIN32) SET (GSL_LIBRARIES ${GSL_LIB} ${GSLCBLAS_LIB}) ELSE(WIN32) IF(UNIX) + # try to use framework on mac + # want clean framework path, not unix compatibility path IF (APPLE) - SET (GSL_MAC_PATH /Library/Frameworks/GSL.framework/Programs) + IF (CMAKE_FIND_FRAMEWORK MATCHES "FIRST" + OR CMAKE_FRAMEWORK_PATH MATCHES "ONLY" + OR NOT CMAKE_FIND_FRAMEWORK) + SET (CMAKE_FIND_FRAMEWORK_save ${CMAKE_FIND_FRAMEWORK} CACHE STRING "" FORCE) + SET (CMAKE_FIND_FRAMEWORK "ONLY" CACHE STRING "" FORCE) + FIND_LIBRARY(GSL_LIBRARIES GSL) + IF (GSL_LIBRARIES) + # they're all the same in a framework + SET (GSL_PREFIX ${GSL_LIBRARIES}) + SET (GSL_INCLUDE_DIR ${GSL_LIBRARIES}/Headers CACHE PATH "Path to a file.") + SET (GSL_CONFIG ${GSL_LIBRARIES}/Programs/gsl-config CACHE FILEPATH "Path to a program.") + ENDIF (GSL_LIBRARIES) + SET (CMAKE_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK_save} CACHE STRING "" FORCE) + ENDIF () ENDIF (APPLE) - SET(GSL_CONFIG_PREFER_PATH "$ENV{GSL_HOME}/bin" CACHE STRING "preferred path to GSL (gsl-config)") - FIND_PROGRAM(GSL_CONFIG gsl-config - ${GSL_CONFIG_PREFER_PATH} - ${GSL_MAC_PATH} - /usr/local/bin/ - /usr/bin/ - ) - # MESSAGE("DBG GSL_CONFIG ${GSL_CONFIG}") - - IF (GSL_CONFIG) - # set CXXFLAGS to be fed into CXX_FLAGS by the user: - SET(GSL_CXX_FLAGS "`${GSL_CONFIG} --cflags`") + + IF (NOT GSL_INCLUDE_DIR AND NOT GSL_LIBRARIES AND NOT GSL_CONFIG) + # didn't find OS X framework, or was set by user + SET(GSL_CONFIG_PREFER_PATH "$ENV{GSL_HOME}/bin" CACHE STRING "preferred path to GSL (gsl-config)") + FIND_PROGRAM(GSL_CONFIG gsl-config + ${GSL_CONFIG_PREFER_PATH} + /usr/local/bin/ + /usr/bin/ + ) + # MESSAGE("DBG GSL_CONFIG ${GSL_CONFIG}") + + IF (GSL_CONFIG) + # set CXXFLAGS to be fed into CXX_FLAGS by the user: + SET(GSL_CXX_FLAGS "`${GSL_CONFIG} --cflags`") - # set INCLUDE_DIRS to prefix+include - EXEC_PROGRAM(${GSL_CONFIG} - ARGS --prefix - OUTPUT_VARIABLE GSL_PREFIX) - SET(GSL_INCLUDE_DIR ${GSL_PREFIX}/include CACHE STRING INTERNAL) - - # set link libraries and link flags - EXEC_PROGRAM(${GSL_CONFIG} - ARGS --libs - OUTPUT_VARIABLE GSL_LIBRARIES) + # set INCLUDE_DIRS to prefix+include + EXEC_PROGRAM(${GSL_CONFIG} + ARGS --prefix + OUTPUT_VARIABLE GSL_PREFIX) + SET(GSL_INCLUDE_DIR ${GSL_PREFIX}/include CACHE STRING INTERNAL) + + # set link libraries and link flags + EXEC_PROGRAM(${GSL_CONFIG} + ARGS --libs + OUTPUT_VARIABLE GSL_LIBRARIES) - ## extract link dirs for rpath - EXEC_PROGRAM(${GSL_CONFIG} - ARGS ${LIBS_ARG} - OUTPUT_VARIABLE GSL_CONFIG_LIBS ) - - ## split off the link dirs (for rpath) - ## use regular expression to match wildcard equivalent "-L*" - ## with is a space or a semicolon - STRING(REGEX MATCHALL "[-][L]([^ ;])+" - GSL_LINK_DIRECTORIES_WITH_PREFIX - "${GSL_CONFIG_LIBS}" ) + ## extract link dirs for rpath + EXEC_PROGRAM(${GSL_CONFIG} + ARGS ${LIBS_ARG} + OUTPUT_VARIABLE GSL_CONFIG_LIBS ) + + ## split off the link dirs (for rpath) + ## use regular expression to match wildcard equivalent "-L*" + ## with is a space or a semicolon + STRING(REGEX MATCHALL "[-][L]([^ ;])+" + GSL_LINK_DIRECTORIES_WITH_PREFIX + "${GSL_CONFIG_LIBS}" ) # MESSAGE("DBG GSL_LINK_DIRECTORIES_WITH_PREFIX=${GSL_LINK_DIRECTORIES_WITH_PREFIX}") - ## remove prefix -L because we need the pure directory for LINK_DIRECTORIES + ## remove prefix -L because we need the pure directory for LINK_DIRECTORIES - IF (GSL_LINK_DIRECTORIES_WITH_PREFIX) - STRING(REGEX REPLACE "[-][L]" "" GSL_LINK_DIRECTORIES ${GSL_LINK_DIRECTORIES_WITH_PREFIX} ) - ENDIF (GSL_LINK_DIRECTORIES_WITH_PREFIX) - SET(GSL_EXE_LINKER_FLAGS "-Wl,-rpath,${GSL_LINK_DIRECTORIES}" CACHE STRING INTERNAL) - # MESSAGE("DBG GSL_LINK_DIRECTORIES=${GSL_LINK_DIRECTORIES}") - # MESSAGE("DBG GSL_EXE_LINKER_FLAGS=${GSL_EXE_LINKER_FLAGS}") - - # ADD_DEFINITIONS("-DHAVE_GSL") - # SET(GSL_DEFINITIONS "-DHAVE_GSL") - MARK_AS_ADVANCED( - GSL_CXX_FLAGS - GSL_INCLUDE_DIR - GSL_LIBRARIES - GSL_LINK_DIRECTORIES - GSL_DEFINITIONS - ) + IF (GSL_LINK_DIRECTORIES_WITH_PREFIX) + STRING(REGEX REPLACE "[-][L]" "" GSL_LINK_DIRECTORIES ${GSL_LINK_DIRECTORIES_WITH_PREFIX} ) + ENDIF (GSL_LINK_DIRECTORIES_WITH_PREFIX) + SET(GSL_EXE_LINKER_FLAGS "-Wl,-rpath,${GSL_LINK_DIRECTORIES}" CACHE STRING INTERNAL) + # MESSAGE("DBG GSL_LINK_DIRECTORIES=${GSL_LINK_DIRECTORIES}") + # MESSAGE("DBG GSL_EXE_LINKER_FLAGS=${GSL_EXE_LINKER_FLAGS}") + + # ADD_DEFINITIONS("-DHAVE_GSL") + # SET(GSL_DEFINITIONS "-DHAVE_GSL") + MARK_AS_ADVANCED( + GSL_CXX_FLAGS + GSL_INCLUDE_DIR + GSL_LIBRARIES + GSL_LINK_DIRECTORIES + GSL_DEFINITIONS + ) - ELSE(GSL_CONFIG) - MESSAGE("FindGSL.cmake: gsl-config not found. Please set it manually. GSL_CONFIG=${GSL_CONFIG}") - ENDIF(GSL_CONFIG) - + ELSE(GSL_CONFIG) + MESSAGE("FindGSL.cmake: gsl-config not found. Please set it manually. GSL_CONFIG=${GSL_CONFIG}") + ENDIF(GSL_CONFIG) + ENDIF (NOT GSL_INCLUDE_DIR AND NOT GSL_LIBRARIES AND NOT GSL_CONFIG) ENDIF(UNIX) ENDIF(WIN32) diff --git a/cmake/FindProj.cmake b/cmake/FindProj.cmake index 5d33a991f974..2fe0fa63c704 100644 --- a/cmake/FindProj.cmake +++ b/cmake/FindProj.cmake @@ -19,14 +19,26 @@ # searching for the same item do nothing. # try to use framework on mac +# want clean framework path, not unix compatibility path IF (APPLE) - SET (PROJ_MAC_INC_PATH /Library/Frameworks/PROJ.framework/Headers) + IF (CMAKE_FIND_FRAMEWORK MATCHES "FIRST" + OR CMAKE_FRAMEWORK_PATH MATCHES "ONLY" + OR NOT CMAKE_FIND_FRAMEWORK) + SET (CMAKE_FIND_FRAMEWORK_save ${CMAKE_FIND_FRAMEWORK} CACHE STRING "" FORCE) + SET (CMAKE_FIND_FRAMEWORK "ONLY" CACHE STRING "" FORCE) + #FIND_PATH(PROJ_INCLUDE_DIR PROJ/proj_api.h) + FIND_LIBRARY(PROJ_LIBRARY PROJ) + IF (PROJ_LIBRARY) + # FIND_PATH doesn't add "Headers" for a framework + SET (PROJ_INCLUDE_DIR ${PROJ_LIBRARY}/Headers CACHE PATH "Path to a file.") + ENDIF (PROJ_LIBRARY) + SET (CMAKE_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK_save} CACHE STRING "" FORCE) + ENDIF () ENDIF (APPLE) FIND_PATH(PROJ_INCLUDE_DIR proj_api.h "$ENV{LIB_DIR}/include/proj" "$ENV{LIB_DIR}/include" - ${PROJ_MAC_INC_PATH} #mingw c:/msys/local/include NO_DEFAULT_PATH diff --git a/cmake/FindPyQt.py b/cmake/FindPyQt.py index 090fba51b2a5..b5f82c940b80 100644 --- a/cmake/FindPyQt.py +++ b/cmake/FindPyQt.py @@ -23,3 +23,4 @@ print("pyqt_sip_dir:%s" % pyqtcfg.pyqt_sip_dir) print("pyqt_sip_flags:%s" % pyqtcfg.pyqt_sip_flags) +print("pyqt_bin_dir:%s" % pyqtcfg.pyqt_bin_dir) diff --git a/cmake/FindPyQt4.cmake b/cmake/FindPyQt4.cmake index 12ac7103f66b..42f802fd5c0a 100644 --- a/cmake/FindPyQt4.cmake +++ b/cmake/FindPyQt4.cmake @@ -37,6 +37,7 @@ ELSE(EXISTS PYQT4_VERSION) STRING(REGEX REPLACE ".*\npyqt_version_num:([^\n]+).*$" "\\1" PYQT4_VERSION_NUM ${pyqt_config}) STRING(REGEX REPLACE ".*\npyqt_sip_dir:([^\n]+).*$" "\\1" PYQT4_SIP_DIR ${pyqt_config}) STRING(REGEX REPLACE ".*\npyqt_sip_flags:([^\n]+).*$" "\\1" PYQT4_SIP_FLAGS ${pyqt_config}) + STRING(REGEX REPLACE ".*\npyqt_bin_dir:([^\n]+).*$" "\\1" PYQT4_BIN_DIR ${pyqt_config}) SET(PYQT4_FOUND TRUE) ENDIF(pyqt_config) diff --git a/cmake/FindSIP.cmake b/cmake/FindSIP.cmake index 1f39b22c778c..c7542200423b 100644 --- a/cmake/FindSIP.cmake +++ b/cmake/FindSIP.cmake @@ -41,6 +41,7 @@ ELSE(SIP_VERSION) STRING(REGEX REPLACE ".*\nsip_bin:([^\n]+).*$" "\\1" SIP_BINARY_PATH ${sip_config}) STRING(REGEX REPLACE ".*\ndefault_sip_dir:([^\n]+).*$" "\\1" SIP_DEFAULT_SIP_DIR ${sip_config}) STRING(REGEX REPLACE ".*\nsip_inc_dir:([^\n]+).*$" "\\1" SIP_INCLUDE_DIR ${sip_config}) + STRING(REGEX REPLACE ".*\nsip_mod_dir:([^\n]+).*$" "\\1" SIP_MOD_DIR ${sip_config}) SET(SIP_FOUND TRUE) ENDIF(sip_config) diff --git a/cmake/FindSIP.py b/cmake/FindSIP.py index e44169b1f0b8..604b9c0947b0 100644 --- a/cmake/FindSIP.py +++ b/cmake/FindSIP.py @@ -14,3 +14,4 @@ print("sip_bin:%s" % sipcfg.sip_bin) print("default_sip_dir:%s" % sipcfg.default_sip_dir) print("sip_inc_dir:%s" % sipcfg.sip_inc_dir) +print("sip_mod_dir:%s" % sipcfg.sip_mod_dir) diff --git a/cmake/FindSPATIALITE.cmake b/cmake/FindSPATIALITE.cmake index adb2430f5735..e6c6662fe708 100644 --- a/cmake/FindSPATIALITE.cmake +++ b/cmake/FindSPATIALITE.cmake @@ -19,11 +19,28 @@ # locations. When an earlier FIND_* succeeds, subsequent FIND_*s # searching for the same item do nothing. +# try to use sqlite framework on mac +# want clean framework path, not unix compatibility path +IF (APPLE) + IF (CMAKE_FIND_FRAMEWORK MATCHES "FIRST" + OR CMAKE_FRAMEWORK_PATH MATCHES "ONLY" + OR NOT CMAKE_FIND_FRAMEWORK) + SET (CMAKE_FIND_FRAMEWORK_save ${CMAKE_FIND_FRAMEWORK} CACHE STRING "" FORCE) + SET (CMAKE_FIND_FRAMEWORK "ONLY" CACHE STRING "" FORCE) + FIND_PATH(SPATIALITE_INCLUDE_DIR SQLite3/spatialite.h) + # if no spatialite header, we don't want sqlite find below to succeed + IF (SPATIALITE_INCLUDE_DIR) + FIND_LIBRARY(SPATIALITE_LIBRARY SQLite3) + # FIND_PATH doesn't add "Headers" for a framework + SET (SPATIALITE_INCLUDE_DIR ${SPATIALITE_LIBRARY}/Headers CACHE PATH "Path to a file." FORCE) + ENDIF (SPATIALITE_INCLUDE_DIR) + SET (CMAKE_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK_save} CACHE STRING "" FORCE) + ENDIF () +ENDIF (APPLE) + FIND_PATH(SPATIALITE_INCLUDE_DIR spatialite.h "$ENV{LIB_DIR}/include" "$ENV{LIB_DIR}/include/spatialite" - # try to use SQLite3 framework on mac, should be set from SQLite3 check - ${SQLITE3_MAC_INC_PATH} #mingw c:/msys/local/include NO_DEFAULT_PATH diff --git a/cmake/FindSqlite3.cmake b/cmake/FindSqlite3.cmake index 2a081eb4be0c..d4964137e794 100644 --- a/cmake/FindSqlite3.cmake +++ b/cmake/FindSqlite3.cmake @@ -20,14 +20,26 @@ # searching for the same item do nothing. # try to use framework on mac +# want clean framework path, not unix compatibility path IF (APPLE) - SET (SQLITE3_MAC_INC_PATH /Library/Frameworks/SQLite3.framework/Headers) + IF (CMAKE_FIND_FRAMEWORK MATCHES "FIRST" + OR CMAKE_FRAMEWORK_PATH MATCHES "ONLY" + OR NOT CMAKE_FIND_FRAMEWORK) + SET (CMAKE_FIND_FRAMEWORK_save ${CMAKE_FIND_FRAMEWORK} CACHE STRING "" FORCE) + SET (CMAKE_FIND_FRAMEWORK "ONLY" CACHE STRING "" FORCE) + #FIND_PATH(SQLITE3_INCLUDE_DIR SQLite3/sqlite3.h) + FIND_LIBRARY(SQLITE3_LIBRARY SQLite3) + IF (SQLITE3_LIBRARY) + # FIND_PATH doesn't add "Headers" for a framework + SET (SQLITE3_INCLUDE_DIR ${SQLITE3_LIBRARY}/Headers CACHE PATH "Path to a file.") + ENDIF (SQLITE3_LIBRARY) + SET (CMAKE_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK_save} CACHE STRING "" FORCE) + ENDIF () ENDIF (APPLE) FIND_PATH(SQLITE3_INCLUDE_DIR sqlite3.h "$ENV{LIB_DIR}/include" "$ENV{LIB_DIR}/include/sqlite" - ${SQLITE3_MAC_INC_PATH} #mingw c:/msys/local/include NO_DEFAULT_PATH diff --git a/mac/CMakeLists.txt b/mac/CMakeLists.txt new file mode 100644 index 000000000000..22c6e00163eb --- /dev/null +++ b/mac/CMakeLists.txt @@ -0,0 +1,30 @@ +# mac bundling must happen at end, so all binaries installed +# and install_names can be adjusted +IF (APPLE) + # for included scripts that set policies (ie OS X bundling) + INSTALL (CODE "cmake_policy(SET CMP0011 NEW)") + CONFIGURE_FILE (cmake/0qgis.cmake.in 0qgis.cmake @ONLY) + INSTALL (SCRIPT ${CMAKE_BINARY_DIR}/mac/0qgis.cmake) + IF (QGIS_MACAPP_BUNDLE GREATER 0) + # start with Qt + CONFIGURE_FILE (cmake/1qt.cmake.in 1qt.cmake @ONLY) + INSTALL (SCRIPT ${CMAKE_BINARY_DIR}/mac/1qt.cmake) + IF (QGIS_MACAPP_BUNDLE GREATER 1) + # next - libs + CONFIGURE_FILE (cmake/2lib.cmake.in 2lib.cmake @ONLY) + INSTALL (SCRIPT ${CMAKE_BINARY_DIR}/mac/2lib.cmake) + IF (QGIS_MACAPP_BUNDLE GREATER 2) + # last - frameworks + CONFIGURE_FILE (cmake/3fw.cmake.in 3fw.cmake @ONLY) + INSTALL (SCRIPT ${CMAKE_BINARY_DIR}/mac/3fw.cmake) + ENDIF (QGIS_MACAPP_BUNDLE GREATER 2) + ENDIF (QGIS_MACAPP_BUNDLE GREATER 1) + ENDIF (QGIS_MACAPP_BUNDLE GREATER 0) + # user bundling + IF (QGIS_MACAPP_BUNDLE_USER) + CONFIGURE_FILE (${QGIS_MACAPP_BUNDLE_USER} 4user.cmake @ONLY) + INSTALL (SCRIPT ${CMAKE_BINARY_DIR}/mac/4user.cmake) + ENDIF (QGIS_MACAPP_BUNDLE_USER) + # tickle app bundle + INSTALL (CODE "EXECUTE_PROCESS(COMMAND touch ${CMAKE_INSTALL_PREFIX}/../../.)") +ENDIF (APPLE) diff --git a/mac/cmake/0qgis.cmake.in b/mac/cmake/0qgis.cmake.in new file mode 100644 index 000000000000..d9afb9ebc111 --- /dev/null +++ b/mac/cmake/0qgis.cmake.in @@ -0,0 +1,71 @@ +# 0qgis - fixup install_names for @loader_path +# ! cmakecache vars not available to external scripts +# so we configure it first to do substitutions +# make sure to use @varname@ + +# kill boolean warnings +CMAKE_POLICY (SET CMP0012 NEW) + +SET (QAPPDIRC "@QGIS_MACAPP_PREFIX@") +SET (QAPPDIR "@CMAKE_INSTALL_PREFIX@") +SET (QFWDIR "${QAPPDIR}/@QGIS_FW_SUBDIR@") +SET (QBINDIR "${QAPPDIR}/@QGIS_BIN_SUBDIR@") +SET (QCGIDIR "${QAPPDIR}/@QGIS_CGIBIN_SUBDIR@") +SET (QLIBDIR "${QAPPDIR}/@QGIS_LIB_SUBDIR@") +SET (QLIBXDIR "${QAPPDIR}/@QGIS_LIBEXEC_SUBDIR@") +SET (QDATADIR "${QAPPDIR}/@QGIS_DATA_SUBDIR@") +SET (QPLUGDIR "${QAPPDIR}/@QGIS_PLUGIN_SUBDIR@") +SET (QGISPYDIR "${QAPPDIR}/@QGIS_DATA_SUBDIR@/python") +# Qt framework version is major version +SET (QT_FWVER @QT_VERSION_MAJOR@) + +# so config-file doesn't try to replace @ +SET (ATEXECUTABLE "@executable_path") +SET (ATLOADER "@loader_path") + +# message only if verbose makefiles (use for install_name_tool echos) +FUNCTION (MYMESSAGE MSG) + IF (@CMAKE_VERBOSE_MAKEFILE@) + MESSAGE (STATUS "${MSG}") + ENDIF (@CMAKE_VERBOSE_MAKEFILE@) +ENDFUNCTION (MYMESSAGE) + +# isntall_name_tool -change CHANGE CHANGETO CHANGEBIN +FUNCTION (INSTALLNAMETOOL_CHANGE CHANGE CHANGETO CHANGEBIN) + MYMESSAGE ("install_name_tool -change ${CHANGE} ${CHANGETO} \"${CHANGEBIN}\"") + EXECUTE_PROCESS (COMMAND install_name_tool -change ${CHANGE} ${CHANGETO} "${CHANGEBIN}") +ENDFUNCTION (INSTALLNAMETOOL_CHANGE) + +FILE (GLOB QGLIBLIST RELATIVE ${QLIBDIR} ${QLIBDIR}/libqgis*.dylib) +FILE (GLOB QGPLUGLIST ${QPLUGDIR}/*.so) +FILE (GLOB QGPYLIST ${QGISPYDIR}/qgis/*.so) + +# assume all install_names start with CMAKE_INSTALL_NAME_DIR +# so we don't have to extract it from binaries +# leave main qgis executable and qgis_help with executable_paths + +IF (@OSX_HAVE_LOADERPATH@) + MESSAGE (STATUS "Updating QGIS library paths...") + # inter-library links - do all combos, many will be noops + FOREACH (QL ${QGLIBLIST}) + FOREACH (QLL ${QGLIBLIST}) + INSTALLNAMETOOL_CHANGE (@CMAKE_INSTALL_NAME_DIR@/${QLL} ${ATLOADER}/${QLL} "${QLIBDIR}/${QL}") + ENDFOREACH (QLL) + ENDFOREACH (QL) + # plugins + FOREACH (QP ${QGPLUGLIST}) + FOREACH (QLL ${QGLIBLIST}) + INSTALLNAMETOOL_CHANGE (@CMAKE_INSTALL_NAME_DIR@/${QLL} ${ATLOADER}/@QGIS_PLUGIN_SUBDIR_REV@/@QGIS_LIB_SUBDIR@/${QLL} "${QP}") + ENDFOREACH (QLL) + ENDFOREACH (QP) + # qgis python + FOREACH (PG ${QGPYLIST}) + FOREACH (QLL ${QGLIBLIST}) + INSTALLNAMETOOL_CHANGE (@CMAKE_INSTALL_NAME_DIR@/${QLL} ${ATLOADER}/../../@QGIS_DATA_SUBDIR_REV@/@QGIS_LIB_SUBDIR@/${QLL} "${PG}") + ENDFOREACH (QLL) + ENDFOREACH (PG) + # qgis-mapserver + FOREACH (QLL ${QGLIBLIST}) + INSTALLNAMETOOL_CHANGE (@CMAKE_INSTALL_NAME_DIR@/${QLL} ${ATEXECUTABLE}/@QGIS_CGIBIN_SUBDIR_REV@/@QGIS_LIB_SUBDIR@/${QLL} "${QCGIDIR}/qgis_mapserv.fcgi") + ENDFOREACH (QLL) +ENDIF (@OSX_HAVE_LOADERPATH@) diff --git a/mac/cmake/1qt.cmake.in b/mac/cmake/1qt.cmake.in new file mode 100644 index 000000000000..a552d92bd415 --- /dev/null +++ b/mac/cmake/1qt.cmake.in @@ -0,0 +1,316 @@ +# 1qt - bundle Qt frameworks and PyQt +# ! cmakecache vars not available to external scripts +# so we configure it first to do substitutions +# make sure to use @varname@ + +# need part of BundleUtilities +INCLUDE (GetPrerequisites) + +# kill boolean warnings +CMAKE_POLICY (SET CMP0012 NEW) + +SET (QAPPDIRC "@QGIS_MACAPP_PREFIX@") +SET (QAPPDIR "@CMAKE_INSTALL_PREFIX@") +#SET (QAPPDIRC "@CMAKE_INSTALL_PREFIX@/@QGIS_APP_NAME@.app/Contents") +#SET (QAPPDIR "${QAPPDIRC}/MacOS") +SET (QFWDIR "${QAPPDIR}/@QGIS_FW_SUBDIR@") +SET (QBINDIR "${QAPPDIR}/@QGIS_BIN_SUBDIR@") +SET (QCGIDIR "${QAPPDIR}/@QGIS_CGIBIN_SUBDIR@") +SET (QLIBDIR "${QAPPDIR}/@QGIS_LIB_SUBDIR@") +SET (QLIBXDIR "${QAPPDIR}/@QGIS_LIBEXEC_SUBDIR@") +SET (QDATADIR "${QAPPDIR}/@QGIS_DATA_SUBDIR@") +SET (QPLUGDIR "${QAPPDIR}/@QGIS_PLUGIN_SUBDIR@") +SET (QGISPYDIR "${QAPPDIR}/@QGIS_DATA_SUBDIR@/python") +# Qt framework version is major version +SET (QT_FWVER @QT_VERSION_MAJOR@) + +# so config-file doesn't try to replace @ +SET (ATEXECUTABLE "@executable_path") +SET (ATLOADER "@loader_path") + +# helper functions + +FUNCTION (GET_INSTALL_NAME LIBFILE LIBNAME OUTVAR) + get_prerequisites ("${LIBFILE}" LIBLIST 1 0 "" "") + FOREACH (L ${LIBLIST}) + STRING (REGEX MATCH ".*${LIBNAME}.+" LL ${L}) + IF (LL) + SET (${OUTVAR} ${LL} PARENT_SCOPE) + ENDIF (LL) + ENDFOREACH () +ENDFUNCTION (GET_INSTALL_NAME) + +# message only if verbose makefiles +FUNCTION (MYMESSAGE MSG) + IF (@CMAKE_VERBOSE_MAKEFILE@) + MESSAGE (STATUS "${MSG}") + ENDIF (@CMAKE_VERBOSE_MAKEFILE@) +ENDFUNCTION (MYMESSAGE) + +# isntall_name_tool -change CHANGE CHANGETO CHANGEBIN +FUNCTION (INSTALLNAMETOOL_CHANGE CHANGE CHANGETO CHANGEBIN) + MYMESSAGE ("install_name_tool -change ${CHANGE} ${CHANGETO} \"${CHANGEBIN}\"") + EXECUTE_PROCESS (COMMAND install_name_tool -change ${CHANGE} ${CHANGETO} "${CHANGEBIN}") +ENDFUNCTION (INSTALLNAMETOOL_CHANGE) + +# build list of Qt frameworks to bundle + +SET (QTLISTQG QtCore QtGui phonon) +SET (PYQTLIST Qt QtCore QtGui phonon) +IF (@QT_USE_QTXML@) + SET (QTLISTQG ${QTLISTQG} QtXml) + SET (PYQTLIST ${PYQTLIST} QtXml) +ENDIF (@QT_USE_QTXML@) +IF (@QT_USE_QTNETWORK@) + SET (QTLISTQG ${QTLISTQG} QtNetwork) + SET (PYQTLIST ${PYQTLIST} QtNetwork) +ENDIF (@QT_USE_QTNETWORK@) +IF (@QT_USE_QTSVG@) + SET (QTLISTQG ${QTLISTQG} QtSvg) + SET (PYQTLIST ${PYQTLIST} QtSvg) +ENDIF (@QT_USE_QTSVG@) +IF (@QT_USE_QTSQL@) + SET (QTLISTQG ${QTLISTQG} QtSql) + SET (PYQTLIST ${PYQTLIST} QtSql) +ENDIF (@QT_USE_QTSQL@) +IF (@QT_USE_QTWEBKIT@) + SET (QTLISTQG ${QTLISTQG} QtWebKit) + SET (PYQTLIST ${PYQTLIST} QtWebKit) + # see if it links QtDBus + EXECUTE_PROCESS (COMMAND otool -L @QT_QTWEBKIT_LIBRARY@/QtWebKit + OUTPUT_VARIABLE QTWEBKIT_DBUS) + IF (QTWEBKIT_DBUS MATCHES ".*QtDBus.framework.*") + SET (QTLISTQG ${QTLISTQG} QtDBus) + ENDIF () + # see if it links QtXmlPatterns + EXECUTE_PROCESS (COMMAND otool -L @QT_QTWEBKIT_LIBRARY@/QtWebKit + OUTPUT_VARIABLE QTWEBKIT_XMLP) + IF (QTWEBKIT_XMLP MATCHES ".*QtXmlPatterns.framework.*") + SET (QTLISTQG ${QTLISTQG} QtXmlPatterns) + SET (PYQTLIST ${PYQTLIST} QtXmlPatterns) + ENDIF () +ENDIF (@QT_USE_QTWEBKIT@) +MYMESSAGE ("Qt list: ${QTLISTQG}") + +# qt arches +FOREACH (QARCH @CMAKE_OSX_ARCHITECTURES@) + SET (QARCHS ${QARCHS} "--arch" "${QARCH}") +ENDFOREACH (QARCH) +MYMESSAGE("Archs: ${QARCHS}") + +# symlinks when only @executable_path used + +IF (NOT @OSX_HAVE_LOADERPATH@) + EXECUTE_PROCESS (COMMAND ln -sfh ../Frameworks "${QAPPDIR}/") + IF (IS_DIRECTORY "${QLIBXIR}/grass/bin") + EXECUTE_PROCESS (COMMAND ln -sfh ../@QGIS_LIBEXEC_SUBDIR_REV@/@QGIS_FW_SUBDIR@ "${QLIBXDIR}/grass/Frameworks") + ENDIF () + EXECUTE_PROCESS (COMMAND ln -sfh ../../../@QGIS_FW_SUBDIR@ "${QBINDIR}/qgis_help.app/Contents/Frameworks") + EXECUTE_PROCESS (COMMAND ln -sfh @QGIS_CGIBIN_SUBDIR_REV@/@QGIS_LIB_SUBDIR@ "${QCGIDIR}/lib") +ENDIF (NOT @OSX_HAVE_LOADERPATH@) + +# Qt frameworks + +MESSAGE (STATUS "Copying Qt frameworks...") +EXECUTE_PROCESS (COMMAND mkdir -p "${QFWDIR}") +FOREACH (QFW ${QTLISTQG}) + IF (NOT IS_DIRECTORY "${QFWDIR}/${QFW}.framework") + # reconstruct framework to avoid excessive copying, then deleting + # especially when debug variants are present + EXECUTE_PROCESS (COMMAND mkdir -p "${QFWDIR}/${QFW}.framework/Versions/${QT_FWVER}") + EXECUTE_PROCESS (COMMAND ln -sfh ${QT_FWVER} "${QFWDIR}/${QFW}.framework/Versions/Current") + MYMESSAGE ("ditto ${QARCHS} \"@QT_LIBRARY_DIR@/${QFW}.framework/Versions/${QT_FWVER}/${QFW}\" \"${QFWDIR}/${QFW}.framework/Versions/${QT_FWVER}/${QFW}\"") + EXECUTE_PROCESS (COMMAND ditto ${QARCHS} "@QT_LIBRARY_DIR@/${QFW}.framework/Versions/${QT_FWVER}/${QFW}" "${QFWDIR}/${QFW}.framework/Versions/${QT_FWVER}/${QFW}") + EXECUTE_PROCESS (COMMAND ln -sf Versions/Current/${QFW} "${QFWDIR}/${QFW}.framework/${QFW}") + IF (IS_DIRECTORY "@QT_LIBRARY_DIR@/${QFW}.framework/Versions/${QT_FWVER}/Resources") + EXECUTE_PROCESS (COMMAND cp -Rfp "@QT_LIBRARY_DIR@/${QFW}.framework/Versions/${QT_FWVER}/Resources" "${QFWDIR}/${QFW}.framework/Versions/${QT_FWVER}") + EXECUTE_PROCESS (COMMAND ln -sfh Versions/Current/Resources "${QFWDIR}/${QFW}.framework/Resources") + ENDIF (IS_DIRECTORY "@QT_LIBRARY_DIR@/${QFW}.framework/Versions/${QT_FWVER}/Resources") + # debug variants + SET (QFWD "${QFW}_debug") + IF (@CMAKE_BUILD_TYPE@ STREQUAL "Debug" AND EXISTS "@QT_LIBRARY_DIR@/${QFW}.framework/Versions/${QT_FWVER}/${QFWD}") + EXECUTE_PROCESS (COMMAND ditto ${QARCHS} "@QT_LIBRARY_DIR@/${QFW}.framework/Versions/${QT_FWVER}/${QFWD}" "${QFWDIR}/${QFW}.framework/Versions/${QT_FWVER}/${QFWD}") + EXECUTE_PROCESS (COMMAND ln -sf Versions/Current/${QFWD} "${QFWDIR}/${QFW}.framework/${QFWD}") + IF (IS_DIRECTORY "@QT_LIBRARY_DIR@/${QFW}.framework/${QFWD}.dSYM") + EXECUTE_PROCESS (COMMAND ditto -X ${QARCHS} "@QT_LIBRARY_DIR@/${QFW}.framework/${QFWD}.dSYM" "${QFWDIR}/${QFW}.framework") + ENDIF () + ENDIF () + ENDIF () +ENDFOREACH (QFW) + +# Qt plugins + +EXECUTE_PROCESS (COMMAND mkdir -p "${QAPPDIRC}/PlugIns/imageformats") +IF (NOT EXISTS "${QAPPDIRC}/PlugIns/imageformats/libqjpeg.dylib") + EXECUTE_PROCESS (COMMAND ditto ${QARCHS} "@QT_PLUGINS_DIR@/imageformats/libqjpeg.dylib" "${QAPPDIRC}/PlugIns/imageformats/libqjpeg.dylib") +ENDIF () +EXECUTE_PROCESS (COMMAND mkdir -p "${QAPPDIRC}/PlugIns/codecs") +FOREACH (QTC cn;jp;kr;tw) + IF (NOT EXISTS "${QAPPDIRC}/PlugIns/codecs/libq${QTC}codecs.dylib") + EXECUTE_PROCESS (COMMAND ditto ${QARCHS} "@QT_PLUGINS_DIR@/codecs/libq${QTC}codecs.dylib" "${QAPPDIRC}/PlugIns/codecs/libq${QTC}codecs.dylib") + ENDIF () +ENDFOREACH (QTC) + +# Qwt +# assumes shared libraries + +MESSAGE (STATUS "Copying Qwt and updating library paths...") +IF (NOT EXISTS "${QLIBDIR}/libqwt.dylib") + EXECUTE_PROCESS (COMMAND ditto ${QARCHS} "@QWT_LIBRARY@" "${QLIBDIR}/libqwt.dylib") + GET_INSTALL_NAME ("@QWT_LIBRARY@" "libqwt" QLIB) + IF (QLIB) + SET (QWT_CHG "${QLIB}") + # default for Qgis and no loader_path + SET (QWT_CHG_TO "${ATEXECUTABLE}/@QGIS_LIB_SUBDIR@/libqwt.dylib") + INSTALLNAMETOOL_CHANGE (${QWT_CHG} ${QWT_CHG_TO} "${QAPPDIR}/Qgis") + ENDIF (QLIB) +ENDIF () + +# PyQt + +MESSAGE (STATUS "Copying PyQt...") +IF (NOT EXISTS "${QGISPYDIR}/sip.so") + MYMESSAGE ("ditto ${QARCHS} \"@SIP_MOD_DIR@/sip.so\" \"${QGISPYDIR}/\"") + EXECUTE_PROCESS (COMMAND ditto ${QARCHS} "@SIP_MOD_DIR@/sip.so" "${QGISPYDIR}/") + EXECUTE_PROCESS (COMMAND cp -fp "@SIP_MOD_DIR@/sipconfig.py" "${QGISPYDIR}/") +ENDIF () +# for now assume "PyQt4" next to SIP +EXECUTE_PROCESS (COMMAND mkdir -p "${QGISPYDIR}/PyQt${QT_FWVER}") +FOREACH (PQ ${PYQTLIST}) + IF (NOT EXISTS "${QGISPYDIR}/PyQt${QT_FWVER}/${PQ}.so") + MYMESSAGE ("ditto ${QARCHS} \"@SIP_MOD_DIR@/PyQt${QT_FWVER}/${PQ}.so\" \"${QGISPYDIR}/PyQt${QT_FWVER}/${PQ}.so\"") + EXECUTE_PROCESS (COMMAND ditto ${QARCHS} "@SIP_MOD_DIR@/PyQt${QT_FWVER}/${PQ}.so" "${QGISPYDIR}/PyQt${QT_FWVER}/${PQ}.so") + ENDIF () +ENDFOREACH (PQ) +FILE (GLOB PQPYLIST "@SIP_MOD_DIR@/PyQt${QT_FWVER}/*.py") +FOREACH (PQPY ${PQPYLIST}) + EXECUTE_PROCESS (COMMAND cp -fp "${PQPY}" "${QGISPYDIR}/PyQt${QT_FWVER}/") +ENDFOREACH (PQPY) +EXECUTE_PROCESS (COMMAND cp -Rfp "@SIP_MOD_DIR@/PyQt${QT_FWVER}/uic" "${QGISPYDIR}/PyQt${QT_FWVER}") + +# PyQt utilities + +FOREACH (PU pylupdate4;pyrcc4) + IF (NOT EXISTS "${QBINDIR}/${PU}") + EXECUTE_PROCESS (COMMAND ditto ${QARCHS} "@PYQT4_BIN_DIR@/${PU}" "${QBINDIR}/") + ENDIF () +ENDFOREACH (PU) +IF (NOT EXISTS "${QBINDIR}/pyuic4") + EXECUTE_PROCESS (COMMAND sed -E "s, /.*/PyQt4/uic/pyuic.py, ${QDATADIR}/python/PyQt4/uic/pyuic.py," "@PYQT4_BIN_DIR@/pyuic4" + OUTPUT_VARIABLE PYUIC_CONTENTS) + FILE (WRITE "${QBINDIR}/pyuic4" "${PYUIC_CONTENTS}") + EXECUTE_PROCESS (COMMAND chmod +x "${QBINDIR}/pyuic4") +ENDIF () + +# PyQwt + +MESSAGE (STATUS "Copying PyQwt and updating library paths...") +EXECUTE_PROCESS (COMMAND mkdir -p "${QGISPYDIR}/PyQt${QT_FWVER}/Qwt5") +IF (NOT EXISTS "${QGISPYDIR}/PyQt${QT_FWVER}/Qwt5/_iqt.so") + EXECUTE_PROCESS (COMMAND ditto ${QARCHS} "@SIP_MOD_DIR@/PyQt${QT_FWVER}/Qwt5/_iqt.so" "${QGISPYDIR}/PyQt${QT_FWVER}/Qwt5/") +ENDIF () +IF (NOT EXISTS "${QGISPYDIR}/PyQt${QT_FWVER}/Qwt5/Qwt.so") + EXECUTE_PROCESS (COMMAND ditto ${QARCHS} "@SIP_MOD_DIR@/PyQt${QT_FWVER}/Qwt5/Qwt.so" "${QGISPYDIR}/PyQt${QT_FWVER}/Qwt5/") +ENDIF () +FILE (GLOB PQWPYLIST "@SIP_MOD_DIR@/PyQt${QT_FWVER}/Qwt5/*.py") +FOREACH (PQWPY ${PQWPYLIST}) + EXECUTE_PROCESS (COMMAND cp -fp "${PQWPY}" "${QGISPYDIR}/PyQt${QT_FWVER}/Qwt5/") +ENDFOREACH (PQWPY) +IF (QWT_CHG) + IF (@OSX_HAVE_LOADERPATH@ AND QWT_CHG) + SET (QWT_CHG_TO "${ATLOADER}/../../../@QGIS_DATA_SUBDIR_REV@/@QGIS_LIB_SUBDIR@/libqwt.dylib") + ENDIF (@OSX_HAVE_LOADERPATH@ AND QWT_CHG) + FOREACH (PW _iqt;Qwt) + INSTALLNAMETOOL_CHANGE (${QWT_CHG} ${QWT_CHG_TO} "${QGISPYDIR}/PyQt${QT_FWVER}/Qwt5/${PW}.so") + ENDFOREACH (PW) +ENDIF (QWT_CHG) + +# don't load plugins from system-installed Qt +FILE (WRITE "${QAPPDIRC}/Resources/qt.conf" "") +FILE (WRITE "${QBINDIR}/qgis_help.app/Contents/Resources/qt.conf" "") + +FILE (GLOB QGLIBLIST ${QLIBDIR}/libqgis*.dylib) +FILE (GLOB QGPLUGLIST ${QPLUGDIR}/*.so) +FILE (GLOB QGPYLIST ${QGISPYDIR}/qgis/*.so) + +# main Qt framework loop + +MESSAGE (STATUS "Updating Qt library paths...") + +FOREACH (QFW ${QTLISTQG}) + # get install names from installed in case bundled copy already changed + # from a previous install attempt + GET_INSTALL_NAME ("@QT_LIBRARY_DIR@/${QFW}.framework/${QFW}" ${QFW}.framework QQ) + SET (QFW_CHG "${QQ}") + SET (QFW_CHG_TO "${ATEXECUTABLE}/@QGIS_FW_SUBDIR@/${QFW}.framework/${QFW}") + # app - always @executable_path + INSTALLNAMETOOL_CHANGE (${QFW_CHG} ${QFW_CHG_TO} "${QAPPDIR}/Qgis") + # qgis_help - use symlink, even when have loader_path, + # applications behave better that way + INSTALLNAMETOOL_CHANGE (${QFW_CHG} ${QFW_CHG_TO} "${QBINDIR}/qgis_help.app/Contents/MacOS/qgis_help") + # qgis-mapserver + IF (@OSX_HAVE_LOADERPATH@) + SET (QFW_CHG_TO "${ATEXECUTABLE}/@QGIS_CGIBIN_SUBDIR_REV@/@QGIS_FW_SUBDIR@/${QFW}.framework/${QFW}") + ENDIF (@OSX_HAVE_LOADERPATH@) + INSTALLNAMETOOL_CHANGE (${QFW_CHG} ${QFW_CHG_TO} "${QCGIDIR}/qgis_mapserv.fcgi") + # libs + IF (@OSX_HAVE_LOADERPATH@) + SET (QFW_CHG_TO "${ATLOADER}/@QGIS_LIB_SUBDIR_REV@/@QGIS_FW_SUBDIR@/${QFW}.framework/${QFW}") + ENDIF (@OSX_HAVE_LOADERPATH@) + FOREACH (QL ${QGLIBLIST}) + INSTALLNAMETOOL_CHANGE (${QFW_CHG} ${QFW_CHG_TO} "${QL}") + ENDFOREACH (QL) + # Qwt + INSTALLNAMETOOL_CHANGE (${QFW_CHG} ${QFW_CHG_TO} "${QLIBDIR}/libqwt.dylib") + # GRASS libexec stuff + IF (EXISTS "${QLIBXDIR}/grass/bin/qgis.g.browser") + IF (@OSX_HAVE_LOADERPATH@) + SET (QFW_CHG_TO "${ATLOADER}/../../@QGIS_LIBEXEC_SUBDIR_REV@/@QGIS_FW_SUBDIR@/${QFW}.framework/${QFW}") + ENDIF (@OSX_HAVE_LOADERPATH@) + INSTALLNAMETOOL_CHANGE (${QFW_CHG} ${QFW_CHG_TO} "${QLIBXDIR}/grass/bin/qgis.g.browser") + ENDIF () + # plugins + IF (@OSX_HAVE_LOADERPATH@) + SET (QFW_CHG_TO "${ATLOADER}/@QGIS_PLUGIN_SUBDIR_REV@/@QGIS_FW_SUBDIR@/${QFW}.framework/${QFW}") + ENDIF (@OSX_HAVE_LOADERPATH@) + FOREACH (QP ${QGPLUGLIST}) + INSTALLNAMETOOL_CHANGE (${QFW_CHG} ${QFW_CHG_TO} "${QP}") + ENDFOREACH (QP) + # qt plugs - same relative path + INSTALLNAMETOOL_CHANGE (${QFW_CHG} ${QFW_CHG_TO} "${QAPPDIRC}/PlugIns/imageformats/libqjpeg.dylib") + FOREACH (QC cn;jp;kr;tw) + INSTALLNAMETOOL_CHANGE (${QFW_CHG} ${QFW_CHG_TO} "${QAPPDIRC}/PlugIns/codecs/libq${QC}codecs.dylib") + ENDFOREACH (QC) + # qt fw + IF (@OSX_HAVE_LOADERPATH@) + SET (QFW_CHG_TO "${ATLOADER}/../../../${QFW}.framework/${QFW}") + ENDIF (@OSX_HAVE_LOADERPATH@) + FOREACH (QF ${QTLISTQG}) + INSTALLNAMETOOL_CHANGE (${QFW_CHG} ${QFW_CHG_TO} "${QFWDIR}/${QF}.framework/${QF}") + ENDFOREACH (QF) + # PyQt + IF (@OSX_HAVE_LOADERPATH@) + SET (QFW_CHG_TO "${ATLOADER}/../../@QGIS_DATA_SUBDIR_REV@/@QGIS_FW_SUBDIR@/${QFW}.framework/${QFW}") + ENDIF (@OSX_HAVE_LOADERPATH@) + FOREACH (PQ ${PYQTLIST}) + INSTALLNAMETOOL_CHANGE (${QFW_CHG} ${QFW_CHG_TO} "${QGISPYDIR}/PyQt${QT_FWVER}/${PQ}.so") + ENDFOREACH (PQ) + # qgis python + FOREACH (PG ${QGPYLIST}) + INSTALLNAMETOOL_CHANGE (${QFW_CHG} ${QFW_CHG_TO} "${PG}") + ENDFOREACH (PG) + # bin - PyQt utils + IF (@OSX_HAVE_LOADERPATH@) + SET (QFW_CHG_TO "${ATLOADER}/@QGIS_BIN_SUBDIR_REV@/@QGIS_FW_SUBDIR@/${QFW}.framework/${QFW}") + ENDIF (@OSX_HAVE_LOADERPATH@) + FOREACH (PB pylupdate4;pyrcc4) + INSTALLNAMETOOL_CHANGE (${QFW_CHG} ${QFW_CHG_TO} "${QBINDIR}/${PB}") + ENDFOREACH (PB) + # PyQwt + IF (@OSX_HAVE_LOADERPATH@) + SET (QFW_CHG_TO "${ATLOADER}/../../../@QGIS_DATA_SUBDIR_REV@/@QGIS_FW_SUBDIR@/${QFW}.framework/${QFW}") + ENDIF (@OSX_HAVE_LOADERPATH@) + FOREACH (PW _iqt;Qwt) + INSTALLNAMETOOL_CHANGE (${QFW_CHG} ${QFW_CHG_TO} "${QGISPYDIR}/PyQt${QT_FWVER}/Qwt5/${PW}.so") + ENDFOREACH (PW) +ENDFOREACH (QFW) diff --git a/mac/cmake/2lib.cmake.in b/mac/cmake/2lib.cmake.in new file mode 100644 index 000000000000..27e04e58ade8 --- /dev/null +++ b/mac/cmake/2lib.cmake.in @@ -0,0 +1,137 @@ +# 2lib - bundle shared libraries (but not standard frameworks) +# ! cmakecache vars not available to external scripts +# so we configure it first to do substitutions +# make sure to use @varname@ + +# for now, just libs not available as frameworks +# libpq +# libfcgi (non-system) + +# need part of BundleUtilities +INCLUDE (GetPrerequisites) + +# kill boolean warnings +CMAKE_POLICY (SET CMP0012 NEW) + +SET (QAPPDIRC "@QGIS_MACAPP_PREFIX@") +SET (QAPPDIR "@CMAKE_INSTALL_PREFIX@") +#SET (QAPPDIRC "@CMAKE_INSTALL_PREFIX@/@QGIS_APP_NAME@.app/Contents") +#SET (QAPPDIR "${QAPPDIRC}/MacOS") +SET (QFWDIR "${QAPPDIR}/@QGIS_FW_SUBDIR@") +SET (QBINDIR "${QAPPDIR}/@QGIS_BIN_SUBDIR@") +SET (QCGIDIR "${QAPPDIR}/@QGIS_CGIBIN_SUBDIR@") +SET (QLIBDIR "${QAPPDIR}/@QGIS_LIB_SUBDIR@") +SET (QLIBXDIR "${QAPPDIR}/@QGIS_LIBEXEC_SUBDIR@") +SET (QDATADIR "${QAPPDIR}/@QGIS_DATA_SUBDIR@") +SET (QPLUGDIR "${QAPPDIR}/@QGIS_PLUGIN_SUBDIR@") +SET (QGISPYDIR "${QAPPDIR}/@QGIS_DATA_SUBDIR@/python") +# Qt framework version is major version +SET (QT_FWVER @QT_VERSION_MAJOR@) + +# so config-file doesn't try to replace @ +SET (ATEXECUTABLE "@executable_path") +SET (ATLOADER "@loader_path") + +# helper functions + +FUNCTION (GET_INSTALL_NAME LIBFILE LIBNAME OUTVAR) + get_prerequisites ("${LIBFILE}" LIBLIST 1 0 "" "") + FOREACH (L ${LIBLIST}) + STRING (REGEX MATCH ".*${LIBNAME}.+" LL ${L}) + IF (LL) + SET (${OUTVAR} ${LL} PARENT_SCOPE) + ENDIF (LL) + ENDFOREACH () +ENDFUNCTION (GET_INSTALL_NAME) + +# message only if verbose makefiles (use for install_name_tool echos) +FUNCTION (MYMESSAGE MSG) + IF (@CMAKE_VERBOSE_MAKEFILE@) + MESSAGE (STATUS "${MSG}") + ENDIF (@CMAKE_VERBOSE_MAKEFILE@) +ENDFUNCTION (MYMESSAGE) + +# isntall_name_tool -change CHANGE CHANGETO CHANGEBIN +FUNCTION (INSTALLNAMETOOL_CHANGE CHANGE CHANGETO CHANGEBIN) + MYMESSAGE ("install_name_tool -change ${CHANGE} ${CHANGETO} \"${CHANGEBIN}\"") + EXECUTE_PROCESS (COMMAND install_name_tool -change ${CHANGE} ${CHANGETO} "${CHANGEBIN}") +ENDFUNCTION (INSTALLNAMETOOL_CHANGE) + +FUNCTION (UPDATEQGISPATHS LIBFROM LIBTO) + IF (LIBFROM) + SET (LIB_CHG_TO "${ATEXECUTABLE}/@QGIS_LIB_SUBDIR@/${LIBTO}") + # app - always @executable_path + INSTALLNAMETOOL_CHANGE (${LIBFROM} ${LIB_CHG_TO} "${QAPPDIR}/Qgis") + # qgis_help - doesn't link anything else than Qt/Qgis + # qgis-mapserver + IF (@OSX_HAVE_LOADERPATH@) + SET (LIB_CHG_TO "${ATEXECUTABLE}/@QGIS_CGIBIN_SUBDIR_REV@/@QGIS_LIB_SUBDIR@/${LIBTO}") + ENDIF (@OSX_HAVE_LOADERPATH@) + INSTALLNAMETOOL_CHANGE (${LIBFROM} ${LIB_CHG_TO} "${QCGIDIR}/qgis_mapserv.fcgi") + # libs + IF (@OSX_HAVE_LOADERPATH@) + SET (LIB_CHG_TO "${ATLOADER}/@QGIS_LIB_SUBDIR_REV@/@QGIS_LIB_SUBDIR@/${LIBTO}") + ENDIF (@OSX_HAVE_LOADERPATH@) + FOREACH (QL ${QGLIBLIST}) + INSTALLNAMETOOL_CHANGE (${LIBFROM} ${LIB_CHG_TO} "${QL}") + ENDFOREACH (QL) + # GRASS libexec stuff + #IF (EXISTS "${QLIBXDIR}/grass/bin/qgis.g.browser") + # IF (@OSX_HAVE_LOADERPATH@) + # SET (LIB_CHG_TO "${ATLOADER}/../../@QGIS_LIBEXEC_SUBDIR_REV@/@QGIS_LIB_SUBDIR@/${LIBTO}") + # ENDIF (@OSX_HAVE_LOADERPATH@) + # INSTALLNAMETOOL_CHANGE (${LIBFROM} ${LIB_CHG_TO} "${QLIBXDIR}/grass/bin/qgis.g.browser") + #ENDIF () + # plugins + IF (@OSX_HAVE_LOADERPATH@) + SET (LIB_CHG_TO "${ATLOADER}/@QGIS_PLUGIN_SUBDIR_REV@/@QGIS_LIB_SUBDIR@/${LIBTO}") + ENDIF (@OSX_HAVE_LOADERPATH@) + FOREACH (QP ${QGPLUGLIST}) + INSTALLNAMETOOL_CHANGE (${LIBFROM} ${LIB_CHG_TO} "${QP}") + ENDFOREACH (QP) + # qgis python + IF (@OSX_HAVE_LOADERPATH@) + SET (LIB_CHG_TO "${ATLOADER}/../../@QGIS_DATA_SUBDIR_REV@/@QGIS_LIB_SUBDIR@/${LIBTO}") + ENDIF (@OSX_HAVE_LOADERPATH@) + FOREACH (PG ${QGPYLIST}) + INSTALLNAMETOOL_CHANGE (${LIBFROM} ${LIB_CHG_TO} "${PG}") + ENDFOREACH (PG) + # bin - nothing yet + #IF (@OSX_HAVE_LOADERPATH@) + # SET (LIB_CHG_TO "${ATLOADER}/@QGIS_BIN_SUBDIR_REV@/@QGIS_LIB_SUBDIR@/${LIBTO}") + #ENDIF (@OSX_HAVE_LOADERPATH@) + #FOREACH (PB ...) + # INSTALLNAMETOOL_CHANGE (${LIBFROM} ${LIB_CHG_TO} "${QBINDIR}/${PB}") + #ENDFOREACH (PB) + ENDIF (LIBFROM) +ENDFUNCTION (UPDATEQGISPATHS) + +# arches +FOREACH (QARCH @CMAKE_OSX_ARCHITECTURES@) + SET (QARCHS ${QARCHS} "--arch" "${QARCH}") +ENDFOREACH (QARCH) + +FILE (GLOB QGLIBLIST ${QLIBDIR}/libqgis*.dylib) +FILE (GLOB QGPLUGLIST ${QPLUGDIR}/*.so) +FILE (GLOB QGPYLIST ${QGISPYDIR}/qgis/*.so) + +# Postgres + +IF (@POSTGRES_LIBRARY@ MATCHES ".*libpq.dylib") + MESSAGE (STATUS "Copying libpq and updating library paths...") + MYMESSAGE ("ditto ${QARCHS} \"@POSTGRES_LIBRARY@\" \"${QLIBDIR}/libpq.dylib\"") + EXECUTE_PROCESS (COMMAND ditto ${QARCHS} "@POSTGRES_LIBRARY@" "${QLIBDIR}/libpq.dylib") + GET_INSTALL_NAME ("@POSTGRES_LIBRARY@" "libpq" PQLIB) + UPDATEQGISPATHS (${PQLIB} libpq.dylib) +ENDIF () + +# libfcgi (non-system) + +IF (@FCGI_LIBRARY@ MATCHES ".*libfcgi.dylib" AND NOT @FCGI_LIBRARY@ MATCHES "/usr/lib/.*") + MESSAGE (STATUS "Copying libfcgi and updating library paths...") + MYMESSAGE ("ditto ${QARCHS} \"@FCGI_LIBRARY@\" \"${QLIBDIR}/libfcgi.dylib\"") + EXECUTE_PROCESS (COMMAND ditto ${QARCHS} "@FCGI_LIBRARY@" "${QLIBDIR}/libfcgi.dylib") + GET_INSTALL_NAME ("@FCGI_LIBRARY@" "libfcgi" FCGILIB) + UPDATEQGISPATHS (${FCGILIB} libfcgi.dylib) +ENDIF () + diff --git a/src/app/CMakeLists.txt b/src/app/CMakeLists.txt index 124110c3386d..237aac5dcd82 100644 --- a/src/app/CMakeLists.txt +++ b/src/app/CMakeLists.txt @@ -364,15 +364,15 @@ ENDIF (POSTGRES_FOUND) IF (WIN32) # 'WIN32' removes console, which is Bad when debugging IF (CMAKE_BUILD_TYPE MATCHES Debug) - ADD_EXECUTABLE(qgis ${QGIS_APP_SRCS} ${QGIS_APP_MOC_SRCS} ${IMAGE_RCC_SRCS}) + ADD_EXECUTABLE(${QGIS_APP_NAME} ${QGIS_APP_SRCS} ${QGIS_APP_MOC_SRCS} ${IMAGE_RCC_SRCS}) ELSE (CMAKE_BUILD_TYPE MATCHES Debug) - ADD_EXECUTABLE(qgis WIN32 ${QGIS_APP_SRCS} ${QGIS_APP_MOC_SRCS} ${IMAGE_RCC_SRCS}) + ADD_EXECUTABLE(${QGIS_APP_NAME} WIN32 ${QGIS_APP_SRCS} ${QGIS_APP_MOC_SRCS} ${IMAGE_RCC_SRCS}) ENDIF (CMAKE_BUILD_TYPE MATCHES Debug) ELSE (WIN32) - ADD_EXECUTABLE(qgis ${QGIS_APP_SRCS} ${QGIS_APP_MOC_SRCS} ${IMAGE_RCC_SRCS}) + ADD_EXECUTABLE(${QGIS_APP_NAME} ${QGIS_APP_SRCS} ${QGIS_APP_MOC_SRCS} ${IMAGE_RCC_SRCS}) ENDIF (WIN32) -TARGET_LINK_LIBRARIES(qgis +TARGET_LINK_LIBRARIES(${QGIS_APP_NAME} ${QT_QTSQL_LIBRARY} ${QT_QTUITOOLS_LIBRARY} #should only be needed for win @@ -386,38 +386,38 @@ IF( WIN32 ) ADD_DEFINITIONS(-DQWT_DLL) ENDIF( WIN32 ) INCLUDE_DIRECTORIES(${QWT_INCLUDE_DIR}) -TARGET_LINK_LIBRARIES(qgis ${QWT_LIBRARY}) +TARGET_LINK_LIBRARIES(${QGIS_APP_NAME} ${QWT_LIBRARY}) IF(NOT WITH_INTERNAL_SPATIALITE) - TARGET_LINK_LIBRARIES(qgis ${SQLITE_LIBRARY}) + TARGET_LINK_LIBRARIES(${QGIS_APP_NAME} ${SQLITE_LIBRARY}) ENDIF(NOT WITH_INTERNAL_SPATIALITE) IF (${QTVERSION} STRLESS "4.3.0") - TARGET_LINK_LIBRARIES(qgis ${QT_QT3SUPPORT_LIBRARY} ) + TARGET_LINK_LIBRARIES(${QGIS_APP_NAME} ${QT_QT3SUPPORT_LIBRARY} ) ENDIF (${QTVERSION} STRLESS "4.3.0") IF (APPLE) - TARGET_LINK_LIBRARIES(qgis ${APP_SERVICES_LIBRARY} ) + TARGET_LINK_LIBRARIES(${QGIS_APP_NAME} ${APP_SERVICES_LIBRARY} ) ENDIF (APPLE) -SET_TARGET_PROPERTIES(qgis PROPERTIES +SET_TARGET_PROPERTIES(${QGIS_APP_NAME} PROPERTIES INSTALL_RPATH ${CMAKE_INSTALL_PREFIX}/${QGIS_LIB_DIR} INSTALL_RPATH_USE_LINK_PATH true ) IF (POSTGRES_FOUND) - TARGET_LINK_LIBRARIES (qgis ${POSTGRES_LIBRARY}) + TARGET_LINK_LIBRARIES (${QGIS_APP_NAME} ${POSTGRES_LIBRARY}) ENDIF (POSTGRES_FOUND) IF (SPATIALITE_FOUND) - TARGET_LINK_LIBRARIES (qgis ${SPATIALITE_LIBRARY}) + TARGET_LINK_LIBRARIES (${QGIS_APP_NAME} ${SPATIALITE_LIBRARY}) ENDIF (SPATIALITE_FOUND) IF (APPLE) # For Mac OS X, the executable must be at the root of the bundle's executable folder - INSTALL(TARGETS qgis RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}) + INSTALL(TARGETS ${QGIS_APP_NAME} RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}) ELSE (APPLE) - INSTALL(TARGETS qgis RUNTIME DESTINATION ${QGIS_BIN_DIR}) + INSTALL(TARGETS ${QGIS_APP_NAME} RUNTIME DESTINATION ${QGIS_BIN_DIR}) ENDIF (APPLE) IF(MSVC) diff --git a/src/helpviewer/CMakeLists.txt b/src/helpviewer/CMakeLists.txt index b2bac8b4c002..2788af472e74 100644 --- a/src/helpviewer/CMakeLists.txt +++ b/src/helpviewer/CMakeLists.txt @@ -99,7 +99,8 @@ SET_TARGET_PROPERTIES(qgis_help PROPERTIES IF (APPLE) INSTALL (TARGETS qgis_help BUNDLE DESTINATION ${QGIS_BIN_DIR}) - INSTALL (CODE "EXECUTE_PROCESS(COMMAND install_name_tool -change @executable_path/lib/libqgis_core.${COMPLETE_VERSION}.dylib @executable_path/../../../../lib/libqgis_core.${COMPLETE_VERSION}.dylib \"${CMAKE_INSTALL_PREFIX}/${QGIS_BIN_DIR}/qgis_help.app/Contents/MacOS/qgis_help\")") + # needed because global install_name prefix is for main qgis app + INSTALL (CODE "EXECUTE_PROCESS(COMMAND install_name_tool -change ${CMAKE_INSTALL_NAME_DIR}/libqgis_core.${COMPLETE_VERSION}.dylib @executable_path/../../../../lib/libqgis_core.${COMPLETE_VERSION}.dylib \"${CMAKE_INSTALL_PREFIX}/${QGIS_BIN_DIR}/qgis_help.app/Contents/MacOS/qgis_help\")") ELSE (APPLE) INSTALL (TARGETS qgis_help RUNTIME DESTINATION ${QGIS_BIN_DIR}) ENDIF (APPLE) diff --git a/src/mac/Contents/CMakeLists.txt b/src/mac/Contents/CMakeLists.txt index 626ddc286f2f..3be39ea811ba 100644 --- a/src/mac/Contents/CMakeLists.txt +++ b/src/mac/Contents/CMakeLists.txt @@ -10,6 +10,8 @@ ADD_CUSTOM_TARGET(Info.plist ALL -D CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} -D SOURCE_DIR=${CMAKE_SOURCE_DIR} -D VERSION=${COMPLETE_VERSION_WITH_RELEASE_NAME} + -D VERSION_NUM=${COMPLETE_VERSION} + -D APP_NAME=${QGIS_APP_NAME} -P ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist.cmake) ############################################################# diff --git a/src/mac/Contents/Info.plist.in b/src/mac/Contents/Info.plist.in index 567d16475bac..7b6a94391211 100644 --- a/src/mac/Contents/Info.plist.in +++ b/src/mac/Contents/Info.plist.in @@ -1,13 +1,15 @@ - + + CFBundleDevelopmentRegion + English CFBundleName QGIS CFBundleIdentifier org.qgis.qgis CFBundleExecutable - qgis + @APP_NAME@ CFBundlePackageType APPL CFBundleSignature @@ -15,11 +17,15 @@ CFBundleGetInfoString QGIS @VERSION@ (@REVISION@), © 2002-2010 QGIS Development Team CFBundleShortVersionString - @VERSION@ (@REVISION@) + @VERSION_NUM@ CFBundleVersion @VERSION@ (@REVISION@) CFBundleIconFile qgis.icns + CFBundleInfoDictionaryVersion + 6.0 + CSResourcesFileMapped + CFBundleDocumentTypes