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