1# Copyright (c) 2009, 2021, Oracle and/or its affiliates.
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, version 2.0,
5# as published by the Free Software Foundation.
6#
7# This program is also distributed with certain software (including
8# but not limited to OpenSSL) that is licensed under separate terms,
9# as designated in a particular file or component or in included license
10# documentation.  The authors of MySQL hereby grant you an additional
11# permission to link the program and your derivative works with the
12# separately licensed software that they have included with MySQL.
13#
14# This program is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17# GNU General Public License, version 2.0, for more details.
18#
19# You should have received a copy of the GNU General Public License
20# along with this program; if not, write to the Free Software
21# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
22
23# Make source distribution
24# If git is present, run git archive.
25# Otherwise, just run cpack with source configuration.
26
27SET(CMAKE_SOURCE_DIR "@CMAKE_SOURCE_DIR@")
28SET(CMAKE_BINARY_DIR "@CMAKE_BINARY_DIR@")
29SET(CPACK_SOURCE_PACKAGE_FILE_NAME "@CPACK_SOURCE_PACKAGE_FILE_NAME@")
30SET(CMAKE_CPACK_COMMAND  "@CMAKE_CPACK_COMMAND@")
31SET(CMAKE_COMMAND  "@CMAKE_COMMAND@")
32SET(GIT_EXECUTABLE "@GIT_EXECUTABLE@")
33SET(GTAR_EXECUTABLE "@GTAR_EXECUTABLE@")
34SET(TAR_EXECUTABLE "@TAR_EXECUTABLE@")
35SET(CMAKE_GENERATOR "@CMAKE_GENERATOR@")
36SET(CMAKE_MAKE_PROGRAM "@CMAKE_MAKE_PROGRAM@")
37SET(CMAKE_SYSTEM_NAME "@CMAKE_SYSTEM_NAME@")
38SET(BUILD_IS_SINGLE_CONFIG "@BUILD_IS_SINGLE_CONFIG@")
39SET(WITH_WSREP "@WITH_WSREP@")
40
41SET(VERSION "@VERSION@")
42
43SET(MYSQL_DOCS_LOCATION "@MYSQL_DOCS_LOCATION@")
44
45
46SET(PACKAGE_DIR  ${CMAKE_BINARY_DIR}/${CPACK_SOURCE_PACKAGE_FILE_NAME})
47
48FILE(REMOVE_RECURSE ${PACKAGE_DIR})
49FILE(REMOVE ${PACKAGE_DIR}.tar.gz )
50
51# Only allow git if source dir itself is a git repository
52IF(GIT_EXECUTABLE)
53  EXECUTE_PROCESS(
54    COMMAND "${GIT_EXECUTABLE}" rev-parse --show-toplevel
55    OUTPUT_VARIABLE GIT_ROOT
56    ERROR_VARIABLE GIT_ROOT_ERROR
57    OUTPUT_STRIP_TRAILING_WHITESPACE
58    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
59    RESULT_VARIABLE RESULT
60  )
61
62  IF(NOT RESULT EQUAL 0 OR NOT GIT_ROOT STREQUAL ${CMAKE_SOURCE_DIR})
63    MESSAGE(STATUS "This is not a git repository")
64    SET(GIT_EXECUTABLE)
65  ENDIF()
66ENDIF()
67
68# this code is to checkout current revision (not just HEAD)
69# with all submodules and create complete source tarball
70IF(WITH_WSREP)
71  IF(GIT_EXECUTABLE)
72    MESSAGE(STATUS "Running git checkout-index")
73    EXECUTE_PROCESS(
74      COMMAND "${GIT_EXECUTABLE}" checkout-index --all --prefix=${PACKAGE_DIR}/
75      WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
76      RESULT_VARIABLE RESULT
77    )
78    IF(NOT RESULT EQUAL 0)
79      SET(GIT_EXECUTABLE)
80    ENDIF()
81    EXECUTE_PROCESS(
82      COMMAND "${GIT_EXECUTABLE}" submodule foreach "${GIT_EXECUTABLE} checkout-index --all --prefix=${PACKAGE_DIR}/$path/"
83      WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
84      RESULT_VARIABLE RESULT
85    )
86    IF(NOT RESULT EQUAL 0)
87      SET(GIT_EXECUTABLE)
88    ENDIF()
89  ENDIF()
90ELSE()
91  IF(GIT_EXECUTABLE)
92    MESSAGE(STATUS "Running git archive -o ${PACKAGE_DIR}.tar")
93    EXECUTE_PROCESS(
94      COMMAND "${GIT_EXECUTABLE}" archive --format=tar
95      --prefix=${CPACK_SOURCE_PACKAGE_FILE_NAME}/ -o ${PACKAGE_DIR}.tar HEAD
96      WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
97      RESULT_VARIABLE RESULT
98    )
99    IF(NOT RESULT EQUAL 0)
100      SET(GIT_EXECUTABLE)
101    ELSE()
102      # Unpack tarball
103      EXECUTE_PROCESS(
104        COMMAND ${CMAKE_COMMAND} -E tar xf ${PACKAGE_DIR}.tar
105        WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
106        RESULT_VARIABLE TAR_RESULT
107      )
108      IF(NOT TAR_RESULT EQUAL 0)
109        SET(GIT_EXECUTABLE)
110      ELSE()
111        # Remove tarball after unpacking
112        EXECUTE_PROCESS(
113          COMMAND ${CMAKE_COMMAND} -E remove ${PACKAGE_DIR}.tar
114          WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
115        )
116      ENDIF()
117    ENDIF()
118  ENDIF()
119ENDIF()
120
121IF(NOT GIT_EXECUTABLE)
122  MESSAGE(STATUS "git not found or source dir is not a repo, use CPack")
123
124  IF(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
125    # In-source build is the worst option, we have to cleanup source tree.
126
127    # Save bison output first.
128    CONFIGURE_FILE(${CMAKE_BINARY_DIR}/sql/sql_yacc.cc
129       ${CMAKE_BINARY_DIR}/sql_yacc.cc COPYONLY)
130    CONFIGURE_FILE(${CMAKE_BINARY_DIR}/sql/sql_yacc.h
131       ${CMAKE_BINARY_DIR}/sql_yacc.h COPYONLY)
132    #
133    CONFIGURE_FILE(${CMAKE_BINARY_DIR}/sql/sql_hints.yy.cc
134       ${CMAKE_BINARY_DIR}/sql_hints.yy.cc COPYONLY)
135    CONFIGURE_FILE(${CMAKE_BINARY_DIR}/sql/sql_hints.yy.h
136       ${CMAKE_BINARY_DIR}/sql_hints.yy.h COPYONLY)
137
138    IF(BUILD_IS_SINGLE_CONFIG)
139    # make clean
140    EXECUTE_PROCESS(
141      COMMAND ${CMAKE_MAKE_PROGRAM} clean
142      WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
143    )
144    ENDIF()
145
146    # Restore bison output
147    CONFIGURE_FILE(${CMAKE_BINARY_DIR}/sql_yacc.cc
148       ${CMAKE_BINARY_DIR}/sql/sql_yacc.cc COPYONLY)
149    CONFIGURE_FILE(${CMAKE_BINARY_DIR}/sql_yacc.h
150       ${CMAKE_BINARY_DIR}/sql/sql_yacc.h COPYONLY)
151    FILE(REMOVE ${CMAKE_BINARY_DIR}/sql_yacc.cc)
152    FILE(REMOVE ${CMAKE_BINARY_DIR}/sql_yacc.h)
153    #
154    CONFIGURE_FILE(${CMAKE_BINARY_DIR}/sql_hints.yy.cc
155       ${CMAKE_BINARY_DIR}/sql/sql_hints.yy.cc COPYONLY)
156    CONFIGURE_FILE(${CMAKE_BINARY_DIR}/sql_hints.yy.h
157       ${CMAKE_BINARY_DIR}/sql/sql_hints.yy.h COPYONLY)
158    FILE(REMOVE ${CMAKE_BINARY_DIR}/sql_hints.yy.cc)
159    FILE(REMOVE ${CMAKE_BINARY_DIR}/sql_hints.yy.h)
160  ENDIF()
161
162  EXECUTE_PROCESS(
163    COMMAND ${CMAKE_CPACK_COMMAND} -G TGZ --config ./CPackSourceConfig.cmake
164    ${CMAKE_BINARY_DIR}/CPackSourceConfig.cmake
165
166    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
167  )
168  EXECUTE_PROCESS(
169  COMMAND ${CMAKE_COMMAND} -E tar xzf
170    ${CPACK_SOURCE_PACKAGE_FILE_NAME}.tar.gz
171    ${PACK_SOURCE_PACKAGE_FILE_NAME}
172    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
173  )
174ENDIF()
175
176# Copy bison output
177CONFIGURE_FILE(${CMAKE_BINARY_DIR}/sql/sql_yacc.h
178   ${PACKAGE_DIR}/sql/sql_yacc.h COPYONLY)
179CONFIGURE_FILE(${CMAKE_BINARY_DIR}/sql/sql_yacc.cc
180   ${PACKAGE_DIR}/sql/sql_yacc.cc COPYONLY)
181#
182CONFIGURE_FILE(${CMAKE_BINARY_DIR}/sql/sql_hints.yy.h
183   ${PACKAGE_DIR}/sql/sql_hints.yy.h COPYONLY)
184CONFIGURE_FILE(${CMAKE_BINARY_DIR}/sql/sql_hints.yy.cc
185   ${PACKAGE_DIR}/sql/sql_hints.yy.cc COPYONLY)
186
187# Add documentation, if user has specified where to find them
188IF(MYSQL_DOCS_LOCATION)
189  MESSAGE("Copying documentation files from " ${MYSQL_DOCS_LOCATION})
190  EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E copy_directory "${MYSQL_DOCS_LOCATION}" "${PACKAGE_DIR}")
191ENDIF()
192
193# Ensure there is an "INFO_SRC" file.
194INCLUDE(${CMAKE_BINARY_DIR}/info_macros.cmake)
195IF(NOT EXISTS ${PACKAGE_DIR}/Docs/INFO_SRC)
196  CREATE_INFO_SRC(${PACKAGE_DIR}/Docs)
197ENDIF()
198
199# In case we used CPack, it could have copied some
200# extra files that are not usable on different machines.
201FILE(REMOVE ${PACKAGE_DIR}/CMakeCache.txt)
202
203# When packing source, prefer gnu tar  to "cmake -P tar"
204# cmake does not preserve timestamps.gnuwin32 tar is broken, cygwin is ok
205
206IF(CMAKE_SYSTEM_NAME MATCHES "Windows")
207  IF (EXISTS C:/cygwin/bin/tar.exe)
208    SET(TAR_EXECUTABLE C:/cygwin/bin/tar.exe)
209  ENDIF()
210ENDIF()
211
212IF(GTAR_EXECUTABLE)
213  SET(GNUTAR ${GTAR_EXECUTABLE})
214ELSEIF(TAR_EXECUTABLE)
215  EXECUTE_PROCESS(
216    COMMAND "${TAR_EXECUTABLE}" --version
217    RESULT_VARIABLE RESULT OUTPUT_VARIABLE OUT ERROR_VARIABLE ERR
218  )
219  IF(RESULT EQUAL 0 AND OUT MATCHES "GNU")
220    SET(GNUTAR ${TAR_EXECUTABLE})
221  ENDIF()
222ENDIF()
223
224SET($ENV{GZIP} "--best")
225
226IF(GNUTAR)
227  SET(PACK_COMMAND
228  ${GNUTAR} --exclude-vcs --owner=0 --group=0 -czf
229  ${CPACK_SOURCE_PACKAGE_FILE_NAME}.tar.gz
230  ${CPACK_SOURCE_PACKAGE_FILE_NAME}
231  )
232ELSE()
233  SET(PACK_COMMAND ${CMAKE_COMMAND} -E tar cfz
234  ${CPACK_SOURCE_PACKAGE_FILE_NAME}.tar.gz
235  ${CPACK_SOURCE_PACKAGE_FILE_NAME}
236)
237ENDIF()
238
239STRING(REPLACE ";" " " PACK_COMMAND_STRING "${PACK_COMMAND}")
240MESSAGE(STATUS "Creating source package with ${PACK_COMMAND_STRING}")
241
242EXECUTE_PROCESS(
243  COMMAND ${PACK_COMMAND}
244)
245MESSAGE(STATUS "Source package ${PACKAGE_DIR}.tar.gz created")
246