Mercurial > hg > orthanc-databases
diff Resources/CMake/PostgreSQLConfiguration.cmake @ 0:7cea966b6829
initial commit
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 04 Jul 2018 08:16:29 +0200 |
parents | |
children | 9e5e7a8314e0 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Resources/CMake/PostgreSQLConfiguration.cmake Wed Jul 04 08:16:29 2018 +0200 @@ -0,0 +1,365 @@ +# Orthanc - A Lightweight, RESTful DICOM Store +# Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics +# Department, University Hospital of Liege, Belgium +# Copyright (C) 2017-2018 Osimis S.A., Belgium +# +# This program is free software: you can redistribute it and/or +# modify it under the terms of the GNU Affero General Public License +# as published by the Free Software Foundation, either version 3 of +# the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + + +##################################################################### +## PostgreSQL +##################################################################### + +INCLUDE(CheckTypeSize) +INCLUDE(CheckCSourceCompiles) +INCLUDE(CheckFunctionExists) +INCLUDE(CheckStructHasMember) + + +if (STATIC_BUILD OR NOT USE_SYSTEM_LIBPQ) + add_definitions(-DORTHANC_POSTGRESQL_STATIC=1) + + SET(LIBPQ_MAJOR 9) + SET(LIBPQ_MINOR 6) + SET(LIBPQ_REVISION 1) + SET(LIBPQ_VERSION ${LIBPQ_MAJOR}.${LIBPQ_MINOR}.${LIBPQ_REVISION}) + + SET(LIBPQ_SOURCES_DIR ${CMAKE_BINARY_DIR}/postgresql-${LIBPQ_VERSION}) + DownloadPackage( + "eaa7e267e89ea1ed2693d2b88d3cd290" + "http://www.orthanc-server.com/downloads/third-party/postgresql-${LIBPQ_VERSION}.tar.gz" + "${LIBPQ_SOURCES_DIR}") + + + ## + ## Platform-specific configuration + ## + + if (CMAKE_SYSTEM_NAME STREQUAL "Windows") + add_definitions( + -DEXEC_BACKEND + ) + + configure_file( + ${LIBPQ_SOURCES_DIR}/src/include/port/win32.h + ${AUTOGENERATED_DIR}/pg_config_os.h + COPYONLY) + + elseif (CMAKE_SYSTEM_NAME STREQUAL "Linux") + add_definitions( + -D_GNU_SOURCE + -D_THREAD_SAFE + -D_POSIX_PTHREAD_SEMANTICS + ) + + configure_file( + ${LIBPQ_SOURCES_DIR}/src/include/port/linux.h + ${AUTOGENERATED_DIR}/pg_config_os.h + COPYONLY) + + elseif (CMAKE_SYSTEM_NAME STREQUAL "Darwin") + add_definitions( + -D_GNU_SOURCE + -D_THREAD_SAFE + -D_POSIX_PTHREAD_SEMANTICS + ) + + configure_file( + ${LIBPQ_SOURCES_DIR}/src/include/port/darwin.h + ${AUTOGENERATED_DIR}/pg_config_os.h + COPYONLY) + + elseif (CMAKE_SYSTEM_NAME STREQUAL "OpenBSD") + configure_file( + ${LIBPQ_SOURCES_DIR}/src/include/port/openbsd.h + ${AUTOGENERATED_DIR}/pg_config_os.h + COPYONLY) + + elseif (CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") + configure_file( + ${LIBPQ_SOURCES_DIR}/src/include/port/freebsd.h + ${AUTOGENERATED_DIR}/pg_config_os.h + COPYONLY) + + else() + message(FATAL_ERROR "Support your platform here") + endif() + + + ## + ## Generation of "pg_config.h" + ## + + if (CMAKE_SYSTEM_NAME STREQUAL "Windows") + configure_file( + ${LIBPQ_SOURCES_DIR}/src/include/pg_config_ext.h.win32 + ${AUTOGENERATED_DIR}/pg_config_ext.h + COPYONLY) + + configure_file( + ${LIBPQ_SOURCES_DIR}/src/include/pg_config.h.win32 + ${AUTOGENERATED_DIR}/pg_config.h + COPYONLY) + + if (CMAKE_COMPILER_IS_GNUCXX) # MinGW + add_definitions( + -DPG_PRINTF_ATTRIBUTE=gnu_printf + -DHAVE_GETTIMEOFDAY + -DHAVE_LONG_LONG_INT_64 + -DHAVE_STRUCT_ADDRINFO + -DHAVE_STRUCT_SOCKADDR_STORAGE + -DHAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY + ) + endif() + + elseif(CROSS_COMPILING) + message(FATAL_ERROR "Cannot auto-generate the configuration file cross-compiling") + + else() + configure_file( + ${CMAKE_CURRENT_LIST_DIR}/../PostgreSQL/pg_config_ext.h + ${AUTOGENERATED_DIR}/pg_config_ext.h + COPYONLY + ) + + set(CMAKE_EXTRA_INCLUDE_FILES "sys/socket.h;netdb.h;sys/types.h") + + include(${CMAKE_CURRENT_LIST_DIR}/../PostgreSQL/func_accept_args.cmake) + set(ACCEPT_TYPE_ARG3 ${ACCEPT_TYPE_ARG3}) + + check_type_size("long int" SIZE_LONG_INT) + if (SIZE_LONG_INT EQUAL 8) + set(HAVE_LONG_INT_64 1) + endif() + + check_type_size("long long int" SIZE_LONG_LONG_INT) + if (SIZE_LONG_LONG_INT EQUAL 8) + set(HAVE_LONG_LONG_INT_64 1) + endif() + + file(READ ${CMAKE_CURRENT_LIST_DIR}/../PostgreSQL/c_flexmember.c SOURCE) + check_c_source_compiles("${SOURCE}" c_flexmember) + if (c_flexmember) + set(FLEXIBLE_ARRAY_MEMBER "/**/") + endif() + + if (CMAKE_SYSTEM_NAME STREQUAL "Darwin" OR + CMAKE_SYSTEM_NAME STREQUAL "FreeBSD" OR + CMAKE_SYSTEM_NAME STREQUAL "OpenBSD") + set(PG_PRINTF_ATTRIBUTE "printf") + else() + file(READ ${CMAKE_CURRENT_LIST_DIR}/../PostgreSQL/printf_archetype.c SOURCE) + check_c_source_compiles("${SOURCE}" printf_archetype) + if (printf_archetype) + set(PG_PRINTF_ATTRIBUTE "gnu_printf") + else() + set(PG_PRINTF_ATTRIBUTE "printf") + endif() + endif() + + check_function_exists("isinf" HAVE_ISINF) + check_function_exists("getaddrinfo" HAVE_GETADDRINFO) + check_function_exists("gettimeofday" HAVE_GETTIMEOFDAY) + check_function_exists("snprintf" HAVE_DECL_SNPRINTF) + check_function_exists("srandom" HAVE_SRANDOM) + check_function_exists("strlcat" HAVE_DECL_STRLCAT) + check_function_exists("strlcpy" HAVE_DECL_STRLCPY) + check_function_exists("unsetenv" HAVE_UNSETENV) + check_function_exists("vsnprintf" HAVE_DECL_VSNPRINTF) + + check_type_size("struct addrinfo" SIZE_STRUCT_ADDRINFO) + if (HAVE_SIZE_STRUCT_ADDRINFO) + set(HAVE_STRUCT_ADDRINFO 1) + endif() + + check_type_size("struct sockaddr_storage" SIZE_STRUCT_SOCKADDR_STORAGE) + if (HAVE_SIZE_STRUCT_SOCKADDR_STORAGE) + set(HAVE_STRUCT_SOCKADDR_STORAGE 1) + endif() + + set(MEMSET_LOOP_LIMIT 1024) # This is hardcoded in "postgresql-9.6.1/configure" + set(DEF_PGPORT 5432) # Default port number of PostgreSQL + set(DEF_PGPORT_STR "\"5432\"") # Same as above, as a string + set(PG_VERSION "\"${LIBPQ_VERSION}\"") # Version of PostgreSQL, as a string + + # Version of PostgreSQL, as a number + math(EXPR PG_VERSION_NUM "${LIBPQ_MAJOR} * 10000 + ${LIBPQ_MINOR} * 100 + ${LIBPQ_REVISION}") + + set(HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY 1) # TODO Autodetection + + # Compute maximum alignment of any basic type. + # We assume long's alignment is at least as strong as char, short, or int; + # but we must check long long (if it exists) and double. + check_type_size("long" SIZE_LONG) + check_type_size("long long" SIZE_LONG_LONG) + check_type_size("double" SIZE_DOUBLE) + set(MAXIMUM_ALIGNOF ${SIZE_LONG}) + if(SIZE_LONG_LONG AND SIZE_LONG_LONG GREATER MAXIMUM_ALIGNOF) + set(MAXIMUM_ALIGNOF ${SIZE_LONG_LONG}) + endif() + if(SIZE_DOUBLE GREATER MAXIMUM_ALIGNOF) + set(MAXIMUM_ALIGNOF ${SIZE_DOUBLE}) + endif() + + check_include_file("poll.h" HAVE_POLL_H) + check_include_file("net/if.h" HAVE_NET_IF_H) + check_include_file("netinet/in.h" HAVE_NETINET_IN_H) + check_include_file("netinet/tcp.h" HAVE_NETINET_TCP_H) + check_include_file("sys/ioctl.h" HAVE_SYS_IOCTL_H) + check_include_file("sys/un.h" HAVE_SYS_UN_H) + + If (NOT HAVE_NET_IF_H) # This is the case of OpenBSD + unset(HAVE_NET_IF_H CACHE) + check_include_files("sys/socket.h;net/if.h" HAVE_NET_IF_H) + endif() + + if (NOT HAVE_NETINET_TCP_H) # This is the case of OpenBSD + unset(HAVE_NETINET_TCP_H CACHE) + check_include_files("sys/socket.h;netinet/tcp.h" HAVE_NETINET_TCP_H) + endif() + + + execute_process( + COMMAND + ${PYTHON_EXECUTABLE} + "${CMAKE_CURRENT_LIST_DIR}/../PostgreSQL/PrepareCMakeConfigurationFile.py" + "${LIBPQ_SOURCES_DIR}/src/include/pg_config.h.in" + "${AUTOGENERATED_DIR}/pg_config.h.in" + ERROR_VARIABLE NO_PG_CONFIG + OUTPUT_VARIABLE out + ) + + if (NO_PG_CONFIG) + message(FATAL_ERROR "Cannot find pg_config.h.in") + endif() + + configure_file( + ${AUTOGENERATED_DIR}/pg_config.h.in + ${AUTOGENERATED_DIR}/pg_config.h) + endif() + + + + ## + ## Generic configuration + ## + + file(WRITE + ${AUTOGENERATED_DIR}/pg_config_paths.h + "") + + add_definitions( + -D_REENTRANT + -DFRONTEND + -DUNSAFE_STAT_OK + -DSYSCONFDIR="" + ) + + include_directories( + ${LIBPQ_SOURCES_DIR}/src/include + ${LIBPQ_SOURCES_DIR}/src/include/libpq + ${LIBPQ_SOURCES_DIR}/src/interfaces/libpq + ) + + set(LIBPQ_SOURCES + ${LIBPQ_SOURCES_DIR}/src/interfaces/libpq/fe-auth.c + ${LIBPQ_SOURCES_DIR}/src/interfaces/libpq/fe-connect.c + ${LIBPQ_SOURCES_DIR}/src/interfaces/libpq/fe-exec.c + ${LIBPQ_SOURCES_DIR}/src/interfaces/libpq/fe-lobj.c + ${LIBPQ_SOURCES_DIR}/src/interfaces/libpq/fe-misc.c + ${LIBPQ_SOURCES_DIR}/src/interfaces/libpq/fe-print.c + ${LIBPQ_SOURCES_DIR}/src/interfaces/libpq/fe-protocol2.c + ${LIBPQ_SOURCES_DIR}/src/interfaces/libpq/fe-protocol3.c + ${LIBPQ_SOURCES_DIR}/src/interfaces/libpq/fe-secure.c + ${LIBPQ_SOURCES_DIR}/src/interfaces/libpq/libpq-events.c + ${LIBPQ_SOURCES_DIR}/src/interfaces/libpq/pqexpbuffer.c + + # libpgport C files we always use + ${LIBPQ_SOURCES_DIR}/src/port/chklocale.c + ${LIBPQ_SOURCES_DIR}/src/port/inet_net_ntop.c + ${LIBPQ_SOURCES_DIR}/src/port/noblock.c + ${LIBPQ_SOURCES_DIR}/src/port/pgstrcasecmp.c + ${LIBPQ_SOURCES_DIR}/src/port/pqsignal.c + ${LIBPQ_SOURCES_DIR}/src/port/thread.c + + ${LIBPQ_SOURCES_DIR}/src/backend/libpq/ip.c + ${LIBPQ_SOURCES_DIR}/src/backend/libpq/md5.c + ${LIBPQ_SOURCES_DIR}/src/backend/utils/mb/encnames.c + ${LIBPQ_SOURCES_DIR}/src/backend/utils/mb/wchar.c + ) + + + if (CMAKE_SYSTEM_NAME STREQUAL "Linux") + LIST(APPEND LIBPQ_SOURCES + ${LIBPQ_SOURCES_DIR}/src/port/strlcpy.c + ) + + elseif (CMAKE_SYSTEM_NAME STREQUAL "Windows") + include_directories( + ${LIBPQ_SOURCES_DIR}/src/include/port/win32 + ${LIBPQ_SOURCES_DIR}/src/port + ) + + LIST(APPEND LIBPQ_SOURCES + # libpgport C files that are needed if identified by configure + ${LIBPQ_SOURCES_DIR}/src/interfaces/libpq/win32.c + ${LIBPQ_SOURCES_DIR}/src/port/crypt.c + ${LIBPQ_SOURCES_DIR}/src/port/inet_aton.c + ${LIBPQ_SOURCES_DIR}/src/port/open.c + ${LIBPQ_SOURCES_DIR}/src/port/pgsleep.c + ${LIBPQ_SOURCES_DIR}/src/port/snprintf.c + ${LIBPQ_SOURCES_DIR}/src/port/system.c + ${LIBPQ_SOURCES_DIR}/src/port/win32setlocale.c + ${LIBPQ_SOURCES_DIR}/src/port/getaddrinfo.c + ${LIBPQ_SOURCES_DIR}/src/port/strlcpy.c + ) + + if (CMAKE_COMPILER_IS_GNUCXX OR + (MSVC AND MSVC_VERSION GREATER 1800)) + # Starting Visual Studio 2013 (version 1800), it is necessary to also add "win32error.c" + LIST(APPEND LIBPQ_SOURCES ${LIBPQ_SOURCES_DIR}/src/port/win32error.c) + endif() + + if (MSVC) + LIST(APPEND LIBPQ_SOURCES ${LIBPQ_SOURCES_DIR}/src/interfaces/libpq/pthread-win32.c) + endif() + endif() + + if (CMAKE_COMPILER_IS_GNUCXX AND + NOT CMAKE_SYSTEM_NAME STREQUAL "OpenBSD") + LIST(APPEND LIBPQ_SOURCES + ${LIBPQ_SOURCES_DIR}/src/port/getpeereid.c + ) + + elseif (MSVC) + include_directories( + ${LIBPQ_SOURCES_DIR}/src/include/port/win32_msvc + ) + + LIST(APPEND LIBPQ_SOURCES + ${LIBPQ_SOURCES_DIR}/src/port/dirent.c + ${LIBPQ_SOURCES_DIR}/src/port/dirmod.c + ) + endif() + + source_group(ThirdParty\\PostgreSQL REGULAR_EXPRESSION ${LIBPQ_SOURCES_DIR}/.*) + +else() + include(${CMAKE_CURRENT_LIST_DIR}/FindPostgreSQL.cmake) + include_directories( + ${PostgreSQL_INCLUDE_DIR} + ${PostgreSQL_TYPE_INCLUDE_DIR} + ) + link_libraries(${PostgreSQL_LIBRARY}) +endif()