1*61c4878aSAndroid Build Coastguard Worker# Copyright 2021 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 Worker 15*61c4878aSAndroid Build Coastguard Workerimport("//build_overrides/pigweed.gni") 16*61c4878aSAndroid Build Coastguard Worker 17*61c4878aSAndroid Build Coastguard Worker# Mirrors a directory structure to the output directory. 18*61c4878aSAndroid Build Coastguard Worker# 19*61c4878aSAndroid Build Coastguard Worker# This is similar to a GN copy target, with some differences: 20*61c4878aSAndroid Build Coastguard Worker# 21*61c4878aSAndroid Build Coastguard Worker# - The outputs list is generated by the template based on the source_root and 22*61c4878aSAndroid Build Coastguard Worker# directory arguments, rather than using source expansion. 23*61c4878aSAndroid Build Coastguard Worker# - The source_root argument can be used to trim prefixes from source files. 24*61c4878aSAndroid Build Coastguard Worker# - pw_mirror_tree uses hard links instead of copies for efficiency. 25*61c4878aSAndroid Build Coastguard Worker# 26*61c4878aSAndroid Build Coastguard Worker# Args: 27*61c4878aSAndroid Build Coastguard Worker# 28*61c4878aSAndroid Build Coastguard Worker# directory: Output directory for the files. 29*61c4878aSAndroid Build Coastguard Worker# sources: List of files to mirror to the output directory. 30*61c4878aSAndroid Build Coastguard Worker# source_root: Root path for sources; defaults to ".". 31*61c4878aSAndroid Build Coastguard Worker# 32*61c4878aSAndroid Build Coastguard Workertemplate("pw_mirror_tree") { 33*61c4878aSAndroid Build Coastguard Worker assert(defined(invoker.sources), "'sources' must be provided") 34*61c4878aSAndroid Build Coastguard Worker assert(defined(invoker.directory) && invoker.directory != "", 35*61c4878aSAndroid Build Coastguard Worker "The output path must be specified as 'directory'") 36*61c4878aSAndroid Build Coastguard Worker 37*61c4878aSAndroid Build Coastguard Worker if (defined(invoker.source_root)) { 38*61c4878aSAndroid Build Coastguard Worker _root = invoker.source_root 39*61c4878aSAndroid Build Coastguard Worker } else { 40*61c4878aSAndroid Build Coastguard Worker _root = "." 41*61c4878aSAndroid Build Coastguard Worker } 42*61c4878aSAndroid Build Coastguard Worker 43*61c4878aSAndroid Build Coastguard Worker _deps = [] 44*61c4878aSAndroid Build Coastguard Worker if (defined(invoker.deps)) { 45*61c4878aSAndroid Build Coastguard Worker _deps += invoker.deps 46*61c4878aSAndroid Build Coastguard Worker } 47*61c4878aSAndroid Build Coastguard Worker 48*61c4878aSAndroid Build Coastguard Worker _public_deps = [] 49*61c4878aSAndroid Build Coastguard Worker if (defined(invoker.public_deps)) { 50*61c4878aSAndroid Build Coastguard Worker _public_deps += invoker.public_deps 51*61c4878aSAndroid Build Coastguard Worker } 52*61c4878aSAndroid Build Coastguard Worker 53*61c4878aSAndroid Build Coastguard Worker _copy_deps = [] 54*61c4878aSAndroid Build Coastguard Worker 55*61c4878aSAndroid Build Coastguard Worker foreach(source, invoker.sources) { 56*61c4878aSAndroid Build Coastguard Worker _stripped_source = rebase_path(source, _root) 57*61c4878aSAndroid Build Coastguard Worker _subtarget_name = 58*61c4878aSAndroid Build Coastguard Worker string_replace("${target_name}_${_stripped_source}", "/", ".") 59*61c4878aSAndroid Build Coastguard Worker 60*61c4878aSAndroid Build Coastguard Worker copy(_subtarget_name) { 61*61c4878aSAndroid Build Coastguard Worker sources = [ source ] 62*61c4878aSAndroid Build Coastguard Worker outputs = [ "${invoker.directory}/${_stripped_source}" ] 63*61c4878aSAndroid Build Coastguard Worker deps = _deps 64*61c4878aSAndroid Build Coastguard Worker public_deps = _public_deps 65*61c4878aSAndroid Build Coastguard Worker } 66*61c4878aSAndroid Build Coastguard Worker _copy_deps += [ ":${_subtarget_name}" ] 67*61c4878aSAndroid Build Coastguard Worker } 68*61c4878aSAndroid Build Coastguard Worker 69*61c4878aSAndroid Build Coastguard Worker group(target_name) { 70*61c4878aSAndroid Build Coastguard Worker public_deps = _copy_deps 71*61c4878aSAndroid Build Coastguard Worker } 72*61c4878aSAndroid Build Coastguard Worker} 73