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