function(_FlatBuffers_import)
+ find_package(Flatbuffers QUIET)
+ set(FlatBuffers_FOUND ${Flatbuffers_FOUND} PARENT_SCOPE)
+endfunction(_FlatBuffers_import)
+
+function(_FlatBuffers_build)
nncc_find_package(FlatBuffersSource QUIET)
if(NOT FlatBuffersSource_FOUND)
- set(FlatBuffers_FOUND FALSE PARENT_SCOPE)
+ # Source is not available
return()
endif(NOT FlatBuffersSource_FOUND)
- # From FlatBuffers's CMakeLists.txt
- list(APPEND FlatBuffers_Library_SRCS "${FlatBuffersSource_DIR}/src/code_generators.cpp")
- list(APPEND FlatBuffers_Library_SRCS "${FlatBuffersSource_DIR}/src/idl_parser.cpp")
- list(APPEND FlatBuffers_Library_SRCS "${FlatBuffersSource_DIR}/src/idl_gen_text.cpp")
- list(APPEND FlatBuffers_Library_SRCS "${FlatBuffersSource_DIR}/src/reflection.cpp")
- list(APPEND FlatBuffers_Library_SRCS "${FlatBuffersSource_DIR}/src/util.cpp")
-
- # From FlatBuffers's CMakeLists.txt
- list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/idl_gen_cpp.cpp")
- list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/idl_gen_general.cpp")
- list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/idl_gen_go.cpp")
- list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/idl_gen_js.cpp")
- list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/idl_gen_php.cpp")
- list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/idl_gen_python.cpp")
- list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/idl_gen_fbs.cpp")
- list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/idl_gen_grpc.cpp")
- list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/idl_gen_json_schema.cpp")
- list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/flatc.cpp")
- list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/flatc_main.cpp")
- list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/grpc/src/compiler/cpp_generator.cc")
- list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/grpc/src/compiler/go_generator.cc")
-
- if(NOT TARGET flatbuffers)
- add_library(flatbuffers ${FlatBuffers_Library_SRCS})
- target_include_directories(flatbuffers PUBLIC "${FlatBuffersSource_DIR}/include")
- endif(NOT TARGET flatbuffers)
+ # TODO Introduce helper functions
+ set(FLATBUFFERS_BUILD "${CMAKE_BINARY_DIR}/externals/FLATBUFFERS/build")
+ set(FLATBUFFERS_INSTALL "${NNCC_OVERLAY_DIR}")
- if(NOT TARGET flatc)
- add_executable(flatc ${FlatBuffers_Compiler_SRCS})
- target_include_directories(flatc PRIVATE "${FlatBuffersSource_DIR}/grpc")
- target_link_libraries(flatc flatbuffers)
- endif(NOT TARGET flatc)
-
- set(FlatBuffers_FOUND TRUE PARENT_SCOPE)
-endfunction(_FlatBuffers_import)
+ set(STAMP_PATH "${FLATBUFFERS_INSTALL}/FLATBUFFERS.stamp")
+ set(LOG_PATH "${FLATBUFFERS_INSTALL}/FLATBUFFERS.log")
+ if(EXISTS ${STAMP_PATH})
+ return()
+ endif(EXISTS ${STAMP_PATH})
+
+ message(STATUS "Build Flatbuffers from ${FlatBuffersSource_DIR}")
+
+ file(MAKE_DIRECTORY ${FLATBUFFERS_BUILD})
+ file(MAKE_DIRECTORY ${FLATBUFFERS_INSTALL})
+
+ # NOTE Do NOT retry Flatbuffers build once it fails
+ file(WRITE "${STAMP_PATH}")
+
+ execute_process(COMMAND ${CMAKE_COMMAND}
+ -DCMAKE_INSTALL_PREFIX=${FLATBUFFERS_INSTALL}
+ -DCMAKE_BUILD_TYPE=Release
+ ${FlatBuffersSource_DIR}
+ OUTPUT_FILE ${LOG_PATH}
+ ERROR_FILE ${LOG_PATH}
+ WORKING_DIRECTORY ${FLATBUFFERS_BUILD}
+ RESULT_VARIABLE BUILD_EXITCODE)
+
+ execute_process(COMMAND ${CMAKE_COMMAND} --build . -- install
+ OUTPUT_FILE ${LOG_PATH}
+ ERROR_FILE ${LOG_PATH}
+ WORKING_DIRECTORY ${FLATBUFFERS_BUILD}
+ RESULT_VARIABLE INSTALL_EXITCODE)
+
+ if(BUILD_EXITCODE EQUAL 0 AND INSTALL_EXITCODE EQUAL 0)
+ message(STATUS "Succeeded in building Flatbuffers")
+ else()
+ message(STATUS "Fail to build Flatbuffers (check '${LOG_PATH}' for details)")
+ endif(BUILD_EXITCODE EQUAL 0 AND INSTALL_EXITCODE EQUAL 0)
+endfunction(_FlatBuffers_build)
+
+_FlatBuffers_build()
_FlatBuffers_import()
if(FlatBuffers_FOUND)
+ if(NOT TARGET flatbuffers)
+ add_library(flatbuffers INTERFACE)
+ target_link_libraries(flatbuffers INTERFACE flatbuffers::flatbuffers)
+ endif(NOT TARGET flatbuffers)
+
function(FlatBuffers_Generate PREFIX OUTPUT_DIR SCHEMA_DIR)
get_filename_component(abs_output_dir ${OUTPUT_DIR} ABSOLUTE)
get_filename_component(abs_schema_dir ${SCHEMA_DIR} ABSOLUTE)
add_custom_command(OUTPUT ${OUTPUT_FILES}
COMMAND ${CMAKE_COMMAND} -E make_directory "${abs_output_dir}"
- COMMAND "$<TARGET_FILE:flatc>" -c --no-includes
+ COMMAND "$<TARGET_FILE:flatbuffers::flatc>" -c --no-includes
--no-union-value-namespacing
--gen-object-api -o "${abs_output_dir}"
${SCHEMA_FILES}
- DEPENDS flatc)
+ DEPENDS flatbuffers::flatc)
set(${PREFIX}_SOURCES ${OUTPUT_FILES} PARENT_SCOPE)
set(${PREFIX}_INCLUDE_DIRS ${abs_output_dir} PARENT_SCOPE)
# Generate output files before building TGT
add_custom_command(TARGET ${TGT} PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory "${abs_output_dir}"
- COMMAND "$<TARGET_FILE:flatc>" -c --no-includes
+ COMMAND "$<TARGET_FILE:flatbuffers::flatc>" -c --no-includes
--no-union-value-namespacing
--gen-object-api -o "${abs_output_dir}"
${SCHEMA_FILES}
- DEPENDS flatc)
+ DEPENDS flatbuffers::flatc)
endfunction(FlatBuffers_Target)
endif(FlatBuffers_FOUND)