mysql5/mysql-5.7.27/cmake/merge_archives.cmake.in

163 lines
5.6 KiB
CMake

# Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
#
# 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
# Build TARGET_NAME (a static library) from "convenience libraries"
# -DTARGET_NAME=${TARGET}
# -DTARGET_LOC=$<TARGET_FILE:${TARGET}>
# -DCFG_INTDIR=${CMAKE_CFG_INTDIR}
SET(APPLE "@APPLE@")
SET(LINUX "@LINUX@")
SET(MSVC "@MSVC@")
SET(SOLARIS "@SOLARIS@")
SET(UNIX "@UNIX@")
SET(MYLIBS "@MYLIBS@")
SET(MYSQL_CMAKE_SCRIPT_DIR "@MYSQL_CMAKE_SCRIPT_DIR@")
SET(CMAKE_AR "@CMAKE_AR@")
SET(CMAKE_BINARY_DIR "@CMAKE_BINARY_DIR@")
SET(CMAKE_COMMAND "@CMAKE_COMMAND@")
SET(CMAKE_CXX_CREATE_STATIC_LIBRARY "@CMAKE_CXX_CREATE_STATIC_LIBRARY@")
SET(CMAKE_C_CREATE_STATIC_LIBRARY "@CMAKE_C_CREATE_STATIC_LIBRARY@")
SET(CMAKE_LINKER "@CMAKE_LINKER@")
SET(CMAKE_RANLIB "@CMAKE_RANLIB@")
SET(CMAKE_STATIC_LINKER_FLAGS "@CMAKE_STATIC_LINKER_FLAGS@")
# MESSAGE(STATUS "merge_archives MYLIBS ${MYLIBS}")
# MESSAGE(STATUS "merge_archives TARGET_LINK_FLAGS ${TARGET_LINK_FLAGS}")
# MESSAGE(STATUS "merge_archives TARGET_LOC ${TARGET_LOC}")
# MESSAGE(STATUS "merge_archives TARGET_NAME ${TARGET_NAME}")
#
# MESSAGE(STATUS "merge_archives CMAKE_AR ${CMAKE_AR}")
# MESSAGE(STATUS "merge_archives CMAKE_BINARY_DIR ${CMAKE_BINARY_DIR}")
# MESSAGE(STATUS "merge_archives CMAKE_COMMAND ${CMAKE_COMMAND}")
# MESSAGE(STATUS "merge_archives CMAKE_CXX_CREATE_STATIC_LIBRARY ${CMAKE_CXX_CREATE_STATIC_LIBRARY}")
# MESSAGE(STATUS "merge_archives CMAKE_C_CREATE_STATIC_LIBRARY ${CMAKE_C_CREATE_STATIC_LIBRARY}")
# MESSAGE(STATUS "merge_archives CMAKE_LINKER ${CMAKE_LINKER}")
# MESSAGE(STATUS "merge_archives CMAKE_RANLIB ${CMAKE_RANLIB}")
# MESSAGE(STATUS "merge_archives CMAKE_STATIC_LINKER_FLAGS ${CMAKE_STATIC_LINKER_FLAGS}")
SET(LIB_LOCATIONS)
FOREACH(LIB ${MYLIBS})
SET(FILENAME "${CMAKE_BINARY_DIR}/archive_output_directory")
SET(FILENAME "${FILENAME}/${CFG_INTDIR}/lib_location_${LIB}")
FILE(READ ${FILENAME} CONTENT)
STRING(REGEX REPLACE "\n" "" LIB_LOCATION ${CONTENT})
LIST(APPEND LIB_LOCATIONS ${LIB_LOCATION})
# MESSAGE(STATUS "LIB ${LIB} LIB_LOCATION ${LIB_LOCATION}")
ENDFOREACH()
MACRO(CONFIGURE_FILE_CONTENT content file)
SET(CMAKE_CONFIGURABLE_FILE_CONTENT
"${content}")
CONFIGURE_FILE(
${MYSQL_CMAKE_SCRIPT_DIR}/configurable_file_content.in
${file}
@ONLY)
ENDMACRO()
# Remove the "dummy" library, created from the empty ${TARGET}_depends.c
EXECUTE_PROCESS(
COMMAND ${CMAKE_COMMAND} -E remove ${TARGET_LOC}
)
IF(MSVC)
# See CMAKE_CXX_CREATE_STATIC_LIBRARY
FIND_PROGRAM(LINK_IN_PATH "link.exe")
MESSAGE(STATUS "merge_archives linker in PATH is ${LINK_IN_PATH}")
EXECUTE_PROCESS(
COMMAND ${CMAKE_LINKER} "/lib" "/NOLOGO" "${CMAKE_STATIC_LINKER_FLAGS}"
"/OUT:${TARGET_LOC}" ${LIB_LOCATIONS}
RESULT_VARIABLE link_result
OUTPUT_FILE link_output_file
ERROR_FILE link_error_file
)
MESSAGE(STATUS "link_result is ${link_result}")
IF(link_result)
MESSAGE(WARNING "Retrying link with ${LINK_IN_PATH}")
EXECUTE_PROCESS(
COMMAND ${LINK_IN_PATH} "/lib" "/NOLOGO" "${CMAKE_STATIC_LINKER_FLAGS}"
"/OUT:${TARGET_LOC}" ${LIB_LOCATIONS}
RESULT_VARIABLE link_result
)
ENDIF()
ELSEIF(APPLE)
# libtool handles it for us
EXECUTE_PROCESS(
COMMAND /usr/bin/libtool -static -o ${TARGET_LOC} ${LIB_LOCATIONS}
)
ELSEIF(LINUX)
# First create a "thin" archive, then convert it to a normal one.
SET(CONTENT "create ${TARGET_LOC}\n")
SET(CONTENT "${CONTENT}addlib ${TARGET_LOC}\n")
SET(CONTENT "${CONTENT}save\n")
SET(CONTENT "${CONTENT}end\n")
CONFIGURE_FILE_CONTENT(
${CONTENT}
"${CMAKE_BINARY_DIR}/archive_output_directory/cmake_ar_m_${TARGET_NAME}")
EXECUTE_PROCESS(
COMMAND ${CMAKE_AR} cqT ${TARGET_LOC} ${LIB_LOCATIONS}
)
EXECUTE_PROCESS(
COMMAND ${CMAKE_AR} -M
INPUT_FILE
"${CMAKE_BINARY_DIR}/archive_output_directory/cmake_ar_m_${TARGET_NAME}"
)
EXECUTE_PROCESS(
COMMAND ${CMAKE_RANLIB} ${TARGET_LOC}
)
ELSEIF(UNIX)
# freebsd and solaris, run 'ar -x' on all libraries,
# followed by 'ar -r' on all .o files
SET(TEMP_DIR
"${CMAKE_BINARY_DIR}/archive_output_directory/merge_archives_${TARGET_NAME}")
MAKE_DIRECTORY(${TEMP_DIR})
FOREACH(LIB ${LIB_LOCATIONS})
GET_FILENAME_COMPONENT(NAME_NO_EXT ${LIB} NAME_WE)
SET(TEMP_SUBDIR ${TEMP_DIR}/${NAME_NO_EXT})
MAKE_DIRECTORY(${TEMP_SUBDIR})
# Extract files into a sub-directory
EXECUTE_PROCESS(
COMMAND ${CMAKE_AR} -x ${LIB}
WORKING_DIRECTORY ${TEMP_SUBDIR}
)
FILE(GLOB_RECURSE LIB_OBJECTS "${TEMP_SUBDIR}/*")
SET(OBJECTS ${OBJECTS} ${LIB_OBJECTS})
ENDFOREACH()
# Use relative paths, makes command line shorter.
FOREACH(OBJ ${OBJECTS})
FILE(RELATIVE_PATH OBJ ${TEMP_DIR} ${OBJ})
FILE(TO_NATIVE_PATH ${OBJ} OBJ)
SET(ALL_OBJECTS ${ALL_OBJECTS} ${OBJ})
ENDFOREACH()
EXECUTE_PROCESS(
COMMAND ${CMAKE_AR} -r ${TARGET_LOC} ${ALL_OBJECTS}
WORKING_DIRECTORY ${TEMP_DIR}
)
EXECUTE_PROCESS(
COMMAND ${CMAKE_RANLIB} ${TARGET_LOC}
)
# Cleanup
FILE(REMOVE_RECURSE ${TEMP_DIR})
ELSE()
MESSAGE(FATAL_ERROR "Don't know how to merge libraries.")
ENDIF()