Update CMake java functions

This commit is contained in:
Allen Byrne
2016-09-15 13:32:01 -05:00
parent 052efd9bde
commit 04634520cf
3 changed files with 225 additions and 40 deletions

View File

@@ -169,7 +169,7 @@
#
# ::
#
# The add_jar() functions sets some target properties. You can get these
# The add_jar() function sets some target properties. You can get these
# properties with the
# get_property(TARGET <target_name> PROPERTY <propery_name>)
# command.
@@ -217,6 +217,19 @@
# This command installs the TARGET_NAME files to the given DESTINATION.
# It should be called in the same scope as add_jar() or it will fail.
#
# Target Properties:
#
# ::
#
# The install_jar() function sets the INSTALL_DESTINATION target property
# on jars so installed. This property holds the DESTINATION as described
# above, and is used by install_jar_exports(). You can get this property
# with the
# get_property(TARGET <target_name> PROPERTY INSTALL_DESTINATION)
# command.
#
#
#
# ::
#
# install_jni_symlink(target_name destination)
@@ -228,6 +241,24 @@
#
# ::
#
# install_jar_exports(TARGETS jar1 [jar2 ...]
# FILE export_filename
# DESTINATION destination [COMPONENT component])
#
# This command installs a target export file export_filename for the named jar
# targets to the given DESTINATION. Its function is similar to that of
# install(EXPORTS).
#
# ::
#
# export_jars(TARGETS jar1 [jar2 ...]
# FILE export_filename)
#
# This command writes a target export file export_filename for the named jar
# targets. Its function is similar to that of export().
#
# ::
#
# create_javadoc(<VAR>
# PACKAGES pkg1 [pkg2 ...]
# [SOURCEPATH <sourcepath>]
@@ -324,7 +355,7 @@
# that allow your Java and C code to interact.
#
# There are two main signatures for create_javah. The first signature
# returns generated files throught variable specified by GENERATED_FILES option:
# returns generated files through variable specified by GENERATED_FILES option:
#
# ::
#
@@ -389,14 +420,36 @@ include(CMakeParseArguments)
function (__java_copy_file src dest comment)
add_custom_command(
OUTPUT ${dest}
COMMAND cmake -E copy_if_different
COMMAND ${CMAKE_COMMAND} -E copy_if_different
ARGS ${src}
${dest}
DEPENDS ${src}
COMMENT ${comment})
endfunction ()
function(__java_lcat VAR)
foreach(_line ${ARGN})
set(${VAR} "${${VAR}}${_line}\n")
endforeach()
set(${VAR} "${${VAR}}" PARENT_SCOPE)
endfunction()
function(__java_export_jar VAR TARGET PATH)
get_target_property(_jarpath ${TARGET} JAR_FILE)
get_filename_component(_jarname ${_jarpath} NAME)
__java_lcat(${VAR}
"# Create imported target ${TARGET}"
"add_custom_target(${TARGET})"
"set_target_properties(${TARGET} PROPERTIES"
" JAR_FILE \"${PATH}/${_jarname}\")"
""
)
set(${VAR} "${${VAR}}" PARENT_SCOPE)
endfunction()
# define helper scripts
set(_JAVA_EXPORT_TARGETS_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/javaTargets.cmake.in)
set(_JAVA_CLASS_FILELIST_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/UseJavaClassFilelist.cmake)
set(_JAVA_SYMLINK_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/UseJavaSymlinks.cmake)
@@ -435,6 +488,8 @@ function(add_jar _TARGET_NAME)
if (NOT DEFINED _add_jar_OUTPUT_DIR)
set(_add_jar_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR})
else()
get_filename_component(_add_jar_OUTPUT_DIR ${_add_jar_OUTPUT_DIR} ABSOLUTE)
endif()
if (_add_jar_ENTRY_POINT)
@@ -467,7 +522,7 @@ function(add_jar _TARGET_NAME)
endif()
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}")
string(APPEND CMAKE_JAVA_INCLUDE_PATH_FINAL "${CMAKE_JAVA_INCLUDE_FLAG_SEP}${JAVA_INCLUDE_DIR}")
endforeach()
set(CMAKE_JAVA_CLASS_OUTPUT_PATH "${_add_jar_OUTPUT_DIR}${CMAKE_FILES_DIRECTORY}/${_TARGET_NAME}.dir")
@@ -539,7 +594,7 @@ function(add_jar _TARGET_NAME)
if (TARGET ${_JAVA_INCLUDE_JAR})
get_target_property(_JAVA_JAR_PATH ${_JAVA_INCLUDE_JAR} JAR_FILE)
if (_JAVA_JAR_PATH)
set(CMAKE_JAVA_INCLUDE_PATH_FINAL "${CMAKE_JAVA_INCLUDE_PATH_FINAL}${CMAKE_JAVA_INCLUDE_FLAG_SEP}${_JAVA_JAR_PATH}")
string(APPEND CMAKE_JAVA_INCLUDE_PATH_FINAL "${CMAKE_JAVA_INCLUDE_FLAG_SEP}${_JAVA_JAR_PATH}")
list(APPEND CMAKE_JAVA_INCLUDE_PATH ${_JAVA_JAR_PATH})
list(APPEND _JAVA_DEPENDS ${_JAVA_INCLUDE_JAR})
list(APPEND _JAVA_COMPILE_DEPENDS ${_JAVA_INCLUDE_JAR})
@@ -547,18 +602,13 @@ function(add_jar _TARGET_NAME)
message(SEND_ERROR "add_jar: INCLUDE_JARS target ${_JAVA_INCLUDE_JAR} is not a jar")
endif ()
else ()
set(CMAKE_JAVA_INCLUDE_PATH_FINAL "${CMAKE_JAVA_INCLUDE_PATH_FINAL}${CMAKE_JAVA_INCLUDE_FLAG_SEP}${_JAVA_INCLUDE_JAR}")
string(APPEND CMAKE_JAVA_INCLUDE_PATH_FINAL "${CMAKE_JAVA_INCLUDE_FLAG_SEP}${_JAVA_INCLUDE_JAR}")
list(APPEND CMAKE_JAVA_INCLUDE_PATH "${_JAVA_INCLUDE_JAR}")
list(APPEND _JAVA_DEPENDS "${_JAVA_INCLUDE_JAR}")
list(APPEND _JAVA_COMPILE_DEPENDS "${_JAVA_INCLUDE_JAR}")
endif ()
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()
if (_JAVA_COMPILE_FILES OR _JAVA_COMPILE_FILELISTS)
set (_JAVA_SOURCES_FILELISTS)
@@ -598,6 +648,11 @@ function(add_jar _TARGET_NAME)
DEPENDS ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_compiled_${_TARGET_NAME}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)
else ()
# 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()
endif ()
# create the jar file
@@ -716,6 +771,13 @@ function(INSTALL_JAR _TARGET_NAME)
PROPERTY
INSTALL_FILES
)
set_property(
TARGET
${_TARGET_NAME}
PROPERTY
INSTALL_DESTINATION
${_DESTINATION}
)
if (__FILES)
install(
@@ -1348,3 +1410,94 @@ function (create_javah)
set (${_create_javah_GENERATED_FILES} ${_output_files} PARENT_SCOPE)
endif()
endfunction()
function(export_jars)
# Parse and validate arguments
cmake_parse_arguments(_export_jars
""
"FILE"
"TARGETS"
${ARGN}
)
if (NOT _export_jars_FILE)
message(SEND_ERROR "export_jars: FILE must be specified.")
endif()
if (NOT _export_jars_TARGETS)
message(SEND_ERROR "export_jars: TARGETS must be specified.")
endif()
# Set content of generated exports file
string(REPLACE ";" " " __targets__ "${_export_jars_TARGETS}")
set(__targetdefs__ "")
foreach(_target ${_export_jars_TARGETS})
get_target_property(_jarpath ${_target} JAR_FILE)
get_filename_component(_jarpath ${_jarpath} PATH)
__java_export_jar(__targetdefs__ ${_target} "${_jarpath}")
endforeach()
# Generate exports file
configure_file(
${_JAVA_EXPORT_TARGETS_SCRIPT}
${_export_jars_FILE}
@ONLY
)
endfunction()
function(install_jar_exports)
# Parse and validate arguments
cmake_parse_arguments(_install_jar_exports
""
"FILE;DESTINATION;COMPONENT"
"TARGETS"
${ARGN}
)
if (NOT _install_jar_exports_FILE)
message(SEND_ERROR "install_jar_exports: FILE must be specified.")
endif()
if (NOT _install_jar_exports_DESTINATION)
message(SEND_ERROR "install_jar_exports: DESTINATION must be specified.")
endif()
if (NOT _install_jar_exports_TARGETS)
message(SEND_ERROR "install_jar_exports: TARGETS must be specified.")
endif()
if (_install_jar_exports_COMPONENT)
set (_COMPONENT COMPONENT ${_install_jar_exports_COMPONENT})
endif()
# Determine relative path from installed export file to install prefix
if(IS_ABSOLUTE ${_install_jar_exports_DESTINATION})
file(RELATIVE_PATH _relpath
${_install_jar_exports_DESTINATION}
${CMAKE_INSTALL_PREFIX}
)
else()
file(RELATIVE_PATH _relpath
${CMAKE_INSTALL_PREFIX}/${_install_jar_exports_DESTINATION}
${CMAKE_INSTALL_PREFIX}
)
endif()
# Set up unique location for generated exports file
string(SHA256 _hash "${_install_jar_exports_DESTINATION}")
set(_tmpdir ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/JavaExports/${_hash})
# Set content of generated exports file
string(REPLACE ";" " " __targets__ "${_install_jar_exports_TARGETS}")
set(__targetdefs__ "set(_prefix \${CMAKE_CURRENT_LIST_DIR}/${_relpath})\n\n")
foreach(_target ${_install_jar_exports_TARGETS})
get_target_property(_dir ${_target} INSTALL_DESTINATION)
__java_export_jar(__targetdefs__ ${_target} "\${_prefix}/${_dir}")
endforeach()
__java_lcat(__targetdefs__ "\nunset(_prefix)")
# Generate and install exports file
configure_file(
${_JAVA_EXPORT_TARGETS_SCRIPT}
${_tmpdir}/${_install_jar_exports_FILE}
@ONLY
)
install(FILES ${_tmpdir}/${_install_jar_exports_FILE}
DESTINATION ${_install_jar_exports_DESTINATION}
${_COMPONENT})
endfunction()