Skip to content

Commit

Permalink
Add filamat-jni to CMake and build.sh (#740)
Browse files Browse the repository at this point in the history
  • Loading branch information
bejado authored Jan 29, 2019
1 parent 44bfac8 commit 836b641
Show file tree
Hide file tree
Showing 6 changed files with 160 additions and 8 deletions.
26 changes: 19 additions & 7 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,14 @@ if (FILAMENT_SUPPORTS_METAL)
add_definitions(-DFILAMENT_SUPPORTS_METAL)
endif()

# Building filamat increases build times and isn't required for non-desktop platforms, so turn it
# off by default.
if (NOT ANDROID AND NOT WEBGL AND NOT IOS)
option(FILAMENT_BUILD_FILAMAT "Build filamat and JNI buildings" ON)
else()
option(FILAMENT_BUILD_FILAMAT "Build filamat and JNI buildings" OFF)
endif()

# ==================================================================================================
# Distribution
# ==================================================================================================
Expand Down Expand Up @@ -323,6 +331,7 @@ endfunction()
# ==================================================================================================
# Sub-projects
# ==================================================================================================

# Common to all platforms
add_subdirectory(${EXTERNAL}/libgtest/tnt)
add_subdirectory(${LIBRARIES}/filabridge)
Expand All @@ -338,6 +347,16 @@ add_subdirectory(${EXTERNAL}/smol-v/tnt)
add_subdirectory(${EXTERNAL}/benchmark/tnt)
add_subdirectory(${EXTERNAL}/meshoptimizer)

if (FILAMENT_BUILD_FILAMAT)
# spirv-tools must come before filamat, as filamat relies on the presence of the
# spirv-tools_SOURCE_DIR variable.
add_subdirectory(${EXTERNAL}/spirv-tools)
add_subdirectory(${EXTERNAL}/glslang/tnt)
add_subdirectory(${EXTERNAL}/spirv-cross/tnt)
add_subdirectory(android/filamat-android)
add_subdirectory(${LIBRARIES}/filamat)
endif()

if (FILAMENT_SUPPORTS_VULKAN)
add_subdirectory(${LIBRARIES}/bluevk)
add_subdirectory(${EXTERNAL}/vkmemalloc/tnt)
Expand All @@ -359,15 +378,8 @@ if (WEBGL)
endif()

if (NOT ANDROID AND NOT WEBGL AND NOT IOS)
# spirv-tools must come before filamat, as filamat relies on the presence of the
# spirv-tools_SOURCE_DIR variable.
add_subdirectory(${EXTERNAL}/spirv-tools)
add_subdirectory(${EXTERNAL}/glslang/tnt)
add_subdirectory(${EXTERNAL}/spirv-cross/tnt)

add_subdirectory(${LIBRARIES}/bluegl)
add_subdirectory(${LIBRARIES}/filagui)
add_subdirectory(${LIBRARIES}/filamat)
add_subdirectory(${LIBRARIES}/imageio)

add_subdirectory(${FILAMENT}/java)
Expand Down
95 changes: 95 additions & 0 deletions android/filamat-android/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
cmake_minimum_required(VERSION 3.4.1)
project(filamat-java)

if (NOT ENABLE_JAVA)
return()
endif()

find_package(Java)
if (NOT Java_FOUND)
message(WARNING "JDK not found, skipping Java projects")
return()
endif()

# Android already has the JNI headers in its system include path.
if (NOT ANDROID)
find_package(JNI)
if (NOT JNI_FOUND)
message(WARNING "JNI not found, skipping Java projects")
return()
endif()
endif()

if (NOT DEFINED ENV{JAVA_HOME})
message(WARNING "The JAVA_HOME environment variable must be set to compile Java projects")
message(WARNING "Skipping Java projects")
return()
endif()

# ==================================================================================================
# JNI bindings
# ==================================================================================================
set(TARGET filamat-jni)

set(JNI_SOURCE_FILES
src/main/cpp/MaterialBuilder.cpp)

add_library(${TARGET} SHARED ${JNI_SOURCE_FILES})

target_include_directories(${TARGET} PRIVATE ${JNI_INCLUDE_DIRS})

set(EXPORTED_SYMBOLS)
if (APPLE)
set(EXPORTED_SYMBOLS "-exported_symbols_list ${CMAKE_CURRENT_SOURCE_DIR}/libfilamat-jni.symbols")
elseif (ANDROID)
set(EXPORTED_SYMBOLS "-Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/libfilamat-jni.map")
endif()

# This is necessary to avoid a CMake error due to setting RPATH on non-elf platforms.
# Setting this also causes CMake to issue a warning on Mac:
# "Policy CMP0068 is not set: RPATH settings on macOS do not affect install_name." which can be
# safely ignored.
set(CMAKE_SKIP_RPATH TRUE)

set_target_properties(${TARGET} PROPERTIES
CXX_STANDARD 14
COMPILE_FLAGS "-fno-exceptions -fvisibility=hidden"
LINK_FLAGS "${GC_SECTIONS} ${EXPORTED_SYMBOLS}")

target_compile_options(${TARGET} PRIVATE
$<$<PLATFORM_ID:Linux>:-fPIC>
)

target_link_libraries(${TARGET} filamat)

set(INSTALL_TYPE LIBRARY)
if (WIN32 OR CYGWIN)
set(INSTALL_TYPE RUNTIME)
endif()
install(TARGETS ${TARGET} ${INSTALL_TYPE} DESTINATION lib/${DIST_DIR})
install(CODE "execute_process(COMMAND ${CMAKE_STRIP} -x ${CMAKE_INSTALL_PREFIX}/lib/${DIST_DIR}/lib${TARGET}${CMAKE_SHARED_LIBRARY_SUFFIX})")

# ==================================================================================================
# Java APIs
# ==================================================================================================

# Android builds its Java bindings for filamat through Gradle.
if (ANDROID)
return()
endif()

set(TARGET filamat-java)

include(UseJava)

set(CMAKE_JAVA_COMPILE_FLAGS "-source" "1.8" "-target" "1.8")

set(JAVA_SOURCE_FILES
src/main/java/com/google/android/filament/filamat/MaterialBuilder.java
src/main/java/com/google/android/filament/filamat/MaterialPackage.java)

add_jar(${TARGET}
SOURCES ${JAVA_SOURCE_FILES}
INCLUDE_JARS ../../java/lib/support-annotations.jar)

install_jar(${TARGET} lib)
4 changes: 4 additions & 0 deletions android/filamat-android/libfilamat-jni.map
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
LIBFILAMAT {
global: Java_com_google_android_filament_*; JNI*;
local: *;
};
1 change: 1 addition & 0 deletions android/filamat-android/libfilamat-jni.symbols
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
_Java_com_google_android_filament_*
41 changes: 40 additions & 1 deletion build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ function print_help {
echo " Add Vulkan support to the Android build."
echo " -s"
echo " Add iOS simulator support to the iOS build."
echo " -l"
echo " Add filamat support to the Android build."
echo ""
echo "Build types:"
echo " release"
Expand Down Expand Up @@ -100,6 +102,9 @@ GENERATE_TOOLCHAINS=false

VULKAN_ANDROID_OPTION="-DFILAMENT_SUPPORTS_VULKAN=OFF"

BUILD_FILAMAT_ANDROID=false
FILAMAT_ANDROID_OPTION="-DFILAMENT_BUILD_FILAMAT=OFF"

IOS_BUILD_SIMULATOR=false

BUILD_GENERATOR=Ninja
Expand Down Expand Up @@ -298,6 +303,7 @@ function build_android_target {
-DCMAKE_INSTALL_PREFIX=../android-${LC_TARGET}/filament \
-DCMAKE_TOOLCHAIN_FILE=../../build/toolchain-${ARCH}-linux-android.cmake \
$VULKAN_ANDROID_OPTION \
$FILAMAT_ANDROID_OPTION \
../..
fi

Expand Down Expand Up @@ -382,6 +388,33 @@ function build_android {
fi

cd ../..


if [ "$BUILD_FILAMAT_ANDROID" == "true" ]; then

cd android/filamat-android

if [ "$ISSUE_DEBUG_BUILD" == "true" ]; then
./gradlew -Pfilament_dist_dir=../../out/android-debug/filament assembleDebug

if [ "$INSTALL_COMMAND" ]; then
echo "Installing out/filamat-android-debug.aar..."
cp build/outputs/aar/filamat-android-debug.aar ../../out/
fi
fi

if [ "$ISSUE_RELEASE_BUILD" == "true" ]; then
./gradlew -Pfilament_dist_dir=../../out/android-release/filament assembleRelease

if [ "$INSTALL_COMMAND" ]; then
echo "Installing out/filamat-android-release.aar..."
cp build/outputs/aar/filamat-android-release.aar ../../out/
fi
fi

cd ../..

fi
}

function ensure_ios_toolchain {
Expand Down Expand Up @@ -545,7 +578,7 @@ function run_tests {

pushd `dirname $0` > /dev/null

while getopts ":hacfijmp:tuvs" opt; do
while getopts ":hacfijmp:tuvsl" opt; do
case ${opt} in
h)
print_help
Expand Down Expand Up @@ -615,6 +648,12 @@ while getopts ":hacfijmp:tuvs" opt; do
echo "Also be sure to pass Engine.Backend.VULKAN to Engine.create."
echo ""
;;
l)
FILAMAT_ANDROID_OPTION="-DFILAMENT_BUILD_FILAMAT=ON"
BUILD_FILAMAT_ANDROID=true
echo "Building filamat JNI library for Android."
echo ""
;;
s)
IOS_BUILD_SIMULATOR=true
echo "iOS simulator support enabled."
Expand Down
1 change: 1 addition & 0 deletions third_party/spirv-cross/tnt/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ macro(spirv_cross_add_library name config_name)
target_compile_options(${name} PRIVATE ${spirv-compiler-options})
target_compile_definitions(${name} PRIVATE ${spirv-compiler-defines})
target_compile_definitions(${name} PUBLIC ${spirv-compiler-public-defines})
target_compile_options(${name} PRIVATE $<$<PLATFORM_ID:Linux>:-fPIC>)
endmacro()

spirv_cross_add_library(spirv-cross-core spirv_cross_core STATIC
Expand Down

0 comments on commit 836b641

Please sign in to comment.