Index: build/toolchain/mac/BUILD.gn |
diff --git a/build/toolchain/mac/BUILD.gn b/build/toolchain/mac/BUILD.gn |
index 231a546891d463367ebcdce18584116f5d5f92fa..a5ff08faffad70413eba86ad297d98e48531be61 100644 |
--- a/build/toolchain/mac/BUILD.gn |
+++ b/build/toolchain/mac/BUILD.gn |
@@ -64,7 +64,6 @@ tool_versions = |
exec_script("get_tool_mtime.py", |
rebase_path([ |
"//build/toolchain/mac/compile_xcassets.py", |
- "//build/toolchain/mac/copy_bundle_data.py", |
"//build/toolchain/mac/filter_libtool.py", |
"//build/toolchain/mac/linker_driver.py", |
], |
@@ -307,14 +306,39 @@ template("mac_toolchain") { |
} |
tool("copy_bundle_data") { |
- if (is_ios) { |
- _extra_args = "--strings-format=binary1" |
- } else { |
- _extra_args = "" |
+ # copy_command use hardlink if possible but this does not work with |
+ # directories. If source is a directory, instead use "pax" to create |
+ # the same tree structure using hardlinks to individual files (this |
+ # preserve symbolic links too) as recommended in the replies to the |
+ # question at http://serverfault.com/q/209888/43689 ("cp -al" isn't |
+ # available on macOS). |
+ # |
+ # According to the man page for pax, the commands to use to clone |
+ # olddir to newdir using pax are the following: |
+ # |
+ # $ mkdir newdir |
+ # $ cd olddir |
+ # $ pax -rwl . ../newdir |
+ # |
+ # The _copydir command does exactly that but use an absolute path |
+ # constructed using shell variable $OLDPWD (automatically set when |
+ # cd is used) as computing the relative path is a bit complex and |
+ # using pwd would requires a sub-shell to be created. |
+ _copydir = "mkdir -p {{output}} && cd {{source}} && " + |
+ "pax -rwl . \"\$OLDPWD\"/{{output}}" |
+ _command = "if [[ -d {{source}} ]]; then " + _copydir + "; else " + |
+ copy_command + "; fi" |
+ |
+ # TODO(crbug.com/625578): Remove this conversion on iOS once all the |
+ # bundle_data target have been fixed to reference converted files. |
+ _convert_strings = is_ios |
+ if (_convert_strings) { |
+ _convert = "plutil -convert binary1 -o {{output}} {{source}}" |
+ _command = "case {{source}} in " + "*.strings) " + _convert + ";; " + |
+ "*) " + _command + ";; esac" |
} |
- _tool = rebase_path("//build/toolchain/mac/copy_bundle_data.py", |
- root_build_dir) |
- command = "TOOL_VERSION=${tool_versions.copy_bundle_data} python $_tool ${_extra_args} {{source}} {{output}}" |
+ |
+ command = "rm -rf {{output}} && " + _command |
description = "COPY_BUNDLE_DATA {{source}} {{output}}" |
pool = ":bundle_pool($default_toolchain)" |
} |