You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by kw...@apache.org on 2013/02/28 17:10:36 UTC
svn commit: r1451242 - in /qpid/proton/trunk: ./ proton-c/bindings/java/
proton-j/proton/ tools/cmake/Modules/
Author: kwall
Date: Thu Feb 28 16:10:36 2013
New Revision: 1451242
URL: http://svn.apache.org/r1451242
Log:
PROTON-249: Use a source file list when compiling java sources to avoid hitting command line length limits
* changed UseJava's add_jar pass a source file list to javac instead of many individual files on the command line
* added function add_jar_from_filelist which behaves like CMake-builtin add_jar but accepts a file contain a list of files
(used to compile Java output of Swig)
* added ProtonUseJavaSourceFileList to extract a list of Java source files from one or more directories
Added:
qpid/proton/trunk/tools/cmake/Modules/ProtonUseJava.cmake
- copied, changed from r1450788, qpid/proton/trunk/tools/cmake/Modules/UseProtonJava.cmake
qpid/proton/trunk/tools/cmake/Modules/ProtonUseJavaSourceFileList.cmake
Removed:
qpid/proton/trunk/tools/cmake/Modules/UseProtonJava.cmake
Modified:
qpid/proton/trunk/CMakeLists.txt
qpid/proton/trunk/proton-c/bindings/java/CMakeLists.txt
qpid/proton/trunk/proton-j/proton/CMakeLists.txt
qpid/proton/trunk/tools/cmake/Modules/UseJava.cmake
Modified: qpid/proton/trunk/CMakeLists.txt
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/CMakeLists.txt?rev=1451242&r1=1451241&r2=1451242&view=diff
==============================================================================
--- qpid/proton/trunk/CMakeLists.txt (original)
+++ qpid/proton/trunk/CMakeLists.txt Thu Feb 28 16:10:36 2013
@@ -37,7 +37,7 @@ list(GET PN_VERSION_LIST 0 PN_VERSION_MA
list(GET PN_VERSION_LIST 1 PN_VERSION_MINOR)
set (PN_VERSION "${PN_VERSION_MAJOR}.${PN_VERSION_MINOR}")
-message("PN_VERSION: ${PN_VERSION}")
+message(STATUS "PN_VERSION: ${PN_VERSION}")
enable_testing()
include (CTest)
@@ -86,9 +86,9 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PAT
find_package( Java )
if (JAVA_FOUND)
- message("Java version: ${Java_VERSION}. javac is at: ${Java_JAVAC_EXECUTABLE}")
+ message(STATUS "Java version: ${Java_VERSION}. javac is at: ${Java_JAVAC_EXECUTABLE}")
include(UseJava)
- include(UseProtonJava)
+ include(ProtonUseJava)
add_subdirectory(proton-j/proton-api)
add_subdirectory(proton-j/proton)
Modified: qpid/proton/trunk/proton-c/bindings/java/CMakeLists.txt
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/bindings/java/CMakeLists.txt?rev=1451242&r1=1451241&r2=1451242&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/bindings/java/CMakeLists.txt (original)
+++ qpid/proton/trunk/proton-c/bindings/java/CMakeLists.txt Thu Feb 28 16:10:36 2013
@@ -20,7 +20,7 @@
SET(CMAKE_SWIG_FLAGS -package org.apache.qpid.proton.jni)
SET(CMAKE_SWIG_OUTDIR ${CMAKE_CURRENT_BINARY_DIR}/src/main/java/org/apache/qpid/proton/jni)
-message( "Using JNI libraries: ${JNI_LIBRARIES}" )
+message(STATUS "Using JNI libraries: ${JNI_LIBRARIES}" )
swig_add_module(proton-swig java java.i)
include_directories(${JNI_INCLUDE_DIRS})
@@ -29,24 +29,34 @@ swig_link_libraries(proton-swig ${BINDIN
set_target_properties(proton-swig
PROPERTIES
OUTPUT_NAME "proton-jni"
- PREFIX ${CMAKE_SHARED_LIBRARY_PREFIX})
+ PREFIX "${CMAKE_SHARED_LIBRARY_PREFIX}")
-add_custom_command(OUTPUT ${CMAKE_SWIG_OUTDIR} COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_SWIG_OUTDIR} COMMENT "Creating target directory for Proton-JNI sources")
-add_custom_target(protonjnioutdir ALL DEPENDS ${CMAKE_SWIG_OUTDIR})
-add_dependencies(proton-swig protonjnioutdir)
+add_custom_command(OUTPUT ${CMAKE_SWIG_OUTDIR}
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_SWIG_OUTDIR}
+ COMMENT "Creating target directory for Proton-JNI sources")
+add_custom_target(proton-jni-swig-out-dir ALL DEPENDS ${CMAKE_SWIG_OUTDIR})
+add_dependencies(proton-swig proton-jni-swig-out-dir)
set(CMAKE_JAVA_TARGET_VERSION ${PN_VERSION})
-file(GLOB_RECURSE THUNKING_SOURCES_ABS "src/main/java/*.java")
-
set(CMAKE_JAVA_INCLUDE_PATH ${PROTON_API_TARGET_JAR})
-add_jar(proton-jni ${CMAKE_SWIG_OUTDIR}/*.java ${THUNKING_SOURCES_ABS})
+set(PROTON_JNI_SOURCE_FILE_LIST ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/proton_jni_source_filelist)
+set(PROTON_JNI_ALL_SOURCE_DIRS "${CMAKE_SWIG_OUTDIR}:${CMAKE_CURRENT_SOURCE_DIR}/src/main/java")
+
+add_custom_target(proton-jni-sourcefile-list ALL
+ COMMAND ${CMAKE_COMMAND}
+ -DJAVA_SOURCE_DIR_PATHS=${PROTON_JNI_ALL_SOURCE_DIRS}
+ -DJAVA_SOURCE_FILE_LIST=${PROTON_JNI_SOURCE_FILE_LIST}
+ -P ${CMAKE_MODULE_PATH}/ProtonUseJavaSourceFileList.cmake)
+add_dependencies(proton-jni-sourcefile-list proton-swig)
+
+add_jar_from_filelist(proton-jni ${PROTON_JNI_SOURCE_FILE_LIST})
-include(UseProtonJava)
+include(ProtonUseJava)
rebuild_jar(proton-jni proton-jni-${PN_VERSION}.jar)
-add_dependencies(proton-jni proton-api proton-swig)
+add_dependencies(proton-jni proton-api proton-jni-sourcefile-list)
install_jar(proton-jni ${JNI_INSTALL_DIR})
install(TARGETS proton-swig
Modified: qpid/proton/trunk/proton-j/proton/CMakeLists.txt
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-j/proton/CMakeLists.txt?rev=1451242&r1=1451241&r2=1451242&view=diff
==============================================================================
--- qpid/proton/trunk/proton-j/proton/CMakeLists.txt (original)
+++ qpid/proton/trunk/proton-j/proton/CMakeLists.txt Thu Feb 28 16:10:36 2013
@@ -36,11 +36,11 @@ else()
set(BOUNCYCASTLE_FOUND TRUE)
endif()
-message("Locations of Bouncycastle ${BOUNCYCASTLE_VERSION} jars: "
+message(STATUS "Locations of Bouncycastle ${BOUNCYCASTLE_VERSION} jars: "
"${BOUNCYCASTLE_BCPROV_JAR} ${BOUNCYCASTLE_BCPKIX_JAR}")
if (BOUNCYCASTLE_FOUND)
- message("Will build proton-j-impl")
+ message(STATUS "Will build proton-j-impl")
set(CMAKE_JAVA_TARGET_VERSION ${PN_VERSION})
file(GLOB_RECURSE SOURCES_ABS "src/main/java/*.java")
@@ -58,6 +58,6 @@ if (BOUNCYCASTLE_FOUND)
install_jar(proton-j-impl ${JAVA_INSTALL_DIR})
else()
- message("Won't build proton-j-impl because one or more Bouncycastle jars were not found. PROTON_JAR_DEPEND_DIR was: ${PROTON_JAR_DEPEND_DIR}")
+ message(STATUS "Won't build proton-j-impl because one or more Bouncycastle jars were not found. PROTON_JAR_DEPEND_DIR was: ${PROTON_JAR_DEPEND_DIR}")
endif()
Copied: qpid/proton/trunk/tools/cmake/Modules/ProtonUseJava.cmake (from r1450788, qpid/proton/trunk/tools/cmake/Modules/UseProtonJava.cmake)
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/tools/cmake/Modules/ProtonUseJava.cmake?p2=qpid/proton/trunk/tools/cmake/Modules/ProtonUseJava.cmake&p1=qpid/proton/trunk/tools/cmake/Modules/UseProtonJava.cmake&r1=1450788&r2=1451242&rev=1451242&view=diff
==============================================================================
(empty)
Added: qpid/proton/trunk/tools/cmake/Modules/ProtonUseJavaSourceFileList.cmake
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/tools/cmake/Modules/ProtonUseJavaSourceFileList.cmake?rev=1451242&view=auto
==============================================================================
--- qpid/proton/trunk/tools/cmake/Modules/ProtonUseJavaSourceFileList.cmake (added)
+++ qpid/proton/trunk/tools/cmake/Modules/ProtonUseJavaSourceFileList.cmake Thu Feb 28 16:10:36 2013
@@ -0,0 +1,68 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+#
+# Produces a text file containing a list of java source files from one
+# or more java source directories. Produces output suitable for use
+# with javac's @ source file argument.
+#
+# JAVA_SOURCE_DIR_PATHS - colon (:) separated string of java source directories
+# JAVA_SOURCE_FILE_LIST - name of text file to write
+#
+
+if (JAVA_SOURCE_DIR_PATHS)
+ string(REPLACE ":" ";" JAVA_SOURCE_DIR_PATHS_LIST ${JAVA_SOURCE_DIR_PATHS})
+ message(STATUS "Java source paths: ${JAVA_SOURCE_DIR_PATHS}")
+
+ set(_JAVA_GLOBBED_FILES)
+ foreach(JAVA_SOURCE_DIR_PATH ${JAVA_SOURCE_DIR_PATHS_LIST})
+ if (EXISTS "${JAVA_SOURCE_DIR_PATH}")
+ file(GLOB_RECURSE _JAVA_GLOBBED_TMP_FILES "${JAVA_SOURCE_DIR_PATH}/*.java")
+ if (_JAVA_GLOBBED_TMP_FILES)
+ list(APPEND _JAVA_GLOBBED_FILES ${_JAVA_GLOBBED_TMP_FILES})
+ endif ()
+ else ()
+ message(SEND_ERROR "FATAL: Java source path ${JAVA_SOURCE_DIR_PATH} doesn't exist")
+ endif ()
+ endforeach()
+
+ set (_CHECK_STALE OFF)
+ set(_GENERATE_FILE_LIST ON)
+ if (EXISTS ${JAVA_SOURCE_FILE_LIST})
+ set (_CHECK_STALE ON)
+ set(_GENERATE_FILE_LIST OFF)
+ endif ()
+
+ set(_JAVA_SOURCE_FILES_SEPARATED)
+ foreach(_JAVA_GLOBBED_FILE ${_JAVA_GLOBBED_FILES})
+ if (_CHECK_STALE)
+ if (${_JAVA_GLOBBED_FILE} IS_NEWER_THAN ${JAVA_SOURCE_FILE_LIST})
+ set(_GENERATE_FILE_LIST ON)
+ endif()
+ endif()
+ set(_JAVA_SOURCE_FILES_SEPARATED ${_JAVA_SOURCE_FILES_SEPARATED}${_JAVA_GLOBBED_FILE}\n)
+ endforeach()
+
+ if (_GENERATE_FILE_LIST)
+ message(STATUS "Writing Java source file list to ${JAVA_SOURCE_FILE_LIST}")
+ file(WRITE ${JAVA_SOURCE_FILE_LIST} ${_JAVA_SOURCE_FILES_SEPARATED})
+ endif()
+else ()
+ message(SEND_ERROR "FATAL: Can't find JAVA_SOURCE_DIR_PATHS")
+endif ()
Modified: qpid/proton/trunk/tools/cmake/Modules/UseJava.cmake
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/tools/cmake/Modules/UseJava.cmake?rev=1451242&r1=1451241&r2=1451242&view=diff
==============================================================================
--- qpid/proton/trunk/tools/cmake/Modules/UseJava.cmake (original)
+++ qpid/proton/trunk/tools/cmake/Modules/UseJava.cmake Thu Feb 28 16:10:36 2013
@@ -208,6 +208,8 @@ endfunction ()
set(_JAVA_CLASS_FILELIST_SCRIPT ${CMAKE_MODULE_PATH}/UseJavaClassFilelist.cmake)
set(_JAVA_SYMLINK_SCRIPT ${CMAKE_MODULE_PATH}/UseJavaSymlinks.cmake)
+# Apache Qpid Proton: changed to write a source file list to avoid hitting
+# command line limits when processing many source files.
function(add_jar _TARGET_NAME)
set(_JAVA_SOURCE_FILES ${ARGN})
@@ -302,6 +304,10 @@ function(add_jar _TARGET_NAME)
endif ()
endforeach()
+ set(CMAKE_JAVA_SOURCE_FILE_LIST ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_source_filelist)
+ string(REPLACE ";" "\n" _JAVA_COMPILE_FILES_NEWLINE_SEPARATED "${_JAVA_COMPILE_FILES}")
+ file(WRITE ${CMAKE_JAVA_SOURCE_FILE_LIST} "${_JAVA_COMPILE_FILES_NEWLINE_SEPARATED}")
+
# create an empty java_class_filelist
if (NOT EXISTS ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_class_filelist)
file(WRITE ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_class_filelist "")
@@ -316,7 +322,7 @@ function(add_jar _TARGET_NAME)
${CMAKE_JAVA_COMPILE_FLAGS}
-classpath "${CMAKE_JAVA_INCLUDE_PATH_FINAL}"
-d ${CMAKE_JAVA_CLASS_OUTPUT_PATH}
- ${_JAVA_COMPILE_FILES}
+ @${CMAKE_JAVA_SOURCE_FILE_LIST}
COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_compiled_${_TARGET_NAME}
DEPENDS ${_JAVA_COMPILE_FILES}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
@@ -423,6 +429,130 @@ function(add_jar _TARGET_NAME)
endfunction()
+# Apache Qpid Proton: new function that accepts a file containing the Java source
+# files. This is useful when the set of source files is only discovered at make-time,
+# and avoids passing a wildcard argument to javac (which fails on some platforms)
+function(add_jar_from_filelist _TARGET_NAME CMAKE_JAVA_SOURCE_FILE_LIST)
+
+ if (NOT DEFINED CMAKE_JAVA_TARGET_OUTPUT_DIR)
+ set(CMAKE_JAVA_TARGET_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR})
+ endif()
+
+ set(CMAKE_JAVA_CLASS_OUTPUT_PATH "${CMAKE_JAVA_TARGET_OUTPUT_DIR}${CMAKE_FILES_DIRECTORY}/${_TARGET_NAME}.dir")
+
+ set(_JAVA_TARGET_OUTPUT_NAME "${_TARGET_NAME}.jar")
+ if (CMAKE_JAVA_TARGET_OUTPUT_NAME AND CMAKE_JAVA_TARGET_VERSION)
+ set(_JAVA_TARGET_OUTPUT_NAME "${CMAKE_JAVA_TARGET_OUTPUT_NAME}-${CMAKE_JAVA_TARGET_VERSION}.jar")
+ set(_JAVA_TARGET_OUTPUT_LINK "${CMAKE_JAVA_TARGET_OUTPUT_NAME}.jar")
+ elseif (CMAKE_JAVA_TARGET_VERSION)
+ set(_JAVA_TARGET_OUTPUT_NAME "${_TARGET_NAME}-${CMAKE_JAVA_TARGET_VERSION}.jar")
+ set(_JAVA_TARGET_OUTPUT_LINK "${_TARGET_NAME}.jar")
+ elseif (CMAKE_JAVA_TARGET_OUTPUT_NAME)
+ set(_JAVA_TARGET_OUTPUT_NAME "${CMAKE_JAVA_TARGET_OUTPUT_NAME}.jar")
+ endif ()
+ # reset
+ set(CMAKE_JAVA_TARGET_OUTPUT_NAME)
+
+ foreach (JAVA_INCLUDE_DIR ${CMAKE_JAVA_INCLUDE_PATH})
+ set(CMAKE_JAVA_INCLUDE_PATH_FINAL "${CMAKE_JAVA_INCLUDE_PATH_FINAL}${CMAKE_JAVA_INCLUDE_FLAG_SEP}${JAVA_INCLUDE_DIR}")
+ endforeach()
+
+ # create an empty java_class_filelist
+ if (NOT EXISTS ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_class_filelist)
+ file(WRITE ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_class_filelist "")
+ endif ()
+
+ # Compile the java files and create a list of class files
+ add_custom_command(
+ # NOTE: this command generates an artificial dependency file
+ OUTPUT ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_compiled_${_TARGET_NAME}
+ COMMAND ${Java_JAVAC_EXECUTABLE}
+ ${CMAKE_JAVA_COMPILE_FLAGS}
+ -classpath "${CMAKE_JAVA_INCLUDE_PATH_FINAL}"
+ -d ${CMAKE_JAVA_CLASS_OUTPUT_PATH}
+ @${CMAKE_JAVA_SOURCE_FILE_LIST}
+ COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_compiled_${_TARGET_NAME}
+ DEPENDS ${CMAKE_JAVA_SOURCE_FILE_LIST}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ COMMENT "Building Java objects for ${_TARGET_NAME}.jar"
+ )
+ add_custom_command(
+ OUTPUT ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_class_filelist
+ COMMAND ${CMAKE_COMMAND}
+ -DCMAKE_JAVA_CLASS_OUTPUT_PATH=${CMAKE_JAVA_CLASS_OUTPUT_PATH}
+ -DCMAKE_JAR_CLASSES_PREFIX="${CMAKE_JAR_CLASSES_PREFIX}"
+ -P ${_JAVA_CLASS_FILELIST_SCRIPT}
+ DEPENDS ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_compiled_${_TARGET_NAME}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ )
+
+ # create the jar file
+ set(_JAVA_JAR_OUTPUT_PATH
+ ${CMAKE_JAVA_TARGET_OUTPUT_DIR}/${_JAVA_TARGET_OUTPUT_NAME})
+ add_custom_command(
+ OUTPUT ${_JAVA_JAR_OUTPUT_PATH}
+ COMMAND ${Java_JAR_EXECUTABLE}
+ -cf ${_JAVA_JAR_OUTPUT_PATH}
+ ${_JAVA_RESOURCE_FILES} @java_class_filelist
+ COMMAND ${CMAKE_COMMAND}
+ -D_JAVA_TARGET_DIR=${CMAKE_JAVA_TARGET_OUTPUT_DIR}
+ -D_JAVA_TARGET_OUTPUT_NAME=${_JAVA_TARGET_OUTPUT_NAME}
+ -D_JAVA_TARGET_OUTPUT_LINK=${_JAVA_TARGET_OUTPUT_LINK}
+ -P ${_JAVA_SYMLINK_SCRIPT}
+ WORKING_DIRECTORY ${CMAKE_JAVA_CLASS_OUTPUT_PATH}
+ DEPENDS ${_JAVA_RESOURCE_FILES} ${_JAVA_DEPENDS} ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_class_filelist
+ COMMENT "Creating Java archive ${_JAVA_TARGET_OUTPUT_NAME}"
+ )
+ # Add the target and make sure we have the latest resource files.
+ add_custom_target(${_TARGET_NAME} ALL DEPENDS ${_JAVA_JAR_OUTPUT_PATH})
+
+ set_property(
+ TARGET
+ ${_TARGET_NAME}
+ PROPERTY
+ INSTALL_FILES
+ ${_JAVA_JAR_OUTPUT_PATH}
+ )
+
+ if (_JAVA_TARGET_OUTPUT_LINK)
+ set_property(
+ TARGET
+ ${_TARGET_NAME}
+ PROPERTY
+ INSTALL_FILES
+ ${_JAVA_JAR_OUTPUT_PATH}
+ ${CMAKE_JAVA_TARGET_OUTPUT_DIR}/${_JAVA_TARGET_OUTPUT_LINK}
+ )
+
+ if (CMAKE_JNI_TARGET)
+ set_property(
+ TARGET
+ ${_TARGET_NAME}
+ PROPERTY
+ JNI_SYMLINK
+ ${CMAKE_JAVA_TARGET_OUTPUT_DIR}/${_JAVA_TARGET_OUTPUT_LINK}
+ )
+ endif ()
+ endif ()
+
+ set_property(
+ TARGET
+ ${_TARGET_NAME}
+ PROPERTY
+ JAR_FILE
+ ${_JAVA_JAR_OUTPUT_PATH}
+ )
+
+ set_property(
+ TARGET
+ ${_TARGET_NAME}
+ PROPERTY
+ CLASSDIR
+ ${CMAKE_JAVA_CLASS_OUTPUT_PATH}
+ )
+
+endfunction()
+
function(INSTALL_JAR _TARGET_NAME _DESTINATION)
get_property(__FILES
TARGET
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org