Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
d9b2bb114044e2ae5d775c914d70c38b84b38b7d
[simgrid.git] / tools / cmake / Java.cmake
1 ##
2 ## The Cmake definitions for the use of Java (and Scala)
3 ##   This file is loaded only if the Java option is activated
4 ##
5
6 find_package(Java 1.8 COMPONENTS Runtime Development)
7 if (NOT ${Java_FOUND})
8   message(FATAL_ERROR "Java not found (need at least Java8). Please install the JDK or disable that option")
9 endif()
10 set(Java_FOUND 1)
11 include(UseJava)
12
13 find_package(JNI REQUIRED)
14 message(STATUS "[Java] JNI found: ${JNI_FOUND}")
15 message(STATUS "[Java] JNI include dirs: ${JNI_INCLUDE_DIRS}")
16
17 # Rules to build libsimgrid-java
18 ################################
19
20 add_library(simgrid-java SHARED ${JMSG_C_SRC})
21 set_target_properties(simgrid-java PROPERTIES VERSION          ${libsimgrid-java_version})
22 set_target_properties(simgrid-java PROPERTIES SKIP_BUILD_RPATH ON)
23 set_property(TARGET simgrid-java
24              APPEND PROPERTY INCLUDE_DIRECTORIES "${INTERNAL_INCLUDES}")
25
26 target_link_libraries(simgrid-java simgrid)
27 add_dependencies(tests simgrid-java)
28
29 get_target_property(COMMON_INCLUDES simgrid-java INCLUDE_DIRECTORIES)
30 if (COMMON_INCLUDES)
31   set_target_properties(simgrid-java PROPERTIES  INCLUDE_DIRECTORIES "${COMMON_INCLUDES};${JNI_INCLUDE_DIRS}")
32 else()
33   set_target_properties(simgrid-java PROPERTIES  INCLUDE_DIRECTORIES "${JNI_INCLUDE_DIRS}")
34 endif()
35
36 get_target_property(CHECK_INCLUDES simgrid-java INCLUDE_DIRECTORIES)
37 message(STATUS "[Java] simgrid-java includes: ${CHECK_INCLUDES}")
38
39 # Rules to build simgrid.jar
40 ############################
41
42 ## Files to include in simgrid.jar
43 ##
44 set(SIMGRID_JAR "${CMAKE_BINARY_DIR}/simgrid.jar")
45 set(MANIFEST_IN_FILE "${CMAKE_HOME_DIRECTORY}/src/bindings/java/MANIFEST.in")
46 set(MANIFEST_FILE "${CMAKE_BINARY_DIR}/src/bindings/java/MANIFEST.MF")
47
48 set(LIBSIMGRID_SO       libsimgrid${CMAKE_SHARED_LIBRARY_SUFFIX})
49 set(LIBSIMGRID_JAVA_SO  ${CMAKE_SHARED_LIBRARY_PREFIX}simgrid-java${CMAKE_SHARED_LIBRARY_SUFFIX})
50
51 ## Here is how to build simgrid.jar
52 ##
53 add_jar(simgrid-java_jar ${JMSG_JAVA_SRC} OUTPUT_NAME simgrid)
54
55 if(enable_lib_in_jar)
56   add_dependencies(simgrid-java_jar simgrid-java)
57   add_dependencies(simgrid-java_jar simgrid)
58 endif()
59
60 if (enable_documentation)
61   add_custom_command(
62     TARGET simgrid-java_jar POST_BUILD
63     COMMENT "Add the documentation into simgrid.jar..."
64     DEPENDS ${MANIFEST_IN_FILE}
65             ${CMAKE_HOME_DIRECTORY}/COPYING
66             ${CMAKE_HOME_DIRECTORY}/ChangeLog
67             ${CMAKE_HOME_DIRECTORY}/NEWS
68             ${CMAKE_HOME_DIRECTORY}/LICENSE-LGPL-2.1
69
70     COMMAND ${CMAKE_COMMAND} -E copy ${MANIFEST_IN_FILE} ${MANIFEST_FILE}
71     COMMAND ${CMAKE_COMMAND} -E echo "Specification-Version: \\\"${SIMGRID_VERSION_MAJOR}.${SIMGRID_VERSION_MINOR}.${SIMGRID_VERSION_PATCH}\\\"" >> ${MANIFEST_FILE}
72     COMMAND ${CMAKE_COMMAND} -E echo "Implementation-Version: \\\"${GIT_VERSION}\\\"" >> ${MANIFEST_FILE}
73
74     COMMAND ${Java_JAVADOC_EXECUTABLE} -quiet -d doc/javadoc -sourcepath ${CMAKE_HOME_DIRECTORY}/src/bindings/java/ org.simgrid.msg org.simgrid.trace
75
76     COMMAND ${JAVA_ARCHIVE} -uvmf ${MANIFEST_FILE} ${SIMGRID_JAR} doc/javadoc
77     COMMAND ${JAVA_ARCHIVE} -uvf  ${SIMGRID_JAR} -C ${CMAKE_HOME_DIRECTORY} COPYING -C ${CMAKE_HOME_DIRECTORY} ChangeLog -C ${CMAKE_HOME_DIRECTORY} LICENSE-LGPL-2.1 -C ${CMAKE_HOME_DIRECTORY} NEWS
78   )
79 endif()
80
81 ###
82 ### Pack the java libraries into the jarfile if asked to do so
83 ###
84
85 if(enable_lib_in_jar)
86   set(SG_SYSTEM_NAME ${CMAKE_SYSTEM_NAME})
87
88   if(${SG_SYSTEM_NAME} MATCHES "kFreeBSD")
89     set(SG_SYSTEM_NAME GNU/kFreeBSD)
90   endif()
91
92   set(JAVA_NATIVE_PATH NATIVE/${SG_SYSTEM_NAME}/${CMAKE_SYSTEM_PROCESSOR})
93   if( (${CMAKE_SYSTEM_PROCESSOR} MATCHES "^i[3-6]86$") OR
94       (${CMAKE_SYSTEM_PROCESSOR} MATCHES "x86_64") OR
95       (${CMAKE_SYSTEM_PROCESSOR} MATCHES "AMD64") )
96     if(CMAKE_SIZEOF_VOID_P EQUAL 4) # 32 bits
97       set(JAVA_NATIVE_PATH NATIVE/${SG_SYSTEM_NAME}/x86)
98     else()
99       set(JAVA_NATIVE_PATH NATIVE/${SG_SYSTEM_NAME}/amd64)
100     endif()
101   endif()
102   if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "armv7l")
103     set(JAVA_NATIVE_PATH NATIVE/${SG_SYSTEM_NAME}/arm) # Default arm (soft-float ABI)
104   endif()
105
106   add_custom_command(
107     TARGET simgrid-java_jar POST_BUILD
108     COMMENT "Add the native libs into simgrid.jar..."
109     DEPENDS simgrid simgrid-java ${JAVALIBS}
110
111     COMMAND ${CMAKE_COMMAND} -E make_directory   ${JAVA_NATIVE_PATH}
112
113     COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/lib/${LIBSIMGRID_SO}      ${JAVA_NATIVE_PATH}/${LIBSIMGRID_SO}
114     COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/lib/${LIBSIMGRID_JAVA_SO} ${JAVA_NATIVE_PATH}/${LIBSIMGRID_JAVA_SO}
115   )
116
117 if(APPLE)
118   add_custom_command(
119     TARGET simgrid-java_jar POST_BUILD
120     COMMENT "Add the apple-specific native libs into simgrid.jar..."
121     DEPENDS simgrid simgrid-java ${JAVALIBS}
122
123     # We need to fix the rpath of the simgrid-java library so that it
124     #    searches the simgrid library in the right location
125     #
126     # Since we don't officially install the lib before copying it in
127     # the jarfile, the lib is searched for where it was built. Given
128     # how we unpack it, we need to instruct simgrid-java to forget
129     # about the build path, and search in its current directory
130     # instead.
131     #
132     # This has to be done with the classical Apple tools, as follows:
133
134     COMMAND install_name_tool -change ${CMAKE_BINARY_DIR}/lib/libsimgrid.${SIMGRID_VERSION_MAJOR}.${SIMGRID_VERSION_MINOR}${CMAKE_SHARED_LIBRARY_SUFFIX} @loader_path/libsimgrid.dylib ${JAVA_NATIVE_PATH}/${LIBSIMGRID_JAVA_SO}
135   )
136 endif(APPLE)
137
138   add_custom_command(
139     TARGET simgrid-java_jar POST_BUILD
140     COMMENT "Packing back the simgrid.jar with the native libs (turn lib_in_jar off when coding in java)..."
141     DEPENDS simgrid simgrid-java ${JAVALIBS}
142
143     COMMAND ${JAVA_ARCHIVE} -uvf ${SIMGRID_JAR}  ${JAVA_NATIVE_PATH}
144
145     COMMAND ${CMAKE_COMMAND} -E echo "-- Cmake put the native code in ${JAVA_NATIVE_PATH}"
146     COMMAND "${Java_JAVA_EXECUTABLE}" -classpath "${SIMGRID_JAR}" org.simgrid.NativeLib
147   )
148 endif(enable_lib_in_jar)
149
150 include_directories(${JNI_INCLUDE_DIRS} ${JAVA_INCLUDE_PATH} ${JAVA_INCLUDE_PATH2})