xref: /aosp_15_r20/external/tink/cmake/TinkBuildRules.cmake (revision e7b1675dde1b92d52ec075b0a92829627f2c52a5)
1*e7b1675dSTing-Kang Chang# Copyright 2019 Google LLC
2*e7b1675dSTing-Kang Chang#
3*e7b1675dSTing-Kang Chang# Licensed under the Apache License, Version 2.0 (the "License");
4*e7b1675dSTing-Kang Chang# you may not use this file except in compliance with the License.
5*e7b1675dSTing-Kang Chang# You may obtain a copy of the License at
6*e7b1675dSTing-Kang Chang#
7*e7b1675dSTing-Kang Chang# http://www.apache.org/licenses/LICENSE-2.0
8*e7b1675dSTing-Kang Chang#
9*e7b1675dSTing-Kang Chang# Unless required by applicable law or agreed to in writing, software
10*e7b1675dSTing-Kang Chang# distributed under the License is distributed on an "AS IS" BASIS,
11*e7b1675dSTing-Kang Chang# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*e7b1675dSTing-Kang Chang# See the License for the specific language governing permissions and
13*e7b1675dSTing-Kang Chang# limitations under the License.
14*e7b1675dSTing-Kang Chang#
15*e7b1675dSTing-Kang Chang# Partially adapted from Abseil's CMake helpers
16*e7b1675dSTing-Kang Chang# https://github.com/abseil/abseil-cpp/blob/master/CMake/AbseilHelpers.cmake
17*e7b1675dSTing-Kang Chang
18*e7b1675dSTing-Kang Chang# Rules for declaring Tink targets in a way similar to Bazel.
19*e7b1675dSTing-Kang Chang#
20*e7b1675dSTing-Kang Chang# These functions are intended to reduce the difficulty of supporting completely
21*e7b1675dSTing-Kang Chang# different build systems, and are designed for Tink internal usage only.
22*e7b1675dSTing-Kang Chang# They may work outside this project too, but we don't support that.
23*e7b1675dSTing-Kang Chang#
24*e7b1675dSTing-Kang Chang# A set of global variables influences the behavior of the rules:
25*e7b1675dSTing-Kang Chang#
26*e7b1675dSTing-Kang Chang#   TINK_MODULE name used to build more descriptive names and for namespaces.
27*e7b1675dSTing-Kang Chang#   TINK_GENFILE_DIR generated content root, such pb.{cc,h} files.
28*e7b1675dSTing-Kang Chang#   TINK_INCLUDE_DIRS list of global include paths.
29*e7b1675dSTing-Kang Chang#   TINK_CXX_STANDARD C++ standard to enforce, 11 for now.
30*e7b1675dSTing-Kang Chang#   TINK_BUILD_TESTS flag, set to false to disable tests (default false).
31*e7b1675dSTing-Kang Chang#
32*e7b1675dSTing-Kang Chang# Sensible defaults are provided for all variables, except TINK_MODULE, which is
33*e7b1675dSTing-Kang Chang# defined by calls to tink_module(). Please don't alter it directly.
34*e7b1675dSTing-Kang Chang
35*e7b1675dSTing-Kang Changinclude(CMakeParseArguments)
36*e7b1675dSTing-Kang Chang
37*e7b1675dSTing-Kang Changif (TINK_BUILD_TESTS)
38*e7b1675dSTing-Kang Chang  enable_testing()
39*e7b1675dSTing-Kang Changendif()
40*e7b1675dSTing-Kang Chang
41*e7b1675dSTing-Kang Changif (NOT DEFINED TINK_GENFILE_DIR)
42*e7b1675dSTing-Kang Chang  set(TINK_GENFILE_DIR "${PROJECT_BINARY_DIR}/__generated")
43*e7b1675dSTing-Kang Changendif()
44*e7b1675dSTing-Kang Chang
45*e7b1675dSTing-Kang Changif (NOT DEFINED TINK_CXX_STANDARD)
46*e7b1675dSTing-Kang Chang  set(TINK_CXX_STANDARD 14)
47*e7b1675dSTing-Kang Chang  if (DEFINED CMAKE_CXX_STANDARD_REQUIRED AND CMAKE_CXX_STANDARD_REQUIRED AND DEFINED CMAKE_CXX_STANDARD)
48*e7b1675dSTing-Kang Chang    set(TINK_CXX_STANDARD ${CMAKE_CXX_STANDARD})
49*e7b1675dSTing-Kang Chang  endif()
50*e7b1675dSTing-Kang Changendif()
51*e7b1675dSTing-Kang Chang
52*e7b1675dSTing-Kang Changset(TINK_DEFAULT_COPTS "")
53*e7b1675dSTing-Kang Changif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
54*e7b1675dSTing-Kang Chang  # This is required to avoid error C1128.
55*e7b1675dSTing-Kang Chang  # See https://learn.microsoft.com/en-us/cpp/error-messages/compiler-errors-1/fatal-error-c1128?view=msvc-170.
56*e7b1675dSTing-Kang Chang  set(TINK_DEFAULT_COPTS "/bigobj")
57*e7b1675dSTing-Kang Changendif()
58*e7b1675dSTing-Kang Chang
59*e7b1675dSTing-Kang Changlist(APPEND TINK_INCLUDE_DIRS "${TINK_GENFILE_DIR}")
60*e7b1675dSTing-Kang Chang
61*e7b1675dSTing-Kang Changset(TINK_IDE_FOLDER "Tink")
62*e7b1675dSTing-Kang Chang
63*e7b1675dSTing-Kang Changset(TINK_TARGET_EXCLUDE_IF_OPENSSL "exclude_if_openssl")
64*e7b1675dSTing-Kang Changset(TINK_TARGET_EXCLUDE_IF_WINDOWS "exclude_if_windows")
65*e7b1675dSTing-Kang Chang
66*e7b1675dSTing-Kang Chang# Declare the beginning of a new Tink library namespace.
67*e7b1675dSTing-Kang Chang#
68*e7b1675dSTing-Kang Chang# As a rule of thumb, every CMakeLists.txt should be a different module, named
69*e7b1675dSTing-Kang Chang# after the directory that contains it, and this function should appear at the
70*e7b1675dSTing-Kang Chang# top of each CMakeLists script.
71*e7b1675dSTing-Kang Chang#
72*e7b1675dSTing-Kang Chang# This is not a requirement, though. Targets should be grouped logically, and
73*e7b1675dSTing-Kang Chang# multiple directories can be part of the same module as long as target names
74*e7b1675dSTing-Kang Chang# do not collide.
75*e7b1675dSTing-Kang Chang#
76*e7b1675dSTing-Kang Changmacro(tink_module NAME)
77*e7b1675dSTing-Kang Chang  set(TINK_MODULE ${NAME})
78*e7b1675dSTing-Kang Changendmacro()
79*e7b1675dSTing-Kang Chang
80*e7b1675dSTing-Kang Chang# Declare a Tink library. Produces a static library that can be linked into
81*e7b1675dSTing-Kang Chang# other test, binary or library targets. Tink libraries are mainly meant as
82*e7b1675dSTing-Kang Chang# a way to organise code and speed up compilation.
83*e7b1675dSTing-Kang Chang#
84*e7b1675dSTing-Kang Chang# Arguments:
85*e7b1675dSTing-Kang Chang#   NAME      base name of the target. See below for target naming conventions.
86*e7b1675dSTing-Kang Chang#   SRCS      list of source files, including headers.
87*e7b1675dSTing-Kang Chang#   DEPS      list of dependency targets.
88*e7b1675dSTing-Kang Chang#   PUBLIC    flag, signals that this target is intended for external use.
89*e7b1675dSTing-Kang Chang#   TESTONLY  flag, signals that this target should be ignored if
90*e7b1675dSTing-Kang Chang#             TINK_BUILD_TESTS=OFF.
91*e7b1675dSTing-Kang Chang#
92*e7b1675dSTing-Kang Chang# If SRCS contains only headers, an INTERFACE rule is created. This rule carries
93*e7b1675dSTing-Kang Chang# include path and link library information, but is not directly buildable.
94*e7b1675dSTing-Kang Chang#
95*e7b1675dSTing-Kang Chang# The corresponding build target is named tink_<MODULE>_<NAME> if PUBLIC is
96*e7b1675dSTing-Kang Chang# specified, or tink_internal_<MODULE>_<NAME> otherwise. An alias is also
97*e7b1675dSTing-Kang Chang# defined for use in CMake scripts, in the tink::<MODULE>::<NAME> form.
98*e7b1675dSTing-Kang Chang#
99*e7b1675dSTing-Kang Chang# Unlike Bazel, CMake does not enforce the rule that all dependencies must be
100*e7b1675dSTing-Kang Chang# listed. CMake DEPS just carry include, build and link flags that are passed
101*e7b1675dSTing-Kang Chang# to the compiler. Because of this, a target might compile even if a dependency
102*e7b1675dSTing-Kang Chang# is not specified, but that could break at any time. So make sure that all
103*e7b1675dSTing-Kang Chang# dependencies are explicitly specified.
104*e7b1675dSTing-Kang Chang#
105*e7b1675dSTing-Kang Changfunction(tink_cc_library)
106*e7b1675dSTing-Kang Chang  cmake_parse_arguments(PARSE_ARGV 0 tink_cc_library
107*e7b1675dSTing-Kang Chang    "PUBLIC;TESTONLY"
108*e7b1675dSTing-Kang Chang    "NAME"
109*e7b1675dSTing-Kang Chang    "SRCS;DEPS;TAGS"
110*e7b1675dSTing-Kang Chang  )
111*e7b1675dSTing-Kang Chang
112*e7b1675dSTing-Kang Chang  if (tink_cc_library_TESTONLY AND NOT TINK_BUILD_TESTS)
113*e7b1675dSTing-Kang Chang    return()
114*e7b1675dSTing-Kang Chang  endif()
115*e7b1675dSTing-Kang Chang
116*e7b1675dSTing-Kang Chang  if (NOT DEFINED TINK_MODULE)
117*e7b1675dSTing-Kang Chang    message(FATAL_ERROR
118*e7b1675dSTing-Kang Chang            "TINK_MODULE not defined, perhaps you are missing a tink_module() statement?")
119*e7b1675dSTing-Kang Chang  endif()
120*e7b1675dSTing-Kang Chang
121*e7b1675dSTing-Kang Chang  # Check if this target must be skipped.
122*e7b1675dSTing-Kang Chang  foreach(_tink_cc_library_tag ${tink_cc_library_TAGS})
123*e7b1675dSTing-Kang Chang    # Exclude if we use OpenSSL.
124*e7b1675dSTing-Kang Chang    if (${_tink_cc_library_tag} STREQUAL ${TINK_TARGET_EXCLUDE_IF_OPENSSL} AND TINK_USE_SYSTEM_OPENSSL)
125*e7b1675dSTing-Kang Chang      return()
126*e7b1675dSTing-Kang Chang    endif()
127*e7b1675dSTing-Kang Chang    # Exclude if building on Windows.
128*e7b1675dSTing-Kang Chang    if (${_tink_cc_library_tag} STREQUAL ${TINK_TARGET_EXCLUDE_IF_WINDOWS} AND WIN32)
129*e7b1675dSTing-Kang Chang      return()
130*e7b1675dSTing-Kang Chang    endif()
131*e7b1675dSTing-Kang Chang  endforeach()
132*e7b1675dSTing-Kang Chang
133*e7b1675dSTing-Kang Chang  # We replace :: with __ in targets, because :: may not appear in target names.
134*e7b1675dSTing-Kang Chang  # However, the module name should still span multiple name spaces.
135*e7b1675dSTing-Kang Chang  STRING(REPLACE "::" "__" _ESCAPED_TINK_MODULE ${TINK_MODULE})
136*e7b1675dSTing-Kang Chang
137*e7b1675dSTing-Kang Chang  set(_is_headers_only_lib true)
138*e7b1675dSTing-Kang Chang  foreach(_src_file ${tink_cc_library_SRCS})
139*e7b1675dSTing-Kang Chang    if(${_src_file} MATCHES "\\.cc$")
140*e7b1675dSTing-Kang Chang      set(_is_headers_only_lib false)
141*e7b1675dSTing-Kang Chang      break()
142*e7b1675dSTing-Kang Chang    endif()
143*e7b1675dSTing-Kang Chang  endforeach()
144*e7b1675dSTing-Kang Chang
145*e7b1675dSTing-Kang Chang  if (tink_cc_library_PUBLIC)
146*e7b1675dSTing-Kang Chang    set(_target_name "tink_${_ESCAPED_TINK_MODULE}_${tink_cc_library_NAME}")
147*e7b1675dSTing-Kang Chang  else()
148*e7b1675dSTing-Kang Chang    set(_target_name "tink_internal_${_ESCAPED_TINK_MODULE}_${tink_cc_library_NAME}")
149*e7b1675dSTing-Kang Chang  endif()
150*e7b1675dSTing-Kang Chang
151*e7b1675dSTing-Kang Chang  if(NOT _is_headers_only_lib)
152*e7b1675dSTing-Kang Chang    add_library(${_target_name} STATIC "")
153*e7b1675dSTing-Kang Chang    target_sources(${_target_name} PRIVATE ${tink_cc_library_SRCS})
154*e7b1675dSTing-Kang Chang    target_include_directories(${_target_name} PUBLIC ${TINK_INCLUDE_DIRS})
155*e7b1675dSTing-Kang Chang    target_link_libraries(${_target_name} PUBLIC ${tink_cc_library_DEPS})
156*e7b1675dSTing-Kang Chang    target_compile_options(${_target_name} PRIVATE ${TINK_DEFAULT_COPTS})
157*e7b1675dSTing-Kang Chang    set_property(TARGET ${_target_name} PROPERTY CXX_STANDARD ${TINK_CXX_STANDARD})
158*e7b1675dSTing-Kang Chang    set_property(TARGET ${_target_name} PROPERTY CXX_STANDARD_REQUIRED true)
159*e7b1675dSTing-Kang Chang    if (tink_cc_library_PUBLIC)
160*e7b1675dSTing-Kang Chang      set_property(TARGET ${_target_name}
161*e7b1675dSTing-Kang Chang                   PROPERTY FOLDER "${TINK_IDE_FOLDER}")
162*e7b1675dSTing-Kang Chang    else()
163*e7b1675dSTing-Kang Chang      set_property(TARGET ${_target_name}
164*e7b1675dSTing-Kang Chang                   PROPERTY FOLDER "${TINK_IDE_FOLDER}/Internal")
165*e7b1675dSTing-Kang Chang    endif()
166*e7b1675dSTing-Kang Chang  else()
167*e7b1675dSTing-Kang Chang    add_library(${_target_name} INTERFACE)
168*e7b1675dSTing-Kang Chang    target_include_directories(${_target_name} INTERFACE ${TINK_INCLUDE_DIRS})
169*e7b1675dSTing-Kang Chang    target_link_libraries(${_target_name} INTERFACE ${tink_cc_library_DEPS})
170*e7b1675dSTing-Kang Chang  endif()
171*e7b1675dSTing-Kang Chang
172*e7b1675dSTing-Kang Chang  add_library(
173*e7b1675dSTing-Kang Chang    tink::${TINK_MODULE}::${tink_cc_library_NAME} ALIAS ${_target_name})
174*e7b1675dSTing-Kang Changendfunction(tink_cc_library)
175*e7b1675dSTing-Kang Chang
176*e7b1675dSTing-Kang Chang# Declare a Tink test using googletest, with a syntax similar to Bazel.
177*e7b1675dSTing-Kang Chang#
178*e7b1675dSTing-Kang Chang# Parameters:
179*e7b1675dSTing-Kang Chang#   NAME  base name of the test.
180*e7b1675dSTing-Kang Chang#   SRCS  list of test source files, headers included.
181*e7b1675dSTing-Kang Chang#   DEPS  list of dependencies, see tink_cc_library above.
182*e7b1675dSTing-Kang Chang#   DATA  list of non-code dependencies, such as test vectors.
183*e7b1675dSTing-Kang Chang#
184*e7b1675dSTing-Kang Chang# Tests added with this macro are automatically registered.
185*e7b1675dSTing-Kang Chang# Each test produces a build target named tink_test_<MODULE>_<NAME>.
186*e7b1675dSTing-Kang Chang#
187*e7b1675dSTing-Kang Changfunction(tink_cc_test)
188*e7b1675dSTing-Kang Chang  cmake_parse_arguments(PARSE_ARGV 0 tink_cc_test
189*e7b1675dSTing-Kang Chang    ""
190*e7b1675dSTing-Kang Chang    "NAME"
191*e7b1675dSTing-Kang Chang    "SRCS;DEPS;DATA;TAGS"
192*e7b1675dSTing-Kang Chang  )
193*e7b1675dSTing-Kang Chang
194*e7b1675dSTing-Kang Chang  if (NOT TINK_BUILD_TESTS)
195*e7b1675dSTing-Kang Chang    return()
196*e7b1675dSTing-Kang Chang  endif()
197*e7b1675dSTing-Kang Chang
198*e7b1675dSTing-Kang Chang  if (NOT DEFINED TINK_MODULE)
199*e7b1675dSTing-Kang Chang    message(FATAL_ERROR "TINK_MODULE not defined")
200*e7b1675dSTing-Kang Chang  endif()
201*e7b1675dSTing-Kang Chang
202*e7b1675dSTing-Kang Chang  # Check if this target must be skipped.
203*e7b1675dSTing-Kang Chang  foreach(_tink_cc_test_tag ${tink_cc_test_TAGS})
204*e7b1675dSTing-Kang Chang    # Exclude if we use OpenSSL.
205*e7b1675dSTing-Kang Chang    if (${_tink_cc_test_tag} STREQUAL ${TINK_TARGET_EXCLUDE_IF_OPENSSL} AND TINK_USE_SYSTEM_OPENSSL)
206*e7b1675dSTing-Kang Chang      return()
207*e7b1675dSTing-Kang Chang    endif()
208*e7b1675dSTing-Kang Chang    # Exclude if building on Windows.
209*e7b1675dSTing-Kang Chang    if (${_tink_cc_test_tag} STREQUAL ${TINK_TARGET_EXCLUDE_IF_WINDOWS} AND WIN32)
210*e7b1675dSTing-Kang Chang      return()
211*e7b1675dSTing-Kang Chang    endif()
212*e7b1675dSTing-Kang Chang  endforeach()
213*e7b1675dSTing-Kang Chang
214*e7b1675dSTing-Kang Chang  # We replace :: with __ in targets, because :: may not appear in target names.
215*e7b1675dSTing-Kang Chang  # However, the module name should still span multiple name spaces.
216*e7b1675dSTing-Kang Chang  STRING(REPLACE "::" "__" _ESCAPED_TINK_MODULE ${TINK_MODULE})
217*e7b1675dSTing-Kang Chang
218*e7b1675dSTing-Kang Chang  set(_target_name "tink_test_${_ESCAPED_TINK_MODULE}_${tink_cc_test_NAME}")
219*e7b1675dSTing-Kang Chang
220*e7b1675dSTing-Kang Chang  add_executable(${_target_name}
221*e7b1675dSTing-Kang Chang    ${tink_cc_test_SRCS}
222*e7b1675dSTing-Kang Chang  )
223*e7b1675dSTing-Kang Chang
224*e7b1675dSTing-Kang Chang  target_link_libraries(${_target_name}
225*e7b1675dSTing-Kang Chang    gtest_main
226*e7b1675dSTing-Kang Chang    ${tink_cc_test_DEPS}
227*e7b1675dSTing-Kang Chang  )
228*e7b1675dSTing-Kang Chang
229*e7b1675dSTing-Kang Chang  set_property(TARGET ${_target_name}
230*e7b1675dSTing-Kang Chang               PROPERTY FOLDER "${TINK_IDE_FOLDER}/Tests")
231*e7b1675dSTing-Kang Chang  set_property(TARGET ${_target_name} PROPERTY CXX_STANDARD ${TINK_CXX_STANDARD})
232*e7b1675dSTing-Kang Chang  set_property(TARGET ${_target_name} PROPERTY CXX_STANDARD_REQUIRED true)
233*e7b1675dSTing-Kang Chang
234*e7b1675dSTing-Kang Chang  # Note: This was preferred over using gtest_discover_tests because of [1].
235*e7b1675dSTing-Kang Chang  # [1] https://gitlab.kitware.com/cmake/cmake/-/issues/23039
236*e7b1675dSTing-Kang Chang  add_test(NAME ${_target_name} COMMAND ${_target_name} WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
237*e7b1675dSTing-Kang Changendfunction(tink_cc_test)
238*e7b1675dSTing-Kang Chang
239*e7b1675dSTing-Kang Chang# Declare a C++ Proto library.
240*e7b1675dSTing-Kang Chang#
241*e7b1675dSTing-Kang Chang# Parameters:
242*e7b1675dSTing-Kang Chang#   NAME base name of the library.
243*e7b1675dSTing-Kang Chang#   SRCS list of .proto source files.
244*e7b1675dSTing-Kang Chang#   DEPS list of proto library dependencies, produced by tink_cc_proto or not.
245*e7b1675dSTing-Kang Chang#
246*e7b1675dSTing-Kang Chang# The resulting library follows the same naming convention as tink_cc_library.
247*e7b1675dSTing-Kang Chang#
248*e7b1675dSTing-Kang Changfunction(tink_cc_proto)
249*e7b1675dSTing-Kang Chang  cmake_parse_arguments(PARSE_ARGV 0 tink_cc_proto
250*e7b1675dSTing-Kang Chang    ""
251*e7b1675dSTing-Kang Chang    "NAME"
252*e7b1675dSTing-Kang Chang    "SRCS;DEPS"
253*e7b1675dSTing-Kang Chang  )
254*e7b1675dSTing-Kang Chang
255*e7b1675dSTing-Kang Chang  set(tink_cc_proto_GEN_SRCS)
256*e7b1675dSTing-Kang Chang  foreach(_src_path ${tink_cc_proto_SRCS})
257*e7b1675dSTing-Kang Chang    get_filename_component(_src_absolute_path "${_src_path}" ABSOLUTE)
258*e7b1675dSTing-Kang Chang    get_filename_component(_src_basename "${_src_path}" NAME_WE)
259*e7b1675dSTing-Kang Chang    get_filename_component(_src_dir "${_src_absolute_path}" DIRECTORY)
260*e7b1675dSTing-Kang Chang    file(RELATIVE_PATH _src_rel_path "${PROJECT_SOURCE_DIR}" "${_src_dir}")
261*e7b1675dSTing-Kang Chang
262*e7b1675dSTing-Kang Chang    set(_gen_srcs)
263*e7b1675dSTing-Kang Chang    foreach(_gen_ext .pb.h .pb.cc)
264*e7b1675dSTing-Kang Chang      list(APPEND _gen_srcs
265*e7b1675dSTing-Kang Chang           "${TINK_GENFILE_DIR}/${_src_rel_path}/${_src_basename}${_gen_ext}")
266*e7b1675dSTing-Kang Chang    endforeach()
267*e7b1675dSTing-Kang Chang
268*e7b1675dSTing-Kang Chang    list(APPEND tink_cc_proto_GEN_SRCS ${_gen_srcs})
269*e7b1675dSTing-Kang Chang
270*e7b1675dSTing-Kang Chang    add_custom_command(
271*e7b1675dSTing-Kang Chang      COMMAND protobuf::protoc
272*e7b1675dSTing-Kang Chang      ARGS
273*e7b1675dSTing-Kang Chang        --cpp_out "${TINK_GENFILE_DIR}"
274*e7b1675dSTing-Kang Chang        -I "${PROJECT_SOURCE_DIR}"
275*e7b1675dSTing-Kang Chang        "${_src_absolute_path}"
276*e7b1675dSTing-Kang Chang      OUTPUT
277*e7b1675dSTing-Kang Chang        ${_gen_srcs}
278*e7b1675dSTing-Kang Chang      DEPENDS
279*e7b1675dSTing-Kang Chang        protobuf::protoc
280*e7b1675dSTing-Kang Chang        ${_src_absolute_path}
281*e7b1675dSTing-Kang Chang      COMMENT "Running CXX protocol buffer compiler on ${_src_path}"
282*e7b1675dSTing-Kang Chang      VERBATIM
283*e7b1675dSTing-Kang Chang    )
284*e7b1675dSTing-Kang Chang  endforeach()
285*e7b1675dSTing-Kang Chang
286*e7b1675dSTing-Kang Chang  set_source_files_properties(
287*e7b1675dSTing-Kang Chang    ${tink_cc_proto_GEN_SRCS} PROPERTIES GENERATED true)
288*e7b1675dSTing-Kang Chang
289*e7b1675dSTing-Kang Chang  tink_cc_library(
290*e7b1675dSTing-Kang Chang    NAME ${tink_cc_proto_NAME}
291*e7b1675dSTing-Kang Chang    SRCS ${tink_cc_proto_GEN_SRCS}
292*e7b1675dSTing-Kang Chang    DEPS
293*e7b1675dSTing-Kang Chang      protobuf::libprotoc
294*e7b1675dSTing-Kang Chang      ${tink_cc_proto_DEPS}
295*e7b1675dSTing-Kang Chang  )
296*e7b1675dSTing-Kang Changendfunction()
297*e7b1675dSTing-Kang Chang
298*e7b1675dSTing-Kang Chang# Declare an empty target, that depends on all those specified. Use this rule
299*e7b1675dSTing-Kang Chang# to group dependencies that are logically related and give them a single name.
300*e7b1675dSTing-Kang Chang#
301*e7b1675dSTing-Kang Chang# Parameters:
302*e7b1675dSTing-Kang Chang#   NAME  base name of the target.
303*e7b1675dSTing-Kang Chang#   DEPS  list of dependencies to group.
304*e7b1675dSTing-Kang Chang#
305*e7b1675dSTing-Kang Chang# Each tink_target_group produces a target named tink_<MODULE>_<NAME>.
306*e7b1675dSTing-Kang Changfunction(tink_target_group)
307*e7b1675dSTing-Kang Chang  cmake_parse_arguments(PARSE_ARGV 0 tink_target_group "" "NAME" "DEPS")
308*e7b1675dSTing-Kang Chang  set(_target_name "tink_${TINK_MODULE}_${tink_target_group_NAME}")
309*e7b1675dSTing-Kang Chang  add_custom_target(${_target_name})
310*e7b1675dSTing-Kang Chang  add_dependencies(${_target_name} ${tink_target_group_DEPS})
311*e7b1675dSTing-Kang Changendfunction()
312