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