xref: /aosp_15_r20/external/pigweed/pw_tokenizer/database.cmake (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker# Copyright 2023 The Pigweed Authors
2*61c4878aSAndroid Build Coastguard Worker#
3*61c4878aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); you may not
4*61c4878aSAndroid Build Coastguard Worker# use this file except in compliance with the License. You may obtain a copy of
5*61c4878aSAndroid Build Coastguard Worker# the License at
6*61c4878aSAndroid Build Coastguard Worker#
7*61c4878aSAndroid Build Coastguard Worker#     https://www.apache.org/licenses/LICENSE-2.0
8*61c4878aSAndroid Build Coastguard Worker#
9*61c4878aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10*61c4878aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11*61c4878aSAndroid Build Coastguard Worker# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12*61c4878aSAndroid Build Coastguard Worker# License for the specific language governing permissions and limitations under
13*61c4878aSAndroid Build Coastguard Worker# the License.
14*61c4878aSAndroid Build Coastguard Workerinclude_guard(GLOBAL)
15*61c4878aSAndroid Build Coastguard Worker
16*61c4878aSAndroid Build Coastguard Workerinclude($ENV{PW_ROOT}/pw_build/pigweed.cmake)
17*61c4878aSAndroid Build Coastguard Worker
18*61c4878aSAndroid Build Coastguard Worker# This function creates a library under the specified ${NAME} which provides a
19*61c4878aSAndroid Build Coastguard Worker# generated token database for a given ELF file using pw_tokenizer/database.py.
20*61c4878aSAndroid Build Coastguard Worker#
21*61c4878aSAndroid Build Coastguard Worker# Produces the ${NAME} token database.
22*61c4878aSAndroid Build Coastguard Worker#
23*61c4878aSAndroid Build Coastguard Worker# Args:
24*61c4878aSAndroid Build Coastguard Worker#
25*61c4878aSAndroid Build Coastguard Worker#   NAME - name of the library to create
26*61c4878aSAndroid Build Coastguard Worker#   COMMIT - Deletes temporary tokens in memory and on disk when a CSV exists
27*61c4878aSAndroid Build Coastguard Worker#       within a commit.
28*61c4878aSAndroid Build Coastguard Worker#   CREATE - Create a database. Must be set to one of the supported database
29*61c4878aSAndroid Build Coastguard Worker#       types: "csv" or "binary".
30*61c4878aSAndroid Build Coastguard Worker#   DATABASE - If updating a database, path to an existing database in the
31*61c4878aSAndroid Build Coastguard Worker#       source tree; optional if creating a database, but may provide an output
32*61c4878aSAndroid Build Coastguard Worker#       directory path to override the default of
33*61c4878aSAndroid Build Coastguard Worker#       "$target_gen_dir/$target_name.[csv/binary]"
34*61c4878aSAndroid Build Coastguard Worker#   DEPS - CMake targets to build prior to generating the database; artifacts
35*61c4878aSAndroid Build Coastguard Worker#       from these targets are NOT implicitly used for database generation.
36*61c4878aSAndroid Build Coastguard Worker#   DOMAIN - If provided, extract strings from tokenization domains matching
37*61c4878aSAndroid Build Coastguard Worker#       this regular expression.
38*61c4878aSAndroid Build Coastguard Worker#   TARGET - CMake target (executable or library) from which to add tokens;
39*61c4878aSAndroid Build Coastguard Worker#       this target is also added to deps.
40*61c4878aSAndroid Build Coastguard Workerfunction(pw_tokenizer_database NAME)
41*61c4878aSAndroid Build Coastguard Worker  pw_parse_arguments(
42*61c4878aSAndroid Build Coastguard Worker    NUM_POSITIONAL_ARGS
43*61c4878aSAndroid Build Coastguard Worker      1
44*61c4878aSAndroid Build Coastguard Worker    ONE_VALUE_ARGS
45*61c4878aSAndroid Build Coastguard Worker      COMMIT
46*61c4878aSAndroid Build Coastguard Worker      CREATE
47*61c4878aSAndroid Build Coastguard Worker      DATABASE
48*61c4878aSAndroid Build Coastguard Worker      DEPS
49*61c4878aSAndroid Build Coastguard Worker      DOMAIN
50*61c4878aSAndroid Build Coastguard Worker      TARGET
51*61c4878aSAndroid Build Coastguard Worker    REQUIRED_ARGS
52*61c4878aSAndroid Build Coastguard Worker      TARGET
53*61c4878aSAndroid Build Coastguard Worker  )
54*61c4878aSAndroid Build Coastguard Worker
55*61c4878aSAndroid Build Coastguard Worker  if(NOT DEFINED arg_CREATE AND NOT DEFINED arg_DATABASE)
56*61c4878aSAndroid Build Coastguard Worker    message(FATAL_ERROR "pw_tokenizer_database requires a `database` "
57*61c4878aSAndroid Build Coastguard Worker            "variable, unless 'CREATE' is specified")
58*61c4878aSAndroid Build Coastguard Worker  endif()
59*61c4878aSAndroid Build Coastguard Worker
60*61c4878aSAndroid Build Coastguard Worker  set(_create "")
61*61c4878aSAndroid Build Coastguard Worker  if(DEFINED arg_CREATE)
62*61c4878aSAndroid Build Coastguard Worker    if (NOT (${arg_CREATE} STREQUAL "csv" OR ${arg_CREATE} STREQUAL "binary"))
63*61c4878aSAndroid Build Coastguard Worker      message(FATAL_ERROR "'CREATE' must be \"csv\" or \"binary\".")
64*61c4878aSAndroid Build Coastguard Worker    endif()
65*61c4878aSAndroid Build Coastguard Worker    set(_create ${arg_CREATE})
66*61c4878aSAndroid Build Coastguard Worker    set(_create_new_database TRUE)
67*61c4878aSAndroid Build Coastguard Worker  endif()
68*61c4878aSAndroid Build Coastguard Worker
69*61c4878aSAndroid Build Coastguard Worker  set(_database "")
70*61c4878aSAndroid Build Coastguard Worker  if(DEFINED arg_DATABASE)
71*61c4878aSAndroid Build Coastguard Worker    set(_database ${arg_DATABASE})
72*61c4878aSAndroid Build Coastguard Worker  else()
73*61c4878aSAndroid Build Coastguard Worker    # Default to appending the create type as the extension.
74*61c4878aSAndroid Build Coastguard Worker    set(_database ${NAME}.${_create})
75*61c4878aSAndroid Build Coastguard Worker  endif()
76*61c4878aSAndroid Build Coastguard Worker
77*61c4878aSAndroid Build Coastguard Worker  set(_domain "")
78*61c4878aSAndroid Build Coastguard Worker  if(DEFINED arg_DOMAIN)
79*61c4878aSAndroid Build Coastguard Worker    set(_domain "#${arg_DOMAIN}")
80*61c4878aSAndroid Build Coastguard Worker  endif()
81*61c4878aSAndroid Build Coastguard Worker
82*61c4878aSAndroid Build Coastguard Worker  add_library(${NAME} INTERFACE)
83*61c4878aSAndroid Build Coastguard Worker  add_dependencies(${NAME} INTERFACE ${NAME}_generated_token_db)
84*61c4878aSAndroid Build Coastguard Worker
85*61c4878aSAndroid Build Coastguard Worker  if (DEFINED _create_new_database)
86*61c4878aSAndroid Build Coastguard Worker    add_custom_command(
87*61c4878aSAndroid Build Coastguard Worker        COMMENT "Generating the ${_database} token database"
88*61c4878aSAndroid Build Coastguard Worker        COMMAND
89*61c4878aSAndroid Build Coastguard Worker          ${Python3_EXECUTABLE}
90*61c4878aSAndroid Build Coastguard Worker          "$ENV{PW_ROOT}/pw_tokenizer/py/pw_tokenizer/database.py" create
91*61c4878aSAndroid Build Coastguard Worker          --database ${_database}
92*61c4878aSAndroid Build Coastguard Worker          --type ${_create}
93*61c4878aSAndroid Build Coastguard Worker          "$<TARGET_FILE:${arg_TARGET}>${_domain}"
94*61c4878aSAndroid Build Coastguard Worker          --force
95*61c4878aSAndroid Build Coastguard Worker        DEPENDS
96*61c4878aSAndroid Build Coastguard Worker          ${arg_DEPS}
97*61c4878aSAndroid Build Coastguard Worker          ${arg_TARGET}
98*61c4878aSAndroid Build Coastguard Worker        OUTPUT ${_database} POST_BUILD
99*61c4878aSAndroid Build Coastguard Worker    )
100*61c4878aSAndroid Build Coastguard Worker  else()
101*61c4878aSAndroid Build Coastguard Worker    set(_discard_temporary "")
102*61c4878aSAndroid Build Coastguard Worker    if(DEFINED arg_COMMIT)
103*61c4878aSAndroid Build Coastguard Worker      set(_discard_temporary "--discard-temporary ${arg_COMMIT}")
104*61c4878aSAndroid Build Coastguard Worker    endif()
105*61c4878aSAndroid Build Coastguard Worker
106*61c4878aSAndroid Build Coastguard Worker    add_custom_command(
107*61c4878aSAndroid Build Coastguard Worker        COMMENT "Updating the ${_database} token database"
108*61c4878aSAndroid Build Coastguard Worker        COMMAND
109*61c4878aSAndroid Build Coastguard Worker          ${Python3_EXECUTABLE}
110*61c4878aSAndroid Build Coastguard Worker          "$ENV{PW_ROOT}/pw_tokenizer/py/pw_tokenizer/database.py" add
111*61c4878aSAndroid Build Coastguard Worker          --database ${_database}
112*61c4878aSAndroid Build Coastguard Worker          ${_discard_temporary}
113*61c4878aSAndroid Build Coastguard Worker          "$<TARGET_FILE:${arg_TARGET}>${_domain}"
114*61c4878aSAndroid Build Coastguard Worker        DEPENDS
115*61c4878aSAndroid Build Coastguard Worker          ${arg_DEPS}
116*61c4878aSAndroid Build Coastguard Worker          ${arg_TARGET}
117*61c4878aSAndroid Build Coastguard Worker        OUTPUT ${_database} POST_BUILD
118*61c4878aSAndroid Build Coastguard Worker    )
119*61c4878aSAndroid Build Coastguard Worker  endif()
120*61c4878aSAndroid Build Coastguard Worker
121*61c4878aSAndroid Build Coastguard Worker  add_custom_target(${NAME}_generated_token_db
122*61c4878aSAndroid Build Coastguard Worker    DEPENDS ${_database}
123*61c4878aSAndroid Build Coastguard Worker  )
124*61c4878aSAndroid Build Coastguard Workerendfunction()
125