UseJava: add INCLUDE_MODULES argument to add_jar

Arguments are added to the dependencies list, and to the "--module-path"
passed to javac, which is only generated for adequate JDK versions.
This commit is contained in:
Javier Martín
2025-09-23 22:51:50 +02:00
parent b3365e7c57
commit 343ee5b9ee
15 changed files with 257 additions and 13 deletions

View File

@@ -53,6 +53,7 @@ Creating And Installing JARs
[SOURCES] <source1> [<source2>...] [<resource1>...]
[RESOURCES NAMESPACE <ns1> <resource1>... [NAMESPACE <nsX> <resourceX>...]... ]
[INCLUDE_JARS <jar1> [<jar2>...]]
[INCLUDE_MODULES <jar1> [<jar2>...]]
[ENTRY_POINT <entry>]
[VERSION <version>]
[MANIFEST <manifest>]
@@ -109,6 +110,13 @@ Creating And Installing JARs
jar files listed as sources are ignored (as they have been since the first
version of this module).
``INCLUDE_MODULES``
.. versionadded:: 4.3
The list of jars are added to the module path when building the java sources
and also to the dependencies of the target. ``INCLUDE_MODULES`` also
accepts other target names created by ``add_jar()``.
``ENTRY_POINT``
Defines an entry point in the jar file.
@@ -703,7 +711,7 @@ function(add_jar _TARGET_NAME)
set(options) # currently there are no zero value args (aka: options)
set(oneValueArgs "ENTRY_POINT;MANIFEST;OUTPUT_DIR;;OUTPUT_NAME;VERSION" )
set(multiValueArgs "GENERATE_NATIVE_HEADERS;INCLUDE_JARS;RESOURCES;SOURCES" )
set(multiValueArgs "GENERATE_NATIVE_HEADERS;INCLUDE_JARS;INCLUDE_MODULES;RESOURCES;SOURCES" )
cmake_parse_arguments(PARSE_ARGV 1 _add_jar
"${options}"
@@ -837,6 +845,7 @@ function(add_jar _TARGET_NAME)
set(_JAVA_COMPILE_FILELISTS)
set(_JAVA_DEPENDS)
set(_JAVA_COMPILE_DEPENDS)
set(_JAVA_COMPILE_MODDEPENDS)
set(_JAVA_RESOURCE_FILES)
set(_JAVA_RESOURCE_FILES_RELATIVE)
foreach(_JAVA_SOURCE_FILE IN LISTS _JAVA_SOURCE_FILES)
@@ -897,6 +906,16 @@ function(add_jar _TARGET_NAME)
foreach (resolved_cp_item IN LISTS _JAVA_COMPILE_DEPENDS)
string(APPEND CMAKE_JAVA_INCLUDE_PATH_FINAL "${_UseJava_PATH_SEP}${resolved_cp_item}")
endforeach ()
# Build dependency lists and arguments for JARs in the modulepath
set(javac_mp_args)
if (_add_jar_INCLUDE_MODULES)
if (Java_VERSION VERSION_LESS 9)
message(SEND_ERROR "INCLUDE_MODULES requires Java 9+")
endif()
__java_build_deplists(_JAVA_DEPENDS _JAVA_COMPILE_MODDEPENDS _add_jar_INCLUDE_MODULES)
list(JOIN _JAVA_COMPILE_MODDEPENDS "${_UseJava_PATH_SEP}" javac_mp_args)
set(javac_mp_args "--module-path [[${javac_mp_args}]]")
endif()
if (_JAVA_COMPILE_FILES OR _JAVA_COMPILE_FILELISTS)
set (_JAVA_SOURCES_FILELISTS)
@@ -921,33 +940,41 @@ function(add_jar _TARGET_NAME)
cmake_language(GET_MESSAGE_LOG_LEVEL _LOG_LEVEL)
# 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}
# NOTE: this command generates an artificial dependency file
set(stamp_file "${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_compiled_${_TARGET_NAME}")
add_custom_command(OUTPUT "${stamp_file}"
COMMAND ${CMAKE_COMMAND}
-DCMAKE_JAVA_CLASS_OUTPUT_PATH=${CMAKE_JAVA_CLASS_OUTPUT_PATH}
-DCMAKE_JAR_CLASSES_PREFIX=${CMAKE_JAR_CLASSES_PREFIX}
-P ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/UseJava/ClearClassFiles.cmake
--log-level ${_LOG_LEVEL}
COMMAND ${Java_JAVAC_EXECUTABLE}
${CMAKE_JAVA_COMPILE_FLAGS}
-classpath "${CMAKE_JAVA_INCLUDE_PATH_FINAL}"
-d ${CMAKE_JAVA_CLASS_OUTPUT_PATH}
${_GENERATE_NATIVE_HEADERS}
${_JAVA_SOURCES_FILELISTS}
COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_compiled_${_TARGET_NAME}
DEPENDS ${_JAVA_COMPILE_FILES} ${_JAVA_COMPILE_FILELISTS} ${_JAVA_COMPILE_DEPENDS} ${_JAVA_SOURCES_FILE}
DEPENDS ${_JAVA_COMPILE_FILES} ${_JAVA_COMPILE_FILELISTS} ${_JAVA_COMPILE_DEPENDS} ${_JAVA_COMPILE_MODDEPENDS} ${_JAVA_SOURCES_FILE}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMMENT "Building Java objects for ${_TARGET_NAME}.jar"
VERBATIM
)
cmake_language(EVAL CODE "
add_custom_command(OUTPUT [[${stamp_file}]]
APPEND COMMAND [[${Java_JAVAC_EXECUTABLE}]]
\${CMAKE_JAVA_COMPILE_FLAGS}
-classpath [[${CMAKE_JAVA_INCLUDE_PATH_FINAL}]]
${javac_mp_args}
-d [[${CMAKE_JAVA_CLASS_OUTPUT_PATH}]]
\${_GENERATE_NATIVE_HEADERS}
\${_JAVA_SOURCES_FILELISTS}
)
")
add_custom_command(OUTPUT "${stamp_file}"
APPEND COMMAND ${CMAKE_COMMAND} -E touch "${stamp_file}"
)
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 ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/UseJava/ClassFilelist.cmake
DEPENDS ${CMAKE_JAVA_CLASS_OUTPUT_PATH}/java_compiled_${_TARGET_NAME}
DEPENDS "${stamp_file}"
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
VERBATIM
)