From 32b2670ba16084896e10ae27f7ce7b50313e375a Mon Sep 17 00:00:00 2001 From: Endi Sukma Dewata Date: Sun, 8 Jul 2012 10:09:41 -0500 Subject: Added Java CMake library. New Java CMake library has been added to find the source codes automatically so it's no longer necessary to maintain the list of source codes in the build script. The library also provides separate functions to compile, package, and create symbolic links allowing more flexibility over the build process. Ticket #62 --- cmake/Modules/Java.cmake | 173 +++++++++++++++++++++++++++++++++++++++ cmake/Modules/JavaFileList.cmake | 34 ++++++++ 2 files changed, 207 insertions(+) create mode 100644 cmake/Modules/Java.cmake create mode 100644 cmake/Modules/JavaFileList.cmake (limited to 'cmake') diff --git a/cmake/Modules/Java.cmake b/cmake/Modules/Java.cmake new file mode 100644 index 000000000..bab17f541 --- /dev/null +++ b/cmake/Modules/Java.cmake @@ -0,0 +1,173 @@ +# --- BEGIN COPYRIGHT BLOCK --- +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# (C) 2012 Red Hat, Inc. +# All rights reserved. +# --- END COPYRIGHT BLOCK --- +# +# Author: Endi S. Dewata + +function(javac target) + + set(source_dir ${CMAKE_CURRENT_SOURCE_DIR}) + + foreach (arg ${ARGN}) + + if (arg MATCHES "(SOURCE_DIR|SOURCES|CLASSPATH|OUTPUT_DIR|DEPENDS)") + set(param ${arg}) + + else (arg MATCHES "(SOURCE_DIR|SOURCES|CLASSPATH|OUTPUT_DIR|DEPENDS)") + + if (param MATCHES "SOURCE_DIR") + set(source_dir ${arg}) + + elseif (param MATCHES "SOURCES") + list(APPEND sources ${arg}) + + elseif (param MATCHES "CLASSPATH") + list(APPEND classpath ${arg}) + + elseif (param MATCHES "OUTPUT_DIR") + set(output_dir ${arg}) + + elseif (param MATCHES "DEPENDS") + list(APPEND depends ${arg}) + + endif(param MATCHES "SOURCE_DIR") + + endif(arg MATCHES "(SOURCE_DIR|SOURCES|CLASSPATH|OUTPUT_DIR|DEPENDS)") + + endforeach(arg) + + if (UNIX) + set(separator ":") + else (UNIX) + set(separator ";") + endif(UNIX) + + foreach (path ${classpath}) + set(native_classpath "${native_classpath}${separator}${path}") + endforeach(path) + + set(filelist "${CMAKE_CURRENT_BINARY_DIR}/${target}.files") + + add_custom_target(${target} ALL DEPENDS ${depends}) + + add_custom_command( + TARGET ${target} + COMMAND ${CMAKE_COMMAND} + -Doutput=${filelist} + -Dinput_dir=${source_dir} + -Dfiles="${sources}" + -P ${CMAKE_MODULE_PATH}/JavaFileList.cmake + COMMAND ${CMAKE_Java_COMPILER} + ${CMAKE_JAVA_COMPILE_FLAGS} + -cp ${native_classpath} + -d ${output_dir} + @${filelist} + WORKING_DIRECTORY + ${source_dir} + ) + +endfunction(javac) + +function(jar target) + + set(input_dir ${CMAKE_CURRENT_SOURCE_DIR}) + + foreach (arg ${ARGN}) + + if (arg MATCHES "CREATE") + set(param ${arg}) + set(operation "c") + + elseif (arg MATCHES "UPDATE") + set(param ${arg}) + set(operation "u") + + elseif (arg MATCHES "(INPUT_DIR|FILES|DEPENDS)") + set(param ${arg}) + + else () + + if (param MATCHES "(CREATE|UPDATE)") + set(output ${arg}) + + elseif (param MATCHES "INPUT_DIR") + set(input_dir ${arg}) + + elseif (param MATCHES "FILES") + list(APPEND files ${arg}) + + elseif (param MATCHES "DEPENDS") + list(APPEND depends ${arg}) + + endif(param MATCHES "(CREATE|UPDATE)") + + endif(arg MATCHES "CREATE") + + endforeach(arg) + + set(filelist "${CMAKE_CURRENT_BINARY_DIR}/${target}.files") + + add_custom_target(${target} ALL DEPENDS ${depends}) + + add_custom_command( + TARGET ${target} + COMMAND ${CMAKE_COMMAND} + -Doutput=${filelist} + -Dinput_dir=${input_dir} + -Dfiles="${files}" + -P ${CMAKE_MODULE_PATH}/JavaFileList.cmake + COMMAND ${CMAKE_Java_ARCHIVE} + -${operation}f ${output} + @${filelist} + WORKING_DIRECTORY ${input_dir} + ) + +endfunction(jar) + +function(link target) + + foreach (arg ${ARGN}) + + if (arg MATCHES "(SOURCE|DEST|DEPENDS)") + set(param ${arg}) + + else () + + if (param MATCHES "SOURCE") + set(source ${arg}) + + elseif (param MATCHES "DEST") + set(dest ${arg}) + + elseif (param MATCHES "DEPENDS") + list(APPEND depends ${arg}) + + endif(param MATCHES "SOURCE") + + endif(arg MATCHES "(SOURCE|DEST|DEPENDS)") + + endforeach(arg) + + add_custom_target(${target} ALL DEPENDS ${depends}) + + add_custom_command( + TARGET ${target} + COMMAND ${CMAKE_COMMAND} + -E create_symlink ${dest} ${source} + ) + +endfunction(link) \ No newline at end of file diff --git a/cmake/Modules/JavaFileList.cmake b/cmake/Modules/JavaFileList.cmake new file mode 100644 index 000000000..6ebdaea12 --- /dev/null +++ b/cmake/Modules/JavaFileList.cmake @@ -0,0 +1,34 @@ +# --- BEGIN COPYRIGHT BLOCK --- +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# (C) 2012 Red Hat, Inc. +# All rights reserved. +# --- END COPYRIGHT BLOCK --- +# +# Author: Endi S. Dewata + +file(WRITE ${output} "") + +separate_arguments(file_list UNIX_COMMAND ${files}) + +foreach(file ${file_list}) + + file(GLOB_RECURSE absolute_files "${input_dir}/${file}") + + foreach(absolute_file ${absolute_files}) + file(RELATIVE_PATH relative_file ${input_dir} ${absolute_file}) + file(APPEND ${output} "${relative_file}\n") + endforeach(absolute_file ${absolute_files}) + +endforeach(file ${files}) -- cgit