aboutsummaryrefslogtreecommitdiff
path: root/cmake/libutils.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'cmake/libutils.cmake')
-rw-r--r--cmake/libutils.cmake296
1 files changed, 0 insertions, 296 deletions
diff --git a/cmake/libutils.cmake b/cmake/libutils.cmake
deleted file mode 100644
index 2263b146e..000000000
--- a/cmake/libutils.cmake
+++ /dev/null
@@ -1,296 +0,0 @@
-# Copyright (C) 2009 Sun Microsystems, Inc
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; version 2 of the License.
-#
-# 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 General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-
-# This file exports macros that emulate some functionality found in GNU libtool
-# on Unix systems. One such feature is convenience libraries. In this context,
-# convenience library is a static library that can be linked to shared library
-# On systems that force position-independent code, linking into shared library
-# normally requires compilation with a special flag (often -fPIC). To enable
-# linking static libraries to shared, we compile source files that come into
-# static library with the PIC flag (${CMAKE_SHARED_LIBRARY_C_FLAGS} in CMake)
-# Some systems, like Windows or OSX do not need special compilation (Windows
-# never uses PIC and OSX always uses it).
-#
-# The intention behind convenience libraries is simplify the build and to reduce
-# excessive recompiles.
-
-# Except for convenience libraries, this file provides macros to merge static
-# libraries (we need it for mysqlclient) and to create shared library out of
-# convenience libraries(again, for mysqlclient)
-
-# Following macros are exported
-# - ADD_CONVENIENCE_LIBRARY(target source1...sourceN)
-# This macro creates convenience library. The functionality is similar to
-# ADD_LIBRARY(target STATIC source1...sourceN), the difference is that resulting
-# library can always be linked to shared library
-#
-# - MERGE_LIBRARIES(target [STATIC|SHARED|MODULE] [linklib1 .... linklibN]
-# [EXPORTS exported_func1 .... exported_func_N]
-# [OUTPUT_NAME output_name]
-# This macro merges several static libraries into a single one or creates a shared
-# library from several convenience libraries
-
-# Important global flags
-# - WITH_PIC : If set, it is assumed that everything is compiled as position
-# independent code (that is CFLAGS/CMAKE_C_FLAGS contain -fPIC or equivalent)
-# If defined, ADD_CONVENIENCE_LIBRARY does not add PIC flag to compile flags
-#
-# - DISABLE_SHARED: If set, it is assumed that shared libraries are not produced
-# during the build. ADD_CONVENIENCE_LIBRARY does not add anything to compile flags
-
-
-GET_FILENAME_COMPONENT(MYSQL_CMAKE_SCRIPT_DIR ${CMAKE_CURRENT_LIST_FILE} PATH)
-IF(WIN32 OR CYGWIN OR APPLE OR WITH_PIC OR DISABLE_SHARED OR NOT CMAKE_SHARED_LIBRARY_C_FLAGS)
- SET(_SKIP_PIC 1)
-ENDIF()
-
-INCLUDE(${MYSQL_CMAKE_SCRIPT_DIR}/cmake_parse_arguments.cmake)
-# CREATE_EXPORT_FILE (VAR target api_functions)
-# Internal macro, used to create source file for shared libraries that
-# otherwise consists entirely of "convenience" libraries. On Windows,
-# also exports API functions as dllexport. On unix, creates a dummy file
-# that references all exports and this prevents linker from creating an
-# empty library(there are unportable alternatives, --whole-archive)
-MACRO(CREATE_EXPORT_FILE VAR TARGET API_FUNCTIONS)
- IF(WIN32)
- SET(DUMMY ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_dummy.c)
- SET(EXPORTS ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_exports.def)
- CONFIGURE_FILE_CONTENT("" ${DUMMY})
- SET(CONTENT "EXPORTS\n")
- FOREACH(FUNC ${API_FUNCTIONS})
- SET(CONTENT "${CONTENT} ${FUNC}\n")
- ENDFOREACH()
- CONFIGURE_FILE_CONTENT(${CONTENT} ${EXPORTS})
- SET(${VAR} ${DUMMY} ${EXPORTS})
- ELSE()
- SET(EXPORTS ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_exports_file.cc)
- SET(CONTENT)
- FOREACH(FUNC ${API_FUNCTIONS})
- SET(CONTENT "${CONTENT} extern void* ${FUNC}\;\n")
- ENDFOREACH()
- SET(CONTENT "${CONTENT} void *${TARGET}_api_funcs[] = {\n")
- FOREACH(FUNC ${API_FUNCTIONS})
- SET(CONTENT "${CONTENT} &${FUNC},\n")
- ENDFOREACH()
- SET(CONTENT "${CONTENT} (void *)0\n}\;")
- CONFIGURE_FILE_CONTENT(${CONTENT} ${EXPORTS})
- SET(${VAR} ${EXPORTS})
- ENDIF()
-ENDMACRO()
-
-
-# MYSQL_ADD_CONVENIENCE_LIBRARY(name source1...sourceN)
-# Create static library that can be linked to shared library.
-# On systems that force position-independent code, adds -fPIC or
-# equivalent flag to compile flags.
-MACRO(ADD_CONVENIENCE_LIBRARY)
- SET(TARGET ${ARGV0})
- SET(SOURCES ${ARGN})
- LIST(REMOVE_AT SOURCES 0)
- ADD_LIBRARY(${TARGET} STATIC ${SOURCES})
- IF(NOT _SKIP_PIC)
- SET_TARGET_PROPERTIES(${TARGET} PROPERTIES COMPILE_FLAGS
- "${CMAKE_SHARED_LIBRARY_C_FLAGS}")
- ENDIF()
-ENDMACRO()
-
-
-# Write content to file, using CONFIGURE_FILE
-# The advantage compared to FILE(WRITE) is that timestamp
-# does not change if file already has the same content
-MACRO(CONFIGURE_FILE_CONTENT content file)
- SET(CMAKE_CONFIGURABLE_FILE_CONTENT
- "${content}\n")
- CONFIGURE_FILE(
- ${MYSQL_CMAKE_SCRIPT_DIR}/configurable_file_content.in
- ${file}
- @ONLY)
-ENDMACRO()
-
-# Merge static libraries into a big static lib. The resulting library
-# should not not have dependencies on other static libraries.
-# We use it in MySQL to merge mysys,dbug,vio etc into mysqlclient
-
-MACRO(MERGE_STATIC_LIBS TARGET OUTPUT_NAME LIBS_TO_MERGE)
- # To produce a library we need at least one source file.
- # It is created by ADD_CUSTOM_COMMAND below and will helps
- # also help to track dependencies.
- SET(SOURCE_FILE ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_depends.c)
- ADD_LIBRARY(${TARGET} STATIC ${SOURCE_FILE})
- SET_TARGET_PROPERTIES(${TARGET} PROPERTIES OUTPUT_NAME ${OUTPUT_NAME})
-
- SET(OSLIBS)
- FOREACH(LIB ${LIBS_TO_MERGE})
- GET_TARGET_PROPERTY(LIB_LOCATION ${LIB} LOCATION)
- GET_TARGET_PROPERTY(LIB_TYPE ${LIB} TYPE)
- IF(NOT LIB_LOCATION)
- # 3rd party library like libz.so. Make sure that everything
- # that links to our library links to this one as well.
- LIST(APPEND OSLIBS ${LIB})
- ELSE()
- # This is a target in current project
- # (can be a static or shared lib)
- IF(LIB_TYPE STREQUAL "STATIC_LIBRARY")
- SET(STATIC_LIBS ${STATIC_LIBS} ${LIB_LOCATION})
- ADD_DEPENDENCIES(${TARGET} ${LIB})
- # Extract dependend OS libraries
- GET_DEPENDEND_OS_LIBS(${LIB} LIB_OSLIBS)
- LIST(APPEND OSLIBS ${LIB_OSLIBS})
- ELSE()
- # This is a shared library our static lib depends on.
- LIST(APPEND OSLIBS ${LIB})
- ENDIF()
- ENDIF()
- ENDFOREACH()
- IF(OSLIBS)
- LIST(REMOVE_DUPLICATES OSLIBS)
- TARGET_LINK_LIBRARIES(${TARGET} ${OSLIBS})
- ENDIF()
-
- # Make the generated dummy source file depended on all static input
- # libs. If input lib changes,the source file is touched
- # which causes the desired effect (relink).
- ADD_CUSTOM_COMMAND(
- OUTPUT ${SOURCE_FILE}
- COMMAND ${CMAKE_COMMAND} -E touch ${SOURCE_FILE}
- DEPENDS ${STATIC_LIBS})
-
- IF(MSVC)
- # To merge libs, just pass them to lib.exe command line.
- SET(LINKER_EXTRA_FLAGS "")
- FOREACH(LIB ${STATIC_LIBS})
- SET(LINKER_EXTRA_FLAGS "${LINKER_EXTRA_FLAGS} ${LIB}")
- ENDFOREACH()
- SET_TARGET_PROPERTIES(${TARGET} PROPERTIES STATIC_LIBRARY_FLAGS
- "${LINKER_EXTRA_FLAGS}")
- ELSE()
- GET_TARGET_PROPERTY(TARGET_LOCATION ${TARGET} LOCATION)
- IF(APPLE)
- # Use OSX's libtool to merge archives (ihandles universal
- # binaries properly)
- ADD_CUSTOM_COMMAND(TARGET ${TARGET} POST_BUILD
- COMMAND rm ${TARGET_LOCATION}
- COMMAND /usr/bin/libtool -static -o ${TARGET_LOCATION}
- ${STATIC_LIBS}
- )
- ELSE()
- # Generic Unix, Cygwin or MinGW. In post-build step, call
- # script, that extracts objects from archives with "ar x"
- # and repacks them with "ar r"
- SET(TARGET ${TARGET})
- CONFIGURE_FILE(
- ${MYSQL_CMAKE_SCRIPT_DIR}/merge_archives_unix.cmake.in
- ${CMAKE_CURRENT_BINARY_DIR}/merge_archives_${TARGET}.cmake
- @ONLY
- )
- ADD_CUSTOM_COMMAND(TARGET ${TARGET} POST_BUILD
- COMMAND rm ${TARGET_LOCATION}
- COMMAND ${CMAKE_COMMAND} -P
- ${CMAKE_CURRENT_BINARY_DIR}/merge_archives_${TARGET}.cmake
- )
- ENDIF()
- ENDIF()
-ENDMACRO()
-
-# Create libs from libs.
-# Merges static libraries, creates shared libraries out of convenience libraries.
-# MERGE_LIBRARIES(target [STATIC|SHARED|MODULE]
-# [linklib1 .... linklibN]
-# [EXPORTS exported_func1 .... exportedFuncN]
-# [OUTPUT_NAME output_name]
-#)
-MACRO(MERGE_LIBRARIES)
- CMAKE_PARSE_ARGUMENTS(ARG
- "EXPORTS;OUTPUT_NAME"
- "STATIC;SHARED;MODULE;NOINSTALL"
- ${ARGN}
- )
- LIST(GET ARG_DEFAULT_ARGS 0 TARGET)
- SET(LIBS ${ARG_DEFAULT_ARGS})
- LIST(REMOVE_AT LIBS 0)
- IF(ARG_STATIC)
- IF (NOT ARG_OUTPUT_NAME)
- SET(ARG_OUTPUT_NAME ${TARGET})
- ENDIF()
- MERGE_STATIC_LIBS(${TARGET} ${ARG_OUTPUT_NAME} "${LIBS}")
- ELSEIF(ARG_SHARED OR ARG_MODULE)
- IF(ARG_SHARED)
- SET(LIBTYPE SHARED)
- ELSE()
- SET(LIBTYPE MODULE)
- ENDIF()
- # check for non-PIC libraries
- IF(NOT _SKIP_PIC)
- FOREACH(LIB ${LIBS})
- GET_TARGET_PROPERTY(${LIB} TYPE LIBTYPE)
- IF(LIBTYPE STREQUAL "STATIC_LIBRARY")
- GET_TARGET_PROPERTY(LIB COMPILE_FLAGS LIB_COMPILE_FLAGS)
- STRING(REPLACE "${CMAKE_SHARED_LIBRARY_C_FLAGS}"
- "<PIC_FLAG>" LIB_COMPILE_FLAGS ${LIB_COMPILE_FLAG})
- IF(NOT LIB_COMPILE_FLAGS MATCHES "<PIC_FLAG>")
- MESSAGE(FATAL_ERROR
- "Attempted to link non-PIC static library ${LIB} to shared library ${TARGET}\n"
- "Please use ADD_CONVENIENCE_LIBRARY, instead of ADD_LIBRARY for ${LIB}"
- )
- ENDIF()
- ENDIF()
- ENDFOREACH()
- ENDIF()
- CREATE_EXPORT_FILE(SRC ${TARGET} "${ARG_EXPORTS}")
- ADD_LIBRARY(${TARGET} ${LIBTYPE} ${SRC})
- TARGET_LINK_LIBRARIES(${TARGET} ${LIBS})
- IF(ARG_OUTPUT_NAME)
- SET_TARGET_PROPERTIES(${TARGET} PROPERTIES OUTPUT_NAME "${ARG_OUTPUT_NAME}")
- ENDIF()
- ELSE()
- MESSAGE(FATAL_ERROR "Unknown library type")
- ENDIF()
- IF(NOT ARG_NOINSTALL)
- MYSQL_INSTALL_TARGETS(${TARGET} DESTINATION "${INSTALL_LIBDIR}")
- ENDIF()
- SET_TARGET_PROPERTIES(${TARGET} PROPERTIES LINK_INTERFACE_LIBRARIES "")
-ENDMACRO()
-
-FUNCTION(GET_DEPENDEND_OS_LIBS target result)
- SET(deps ${${target}_LIB_DEPENDS})
- IF(deps)
- FOREACH(lib ${deps})
- # Filter out keywords for used for debug vs optimized builds
- IF(NOT lib MATCHES "general" AND NOT lib MATCHES "debug" AND NOT lib MATCHES "optimized")
- GET_TARGET_PROPERTY(lib_location ${lib} LOCATION)
- IF(NOT lib_location)
- SET(ret ${ret} ${lib})
- ENDIF()
- ENDIF()
- ENDFOREACH()
- ENDIF()
- SET(${result} ${ret} PARENT_SCOPE)
-ENDFUNCTION()
-
-MACRO(RESTRICT_SYMBOL_EXPORTS target)
- IF(CMAKE_COMPILER_IS_GNUCXX AND UNIX)
- CHECK_C_COMPILER_FLAG("-fvisibility=hidden" HAVE_VISIBILITY_HIDDEN)
- IF(HAVE_VISIBILITY_HIDDEN)
- GET_TARGET_PROPERTY(COMPILE_FLAGS ${target} COMPILE_FLAGS)
- IF(NOT COMPILE_FLAGS)
- # Avoid COMPILE_FLAGS-NOTFOUND
- SET(COMPILE_FLAGS)
- ENDIF()
- SET_TARGET_PROPERTIES(${target} PROPERTIES
- COMPILE_FLAGS "${COMPILE_FLAGS} -fvisibility=hidden")
- ENDIF()
- ENDIF()
-ENDMACRO()