project(mapguide) # CMake base requires and policy tweaks cmake_minimum_required( VERSION 2.8 FATAL_ERROR ) if (POLICY CMP0005) # CMP0005: keep escaping behaviour for definitions added via add_definitions() cmake_policy( SET CMP0005 OLD ) endif (POLICY CMP0005) if (POLICY CMP0026) # CMP0026: Disallow use of the LOCATION target property cmake_policy( SET CMP0026 OLD ) endif (POLICY CMP0026) # Look first in internal modules set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules ) # Set configuration if not defined if (NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Release") endif (NOT CMAKE_BUILD_TYPE) message(STATUS "CMake Build Type is: ${CMAKE_BUILD_TYPE}") # Use ccache if available find_program(CCACHE_PROGRAM ccache) if(CCACHE_PROGRAM) set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}") message(STATUS "ccache was found and will be used to cache compilations") endif() # Determine bitness if ((NOT MG_CPU EQUAL 32) AND (NOT MG_CPU EQUAL 64)) message(STATUS "MG_CPU not defined, determining what we're building for based on system bitness") if(CMAKE_SIZEOF_VOID_P EQUAL 8) set(MG_CPU 64) else(CMAKE_SIZEOF_VOID_P EQUAL 8) set(MG_CPU 32) endif(CMAKE_SIZEOF_VOID_P EQUAL 8) message (STATUS "MG_CPU is ${MG_CPU}") endif ((NOT MG_CPU EQUAL 32) AND (NOT MG_CPU EQUAL 64)) #message(STATUS "INTERNAL_ACE = ${INTERNAL_ACE}") #message(STATUS "INTERNAL_CPPUNIT = ${INTERNAL_CPPUNIT}") #message(STATUS "INTERNAL_ZLIB = ${INTERNAL_ZLIB}") #message(STATUS "INTERNAL_LIBPNG = ${INTERNAL_LIBPNG}") #message(STATUS "INTERNAL_JPEG = ${INTERNAL_JPEG}") #message(STATUS "INTERNAL_FREETYPE = ${INTERNAL_FREETYPE}") #message(STATUS "INTERNAL_GD = ${INTERNAL_GD}") #message(STATUS "INTERNAL_JSON = ${INTERNAL_JSON}") #message(STATUS "INTERNAL_GEOS = ${INTERNAL_GEOS}") #message(STATUS "INTERNAL_XERCES = ${INTERNAL_XERCES}") #message(STATUS "WITH_JAVA = ${WITH_JAVA}") include(CheckFunctionExists) include(CheckIncludeFile) include(CheckCXXSourceCompiles) include(CheckLibraryExists) include(ExternalProject) set(MG_VERSION_MAJOR 3) set(MG_VERSION_MINOR 3) set(MG_VERSION_RELEASE 0) if (NOT MG_VERSION_REV) set(MG_VERSION_REV 0) endif (NOT MG_VERSION_REV) set(MG_VERSION "${MG_VERSION_MAJOR}.${MG_VERSION_MINOR}.${MG_VERSION_RELEASE}") set(MG_VERSION_FULL "${MG_VERSION}.${MG_VERSION_REV}") set(MG_HTTPD_PORT 8008) set(MG_TOMCAT_PORT 8009) set(CSMAP_NO_GRID 1) set(MG_OEM_ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/Oem") set(MG_OEM_ROOT_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}/Oem") set(MG_OEM_CSMAP_INCLUDE_DIR "${MG_OEM_ROOT_DIR}/CsMap/CsMapDev/Include") set(MG_OEM_AGG_DIR "${MG_OEM_ROOT_DIR}/agg-2.4") set(MG_OEM_AGG_INCLUDE_DIR "${MG_OEM_AGG_DIR}/include") set(MG_OEM_AGG_FREETYPE_DIR "${MG_OEM_AGG_DIR}/font_freetype") set(MG_OEM_AGG_SOURCE_DIR "${MG_OEM_AGG_DIR}/src") set(MG_OEM_HTTPD_SOURCE_DIR, "${MG_OEM_ROOT_DIR}/LinuxApt/httpd-2.4.18") set(MG_OEM_DWF_INCLUDE_DIR "${MG_OEM_ROOT_DIR}/DWFTK/develop/global/src") set(MG_COMMON_DIR "${CMAKE_CURRENT_SOURCE_DIR}/Common") set(MG_SERVER_COMMON_DIR "${CMAKE_CURRENT_SOURCE_DIR}/Server/src/Common") set(MG_SERVER_SERVICES_DIR "${CMAKE_CURRENT_SOURCE_DIR}/Server/src/Services") set(MG_SERVER_GWS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/Server/src/Gws") set(MG_AUTO_GENERATED_HEADER_DIR "${CMAKE_CURRENT_BINARY_DIR}/IncludeAutogenerated") set(MG_UNIT_TEST_DATA_DIR "${CMAKE_CURRENT_SOURCE_DIR}/UnitTest/TestData") set(MG_COMPONENT_COMMON "common") set(MG_COMPONENT_SERVER "server") set(MG_COMPONENT_WEB "web") # Override install directory to match what the automake build does (/usr/local, rather than /usr/local/lib) if (NOT MG_INSTALL_PREFIX) set(MG_INSTALL_PREFIX "/usr/local/mapguideopensource-${MG_VERSION}") endif (NOT MG_INSTALL_PREFIX) # Have our sub-prefixes be relative for ease of packaging set(MG_INSTALL_WEB_PREFIX "webserverextensions") set(MG_WWWROOT "${MG_INSTALL_WEB_PREFIX}/www") set(MG_INSTALL_SERVER_PREFIX "server") set(MG_SERVER_BIN_DIR "${MG_INSTALL_SERVER_PREFIX}/bin") set(MG_INSTALL_COORDSYS_PREFIX "share/gis/coordsys") # Absolute versions however are for stamping various template configuration files # (which sadly do require absolute paths most of the time) set(MG_INSTALL_SERVER_PREFIX_ABS "${MG_INSTALL_PREFIX}/server") set(MG_INSTALL_WEB_PREFIX_ABS "${MG_INSTALL_PREFIX}/webserverextensions") set(MG_WWWROOT_ABS "${MG_INSTALL_WEB_PREFIX_ABS}/www") set(MG_INSTALL_COORDSYS_PREFIX_ABS "${MG_INSTALL_PREFIX}/share/gis/coordsys") set(CMAKE_INSTALL_PREFIX "${MG_INSTALL_PREFIX}") set(MG_VERSION_SUFFIX "-${MG_VERSION}") macro(set_install_subdir relbase) # Global definitions ( used by all sources ) # Check if is a 64 bits install and use user defined LIB_SUFFIX if(UNIX) set(LIB_SUFFIX "" CACHE STRING "Define suffix of directory name (32/64)") if(MG_CPU EQUAL 64) set(LIB_SUFFIX "64") endif(MG_CPU EQUAL 64) set(LIB_INSTALL_DIR "${relbase}lib${LIB_SUFFIX}") set(BIN_INSTALL_DIR "${relbase}bin") endif(UNIX) endmacro(set_install_subdir) macro(make_install workdir) if (UNIX) install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} -E chdir ${workdir} make install)") endif (UNIX) endmacro(make_install workdir) macro(install_empty_directory dirname root) file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${dirname}") install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${dirname} DESTINATION ${root} COMPONENT ${MG_COMPONENT}) endmacro(install_empty_directory dirname root) if(UNIX) add_definitions(-DFULLPROTO -fPIC -DPIC) endif(UNIX) if (CMAKE_SYSTEM_NAME MATCHES Linux) add_definitions(-DLINUX -DLINUX_IA32 -pthread -Wno-write-strings) endif (CMAKE_SYSTEM_NAME MATCHES Linux) if (CMAKE_COMPILER_IS_GNUCXX) add_definitions(-D__USE_GNU -Wno-deprecated) if(MG_CPU EQUAL 64) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m64") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m64") else(MG_CPU EQUAL 64) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32") endif(MG_CPU EQUAL 64) if (CMAKE_BUILD_TYPE MATCHES Debug) add_definitions(-DDEBUG -D_DEBUG) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g3") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g3") message(STATUS "Adding standard compiler flags for debug") endif (CMAKE_BUILD_TYPE MATCHES Debug) endif(CMAKE_COMPILER_IS_GNUCXX) if (USE_LD_GOLD) execute_process(COMMAND ${CMAKE_C_COMPILER} -fuse-ld=gold -Wl,--version ERROR_QUIET OUTPUT_VARIABLE LD_VERSION) if ("${LD_VERSION}" MATCHES "GNU gold") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fuse-ld=gold") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fuse-ld=gold") message(STATUS "Using GNU gold linker instead of ld") else () message(WARNING "GNU gold linker isn't available, using the default system linker.") endif () endif () find_package(Sanitizers) find_package(MapGuideThirdparty REQUIRED) # Set internal tool paths set(IMAKE_TOOL ${CMAKE_CURRENT_BINARY_DIR}/BuildTools/WebTools/IMake/IMake) set(SWIG_TOOL ${MG_OEM_ROOT_BUILD_DIR}/SWIGEx/swig) set(SWIG_LIB_PATH ${MG_OEM_ROOT_BUILD_DIR}/SWIGEx/Lib) # Set common commands. set(MOVE_COMMAND "mv") if (WITH_JAVA) find_package(Java REQUIRED) find_package(JNI REQUIRED) else (WITH_JAVA) message(STATUS "Skipping optional Java support") endif (WITH_JAVA) # Some helper macros macro(install_symlink target linkname component) # The link target doesn't have to exist at this point in time, the symlink will be valid at install time execute_process(COMMAND ln -sf ${target} ${CMAKE_CURRENT_BINARY_DIR}/${linkname}) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${linkname} DESTINATION ${LIB_INSTALL_DIR} COMPONENT ${component}) endmacro(install_symlink) # See if Xerces typedefs XMLCh to char16_t # This would be the case on Ubuntu 18.04 for its version of xerces-c (3.2.0) check_cxx_source_compiles( "#include #include int main() { static_assert(std::is_same::value, \"Xerces XMLCh is not char16_t\"); }" XERCES_USES_CHAR16_T) if (XERCES_USES_CHAR16_T) add_definitions(-D_XERCES_USES_CHAR16_T_) message(STATUS "Xerces typedefs XMLCh to char16_t") else (XERCES_USES_CHAR16_T) message(STATUS "Xerces does not appear to typedef XMLCh to char16_t") endif (XERCES_USES_CHAR16_T) add_subdirectory(BuildTools) add_subdirectory(Oem) add_subdirectory(Common) add_subdirectory(Server) add_subdirectory(Web) add_subdirectory(UnitTest) if (WITH_DESKTOP) add_subdirectory(Desktop) else (WITH_DESKTOP) message(STATUS "Skipping optional mg-desktop support") endif (WITH_DESKTOP)