From 63fffb289cb6a197e149ba3f07bea1db9302e29f Mon Sep 17 00:00:00 2001
From: Daniel Stonier <d.stonier@gmail.com>
Date: Wed, 25 Jun 2014 18:03:00 +0900
Subject: [PATCH] experimental avoidance of having to shell out to gradle when
 files haven't changed.

---
 cmake/rosjava.cmake.em | 30 ++++++++++++++++++++++++++++--
 1 file changed, 28 insertions(+), 2 deletions(-)

diff --git a/cmake/rosjava.cmake.em b/cmake/rosjava.cmake.em
index 239db5f..9f9fbb5 100644
--- a/cmake/rosjava.cmake.em
+++ b/cmake/rosjava.cmake.em
@@ -44,6 +44,7 @@ endmacro()
 # Note that we check for the variable existence as well so we don't
 # override a user setting.
 macro(_rosjava_env)
+    set(ROS_GRADLE_VERBOSE $ENV{ROS_GRADLE_VERBOSE})
     set(ROS_MAVEN_DEPLOYMENT_REPOSITORY $ENV{ROS_MAVEN_DEPLOYMENT_REPOSITORY})
     set(ROS_MAVEN_REPOSITORY $ENV{ROS_MAVEN_REPOSITORY})
     if(NOT ROS_MAVEN_DEPLOYMENT_REPOSITORY)
@@ -75,13 +76,37 @@ macro(catkin_rosjava_setup)
     else()
       set(gradle_tasks ${ARGV})
     endif()
+    if(ROS_GRADLE_VERBOSE)
+       set(gradle_options "")
+    else()
+       set(gradle_options "-q")
+    endif()
+    ###################################
+    # Execution
+    ###################################
+    # This is an interesting option, it uses cmake to check for changes in files and
+    # avoids gradle's own slow check. It could get annoying though.
+    file(GLOB_RECURSE BUILD_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} FOLLOW_SYMLINKS *.java *.gradle *.properties CMakeLists.txt *.cmake *.xml)
+    # Can't actually key off the subproject build dirs since we don't know them from here so we
+    # use touch a file to link the command to the target. Actual triggers come from the file dependency changes.
+    add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/built
+        DEPENDS ${BUILD_FILES}
+        # COMMAND ${ROSJAVA_ENV} ${CATKIN_ENV} "env" "|" "grep" "ROS" 
+        COMMAND ${ROSJAVA_ENV} ${CATKIN_ENV} ${${PROJECT_NAME}_gradle_BINARY} ${gradle_options} ${gradle_tasks}
+        COMMAND touch ${CMAKE_CURRENT_BINARY_DIR}/built
+        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+        COMMENT "Running gradle tasks for ${PROJECT_NAME}"
+    )
+    
     add_custom_target(gradle-${PROJECT_NAME}
         ALL
-        COMMAND ${ROSJAVA_ENV} ${CATKIN_ENV} "env" "|" "grep" "ROS" 
-        COMMAND ${ROSJAVA_ENV} ${CATKIN_ENV} ${${PROJECT_NAME}_gradle_BINARY} ${gradle_tasks} 
+        DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/built
         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
         VERBATIM
     )
+    ###################################
+    # Target Management
+    ###################################
     catkin_package_xml()
     foreach(depends in ${${PROJECT_NAME}_BUILD_DEPENDS})
         if(TARGET gradle-${depends})
@@ -95,6 +120,7 @@ macro(catkin_rosjava_setup)
     add_custom_target(gradle-clean-${PROJECT_NAME}
         COMMAND ${CATKIN_ENV} ${${PROJECT_NAME}_gradle_BINARY} clean
         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+        COMMENT "Cleaning gradle project for ${PROJECT_NAME}"
     )
     add_dependencies(gradle-clean gradle-clean-${PROJECT_NAME})
 endmacro()
-- 
GitLab