1# Copyright (c) 2010, 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
23INCLUDE(libutils)
24INCLUDE(cmake_parse_arguments)
25
26SET(JAVAC_TARGET "1.6")
27
28# Build (if not already done) NDB version string used for generating jars etc.
29MACRO(SET_JAVA_NDB_VERSION)
30
31  # Check that the NDB_VERSION_XX variables seems to have been set
32  IF(NOT NDB_VERSION_MAJOR)
33    MESSAGE(FATAL_ERROR "NDB_VERSION_MAJOR variable not set!")
34  ENDIF()
35
36  SET(JAVA_NDB_VERSION "${NDB_VERSION_MAJOR}.${NDB_VERSION_MINOR}.${NDB_VERSION_BUILD}")
37  IF(NDB_VERSION_STATUS)
38    SET(JAVA_NDB_VERSION "${JAVA_NDB_VERSION}.${NDB_VERSION_STATUS}")
39  ENDIF()
40
41  # MESSAGE(STATUS "JAVA_NDB_VERSION: ${JAVA_NDB_VERSION}")
42
43ENDMACRO(SET_JAVA_NDB_VERSION)
44
45MACRO(CREATE_MANIFEST filename EXPORTS NAME)
46  FILE(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${filename}" "Manifest-Version: 1.0
47Export-Package: ${EXPORTS}
48Bundle-Name: ${NAME}
49Bundle-Description: ClusterJ")
50ENDMACRO(CREATE_MANIFEST)
51
52MACRO(CREATE_JAR)
53
54  MYSQL_PARSE_ARGUMENTS(ARG
55    "CLASSPATH;MERGE_JARS;DEPENDENCIES;MANIFEST;ENHANCE;EXTRA_FILES;BROKEN_JAVAC"
56    ""
57    ${ARGN}
58  )
59
60  LIST(GET ARG_DEFAULT_ARGS 0 TARGET)
61  SET(JAVA_FILES ${ARG_DEFAULT_ARGS})
62  LIST(REMOVE_AT JAVA_FILES 0)
63
64  SET (BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}/target")
65  SET (CLASS_DIR "${BUILD_DIR}/classes")
66  SET (TARGET_DIR "${CLASS_DIR}")
67
68  SET_JAVA_NDB_VERSION()
69
70  # Concatenate the ARG_CLASSSPATH(a list of strings) into a string
71  # with platform specific separator
72  SET(separator) # Empty separator to start with
73  SET(classpath_str)
74  FOREACH(item ${ARG_CLASSPATH})
75    SET(classpath_str "${classpath_str}${separator}${item}")
76    IF (WIN32)
77      # Quote the semicolon since it's cmakes list separator
78      SET(separator "\;")
79    ELSE()
80      SET(separator ":")
81    ENDIF()
82  ENDFOREACH()
83  # MESSAGE(STATUS "classpath_str: ${classpath_str}")
84
85  # Target jar-file
86  SET(JAR ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}-${JAVA_NDB_VERSION}.jar)
87
88  # Marker for dependency handling
89  SET(MARKER_BASE ${BUILD_DIR}/create_jar)
90  SET(COUNTER 0)
91  SET(MARKER "${MARKER_BASE}.${COUNTER}")
92
93  # Add target
94  ADD_CUSTOM_TARGET(${TARGET}.jar ALL DEPENDS ${JAR})
95
96  # Compile
97  IF (JAVA_FILES)
98    IF (ARG_BROKEN_JAVAC)
99      ADD_CUSTOM_COMMAND(
100        OUTPUT ${MARKER}
101        COMMAND ${CMAKE_COMMAND} -E remove_directory ${BUILD_DIR}
102        COMMAND ${CMAKE_COMMAND} -E make_directory ${CLASS_DIR}
103        COMMAND echo \"${JAVA_COMPILE} -target ${JAVAC_TARGET} -source ${JAVAC_TARGET} -d ${TARGET_DIR} -classpath ${classpath_str} ${ARG_BROKEN_JAVAC}\"
104        COMMAND ${JAVA_COMPILE} -target ${JAVAC_TARGET} -source ${JAVAC_TARGET} -d ${TARGET_DIR} -classpath "${classpath_str}" ${ARG_BROKEN_JAVAC}
105        COMMAND ${CMAKE_COMMAND} -E touch ${MARKER}
106        DEPENDS ${JAVA_FILES}
107        COMMENT "Building objects for ${TARGET}.jar"
108      )
109    ELSE()
110      ADD_CUSTOM_COMMAND(
111        OUTPUT ${MARKER}
112        COMMAND ${CMAKE_COMMAND} -E remove_directory ${BUILD_DIR}
113        COMMAND ${CMAKE_COMMAND} -E make_directory ${CLASS_DIR}
114        COMMAND echo \"${JAVA_COMPILE} -target ${JAVAC_TARGET} -source ${JAVAC_TARGET} -d ${TARGET_DIR} -classpath ${classpath_str} ${JAVA_FILES}\"
115        COMMAND ${JAVA_COMPILE} -target ${JAVAC_TARGET} -source ${JAVAC_TARGET} -d ${TARGET_DIR} -classpath "${classpath_str}" ${JAVA_FILES}
116        COMMAND ${CMAKE_COMMAND} -E touch ${MARKER}
117        DEPENDS ${JAVA_FILES}
118        COMMENT "Building objects for ${TARGET}.jar"
119      )
120    ENDIF()
121  ELSE()
122    ADD_CUSTOM_COMMAND(
123      OUTPUT ${MARKER}
124      COMMAND ${CMAKE_COMMAND} -E remove_directory ${BUILD_DIR}
125      COMMAND ${CMAKE_COMMAND} -E make_directory ${CLASS_DIR}
126      COMMAND ${CMAKE_COMMAND} -E touch ${MARKER}
127      DEPENDS ${JAVA_FILES}
128      COMMENT "No files to compile for ${TARGET}.jar"
129    )
130  ENDIF()
131
132  # Copy extra files/directories
133  FOREACH(F ${ARG_EXTRA_FILES})
134
135    SET(OLD_MARKER ${MARKER})
136    MATH(EXPR COUNTER "${COUNTER} + 1")
137    SET(MARKER "${MARKER_BASE}.${COUNTER}")
138
139    GET_FILENAME_COMPONENT(N ${F} NAME)
140    IF(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${F})
141      ADD_CUSTOM_COMMAND(
142        OUTPUT ${MARKER}
143        COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/${F} ${CLASS_DIR}/${N}
144        COMMAND ${CMAKE_COMMAND} -E touch ${MARKER}
145        DEPENDS ${F} ${OLD_MARKER}
146        COMMENT "Adding directory ${N} to ${TARGET}.jar"
147      )
148    ELSE()
149      ADD_CUSTOM_COMMAND(
150        OUTPUT ${MARKER}
151        COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/${F} ${CLASS_DIR}/${N}
152        COMMAND ${CMAKE_COMMAND} -E touch ${MARKER}
153        DEPENDS ${F} ${OLD_MARKER}
154        COMMENT "Adding file ${N} to ${TARGET}.jar"
155      )
156    ENDIF()
157  ENDFOREACH()
158
159  # Enhance
160  IF(EXISTS ${ARG_ENHANCE})
161    SET(ENHANCER org.apache.openjpa.enhance.PCEnhancer)
162
163    SET(OLD_MARKER ${MARKER})
164    MATH(EXPR COUNTER "${COUNTER} + 1")
165    SET(MARKER "${MARKER_BASE}.${COUNTER}")
166
167    ADD_CUSTOM_COMMAND(
168      OUTPUT ${MARKER}
169      COMMAND echo \"${JAVA_RUNTIME} -classpath ${classpath_str}${separator}${WITH_CLASSPATH} ${ENHANCER} -p ${ARG_ENHANCE} -d ${TARGET_DIR}\"
170      COMMAND ${JAVA_RUNTIME} -classpath "${classpath_str}${separator}${WITH_CLASSPATH}" ${ENHANCER} -p ${ARG_ENHANCE} -d ${TARGET_DIR}
171
172      COMMAND ${CMAKE_COMMAND} -E touch ${MARKER}
173      DEPENDS ${OLD_MARKER}
174      COMMENT "Enhancing objects for ${TARGET}.jar"
175    )
176  ENDIF()
177
178  # Unpack extra jars
179  FOREACH(_J ${ARG_MERGE_JARS})
180
181    SET(OLD_MARKER ${MARKER})
182    MATH(EXPR COUNTER "${COUNTER} + 1")
183    SET(MARKER "${MARKER_BASE}.${COUNTER}")
184
185    GET_FILENAME_COMPONENT(P ${_J} PATH)
186    GET_FILENAME_COMPONENT(N ${_J} NAME_WE)
187    SET(J ${P}/${N}-${JAVA_NDB_VERSION}.jar)
188
189    ADD_CUSTOM_COMMAND(
190      OUTPUT ${MARKER}
191      COMMAND ${JAVA_ARCHIVE} xf ${J}
192      COMMAND ${CMAKE_COMMAND} -E touch ${MARKER}
193      DEPENDS ${J} ${OLD_MARKER}
194      WORKING_DIRECTORY ${CLASS_DIR}
195      COMMENT "Unpacking ${N}.jar"
196    )
197  ENDFOREACH()
198
199  # Create JAR
200  SET(_ARG cf)
201  IF(ARG_MANIFEST)
202    SET(_ARG cfm)
203  ENDIF()
204
205  ADD_CUSTOM_COMMAND(
206    OUTPUT ${JAR}
207    COMMAND echo \"${JAVA_ARCHIVE} ${_ARG} ${JAR}.tmp ${ARG_MANIFEST} -C ${CLASS_DIR} .\"
208    COMMAND ${JAVA_ARCHIVE} ${_ARG} ${JAR}.tmp ${ARG_MANIFEST} -C ${CLASS_DIR} .
209    COMMAND ${CMAKE_COMMAND} -E copy ${JAR}.tmp ${JAR}
210    COMMAND ${CMAKE_COMMAND} -E remove ${JAR}.tmp
211    COMMENT "Creating ${TARGET}.jar"
212    DEPENDS ${MARKER}
213  )
214
215  # Add CMake dependencies
216  FOREACH(DEP ${ARG_DEPENDENCIES})
217    ADD_DEPENDENCIES(${TARGET}.jar ${DEP})
218  ENDFOREACH(DEP ${ARG_DEPENDENCIES})
219
220ENDMACRO()
221