# 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} "$${_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} "$${_domain}" DEPENDS ${arg_DEPS} ${arg_TARGET} OUTPUT ${_database} POST_BUILD ) endif() add_custom_target(${NAME}_generated_token_db DEPENDS ${_database} ) endfunction()