blob: 3d529471fb1d7f1d2c3221472b9fbe92809ba252 [file] [log] [blame]
# Copyright 2023 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)
# This function creates a library under the specified ${NAME} which provides a
# generated token database for a given ELF file using pw_tokenizer/database.py.
#
# Produces the ${NAME} token database.
#
# Args:
#
# NAME - name of the library to create
# COMMIT - Deletes temporary tokens in memory and on disk when a CSV exists
# within a commit.
# CREATE - Create a database. Must be set to one of the supported database
# types: "csv" or "binary".
# DATABASE - If updating a database, path to an existing database in the
# source tree; optional if creating a database, but may provide an output
# directory path to override the default of
# "$target_gen_dir/$target_name.[csv/binary]"
# DEPS - CMake targets to build prior to generating the database; artifacts
# from these targets are NOT implicitly used for database generation.
# DOMAIN - If provided, extract strings from tokenization domains matching
# this regular expression.
# TARGET - CMake target (executable or library) from which to add tokens;
# this target is also added to deps.
function(pw_tokenizer_database NAME)
pw_parse_arguments(
NUM_POSITIONAL_ARGS
1
ONE_VALUE_ARGS
COMMIT
CREATE
DATABASE
DEPS
DOMAIN
TARGET
REQUIRED_ARGS
TARGET
)
if(NOT DEFINED arg_CREATE AND NOT DEFINED arg_DATABASE)
message(FATAL_ERROR "pw_tokenizer_database requires a `database` "
"variable, unless 'CREATE' is specified")
endif()
set(_create "")
if(DEFINED arg_CREATE)
if (NOT (${arg_CREATE} STREQUAL "csv" OR ${arg_CREATE} STREQUAL "binary"))
message(FATAL_ERROR "'CREATE' must be \"csv\" or \"binary\".")
endif()
set(_create ${arg_CREATE})
set(_create_new_database TRUE)
endif()
set(_database "")
if(DEFINED arg_DATABASE)
set(_database ${arg_DATABASE})
else()
# Default to appending the create type as the extension.
set(_database ${NAME}.${_create})
endif()
set(_domain "")
if(DEFINED arg_DOMAIN)
set(_domain "#${arg_DOMAIN}")
endif()
add_library(${NAME} INTERFACE)
add_dependencies(${NAME} INTERFACE ${NAME}_generated_token_db)
if (DEFINED _create_new_database)
add_custom_command(
COMMENT "Generating the ${_database} token database"
COMMAND
${Python3_EXECUTABLE}
"$ENV{PW_ROOT}/pw_tokenizer/py/pw_tokenizer/database.py" create
--database ${_database}
--type ${_create}
"$<TARGET_FILE:${arg_TARGET}>${_domain}"
--force
DEPENDS
${arg_DEPS}
${arg_TARGET}
OUTPUT ${_database} POST_BUILD
)
else()
set(_discard_temporary "")
if(DEFINED arg_COMMIT)
set(_discard_temporary "--discard-temporary ${arg_COMMIT}")
endif()
add_custom_command(
COMMENT "Updating the ${_database} token database"
COMMAND
${Python3_EXECUTABLE}
"$ENV{PW_ROOT}/pw_tokenizer/py/pw_tokenizer/database.py" add
--database ${_database}
${_discard_temporary}
"$<TARGET_FILE:${arg_TARGET}>${_domain}"
DEPENDS
${arg_DEPS}
${arg_TARGET}
OUTPUT ${_database} POST_BUILD
)
endif()
add_custom_target(${NAME}_generated_token_db
DEPENDS ${_database}
)
endfunction()