Skip to content

Commit 0744518

Browse files
committed
native library build replaced by cmake
1 parent 41a8c89 commit 0744518

File tree

4 files changed

+209
-9
lines changed

4 files changed

+209
-9
lines changed

swig/.gitignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
CMakeCache.txt
2+
CMakeFiles/
3+
Makefile
4+
*.jnilib
5+
*.dll
6+
*.so

swig/CMakeLists.txt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
cmake_minimum_required(VERSION 3.0)
2+
project(Julia4J VERSION 0.0.0.1 LANGUAGES C)
3+
4+
find_package(SWIG REQUIRED)
5+
include(${SWIG_USE_FILE})
6+
find_package(JNI REQUIRED)
7+
8+
include(./FindJULIA.cmake)
9+
10+
set_property(SOURCE julia4j.i PROPERTY C ON)
11+
set_property(SOURCE julia4j.i PROPERTY COMPILE_OPTIONS
12+
-package org.julia.jni.swig)
13+
14+
swig_add_library(julia4j
15+
TYPE SHARED
16+
LANGUAGE java
17+
OUTPUT_DIR ${PROJECT_BINARY_DIR}/../src/main/java/org/julia/jni/swig
18+
SOURCES julia4j.i)
19+
20+
set_target_properties(julia4j PROPERTIES
21+
SWIG_INCLUDE_DIRECTORIES ${PROJECT_SOURCE_DIR}/java
22+
SWIG_USE_TARGET_INCLUDE_DIRECTORIES ON
23+
POSITION_INDEPENDENT_CODE ON)
24+
target_include_directories(julia4j PUBLIC ${JNI_INCLUDE_DIRS} ${Julia_INCLUDE_DIRS})
25+
target_link_libraries(julia4j ${JNI_LIBRARIES} ${Julia_LIBRARY} ${Julia_LIBRARY_DIR})

swig/FindJULIA.cmake

Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
# Original FindJulia.cmake from https://github.com/QuantStack/xtensor-julia-cookiecutter/blob/master/%7B%7Bcookiecutter.github_project_name%7D%7D/cmake/FindJulia.cmake
2+
3+
if(Julia_FOUND)
4+
return()
5+
endif()
6+
7+
####################
8+
# Julia Executable #
9+
####################
10+
11+
if(Julia_PREFIX)
12+
message(STATUS "Adding path ${Julia_PREFIX} to search path")
13+
list(APPEND CMAKE_PREFIX_PATH ${Julia_PREFIX})
14+
message(STATUS "THIS BRANCH")
15+
else()
16+
find_program(Julia_EXECUTABLE julia DOC "Julia executable")
17+
message(STATUS "Found Julia executable: " ${Julia_EXECUTABLE})
18+
endif()
19+
20+
#################
21+
# Julia Version #
22+
#################
23+
24+
if(Julia_EXECUTABLE)
25+
execute_process(
26+
COMMAND "${Julia_EXECUTABLE}" --startup-file=no --version
27+
OUTPUT_VARIABLE Julia_VERSION_STRING
28+
)
29+
else()
30+
find_file(Julia_VERSION_INCLUDE julia_version.h PATH_SUFFIXES include/julia)
31+
file(READ ${Julia_VERSION_INCLUDE} Julia_VERSION_STRING)
32+
string(REGEX MATCH "JULIA_VERSION_STRING.*" Julia_VERSION_STRING ${Julia_VERSION_STRING})
33+
endif()
34+
35+
string(
36+
REGEX REPLACE ".*([0-9]+\\.[0-9]+\\.[0-9]+).*" "\\1"
37+
Julia_VERSION_STRING "${Julia_VERSION_STRING}"
38+
)
39+
40+
MESSAGE(STATUS "Julia_VERSION_STRING: ${Julia_VERSION_STRING}")
41+
42+
##################
43+
# Julia Includes #
44+
##################
45+
46+
set(JULIA_HOME_NAME "Sys.BINDIR")
47+
if(${Julia_VERSION_STRING} VERSION_LESS "0.7.0")
48+
set(JULIA_HOME_NAME "JULIA_HOME")
49+
else()
50+
set(USING_LIBDL "using Libdl")
51+
endif()
52+
53+
if(DEFINED ENV{JULIA_INCLUDE_DIRS})
54+
set(Julia_INCLUDE_DIRS $ENV{JULIA_INCLUDE_DIRS}
55+
CACHE STRING "Location of Julia include files")
56+
elseif(Julia_EXECUTABLE)
57+
execute_process(
58+
COMMAND ${Julia_EXECUTABLE} --startup-file=no -E "julia_include_dir = joinpath(match(r\"(.*)(bin)\",${JULIA_HOME_NAME}).captures[1],\"include\",\"julia\")\n
59+
if !isdir(julia_include_dir) # then we're running directly from build\n
60+
julia_base_dir_aux = splitdir(splitdir(${JULIA_HOME_NAME})[1])[1] # useful for running-from-build\n
61+
julia_include_dir = joinpath(julia_base_dir_aux, \"usr\", \"include\" )\n
62+
julia_include_dir *= \";\" * joinpath(julia_base_dir_aux, \"src\", \"support\" )\n
63+
julia_include_dir *= \";\" * joinpath(julia_base_dir_aux, \"src\" )\n
64+
end\n
65+
julia_include_dir"
66+
OUTPUT_VARIABLE Julia_INCLUDE_DIRS
67+
)
68+
69+
string(REGEX REPLACE "\"" "" Julia_INCLUDE_DIRS "${Julia_INCLUDE_DIRS}")
70+
string(REGEX REPLACE "\n" "" Julia_INCLUDE_DIRS "${Julia_INCLUDE_DIRS}")
71+
set(Julia_INCLUDE_DIRS ${Julia_INCLUDE_DIRS}
72+
CACHE PATH "Location of Julia include files")
73+
elseif(Julia_PREFIX)
74+
set(Julia_INCLUDE_DIRS ${Julia_PREFIX}/include/julia)
75+
endif()
76+
MESSAGE(STATUS "Julia_INCLUDE_DIRS: ${Julia_INCLUDE_DIRS}")
77+
78+
###################
79+
# Julia Libraries #
80+
###################
81+
82+
if(WIN32)
83+
set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES} .a)
84+
endif()
85+
86+
if(Julia_EXECUTABLE)
87+
execute_process(
88+
COMMAND ${Julia_EXECUTABLE} --startup-file=no -E "${USING_LIBDL}\nabspath(Libdl.dlpath((ccall(:jl_is_debugbuild, Cint, ()) != 0) ? \"libjulia-debug\" : \"libjulia\"))"
89+
OUTPUT_VARIABLE Julia_LIBRARY
90+
)
91+
92+
string(REGEX REPLACE "\"" "" Julia_LIBRARY "${Julia_LIBRARY}")
93+
string(REGEX REPLACE "\n" "" Julia_LIBRARY "${Julia_LIBRARY}")
94+
string(STRIP "${Julia_LIBRARY}" Julia_LIBRARY)
95+
96+
if(WIN32)
97+
get_filename_component(Julia_LIBRARY_DIR ${Julia_LIBRARY} DIRECTORY)
98+
get_filename_component(Julia_LIBRARY_DIR ${Julia_LIBRARY_DIR} DIRECTORY)
99+
find_library(win_Julia_LIBRARY
100+
NAMES libjulia.dll.a
101+
PATHS "${Julia_LIBRARY_DIR}/lib"
102+
NO_DEFAULT_PATH
103+
)
104+
set(Julia_LIBRARY "${win_Julia_LIBRARY}")
105+
endif()
106+
107+
set(Julia_LIBRARY "${Julia_LIBRARY}"
108+
CACHE PATH "Julia library")
109+
else()
110+
find_library(Julia_LIBRARY NAMES libjulia.${Julia_VERSION_STRING}.dylib julia libjulia libjulia.dll.a CMAKE_FIND_ROOT_PATH_BOTH)
111+
endif()
112+
113+
get_filename_component(Julia_LIBRARY_DIR ${Julia_LIBRARY} DIRECTORY)
114+
115+
MESSAGE(STATUS "Julia_LIBRARY_DIR: ${Julia_LIBRARY_DIR}")
116+
MESSAGE(STATUS "Julia_LIBRARY: ${Julia_LIBRARY}")
117+
118+
##############
119+
# JULIA_HOME #
120+
##############
121+
122+
if(Julia_EXECUTABLE)
123+
execute_process(
124+
COMMAND ${Julia_EXECUTABLE} --startup-file=no -E "${JULIA_HOME_NAME}"
125+
OUTPUT_VARIABLE JULIA_HOME
126+
)
127+
128+
string(REGEX REPLACE "\"" "" JULIA_HOME "${JULIA_HOME}")
129+
string(REGEX REPLACE "\n" "" JULIA_HOME "${JULIA_HOME}")
130+
131+
MESSAGE(STATUS "JULIA_HOME: ${JULIA_HOME}")
132+
133+
###################
134+
# libLLVM version #
135+
###################
136+
137+
execute_process(
138+
COMMAND ${Julia_EXECUTABLE} --startup-file=no -E "Base.libllvm_version"
139+
OUTPUT_VARIABLE Julia_LLVM_VERSION
140+
)
141+
142+
string(REGEX REPLACE "\"" "" Julia_LLVM_VERSION "${Julia_LLVM_VERSION}")
143+
string(REGEX REPLACE "\n" "" Julia_LLVM_VERSION "${Julia_LLVM_VERSION}")
144+
145+
MESSAGE(STATUS "Julia_LLVM_VERSION: ${Julia_LLVM_VERSION}")
146+
endif()
147+
148+
##################################
149+
# Check for Existence of Headers #
150+
##################################
151+
152+
find_path(Julia_MAIN_HEADER julia.h HINTS ${Julia_INCLUDE_DIRS})
153+
154+
#######################################
155+
# Determine if we are on 32 or 64 bit #
156+
#######################################
157+
158+
if(Julia_EXECUTABLE)
159+
execute_process(
160+
COMMAND ${Julia_EXECUTABLE} --startup-file=no -E "Sys.WORD_SIZE"
161+
OUTPUT_VARIABLE Julia_WORD_SIZE
162+
)
163+
string(REGEX REPLACE "\n" "" Julia_WORD_SIZE "${Julia_WORD_SIZE}")
164+
MESSAGE(STATUS "Julia_WORD_SIZE: ${Julia_WORD_SIZE}")
165+
endif()
166+
167+
###########################
168+
# FindPackage Boilerplate #
169+
###########################
170+
171+
include(FindPackageHandleStandardArgs)
172+
find_package_handle_standard_args(Julia
173+
REQUIRED_VARS Julia_LIBRARY Julia_LIBRARY_DIR Julia_INCLUDE_DIRS Julia_MAIN_HEADER
174+
VERSION_VAR Julia_VERSION_STRING
175+
FAIL_MESSAGE "Julia not found"
176+
)

swig/build.sh

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,7 @@
1-
cd lib_src
2-
31
JULIA_JAVA_PATH=`pwd`/../../src/main/java/org/julia/jni/swig
42
rm $JULIA_JAVA_PATH/*.java
53

6-
JL_INCLUDE=`julia -e 'print(joinpath(Sys.BINDIR, "../include", "julia"))'`
7-
8-
swig -java -package org.julia.jni.swig -outdir $JULIA_JAVA_PATH -I$JL_INCLUDE -outcurrentdir ../julia4j.i
4+
cmake .
95
make
106

11-
mv libjulia4j.dylib ../../src/main/resources/native/64/darwin/
12-
rm *.o
13-
14-
cd ..
7+
mv libjulia4j.jnilib ../src/main/resources/native/64/darwin/

0 commit comments

Comments
 (0)