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