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