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