Last active
May 17, 2019 16:45
-
-
Save sasq64/939665cb3559cc70451f9342dbfc2516 to your computer and use it in GitHub Desktop.
Automate creation of djinni targets
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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