Skip to content

Commit f6ffb82

Browse files
committed
updated build scripts
1 parent 22812f7 commit f6ffb82

File tree

6 files changed

+324
-160
lines changed

6 files changed

+324
-160
lines changed

README.md

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,15 @@ engine.eval("println(x);", newContext);
6969

7070
For running: julia should be installed.
7171

72-
For building with binaries: julia, julia-devel, Java 8, swig, gcc, make.
72+
For building with binaries: julia, julia-devel, Java >21, swig, gcc, make.
7373

7474
### How to build
75-
These sources doesn't include native binary libraries. But you can build them manually by [`swig/build.sh`](swig/build.sh) script.
75+
These sources doesn't include native binary libraries. But you can build them manually by [`swig/build.sh`](swig/build.sh) script.
76+
```bash
77+
cd swig
78+
./build.sh
79+
```
80+
7681
Also see [swig/lib_src/Makefile](swig/lib_src/Makefile)
7782

7883
Next run `./gradlew build`

build.gradle

Lines changed: 51 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,78 @@
1-
buildscript {
2-
repositories {
3-
mavenCentral()
4-
mavenLocal()
5-
}
6-
}
7-
81
plugins {
92
id 'java'
103
id 'maven-publish'
114
}
125

13-
group 'org.julia'
14-
version '0.0.2-SNAPSHOT'
6+
group = 'org.julia'
7+
version = '0.0.3.SNAPSHOT'
158

16-
sourceCompatibility = 1.11
9+
java {
10+
sourceCompatibility = JavaVersion.VERSION_21
11+
targetCompatibility = JavaVersion.VERSION_21
12+
}
1713

1814
repositories {
1915
mavenCentral()
16+
mavenLocal()
2017
}
2118

2219
publishing {
2320
publications {
2421
maven(MavenPublication) {
25-
groupId = group
22+
groupId = project.group
2623
artifactId = rootProject.name
27-
version = version
24+
version = project.version
2825

2926
from components.java
3027
}
3128
}
3229
}
3330

31+
// Helper function to get Julia's lib directory
32+
def getJuliaLibPath() {
33+
def juliaCmd = [
34+
'julia',
35+
'-e',
36+
'print(abspath(joinpath(Sys.BINDIR, "..", "lib")))'
37+
]
38+
def process = juliaCmd.execute()
39+
process.waitFor()
40+
if (process.exitValue() != 0) {
41+
throw new GradleException("Failed to find Julia lib path: ${process.err.text}")
42+
}
43+
return process.text.trim()
44+
}
45+
3446
test {
3547
useJUnitPlatform()
48+
49+
// Set library paths for all platforms
50+
def juliaLibPath = getJuliaLibPath()
51+
52+
// macOS specific configuration
53+
if (org.gradle.nativeplatform.platform.internal.DefaultNativePlatform.currentOperatingSystem.isMacOsX()) {
54+
environment "DYLD_LIBRARY_PATH", juliaLibPath + (
55+
System.getenv('DYLD_LIBRARY_PATH')
56+
? ":" + System.getenv('DYLD_LIBRARY_PATH')
57+
: ""
58+
)
59+
}
60+
// Linux specific configuration
61+
else if (org.gradle.nativeplatform.platform.internal.DefaultNativePlatform.currentOperatingSystem.isLinux()) {
62+
environment "LD_LIBRARY_PATH", juliaLibPath + (
63+
System.getenv('LD_LIBRARY_PATH')
64+
? ":" + System.getenv('LD_LIBRARY_PATH')
65+
: ""
66+
)
67+
}
68+
// Windows specific configuration
69+
else if (org.gradle.nativeplatform.platform.internal.DefaultNativePlatform.currentOperatingSystem.isWindows()) {
70+
def currentPath = System.getenv('PATH') ?: ""
71+
environment "PATH", juliaLibPath + File.pathSeparator + currentPath
72+
}
3673
}
3774

3875
dependencies {
39-
testImplementation('org.junit.jupiter:junit-jupiter-api:5.8.2')
40-
testImplementation('org.junit.jupiter:junit-jupiter-engine:5.8.2')
76+
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.11.4'
77+
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.11.4'
4178
}
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1+
#Thu Jun 05 16:27:58 MSK 2025
12
distributionBase=GRADLE_USER_HOME
23
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.2-bin.zip
4+
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip
45
zipStoreBase=GRADLE_USER_HOME
56
zipStorePath=wrapper/dists

swig/CMakeLists.txt

Lines changed: 75 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,91 @@
1-
cmake_minimum_required(VERSION 3.0)
1+
cmake_minimum_required(VERSION 3.18)
22
project(Julia4J VERSION 0.0.0.1 LANGUAGES C)
33

44
find_package(SWIG REQUIRED)
55
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}")
837

938
include(./FindJULIA.cmake)
1039

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")
1442

1543
swig_add_library(julia4j
1644
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+
)
2056

2157
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"
2359
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+
)
2762

28-
# set(CMAKE_INSTALL_RPATH "@loader_path")
63+
target_include_directories(julia4j
64+
PUBLIC
65+
${JNI_INCLUDE_DIRS}
66+
${Julia_INCLUDE_DIRS}
67+
)
2968

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}
3373
)
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

Comments
 (0)