blob: 776d421a8d3a3e83f2f80274fc3ac7f4e606b1b4 [file] [log] [blame]
# Copyright (c) Meta Platforms, Inc. and affiliates.
# All rights reserved.
#
# This source code is licensed under the BSD-style license found in the
# LICENSE file in the root directory of this source tree.
# Please this file formatted by running:
# ~~~
# cmake-format -i CMakeLists.txt
# ~~~
cmake_minimum_required(VERSION 3.19)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
if(NOT CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 17)
endif()
if(NOT FLATCC_EXECUTABLE)
set(FLATCC_EXECUTABLE flatcc)
endif()
# Source root directory for executorch.
if(NOT EXECUTORCH_ROOT)
set(EXECUTORCH_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/..)
endif()
include(${EXECUTORCH_ROOT}/build/Utils.cmake)
if(NOT PYTHON_EXECUTABLE)
resolve_python_executable()
endif()
if(NOT FLATC_EXECUTABLE)
set(FLATC_EXECUTABLE flatc)
endif()
# Paths to headers generated from the .fbs files. set(_etdump_schemas
# etdump_schema_flatcc.fbs scalar_type.fbs)
set(_etdump_schema_names "etdump_schema_flatcc.fbs" "scalar_type.fbs")
set(_bundled_input_schema_names "bundled_program_schema.fbs" "scalar_type.fbs")
foreach(schema_file ${_etdump_schema_names})
list(APPEND _etdump_schema__srcs
"${CMAKE_CURRENT_SOURCE_DIR}/etdump/${schema_file}"
)
endforeach()
foreach(schema_file ${_bundled_input_schema_names})
list(APPEND _bundled_program_schema__srcs
"${CMAKE_CURRENT_SOURCE_DIR}/bundled_program/schema/${schema_file}"
)
endforeach()
set(FLATCC_TEST
OFF
CACHE BOOL ""
)
set(FLATCC_REFLECTION
OFF
CACHE BOOL ""
)
set(FLATCC_DEBUG_CLANG_SANITIZE
OFF
CACHE BOOL ""
)
set(_flatcc_source_dir ${CMAKE_CURRENT_SOURCE_DIR}/../third-party/flatcc)
add_subdirectory(${_flatcc_source_dir} ${CMAKE_BINARY_DIR}/third-party/flatcc)
# Fix for "relocation R_X86_64_32 against `.rodata' can not be used when making
# a shared object; recompile with -fPIC" when building on some x86 linux
# systems.
set_property(TARGET flatccrt PROPERTY POSITION_INDEPENDENT_CODE ON)
# Assume we are cross-compiling and the CMAKE_TOOLCHAIN_FILE is set
include(ExternalProject)
# The include directory that will contain the generated schema headers.
set(_program_schema__include_dir "${CMAKE_BINARY_DIR}/devtools/include")
set(_bundled_schema__include_dir "${CMAKE_BINARY_DIR}/devtools/bundled_program")
# TODO(dbort): Only enable this when cross-compiling. It can cause build race
# conditions (libflatcc.a errors) when enabled.
option(EXECUTORCH_SEPARATE_FLATCC_HOST_PROJECT
"Whether to build the flatcc commandline tool as a separate project" ON
)
if(EXECUTORCH_SEPARATE_FLATCC_HOST_PROJECT)
# Add the host project. We build this separately so that we can generate
# headers on the host during the build, even if we're cross-compiling the
# flatcc runtime to a different architecture.
execute_process(
COMMAND
${CMAKE_COMMAND} ${_flatcc_source_dir} -DFLATCC_TEST=OFF
-DFLATCC_REFLECTION=OFF
# See above comment about POSITION_INDEPENDENT_CODE.
-DCMAKE_POSITION_INDEPENDENT_CODE=ON -B${CMAKE_BINARY_DIR}/_host_build
)
execute_process(
COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR}/_host_build
)
set(_etdump_schema_gen_dep)
# TODO(dbort): flatcc installs its files directly in its source directory
# instead of under CMAKE_BINARY_DIR, and it has no options to avoid doing
# this. We build flatcc twice in the executorch build: once to get the
# `flatcc` host commandline tool, and once to get the (potentially
# cross-compiled) target runtime library. The host build will put its outputs
# in the source tree, making the cross-compiling target build think that the
# outputs have already been built. It will then try to link against the
# host-architecture libraries, failing when cross-compiling. To work around
# this, delete the host outputs after running this command (which only runs
# when setting up the cmake files, not when actually building). This leaves
# room for the target build to put its own files in the source tree. We should
# try to remove this hack, ideally by submitting an upstream PR that adds an
# option to change the installation location.
set(_etdump_schema_cleanup_paths ${_flatcc_source_dir}/bin/*
${_flatcc_source_dir}/lib/*
)
else()
# If we're not cross-compiling, we can just use the plain commandline target.
set(_etdump_schema_gen_dep flatcc_cli)
set(_etdump_schema_cleanup_paths "")
endif()
set(_etdump_schema__outputs)
foreach(fbs_file ${_etdump_schema_names})
string(REGEX REPLACE "[.]fbs$" "_reader.h" generated "${fbs_file}")
list(APPEND _etdump_schema__outputs
"${_program_schema__include_dir}/executorch/devtools/etdump/${generated}"
)
string(REGEX REPLACE "[.]fbs$" "_builder.h" generated "${fbs_file}")
list(APPEND _etdump_schema__outputs
"${_program_schema__include_dir}/executorch/devtools/etdump/${generated}"
)
endforeach()
# lint_cmake: -linelength
set(_bundled_program_schema__outputs)
foreach(fbs_file ${_bundled_input_schema_names})
string(REGEX REPLACE "[.]fbs$" "_generated.h" generated "${fbs_file}")
list(
APPEND
_bundled_program_schema__outputs
"${_bundled_schema__include_dir}/executorch/devtools/bundled_program/schema/${generated}"
)
endforeach()
add_library(etdump_schema INTERFACE ${_etdump_schema__outputs})
add_library(
bundled_program_schema INTERFACE ${_bundled_program_schema__outputs}
)
file(MAKE_DIRECTORY ${_program_schema__include_dir}/executorch/devtools/etdump)
file(MAKE_DIRECTORY
${_program_schema__include_dir}/executorch/devtools/bundled_program
)
add_custom_command(
OUTPUT ${_etdump_schema__outputs}
COMMAND
# Note that the flatcc project actually writes its outputs into the source
# tree instead of under the binary directory, and there's no way to change
# that behavior.
${_flatcc_source_dir}/bin/flatcc -cwr -o
${_program_schema__include_dir}/executorch/devtools/etdump
${_etdump_schema__srcs}
COMMAND rm -f ${_etdump_schema_cleanup_paths}
DEPENDS ${_etdump_schema_gen_dep}
COMMENT "Generating etdump headers"
)
add_library(
etdump ${CMAKE_CURRENT_SOURCE_DIR}/etdump/etdump_flatcc.cpp
${CMAKE_CURRENT_SOURCE_DIR}/etdump/emitter.cpp
)
target_link_libraries(
etdump
PUBLIC etdump_schema flatccrt
PRIVATE executorch
)
add_custom_command(
OUTPUT ${_bundled_program_schema__outputs}
COMMAND
${FLATC_EXECUTABLE} --cpp --cpp-std c++11 --gen-mutable --scoped-enums -o
"${_bundled_schema__include_dir}/executorch/devtools/bundled_program/schema"
${_bundled_program_schema__srcs}
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/devtools
DEPENDS ${FLATC_EXECUTABLE} ${_bundled_program_schema__srcs}
COMMENT "Generating bundled_program headers"
VERBATIM
)
# add_library(bundled_program INTERFACE ${_bundled_program_schema__outputs})
add_library(
bundled_program
${CMAKE_CURRENT_SOURCE_DIR}/bundled_program/bundled_program.cpp
)
target_link_libraries(bundled_program executorch bundled_program_schema)
set_target_properties(bundled_program PROPERTIES LINKER_LANGUAGE CXX)
target_include_directories(
bundled_program PUBLIC ${_bundled_schema__include_dir}
${EXECUTORCH_ROOT}/third-party/flatbuffers/include
)
target_include_directories(
etdump PUBLIC ${_program_schema__include_dir} ${_flatcc_source_dir}/include
)
# Install libraries
install(
TARGETS bundled_program etdump flatccrt
DESTINATION ${CMAKE_BINARY_DIR}/lib
INCLUDES
DESTINATION ${_common_include_directories}
)