Files
hdf5/java/hdf/hdf5lib/CMakeLists.txt

318 lines
13 KiB
CMake

#-----------------------------------------------------------------------------
# CMake configuration for HDF5 Java hdf.hdf5lib package
# This file sets up the build, packaging, and installation rules for the HDF5 Java hdf.hdf5lib package.
# It handles Java source grouping, JAR creation, JFFM dependencies, and formatting for the HDF5 Java bindings.
#-----------------------------------------------------------------------------
cmake_minimum_required (VERSION 3.26)
project (HDF5_JAVA_HDF_HDF5 Java)
set (CMAKE_VERBOSE_MAKEFILE 1)
set_directory_properties(PROPERTIES INCLUDE_DIRECTORIES "${HDF5_JAVA_JSRC_SOURCE_DIR};${HDF5_JAVA_JSRC_BINARY_DIR};${HDF5_JAVA_HDF_HDF5_SOURCE_DIR};${HDF5_JAVA_HDF_HDF5_BINARY_DIR};${HDF5_JAVA_LIB_DIR};${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${HDF5_JAVA_HDF5_LIB_CORENAME}.dir/hdf/hdf5lib")
SET_GLOBAL_VARIABLE (HDF5_JAVA_SOURCE_PACKAGES
"${HDF5_JAVA_SOURCE_PACKAGES};hdf.hdf5lib.callbacks;hdf.hdf5lib.exceptions;hdf.hdf5lib.structs;hdf.hdf5lib"
)
set (HDF5_JAVA_HDF_HDF5_CALLBACKS_SOURCES
callbacks/H5A_iterate_cb.java
callbacks/H5A_iterate_t.java
callbacks/H5D_append_cb.java
callbacks/H5D_append_t.java
callbacks/H5D_iterate_cb.java
callbacks/H5D_iterate_t.java
callbacks/H5E_walk_cb.java
callbacks/H5E_walk_t.java
callbacks/H5L_iterate_t.java
callbacks/H5L_iterate_opdata_t.java
callbacks/H5O_iterate_t.java
callbacks/H5O_iterate_opdata_t.java
# callbacks/H5P_cls_close_func_cb.java
# callbacks/H5P_cls_close_func_t.java
# callbacks/H5P_cls_copy_func_cb.java
# callbacks/H5P_cls_copy_func_t.java
# callbacks/H5P_cls_create_func_cb.java
# callbacks/H5P_cls_create_func_t.java
# callbacks/H5P_prp_close_func_cb.java
# callbacks/H5P_prp_compare_func_cb.java
# callbacks/H5P_prp_copy_func_cb.java
# callbacks/H5P_prp_create_func_cb.java
# callbacks/H5P_prp_delete_func_cb.java
# callbacks/H5P_prp_get_func_cb.java
# callbacks/H5P_prp_set_func_cb.java
callbacks/H5P_iterate_cb.java
callbacks/H5P_iterate_t.java
)
set (HDF5_JAVADOC_HDFH5I_INVALID_HID_HDF5_CALLBACKS_SOURCES
${HDF5_JAVA_HDF_HDF5_CALLBACKS_SOURCES}
callbacks/package-info.java
)
set (HDF5_JAVA_HDF_HDF5_EXCEPTIONS_SOURCES
exceptions/HDF5Exception.java
exceptions/HDF5IdException.java
exceptions/HDF5AttributeException.java
exceptions/HDF5BtreeException.java
exceptions/HDF5DataFiltersException.java
exceptions/HDF5DatasetInterfaceException.java
exceptions/HDF5DataspaceInterfaceException.java
exceptions/HDF5DataStorageException.java
exceptions/HDF5DatatypeInterfaceException.java
exceptions/HDF5ExternalFileListException.java
exceptions/HDF5FileInterfaceException.java
exceptions/HDF5FunctionArgumentException.java
exceptions/HDF5FunctionEntryExitException.java
exceptions/HDF5HeapException.java
exceptions/HDF5InternalErrorException.java
exceptions/HDF5JavaException.java
exceptions/HDF5LibraryException.java
exceptions/HDF5LowLevelIOException.java
exceptions/HDF5MetaDataCacheException.java
exceptions/HDF5ObjectHeaderException.java
exceptions/HDF5PropertyListInterfaceException.java
exceptions/HDF5ReferenceException.java
exceptions/HDF5ResourceUnavailableException.java
exceptions/HDF5SymbolTableException.java
)
set (HDF5_JAVADOC_HDF_HDF5_EXCEPTIONS_SOURCES
${HDF5_JAVA_HDF_HDF5_EXCEPTIONS_SOURCES}
exceptions/package-info.java
)
set (HDF5_JAVA_HDF_HDF5_STRUCTS_SOURCES
structs/H5_ih_info_t.java
structs/H5A_info_t.java
structs/H5AC_cache_config_t.java
structs/H5E_error2_t.java
structs/H5F_info2_t.java
structs/H5G_info_t.java
structs/H5L_info_t.java
structs/H5O_hdr_info_t.java
structs/H5O_info_t.java
structs/H5O_native_info_t.java
structs/H5O_token_t.java
)
list(APPEND HDF5_JAVA_HDF_HDF5_STRUCTS_SOURCES structs/H5FD_ros3_fapl_t.java)
# list(APPEND HDF5_JAVA_HDF_HDF5_STRUCTS_SOURCES structs/H5FD_hdfs_fapl_t.java)
set (HDF5_JAVADOC_HDF_HDF5_STRUCTS_SOURCES
${HDF5_JAVA_HDF_HDF5_STRUCTS_SOURCES}
structs/package-info.java
)
#-----------------------------------------------------------------------------
# Generate H5Version.java with version information from H5public.h
# This ensures the Java version constants match the C library version
# Uses shared template from java/templates/
#-----------------------------------------------------------------------------
configure_file (
${HDF5_SOURCE_DIR}/java/templates/H5Version.java.in
${CMAKE_CURRENT_BINARY_DIR}/H5Version.java
@ONLY
)
# Use sources from both source and binary directories
set (HDF5_JAVA_HDF_HDF5_SOURCES
HDFArray.java
HDF5Constants.java
HDFNativeData.java
H5.java
${CMAKE_CURRENT_BINARY_DIR}/H5Version.java
VLDataConverter.java
)
set (HDF5_JAVADOC_HDF_HDF5_SOURCES
${HDF5_JAVA_HDF_HDF5_SOURCES}
package-info.java
)
file (WRITE ${PROJECT_BINARY_DIR}/Manifest.txt
"Enable-Native-Access: ALL-UNNAMED
"
)
set (CMAKE_JAVA_INCLUDE_PATH "${HDF5_JAVAHDF5_JARS};${HDF5_JAVA_LOGGING_JAR}")
# Create main JAR with platform classifier if Maven deployment is enabled
if (HDF5_ENABLE_MAVEN_DEPLOY)
# Determine platform and architecture for Maven classifiers
if (WIN32)
set (HDF5_MAVEN_PLATFORM "windows")
elseif (APPLE)
set (HDF5_MAVEN_PLATFORM "macos")
else ()
set (HDF5_MAVEN_PLATFORM "linux")
endif ()
if (CMAKE_SIZEOF_VOID_P EQUAL 8)
if (CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|arm64")
set (HDF5_MAVEN_ARCHITECTURE "aarch64")
else ()
set (HDF5_MAVEN_ARCHITECTURE "x86_64")
endif ()
else ()
set (HDF5_MAVEN_ARCHITECTURE "x86")
endif ()
# Set version suffix for snapshots vs releases
if (HDF5_MAVEN_SNAPSHOT)
set (HDF5_MAVEN_VERSION_SUFFIX "-SNAPSHOT")
else ()
set (HDF5_MAVEN_VERSION_SUFFIX "")
endif ()
# For FFM builds, include the FFM binding sources in the Maven JAR
# This ensures the final JAR contains both the FFM bindings (org.hdfgroup.javahdf5.*)
# and the compatibility layer (hdf.hdf5lib.*)
set (HDF5_MAVEN_JAR_SOURCES
${HDF5_JAVA_HDF_HDF5_CALLBACKS_SOURCES}
${HDF5_JAVA_HDF_HDF5_EXCEPTIONS_SOURCES}
${HDF5_JAVA_HDF_HDF5_STRUCTS_SOURCES}
${HDF5_JAVA_HDF_HDF5_SOURCES}
)
# Include FFM bindings if this is an FFM build
if (HDF5_JAVA_USE_FFM)
# Glob the generated FFM binding sources
file (GLOB HDF5_FFM_BINDING_SOURCES
LIST_DIRECTORIES false
${HDF5_JAVA_JSRC_BINARY_DIR}/org/hdfgroup/javahdf5/*.java
)
if (HDF5_FFM_BINDING_SOURCES)
list (LENGTH HDF5_FFM_BINDING_SOURCES list_count)
message (STATUS "Including FFM bindings in Maven JAR (${list_count} files)")
list (APPEND HDF5_MAVEN_JAR_SOURCES ${HDF5_FFM_BINDING_SOURCES})
else ()
message (WARNING "FFM build but no FFM binding sources found in ${HDF5_JAVA_JSRC_BINARY_DIR}/org/hdfgroup/javahdf5/")
endif ()
endif ()
# Build JAR once with platform classifier - this is the primary JAR
set (HDF5_JAR_CLASSIFIER "${HDF5_MAVEN_PLATFORM}-${HDF5_MAVEN_ARCHITECTURE}")
add_jar (${HDF5_JAVA_HDF5_LIB_TARGET}
OUTPUT_NAME "${HDF5_JAVA_HDF5_LIB_TARGET}-${HDF5_PACKAGE_VERSION}${HDF5_MAVEN_VERSION_SUFFIX}-${HDF5_JAR_CLASSIFIER}"
MANIFEST ${PROJECT_BINARY_DIR}/Manifest.txt
${HDF5_MAVEN_JAR_SOURCES}
)
# Get the JAR file path for the platform-specific JAR
get_target_property (HDF5_JAVA_PLATFORM_JAR_FILE ${HDF5_JAVA_HDF5_LIB_TARGET} JAR_FILE)
# Define the universal JAR name and path (without classifier)
set (HDF5_JAVA_UNIVERSAL_JAR_NAME "${HDF5_JAVA_HDF5_LIB_TARGET}-${HDF5_PACKAGE_VERSION}${HDF5_MAVEN_VERSION_SUFFIX}.jar")
set (HDF5_JAVA_UNIVERSAL_JAR_FILE "${CMAKE_CURRENT_BINARY_DIR}/${HDF5_JAVA_UNIVERSAL_JAR_NAME}")
# Create universal JAR by copying the platform-specific JAR
set (HDF5_JAVA_UNIVERSAL_TARGET "${HDF5_JAVA_HDF5_LIB_TARGET}-universal")
add_custom_command (
OUTPUT ${HDF5_JAVA_UNIVERSAL_JAR_FILE}
COMMAND ${CMAKE_COMMAND} -E copy ${HDF5_JAVA_PLATFORM_JAR_FILE} ${HDF5_JAVA_UNIVERSAL_JAR_FILE}
DEPENDS ${HDF5_JAVA_HDF5_LIB_TARGET}
COMMENT "Creating universal JAR ${HDF5_JAVA_UNIVERSAL_JAR_NAME} from platform-specific JAR"
)
# Create a target for the universal JAR
add_custom_target (${HDF5_JAVA_UNIVERSAL_TARGET} ALL
DEPENDS ${HDF5_JAVA_UNIVERSAL_JAR_FILE}
)
set_target_properties (${HDF5_JAVA_UNIVERSAL_TARGET} PROPERTIES FOLDER libraries/java)
# Export universal target name for test dependencies
SET_GLOBAL_VARIABLE (HDF5_JAVA_HDF5_UNIVERSAL_TARGET ${HDF5_JAVA_UNIVERSAL_TARGET})
# Install both JARs
install_jar (${HDF5_JAVA_HDF5_LIB_TARGET} LIBRARY DESTINATION ${HDF5_INSTALL_JAR_DIR} COMPONENT maven)
install (FILES ${HDF5_JAVA_UNIVERSAL_JAR_FILE} DESTINATION ${HDF5_INSTALL_JAR_DIR} COMPONENT libraries)
# Update global variables for both JARs
# Use universal JAR for examples/tests (for compatibility)
SET_GLOBAL_VARIABLE (HDF5_JAVA_JARS "${HDF5_JAVA_JARS};${HDF5_JAVA_UNIVERSAL_JAR_FILE}")
# Export both JARs for installation
SET_GLOBAL_VARIABLE (HDF5_JAVA_JARS_TO_EXPORT "${HDF5_JAVA_JARS_TO_EXPORT};${HDF5_JAVA_UNIVERSAL_JAR_FILE}")
SET_GLOBAL_VARIABLE (HDF5_MAVEN_PLATFORM_JAR_FILE "${HDF5_JAVA_PLATFORM_JAR_FILE}")
# Set HDF5_JAVA_LIBRARY for examples to depend on
SET_GLOBAL_VARIABLE (HDF5_JAVA_LIBRARY ${HDF5_JAVA_UNIVERSAL_TARGET})
else ()
# Standard JAR creation without Maven classifiers
# Include FFM bindings if this is an FFM build
set (HDF5_STANDARD_JAR_SOURCES
${HDF5_JAVA_HDF_HDF5_CALLBACKS_SOURCES}
${HDF5_JAVA_HDF_HDF5_EXCEPTIONS_SOURCES}
${HDF5_JAVA_HDF_HDF5_STRUCTS_SOURCES}
${HDF5_JAVA_HDF_HDF5_SOURCES}
)
if (HDF5_JAVA_USE_FFM)
# Glob the generated FFM binding sources
file (GLOB HDF5_FFM_BINDING_SOURCES
LIST_DIRECTORIES false
${HDF5_JAVA_JSRC_BINARY_DIR}/org/hdfgroup/javahdf5/*.java
)
if (HDF5_FFM_BINDING_SOURCES)
list (LENGTH HDF5_FFM_BINDING_SOURCES list_count)
message (STATUS "Including FFM bindings in standard JAR (${list_count} files)")
list (APPEND HDF5_STANDARD_JAR_SOURCES ${HDF5_FFM_BINDING_SOURCES})
else ()
message (WARNING "FFM build but no FFM binding sources found in ${HDF5_JAVA_JSRC_BINARY_DIR}/org/hdfgroup/javahdf5/")
endif ()
endif ()
add_jar (${HDF5_JAVA_HDF5_LIB_TARGET} OUTPUT_NAME "${HDF5_JAVA_HDF5_LIB_TARGET}-${HDF5_PACKAGE_VERSION}" MANIFEST ${PROJECT_BINARY_DIR}/Manifest.txt ${HDF5_STANDARD_JAR_SOURCES})
install_jar (${HDF5_JAVA_HDF5_LIB_TARGET} LIBRARY DESTINATION ${HDF5_INSTALL_JAR_DIR} COMPONENT libraries)
# For non-Maven builds, use the standard JAR
get_target_property (${HDF5_JAVA_HDF5_LIB_TARGET}_JAR_FILE ${HDF5_JAVA_HDF5_LIB_TARGET} JAR_FILE)
SET_GLOBAL_VARIABLE (HDF5_JAVA_JARS "${HDF5_JAVA_JARS};${${HDF5_JAVA_HDF5_LIB_TARGET}_JAR_FILE}")
SET_GLOBAL_VARIABLE (HDF5_JAVA_JARS_TO_EXPORT "${HDF5_JAVA_JARS_TO_EXPORT};${${HDF5_JAVA_HDF5_LIB_TARGET}_JAR_FILE}")
# Set HDF5_JAVA_LIBRARY for examples to depend on
SET_GLOBAL_VARIABLE (HDF5_JAVA_LIBRARY ${HDF5_JAVA_HDF5_LIB_TARGET})
endif ()
message (STATUS "HDF5 java jar: ${HDF5_JAVA_JARS}")
# Always export the platform-specific JAR for reference (used by Maven deployment)
get_target_property (${HDF5_JAVA_HDF5_LIB_TARGET}_JAR_FILE ${HDF5_JAVA_HDF5_LIB_TARGET} JAR_FILE)
SET_GLOBAL_VARIABLE (HDF5_JAVA_JARS_TO_EXPORT "${HDF5_JAVA_JARS_TO_EXPORT};${${HDF5_JAVA_HDF5_LIB_TARGET}_JAR_FILE}")
message (STATUS "HDF5 java export jar: ${HDF5_JAVA_JARS}")
add_dependencies (${HDF5_JAVA_HDF5_LIB_TARGET} ${HDF5_JAVA_JSRC_LIB_TARGET})
set_target_properties (${HDF5_JAVA_HDF5_LIB_TARGET} PROPERTIES FOLDER libraries/java)
#-----------------------------------------------------------------------------
# Maven POM Generation
#-----------------------------------------------------------------------------
if (HDF5_ENABLE_MAVEN_DEPLOY)
# Configure timestamp for build metadata
string (TIMESTAMP CMAKE_CONFIGURE_DATE "%Y-%m-%d %H:%M:%S UTC" UTC)
# Generate POM file from template
configure_file (
${CMAKE_CURRENT_SOURCE_DIR}/pom.xml.in
${CMAKE_CURRENT_BINARY_DIR}/pom.xml
@ONLY
)
# Install POM file for deployment
install (FILES ${CMAKE_CURRENT_BINARY_DIR}/pom.xml
DESTINATION ${HDF5_INSTALL_JAR_DIR}
COMPONENT maven
)
# Add Maven deployment information to global variables
SET_GLOBAL_VARIABLE (HDF5_MAVEN_POM_FILE "${CMAKE_CURRENT_BINARY_DIR}/pom.xml")
SET_GLOBAL_VARIABLE (HDF5_MAVEN_PLATFORM_CLASSIFIER "${HDF5_MAVEN_PLATFORM}-${HDF5_MAVEN_ARCHITECTURE}")
message (STATUS "Maven POM configured: ${HDF5_MAVEN_PLATFORM}-${HDF5_MAVEN_ARCHITECTURE}")
endif ()
if (HDF5_ENABLE_FORMATTERS)
clang_format (HDF5_JAVA_SRC_FORMAT ${HDF5_JAVA_HDF_HDF5_CALLBACKS_SOURCES} ${HDF5_JAVA_HDF_HDF5_EXCEPTIONS_SOURCES} ${HDF5_JAVA_HDF_HDF5_STRUCTS_SOURCES} ${HDF5_JAVA_HDF_HDF5_SOURCES})
endif ()
set (CMAKE_JAVA_INCLUDE_PATH "")