From e7276c3764620f3c0b8f9dd1f09bccd948a54fbf Mon Sep 17 00:00:00 2001
From: Frank Glinka <glinkaf@uni-muenster.de>
Date: Thu, 19 Jan 2012 11:44:12 +0100
Subject: [PATCH] Add options to add_jar allowing to provide a manifest file
 or main-class file.

---
 Modules/UseJava.cmake |   32 ++++++++++++++++++++++++++++----
 1 files changed, 28 insertions(+), 4 deletions(-)

diff --git a/Modules/UseJava.cmake b/Modules/UseJava.cmake
index b78278c..57c29ea 100644
--- a/Modules/UseJava.cmake
+++ b/Modules/UseJava.cmake
@@ -25,6 +25,18 @@
 #       set(CMAKE_JAVA_TARGET_OUTPUT_NAME shibboleet.jar)
 #       add_jar(foobar foobar.java)
 #
+#   To include 'name : value' attribute pairs from a manifest file in the
+#   created jar at META-INF/MANIFEST.MF you can set the manifest file with:
+#
+#       set(CMAKE_JAVA_MANIFEST mymanifest.mf)
+#       add_jar(foobar foobar.java)
+#
+#   To set a class as the application entry point for stand-alone 
+#   applications bundled into an executable jar you can set its name with:
+#
+#       set(CMAKE_JAVA_EXECUTABLE foo/Main)
+#       add_jar(foobar foo/Main.java)
+#
 #   To add a VERSION to the target output name you can set it using
 #   CMAKE_JAVA_TARGET_VERSION. This will create a jar file with the name
 #   shibboleet-1.0.0.jar and will create a symlink shibboleet.jar
@@ -311,12 +323,23 @@ function(add_jar _TARGET_NAME)
         )
     endif (_JAVA_COMPILE_FILES)
 
+    # define jar file options
+    set(_JAVA_JAR_EXECUTABLE_OPTIONS "-cf")   # default options for creating a jar file
+    if(CMAKE_JAVA_MANIFEST)
+       set(_JAVA_JAR_EXECUTABLE_OPTIONS "${_JAVA_JAR_EXECUTABLE_OPTIONS}m")
+    endif(CMAKE_JAVA_MANIFEST)
+    if(CMAKE_JAVA_EXECUTABLE)
+       set(_JAVA_JAR_EXECUTABLE_OPTIONS "${_JAVA_JAR_EXECUTABLE_OPTIONS}e")
+    endif(CMAKE_JAVA_EXECUTABLE)
+      
+
     # create the jar file
     if (CMAKE_JNI_TARGET)
         add_custom_command(
             OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${_JAVA_TARGET_OUTPUT_NAME}
             COMMAND ${Java_JAR_EXECUTABLE}
-                -cf ${CMAKE_CURRENT_BINARY_DIR}/${_JAVA_TARGET_OUTPUT_NAME}
+                ${_JAVA_JAR_EXECUTABLE_OPTIONS} ${CMAKE_CURRENT_BINARY_DIR}/${_JAVA_TARGET_OUTPUT_NAME}
+                ${CMAKE_JAVA_MANIFEST} ${CMAKE_JAVA_EXECUTABLE}
                 ${_JAVA_RESOURCE_FILES} @java_class_filelist
             COMMAND ${CMAKE_COMMAND}
                 -D_JAVA_TARGET_DIR=${CMAKE_CURRENT_BINARY_DIR}
@@ -328,7 +351,7 @@ function(add_jar _TARGET_NAME)
                 -D_JAVA_TARGET_OUTPUT_NAME=${CMAKE_CURRENT_BINARY_DIR}/${_JAVA_TARGET_OUTPUT_NAME}
                 -D_JAVA_TARGET_OUTPUT_LINK=${_JAVA_TARGET_OUTPUT_LINK}
                 -P ${_JAVA_SYMLINK_SCRIPT}
-            DEPENDS ${_JAVA_RESOURCE_FILES} ${_JAVA_DEPENDS} ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_class_filelist
+            DEPENDS ${CMAKE_JAVA_MANIFEST} ${_JAVA_RESOURCE_FILES} ${_JAVA_DEPENDS} ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_class_filelist
             WORKING_DIRECTORY ${CMAKE_JAVA_CLASS_OUTPUT_PATH}
             COMMENT "Creating Java archive ${_JAVA_TARGET_OUTPUT_NAME}"
         )
@@ -336,7 +359,8 @@ function(add_jar _TARGET_NAME)
         add_custom_command(
             OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${_JAVA_TARGET_OUTPUT_NAME}
             COMMAND ${Java_JAR_EXECUTABLE}
-                -cf ${CMAKE_CURRENT_BINARY_DIR}/${_JAVA_TARGET_OUTPUT_NAME}
+                ${_JAVA_JAR_EXECUTABLE_OPTIONS} ${CMAKE_CURRENT_BINARY_DIR}/${_JAVA_TARGET_OUTPUT_NAME}
+                ${CMAKE_JAVA_MANIFEST} ${CMAKE_JAVA_EXECUTABLE}
                 ${_JAVA_RESOURCE_FILES} @java_class_filelist
             COMMAND ${CMAKE_COMMAND}
                 -D_JAVA_TARGET_DIR=${CMAKE_CURRENT_BINARY_DIR}
@@ -344,7 +368,7 @@ function(add_jar _TARGET_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
+            DEPENDS ${CMAKE_JAVA_MANIFEST} ${_JAVA_RESOURCE_FILES} ${_JAVA_DEPENDS} ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_class_filelist
             COMMENT "Creating Java archive ${_JAVA_TARGET_OUTPUT_NAME}"
         )
     endif (CMAKE_JNI_TARGET)
-- 
1.7.8.msysgit.0

