|
1 | | -cmake_minimum_required(VERSION 3.0) |
| 1 | +cmake_minimum_required(VERSION 3.18) |
2 | 2 | project(Julia4J VERSION 0.0.0.1 LANGUAGES C) |
3 | 3 |
|
4 | 4 | find_package(SWIG REQUIRED) |
5 | 5 | include(${SWIG_USE_FILE}) |
6 | | -#find_package(Java COMPONENTS Development) |
7 | | -find_package(JNI REQUIRED) |
| 6 | + |
| 7 | +# find_package(JNI REQUIRED) # sometimes it gives wrong directories |
| 8 | + |
| 9 | +# Detect current Java installation |
| 10 | +find_package(Java COMPONENTS Development REQUIRED) |
| 11 | +execute_process( |
| 12 | + COMMAND ${Java_JAVA_EXECUTABLE} -XshowSettings:properties -version |
| 13 | + ERROR_VARIABLE java_settings |
| 14 | + OUTPUT_STRIP_TRAILING_WHITESPACE |
| 15 | +) |
| 16 | + |
| 17 | +# Extract java.home from Java output |
| 18 | +string(REGEX MATCH "java.home = ([^\n]+)" _ ${java_settings}) |
| 19 | +if(CMAKE_MATCH_1) |
| 20 | + set(JAVA_HOME ${CMAKE_MATCH_1}) |
| 21 | + message(STATUS "Detected JAVA_HOME: ${JAVA_HOME}") |
| 22 | + |
| 23 | + # Set platform-specific include paths |
| 24 | + if(APPLE) |
| 25 | + set(JNI_INCLUDE_DIRS "${JAVA_HOME}/include" "${JAVA_HOME}/include/darwin") |
| 26 | + elseif(WIN32) |
| 27 | + set(JNI_INCLUDE_DIRS "${JAVA_HOME}/include" "${JAVA_HOME}/include/win32") |
| 28 | + else() # Linux/Unix |
| 29 | + set(JNI_INCLUDE_DIRS "${JAVA_HOME}/include" "${JAVA_HOME}/include/linux") |
| 30 | + endif() |
| 31 | +else() |
| 32 | + message(FATAL_ERROR "Failed to detect Java home directory") |
| 33 | +endif() |
| 34 | + |
| 35 | +include_directories(SYSTEM ${JNI_INCLUDE_DIRS}) |
| 36 | +message(STATUS "JNI include paths: ${JNI_INCLUDE_DIRS}") |
8 | 37 |
|
9 | 38 | include(./FindJULIA.cmake) |
10 | 39 |
|
11 | | -set_property(SOURCE julia4j.i PROPERTY C ON) |
12 | | -set_property(SOURCE julia4j.i PROPERTY COMPILE_OPTIONS |
13 | | - -package org.julia.jni.swig) |
| 40 | +set_source_files_properties(julia4j.i PROPERTIES C ON) |
| 41 | +set_source_files_properties(julia4j.i PROPERTIES COMPILE_OPTIONS "-package;org.julia.jni.swig") |
14 | 42 |
|
15 | 43 | swig_add_library(julia4j |
16 | 44 | TYPE SHARED |
17 | | - LANGUAGE java |
18 | | - OUTPUT_DIR ${PROJECT_BINARY_DIR}/../src/main/java/org/julia/jni/swig |
19 | | - SOURCES julia4j.i) |
| 45 | + LANGUAGE java |
| 46 | + OUTPUT_DIR "${PROJECT_BINARY_DIR}/../src/main/java/org/julia/jni/swig" |
| 47 | + SOURCES julia4j.i |
| 48 | +) |
| 49 | + |
| 50 | +# Get SWIG's standard include directory |
| 51 | +execute_process( |
| 52 | + COMMAND ${SWIG_EXECUTABLE} -swiglib |
| 53 | + OUTPUT_VARIABLE SWIG_DIR |
| 54 | + OUTPUT_STRIP_TRAILING_WHITESPACE |
| 55 | +) |
20 | 56 |
|
21 | 57 | set_target_properties(julia4j PROPERTIES |
22 | | - SWIG_INCLUDE_DIRECTORIES ${PROJECT_SOURCE_DIR}/java |
| 58 | + SWIG_INCLUDE_DIRECTORIES "${SWIG_DIR};${SWIG_DIR}/java;${PROJECT_SOURCE_DIR}/java" |
23 | 59 | SWIG_USE_TARGET_INCLUDE_DIRECTORIES ON |
24 | | - POSITION_INDEPENDENT_CODE ON) |
25 | | -target_include_directories(julia4j PUBLIC ${JNI_INCLUDE_DIRS} ${Julia_INCLUDE_DIRS}) |
26 | | -target_link_libraries(julia4j ${JNI_LIBRARIES} ${Julia_LIBRARY} ${Julia_LIBRARY_DIR}) |
| 60 | + POSITION_INDEPENDENT_CODE ON |
| 61 | +) |
27 | 62 |
|
28 | | -# set(CMAKE_INSTALL_RPATH "@loader_path") |
| 63 | +target_include_directories(julia4j |
| 64 | + PUBLIC |
| 65 | + ${JNI_INCLUDE_DIRS} |
| 66 | + ${Julia_INCLUDE_DIRS} |
| 67 | +) |
29 | 68 |
|
30 | | -string(TOLOWER ${CMAKE_SYSTEM_NAME} OUT_OS_NAME) |
31 | | -install (TARGETS julia4j #${PROJECT_NAME} |
32 | | - LIBRARY DESTINATION ${PROJECT_SOURCE_DIR}/../src/main/resources/native/64/${OUT_OS_NAME}/ |
| 69 | +target_link_libraries(julia4j |
| 70 | + PRIVATE |
| 71 | + ${JNI_LIBRARIES} |
| 72 | + ${Julia_LIBRARY} |
33 | 73 | ) |
| 74 | + |
| 75 | +string(TOLOWER "${CMAKE_SYSTEM_NAME}" OUT_OS_NAME) |
| 76 | + |
| 77 | +cmake_policy(SET CMP0177 NEW) |
| 78 | + |
| 79 | +if(WIN32) |
| 80 | + install( |
| 81 | + TARGETS julia4j |
| 82 | + RUNTIME DESTINATION "${PROJECT_SOURCE_DIR}/../src/main/resources/native/64/${OUT_OS_NAME}/" |
| 83 | + ARCHIVE DESTINATION "${PROJECT_SOURCE_DIR}/../src/main/resources/native/64/${OUT_OS_NAME}/" |
| 84 | + ) |
| 85 | +else() |
| 86 | + install( |
| 87 | + TARGETS julia4j |
| 88 | + LIBRARY DESTINATION "${PROJECT_SOURCE_DIR}/../src/main/resources/native/64/${OUT_OS_NAME}/" |
| 89 | + ARCHIVE DESTINATION "${PROJECT_SOURCE_DIR}/../src/main/resources/native/64/${OUT_OS_NAME}/" |
| 90 | + ) |
| 91 | +endif() |
0 commit comments