blob: 1e63c4bdb214241b403c4ea9ca998c5d4b3d28a0 [file]
# Copyright 2025 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.
include_guard(GLOBAL)
include($ENV{PW_ROOT}/pw_build/pigweed.cmake)
# Path to flatc
set(pw_flatbuffers_FLATC flatc CACHE STRING "Flatbuffers compiler")
# Global args for flatc
set(pw_flatbuffers_FLATC_FLAGS "" CACHE STRING "Global args to flatc")
# If set, this is added to the generated library as a public dependency. Since
# flatbuffers is a header only library, this should be a library containing all
# the headers as HEADERS, then exposing the include path as a public include,
# so anything depending on flatbuffers can properly find the headers. This is
# intended for pigweed itself to use when working with the installed
# flatbuffers package, but any client can use this to substitute their
# flatbuffers implementation as well, if they are not relying on the pigweed
# provided implementation. The user may also opt to add this dependency to the
# DEPS argument instead.
if ("${dir_pw_third_party_flatbuffers}" STREQUAL "")
set(pw_flatbuffers_LIBRARY "" CACHE STRING "Dependency name for flatbuffers headers")
else()
set(pw_flatbuffers_LIBRARY pw_third_party.flatbuffers CACHE STRING "Dependency name for flatbuffers headers")
endif()
function(pw_flatbuffer_library NAME)
pw_parse_arguments(
NUM_POSITIONAL_ARGS
1
ONE_VALUE_ARGS
STRIP_PREFIX
PREFIX
MULTI_VALUE_ARGS
SOURCES
DEPS
FLATC_FLAGS
REQUIRED_ARGS
SOURCES
)
set(out_dir "${CMAKE_CURRENT_BINARY_DIR}/${NAME}")
set(out_sources_dir "${out_dir}/sources")
# Create a set of files with absolute paths which will be the files we
# mirror over to the build directory
pw_rebase_paths(files_to_mirror "${CMAKE_CURRENT_SOURCE_DIR}"
"${CMAKE_CURRENT_SOURCE_DIR}" "${arg_SOURCES}" "")
# Create the set of files in files_to_mirror, but replaced with the
# absolute destination path to the build directory
pw_rebase_paths(sources "${out_sources_dir}"
"${CMAKE_CURRENT_SOURCE_DIR}" "${arg_SOURCES}" "")
add_custom_command(
COMMAND
python3
"$ENV{PW_ROOT}/pw_build/py/pw_build/mirror_tree.py"
--source-root "${CMAKE_CURRENT_SOURCE_DIR}"
--directory "${out_sources_dir}"
${files_to_mirror}
DEPENDS
"$ENV{PW_ROOT}/pw_build/py/pw_build/mirror_tree.py"
${files_to_mirror}
OUTPUT
${sources}
)
add_custom_target("${NAME}._sources" DEPENDS ${sources})
# Generate the C++ headers.
foreach(source IN LISTS sources)
cmake_path(GET source FILENAME source_filename)
cmake_path(RELATIVE_PATH source BASE_DIRECTORY "${out_sources_dir}"
OUTPUT_VARIABLE rel_source)
cmake_path(REMOVE_FILENAME rel_source OUTPUT_VARIABLE rel_source_dir)
cmake_path(RELATIVE_PATH rel_source_dir BASE_DIRECTORY "${arg_STRIP_PREFIX}"
OUTPUT_VARIABLE rel_source_dir_stripped)
cmake_path(SET rel_source_dir_stripped_with_prefix "")
cmake_path(APPEND rel_source_dir_stripped_with_prefix ${arg_PREFIX} ${rel_source_dir_stripped})
cmake_path(REMOVE_EXTENSION source_filename OUTPUT_VARIABLE
generated_filename)
cmake_path(APPEND_STRING generated_filename "_generated.h")
cmake_path(SET generated_directory "${out_dir}")
cmake_path(APPEND generated_directory "cpp" ${rel_source_dir_stripped_with_prefix})
cmake_path(SET output "${generated_directory}")
cmake_path(APPEND output ${generated_filename})
add_custom_command(
COMMAND "${pw_flatbuffers_FLATC}" --cpp ${pw_flatbuffers_FLATC_FLAGS} ${arg_FLATC_FLAGS}
-o "${generated_directory}" ${source}
DEPENDS ${source}
OUTPUT ${output}
)
list(APPEND outputs "${output}")
endforeach()
add_custom_target("${NAME}._generated_sources" DEPENDS ${outputs})
# Add the ${NAME}.cpp library using the generated C++ headers.
pw_add_library_generic("${NAME}.cpp" INTERFACE
PUBLIC_INCLUDES
"${out_dir}/cpp"
PUBLIC_DEPS
${pw_flatbuffers_LIBRARY}
${arg_DEPS}
# Disable the sandbox, since the generated headers are inherently sandboxed.
SANDBOX
OFF
)
add_dependencies("${NAME}.cpp"
"${NAME}._sources" "${NAME}._generated_sources")
endfunction()