Skip to content

Instantly share code, notes, and snippets.

@sasq64
Last active May 17, 2019 16:45
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sasq64/939665cb3559cc70451f9342dbfc2516 to your computer and use it in GitHub Desktop.
Save sasq64/939665cb3559cc70451f9342dbfc2516 to your computer and use it in GitHub Desktop.
Automate creation of djinni targets
# ADD_DJINNI_TARGET(name java_package)
#
# Set up a custom command that will run djinni on name.idl and
# generate variables such as NAME_ALL_SOURCES for inclusion in
# real build targets.
#
# These variables should be set by the caller:
# DJINNI_CMD - The djinni command to run, for instance
# 'java -jar ${CMAKE_CURRENT_SOURCE_DIR}/extras/djinni.jar'
#
# DJINNI_OUT_DIR - The output directory, for instance
# '${CMAKE_CURRENT_SOURCE_DIR}/generated'
#
# DJINNI_IDL_DIR - The idl file directory, for instance
# '${CMAKE_CURRENT_SOURCE_DIR}/extras/idl'
#
# DJINNI_CPP_NAMESPACE - The cpp namespace to use
#
# Input arguments:
#
# name - base name of idl file, and used for output directory
# under DJINNI_OUTPUT_DIR, and for prefix of output
# variables.
# java_pavage - Package of java classes
#
## Example usage
#
# set(DJINNI_CMD java -jar ${CMAKE_CURRENT_SOURCE_DIR}/extras/djinni.jar)
# set(DJINNI_OUT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/generated)
# set(DJINNI_IDL_DIR ${CMAKE_CURRENT_SOURCE_DIR}/extras/idl)
# set(DJINNI_CPP_NAMESPACE mycode)
#
# ADD_DJINNI_TARGET(mystuff com.mystuff.djinni)
#
# if(IOS)
# add_library(mylib SHARED
# ${MYSTUFF_OBJC_SOURCES}
# extras/support-lib/objc/DJIError.mm
# extras/support-lib/objc/DJIProxyCaches.mm)
# else()
# add_library(mylib SHARED
# ${MYSTUFF_JNI_SOURCES}
# ${MYSTUFF_CPP_HEADERS}
# extras/support-lib/jni/djinni_support.cpp
# extras/support-lib/jni/djinni_main.cpp)
# endif()
# PARSE_IDL - helper macro for generating source names
#
# Parse the given djinni `idl_file` and creatie variables for all sets
# of source files that will be generated when djinni is run.
macro(PARSE_IDL idl_file djinni_dir prefix)
set(interfaces "")
set(records "")
set(flags "")
set(enums "")
file(STRINGS ${idl_file} idltext)
foreach(line ${idltext})
string(STRIP ${line} line)
if(NOT line)
continue()
endif()
string(FIND ${line} "#" found)
if(found EQUAL 0)
continue()
endif()
string(FIND ${line} interface found)
if(found GREATER -1)
string(REGEX REPLACE "([A-Za-z0-9]+)[ ]+=[ ]+interface.*" "\\1" name ${line})
set(interfaces ${interfaces} ${name})
endif()
string(FIND ${line} record found)
if(found GREATER -1)
string(REGEX REPLACE "([A-Za-z0-9]+)[ ]+=[ ]+record.*" "\\1" name ${line})
set(records ${records} ${name})
endif()
string(FIND ${line} enum found)
if(found GREATER -1)
string(REGEX REPLACE "([A-Za-z0-9]+)[ ]+=[ ]+enum.*" "\\1" name ${line})
set(enums ${enums} ${name})
endif()
string(FIND ${line} flags found)
if(found GREATER -1)
string(REGEX REPLACE "([A-Za-z0-9]+)[ ]+=[ ]+flags.*" "\\1" name ${line})
set(FLAGS ${flags} ${name})
endif()
endforeach()
string(REGEX REPLACE "([^;]+)" "${djinni_dir}/jni/jni_\\1.cpp" JNI_SOURCES "${interfaces};${records}")
string(REGEX REPLACE "([^;]+)" "${djinni_dir}/jni/jni_\\1.hpp" JNI_HEADERS "${interfaces};${records};${enums};${flags}")
string(REGEX REPLACE "([^;]+)" "${djinni_dir}/cpp/cpp_\\1.hpp" CPP_HEADERS "${interfaces};${records};${enums};${flags}")
string(REGEX REPLACE "([^;]+)" "${djinni_dir}/objc/ObjC\\1.mm" OBJC_SOURCES "${records}")
string(REGEX REPLACE "([^;]+)" "${djinni_dir}/objc/ObjC\\1.h" OBJC_HEADERS "${interfaces};${records};${enums};${flags}")
string(REGEX REPLACE "([^;]+)" "${djinni_dir}/objcpp/ObjC\\1+Private.mm" OBJCPP_SOURCES "${interfaces};${records}")
string(REGEX REPLACE "([^;]+)" "${djinni_dir}/objcpp/ObjC\\1+Private.h" OBJCPP_HEADERS "${interfaces};${records};${enums};${flags}")
set(${prefix}_JNI_SOURCES ${JNI_SOURCES})
set(${prefix}_OBJC_SOURCES ${OBJC_SOURCES})
set(${prefix}_OBJCPP_SOURCES ${OBJCPP_SOURCES})
set(${prefix}_JNI_HEADERS ${JNI_HEADERS})
set(${prefix}_CPP_HEADERS ${CPP_HEADERS})
set(${prefix}_OBJC_HEADERS ${OBJC_HEADERS})
set(${prefix}_OBJCPP_HEADERS ${OBJCPP_HEADERS})
set(${prefix}_ALL_SOURCES "${JNI_SOURCES};${OBJC_SOURCES};${OBJCPP_SOURCES}")
set(${prefix}_ALL_HEADERS "${JNI_HEADERS};${OBJC_HEADERS};${OBJCPP_HEADERS};${CPP_HEADERS}")
set(${prefix}_ALL_FILES "${JNI_SOURCES};${OBJC_SOURCES};${OBJCPP_SOURCES};${JNI_HEADERS};${OBJC_HEADERS};${OBJCPP_HEADERS};${CPP_HEADERS}")
endmacro()
macro(ADD_DJINNI_TARGET name java_package)
string(TOUPPER ${name} upper_name)
set(idlfile "${DJINNI_IDL_DIR}/${name}.idl")
string(REPLACE "." "/" javapath ${java_package})
set(java_target "${DJINNI_OUT_DIR}/java/${javapath}")
set(djinni_out "${DJINNI_OUT_DIR}/${name}")
PARSE_IDL(${idlfile} ${djinni_out} ${upper_name})
set(temp "${upper_name}_ALL_FILES")
set(output_sources ${${temp}})
set(djinni_args
--idl ${idlfile}
--ident-jni-class NativeFooBar
--ident-jni-file jni_FooBar
--ident-cpp-file cpp_FooBar
--objc-type-prefix ObjC
--cpp-out ${djinni_out}/cpp
--objc-out ${djinni_out}/objc
--objcpp-out ${djinni_out}/objcpp
--java-out ${djinni_out}/java
--jni-out ${djinni_out}/jni
--java-package ${java_package}
--cpp-namespace ${DJINNI_CPP_NAMESPACE})
# Make sure cmake is rerun if IDL file changes
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${idlfile})
add_custom_command(OUTPUT ${output_sources}
COMMAND ${CMAKE_COMMAND} -E remove_directory ${djinni_out}
COMMAND ${DJINNI_CMD} ${djinni_args}
COMMAND ${CMAKE_COMMAND} -E copy_directory ${djinni_out}/java ${java_target}
COMMAND ${CMAKE_COMMAND} -E remove_directory ${djinni_out}/java
DEPENDS ${idlfile}
COMMENT "Running Djinni for ${name}")
endmacro()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment