1# Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. 2# 3# This program is free software; you can redistribute it and/or modify 4# it under the terms of the GNU General Public License as published by 5# the Free Software Foundation; version 2 of the License. 6# 7# This program is distributed in the hope that it will be useful, 8# but WITHOUT ANY WARRANTY; without even the implied warranty of 9# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10# GNU General Public License for more details. 11# 12# You should have received a copy of the GNU General Public License 13# along with this program; if not, write to the Free Software 14# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA 15 16INCLUDE(CMakeParseArguments) 17 18FUNCTION (INSTALL_DEBUG_SYMBOLS) 19 IF(MSVC) 20 CMAKE_PARSE_ARGUMENTS(ARG 21 "" 22 "COMPONENT;INSTALL_LOCATION" 23 "" 24 ${ARGN} 25 ) 26 27 IF(NOT ARG_COMPONENT) 28 SET(ARG_COMPONENT DebugBinaries) 29 ENDIF() 30 IF(NOT ARG_INSTALL_LOCATION) 31 SET(ARG_INSTALL_LOCATION lib) 32 ENDIF() 33 SET(targets ${ARG_UNPARSED_ARGUMENTS}) 34 FOREACH(target ${targets}) 35 GET_TARGET_PROPERTY(target_type ${target} TYPE) 36 IF(target_type MATCHES "STATIC") 37 RETURN() 38 ENDIF() 39 set(comp "") 40 41 IF(target STREQUAL "server" 42 OR target STREQUAL "mariadbd") 43 SET(comp Server) 44 ENDIF() 45 46 INSTALL(FILES $<TARGET_PDB_FILE:${target}> DESTINATION symbols COMPONENT Debuginfo) 47 IF(comp) 48 INSTALL(FILES $<TARGET_PDB_FILE:${target}> DESTINATION ${ARG_INSTALL_LOCATION} COMPONENT ${comp}) 49 ENDIF() 50 ENDFOREACH() 51 ENDIF() 52ENDFUNCTION() 53 54# Installs manpage for given file (either script or executable) 55# 56FUNCTION(INSTALL_MANPAGE file) 57 IF(NOT UNIX) 58 RETURN() 59 ENDIF() 60 GET_FILENAME_COMPONENT(file_name "${file}" NAME) 61 SET(GLOB_EXPR 62 ${CMAKE_SOURCE_DIR}/man/*${file}man.1* 63 ${CMAKE_SOURCE_DIR}/man/*${file}man.8* 64 ${CMAKE_BINARY_DIR}/man/*${file}man.1* 65 ${CMAKE_BINARY_DIR}/man/*${file}man.8* 66 ) 67 IF(MYSQL_DOC_DIR) 68 SET(GLOB_EXPR 69 ${MYSQL_DOC_DIR}/man/*${file}man.1* 70 ${MYSQL_DOC_DIR}/man/*${file}man.8* 71 ${MYSQL_DOC_DIR}/man/*${file}.1* 72 ${MYSQL_DOC_DIR}/man/*${file}.8* 73 ${GLOB_EXPR} 74 ) 75 ENDIF() 76 77 FILE(GLOB_RECURSE MANPAGES ${GLOB_EXPR}) 78 79 IF(MANPAGES) 80 LIST(GET MANPAGES 0 MANPAGE) 81 STRING(REPLACE "${file}man.1" "${file}.1" MANPAGE "${MANPAGE}") 82 STRING(REPLACE "${file}man.8" "${file}.8" MANPAGE "${MANPAGE}") 83 IF(MANPAGE MATCHES "${file}.1") 84 SET(SECTION man1) 85 ELSE() 86 SET(SECTION man8) 87 ENDIF() 88 INSTALL(FILES "${MANPAGE}" DESTINATION "${INSTALL_MANDIR}/${SECTION}" 89 COMPONENT ManPages) 90 ENDIF() 91ENDFUNCTION() 92 93FUNCTION(INSTALL_SCRIPT) 94 CMAKE_PARSE_ARGUMENTS(ARG 95 "" 96 "DESTINATION;COMPONENT" 97 "" 98 ${ARGN} 99 ) 100 101 SET(script ${ARG_UNPARSED_ARGUMENTS}) 102 IF(NOT ARG_DESTINATION) 103 SET(ARG_DESTINATION ${INSTALL_BINDIR}) 104 ENDIF() 105 SET(COMP ${ARG_COMPONENT}) 106 107 IF (COMP MATCHES ${SKIP_COMPONENTS}) 108 RETURN() 109 ENDIF() 110 111 INSTALL(PROGRAMS ${script} DESTINATION ${ARG_DESTINATION} COMPONENT ${COMP}) 112 get_filename_component(dest "${script}" NAME) 113 INSTALL_MANPAGE(${dest}) 114ENDFUNCTION() 115 116 117FUNCTION(INSTALL_DOCUMENTATION) 118 CMAKE_PARSE_ARGUMENTS(ARG "" "COMPONENT" "" ${ARGN}) 119 SET(files ${ARG_UNPARSED_ARGUMENTS}) 120 IF(NOT ARG_COMPONENT) 121 SET(ARG_COMPONENT Server) 122 ENDIF() 123 IF (ARG_COMPONENT MATCHES "Readme") 124 SET(destination ${INSTALL_DOCREADMEDIR}) 125 ELSE() 126 SET(destination ${INSTALL_DOCDIR}) 127 ENDIF() 128 129 IF (ARG_COMPONENT MATCHES ${SKIP_COMPONENTS}) 130 RETURN() 131 ENDIF() 132 133 STRING(TOUPPER ${ARG_COMPONENT} COMPUP) 134 IF(CPACK_COMPONENT_${COMPUP}_GROUP) 135 SET(group ${CPACK_COMPONENT_${COMPUP}_GROUP}) 136 ELSE() 137 SET(group ${ARG_COMPONENT}) 138 ENDIF() 139 140 IF(RPM) 141 SET(destination "${destination}/MariaDB-${group}-${VERSION}") 142 ELSEIF(DEB) 143 SET(destination "${destination}/mariadb-${group}-${MAJOR_VERSION}.${MINOR_VERSION}") 144 ENDIF() 145 146 INSTALL(FILES ${files} DESTINATION ${destination} COMPONENT ${ARG_COMPONENT}) 147ENDFUNCTION() 148 149 150# Install symbolic link to CMake target. 151# the link is created in the current build directory 152# and extension will be the same as for target file. 153MACRO(INSTALL_SYMLINK linkname target destination component) 154IF(UNIX) 155 SET(output ${CMAKE_CURRENT_BINARY_DIR}/${linkname}) 156 ADD_CUSTOM_COMMAND( 157 OUTPUT ${output} 158 COMMAND ${CMAKE_COMMAND} ARGS -E remove -f ${linkname} 159 COMMAND ${CMAKE_COMMAND} ARGS -E create_symlink 160 $<TARGET_FILE_NAME:${target}> 161 ${linkname} 162 DEPENDS ${target} 163 ) 164 165 ADD_CUSTOM_TARGET(symlink_${linkname} 166 ALL 167 DEPENDS ${output}) 168 SET_TARGET_PROPERTIES(symlink_${linkname} PROPERTIES CLEAN_DIRECT_OUTPUT 1) 169 IF(CMAKE_GENERATOR MATCHES "Xcode") 170 # For Xcode, replace project config with install config 171 STRING(REPLACE "${CMAKE_CFG_INTDIR}" 172 "\${CMAKE_INSTALL_CONFIG_NAME}" output ${output}) 173 ENDIF() 174 INSTALL(FILES ${output} DESTINATION ${destination} COMPONENT ${component}) 175ENDIF() 176ENDMACRO() 177 178IF(WIN32) 179 OPTION(SIGNCODE "Sign executables and dlls with digital certificate" OFF) 180 MARK_AS_ADVANCED(SIGNCODE) 181 IF(SIGNCODE) 182 SET(SIGNTOOL_PARAMETERS 183 /a /t http://timestamp.globalsign.com/?signature=sha2 184 CACHE STRING "parameters for signtool (list)") 185 IF(NOT SIGNTOOL_EXECUTABLE) 186 FILE(GLOB path_list 187 "$ENV{ProgramFiles} (x86)/Windows Kits/*/bin/*/x64" 188 "$ENV{ProgramFiles} (x86)/Windows Kits/*/App Certification Kit" 189 ) 190 FIND_PROGRAM(SIGNTOOL_EXECUTABLE signtool 191 PATHS ${path_list} 192 ) 193 IF(NOT SIGNTOOL_EXECUTABLE) 194 MESSAGE(FATAL_ERROR 195 "signtool is not found. Signing executables not possible") 196 ENDIF() 197 MARK_AS_ADVANCED(SIGNTOOL_EXECUTABLE SIGNTOOL_PARAMETERS) 198 ENDIF() 199 ENDIF() 200ENDIF() 201 202 203FUNCTION(SIGN_TARGET target) 204 IF(NOT SIGNCODE) 205 RETURN() 206 ENDIF() 207 GET_TARGET_PROPERTY(target_type ${target} TYPE) 208 IF((NOT target_type) OR (target_type MATCHES "STATIC")) 209 RETURN() 210 ENDIF() 211 # Mark executable for signing by creating empty *.signme file 212 # The actual signing happens in preinstall step 213 # (which traverses 214 ADD_CUSTOM_COMMAND(TARGET ${target} POST_BUILD 215 COMMAND ${CMAKE_COMMAND} -E touch "$<TARGET_FILE:${target}>.signme" 216 ) 217ENDFUNCTION() 218 219# Installs targets, also installs pdbs on Windows. 220# 221# 222 223FUNCTION(MYSQL_INSTALL_TARGETS) 224 CMAKE_PARSE_ARGUMENTS(ARG 225 "" 226 "DESTINATION;COMPONENT" 227 "" 228 ${ARGN} 229 ) 230 IF(ARG_COMPONENT) 231 SET(COMP COMPONENT ${ARG_COMPONENT}) 232 ELSE() 233 MESSAGE(FATAL_ERROR "COMPONENT argument required") 234 ENDIF() 235 236 SET(TARGETS ${ARG_UNPARSED_ARGUMENTS}) 237 IF(NOT TARGETS) 238 MESSAGE(FATAL_ERROR "Need target list for MYSQL_INSTALL_TARGETS") 239 ENDIF() 240 IF(NOT ARG_DESTINATION) 241 MESSAGE(FATAL_ERROR "Need DESTINATION parameter for MYSQL_INSTALL_TARGETS") 242 ENDIF() 243 244 FOREACH(target ${TARGETS}) 245 # If signing is required, sign executables before installing 246 IF(SIGNCODE) 247 SIGN_TARGET(${target} ${COMP}) 248 ENDIF() 249 # Install man pages on Unix 250 IF(UNIX) 251 INSTALL_MANPAGE($<TARGET_FILE:${target}>) 252 ENDIF() 253 ENDFOREACH() 254 255 INSTALL(TARGETS ${TARGETS} DESTINATION ${ARG_DESTINATION} ${COMP}) 256 INSTALL_DEBUG_SYMBOLS(${TARGETS} ${COMP} INSTALL_LOCATION ${ARG_DESTINATION}) 257 258ENDFUNCTION() 259 260# Optionally install mysqld/client/embedded from debug build run. outside of the current build dir 261# (unless multi-config generator is used like Visual Studio or Xcode). 262# For Makefile generators we default Debug build directory to ${buildroot}/../debug. 263GET_FILENAME_COMPONENT(BINARY_PARENTDIR ${CMAKE_BINARY_DIR} PATH) 264SET(DEBUGBUILDDIR "${BINARY_PARENTDIR}/debug" CACHE INTERNAL "Directory of debug build") 265 266FUNCTION(INSTALL_MYSQL_TEST from to) 267 IF(INSTALL_MYSQLTESTDIR) 268 INSTALL( 269 DIRECTORY ${from} 270 DESTINATION "${INSTALL_MYSQLTESTDIR}/${to}" 271 USE_SOURCE_PERMISSIONS 272 COMPONENT Test 273 PATTERN "var" EXCLUDE 274 PATTERN "lib/My/SafeProcess" EXCLUDE 275 PATTERN "lib/t*" EXCLUDE 276 PATTERN "CPack" EXCLUDE 277 PATTERN "CMake*" EXCLUDE 278 PATTERN "cmake_install.cmake" EXCLUDE 279 PATTERN "mtr.out*" EXCLUDE 280 PATTERN ".cvsignore" EXCLUDE 281 PATTERN "*.am" EXCLUDE 282 PATTERN "*.in" EXCLUDE 283 PATTERN "Makefile" EXCLUDE 284 PATTERN "*.vcxproj" EXCLUDE 285 PATTERN "*.vcxproj.filters" EXCLUDE 286 PATTERN "*.vcxproj.user" EXCLUDE 287 PATTERN "CTest*" EXCLUDE 288 PATTERN "*~" EXCLUDE 289 ) 290 ENDIF() 291ENDFUNCTION() 292