Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(72)

Unified Diff: build/config/mac/base_rules.gni

Issue 2023703002: Beginning work on GN build (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Really add //build. Add dart_bootstrap rule. Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « build/config/mac/OWNERS ('k') | build/config/mac/compile_xib.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: build/config/mac/base_rules.gni
diff --git a/build/config/mac/base_rules.gni b/build/config/mac/base_rules.gni
new file mode 100644
index 0000000000000000000000000000000000000000..7be6bf3337cd9e5d4843ace4bfe683b1fd7688d5
--- /dev/null
+++ b/build/config/mac/base_rules.gni
@@ -0,0 +1,379 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# This file contains rules that are shared between Mac and iOS.
+
+import("//build/toolchain/toolchain.gni")
+
+if (is_mac) {
+ import("//build/config/mac/mac_sdk.gni")
+} else if (is_ios) {
+ import("//build/config/ios/ios_sdk.gni")
+}
+
+# Convert plist file to given format.
+#
+# Arguments
+#
+# source:
+# string, path to the plist file to convert
+#
+# output:
+# string, path to the converted plist, must be under $root_build_dir
+#
+# format:
+# string, the format to `plutil -convert` the plist to.
+template("convert_plist") {
+ assert(defined(invoker.source), "source must be defined for $target_name")
+ assert(defined(invoker.output), "output must be defined for $target_name")
+ assert(defined(invoker.format), "format must be defined for $target_name")
+
+ action(target_name) {
+ forward_variables_from(invoker,
+ [
+ "visibility",
+ "testonly",
+ "deps",
+ ])
+
+ script = "//build/config/mac/xcrun.py"
+ sources = [
+ invoker.source,
+ ]
+ outputs = [
+ invoker.output,
+ ]
+ args = [
+ "plutil",
+ "-convert",
+ invoker.format,
+ "-o",
+ rebase_path(invoker.output, root_out_dir),
+ rebase_path(invoker.source, root_out_dir),
+ ]
+ }
+}
+
+# The base template used to generate Info.plist files for iOS and Mac apps and
+# frameworks.
+#
+# Arguments
+#
+# plist_templates:
+# string array, paths to plist files which will be used for the bundle.
+#
+# executable_name:
+# string, name of the generated target used for the product
+# and executable name as specified in the output Info.plist.
+#
+# format:
+# string, the format to `plutil -convert` the plist to when
+# generating the output.
+#
+# extra_substitutions:
+# (optional) string array, 'key=value' pairs for extra fields which are
+# specified in a source Info.plist template.
+#
+# output_name:
+# (optional) string, name of the generated plist file, default to
+# "$target_gen_dir/$target_name.plist".
+template("info_plist") {
+ assert(defined(invoker.plist_templates),
+ "A list of template plist files must be specified for $target_name")
+ assert(defined(invoker.executable_name),
+ "The executable_name must be specified for $target_name")
+ assert(defined(invoker.format),
+ "The plist format must be specified for $target_name")
+ executable_name = invoker.executable_name
+
+ _output_name = "$target_gen_dir/$target_name.plist"
+ if (defined(invoker.output_name)) {
+ _output_name = invoker.output_name
+ }
+
+ action(target_name) {
+ script = "//build/config/mac/gen_plist.py"
+ sources = invoker.plist_templates
+ outputs = [
+ _output_name,
+ ]
+ extra_args = []
+ if (defined(invoker.extra_substitutions)) {
+ foreach(substitution, invoker.extra_substitutions) {
+ extra_args += [ "-s=$substitution" ]
+ }
+ }
+ response_file_contents =
+ extra_args + [
+ "-s=BUILD_MACHINE_OS_BUILD=$machine_os_build",
+ "-s=EXECUTABLE_NAME=$executable_name",
+ "-s=GCC_VERSION=com.apple.compilers.llvm.clang.1_0",
+ "-s=PRODUCT_NAME=$executable_name",
+ "-s=XCODE_BUILD=$xcode_build",
+ "-s=XCODE_VERSION=$xcode_version",
+ "-o=" + rebase_path(_output_name, root_build_dir),
+ "-f=" + invoker.format,
+ ] + rebase_path(sources, root_build_dir)
+ args = [ "@{{response_file_name}}" ]
+ forward_variables_from(invoker,
+ [
+ "deps",
+ "testonly",
+ "visibility",
+ ])
+ }
+}
+
+# This is used as the base template for both iOS and Mac frameworks.
+#
+# By default, the bundle target this template generates does not link the
+# resulting framework into anything that depends on it. If a dependency wants
+# a link-time (as well as build-time) dependency on the framework bundle,
+# depend against "$target_name+link". If only the build-time dependency is
+# required (e.g., for copying into another bundle), then use "$target_name".
+#
+# Arguments
+#
+# output_name:
+# (optional) string, name of the generated framework without the
+# .framework suffix. If omitted, defaults to target_name.
+#
+# framework_version:
+# (optional) string, version of the framework. Typically this is a
+# single letter, like "A". If omitted, the Versions/ subdirectory
+# structure will not be created, and build output will go directly
+# into the framework subdirectory.
+#
+# This template provides two targets for the resulting framework bundle. The
+# link-time behavior varies depending on which of the two targets below is
+# added as a dependency:
+# - $target_name only adds a build-time dependency. Targets that depend on
+# it will not link against the framework.
+# - $target_name+link adds a build-time and link-time dependency. Targets
+# that depend on it will link against the framework.
+#
+# The build-time-only dependency is used for when a target needs to use the
+# framework either only for resources, or because the target loads it at run-
+# time, via dlopen() or NSBundle. The link-time dependency will cause the
+# dependee to have the framework loaded by dyld at launch.
+#
+# Example of build-time only dependency:
+#
+# framework_bundle("CoreTeleportation") {
+# sources = [ ... ]
+# }
+#
+# bundle_data("core_teleportation_bundle_data") {
+# deps = [ ":CoreTeleportation" ]
+# sources = [ "$root_out_dir/CoreTeleportation.framework" ]
+# outputs = [ "{{bundle_root_dir}}/Frameworks/{{source_file_part}}" ]
+# }
+#
+# app_bundle("GoatTeleporter") {
+# sources = [ ... ]
+# deps = [
+# ":core_teleportation_bundle_data",
+# ]
+# }
+#
+# The GoatTeleporter.app will not directly link against
+# CoreTeleportation.framework, but it will be included in the bundle's
+# Frameworks directory.
+#
+# Example of link-time dependency:
+#
+# framework_bundle("CoreTeleportation") {
+# sources = [ ... ]
+# ldflags = [
+# "-install_name",
+# "@executable_path/../Frameworks/$target_name.framework"
+# ]
+# }
+#
+# bundle_data("core_teleportation_bundle_data") {
+# deps = [ ":CoreTeleportation+link" ]
+# sources = [ "$root_out_dir/CoreTeleportation.framework" ]
+# outputs = [ "{{bundle_root_dir}}/Frameworks/{{source_file_part}}" ]
+# }
+#
+# app_bundle("GoatTeleporter") {
+# sources = [ ... ]
+# deps = [
+# ":core_teleportation_bundle_data",
+# ]
+# }
+#
+# Note that the framework is still copied to the app's bundle, but dyld will
+# load this library when the app is launched because it uses the "+link"
+# target as a dependency. This also requires that the framework set its
+# install_name so that dyld can locate it.
+#
+# See "gn help shared_library" for more information on arguments supported
+# by shared library target.
+template("framework_bundle") {
+ _target_name = target_name
+ _output_name = target_name
+ if (defined(invoker.output_name)) {
+ _output_name = invoker.output_name
+ }
+
+ # If the framework is unversioned, the final _target_name will be the
+ # create_bundle(_framework_target), otherwise an action with the name
+ # _target_name will depends on the the create_bundle() in order to prepare
+ # the versioned directory structure.
+ _framework_target = _target_name
+ _framework_name = _output_name + ".framework"
+ _framework_root_dir = "$root_out_dir/$_framework_name"
+ if (defined(invoker.framework_version) && invoker.framework_version != "") {
+ _framework_version = invoker.framework_version
+ _framework_root_dir += "/Versions/$_framework_version"
+ _framework_target = _target_name + "_create_bundle"
+ }
+
+ _shared_library_target = target_name + "_shared_library"
+ _shared_library_bundle_data = _shared_library_target + "_bundle_data"
+
+ shared_library(_shared_library_target) {
+ visibility = [ ":$_shared_library_bundle_data" ]
+ forward_variables_from(invoker,
+ "*",
+ [
+ "assert_no_deps",
+ "data_deps",
+ "info_plist",
+ "output_name",
+ "visibility",
+ ])
+ output_name = _output_name
+ output_prefix_override = true
+ output_extension = ""
+ output_dir = "$target_out_dir/$_shared_library_target"
+ }
+
+ bundle_data(_shared_library_bundle_data) {
+ visibility = [ ":$_framework_target" ]
+ forward_variables_from(invoker, [ "testonly" ])
+ sources = [
+ "$target_out_dir/$_shared_library_target/$_output_name",
+ ]
+ outputs = [
+ "{{bundle_executable_dir}}/$_output_name",
+ ]
+ public_deps = [
+ ":$_shared_library_target",
+ ]
+ }
+
+ _framework_public_config = _target_name + "_public_config"
+ config(_framework_public_config) {
+ # TODO(sdefresne): should we have a framework_dirs similar to lib_dirs
+ # and include_dirs to avoid duplicate values on the command-line.
+ visibility = [ ":$_framework_target" ]
+ ldflags = [ "-F" + rebase_path("$root_out_dir/.", root_out_dir) ]
+ lib_dirs = [ root_out_dir ]
+ libs = [ _framework_name ]
+ }
+
+ create_bundle(_framework_target) {
+ forward_variables_from(invoker,
+ [
+ "data_deps",
+ "deps",
+ "public_deps",
+ "testonly",
+ ])
+
+ if (defined(_framework_version)) {
+ visibility = [ ":$_target_name" ]
+ } else {
+ if (defined(invoker.visibility)) {
+ visibility = invoker.visibility
+ visibility += [ ":$_target_name+link" ]
+ }
+ }
+
+ if (!defined(public_deps)) {
+ public_deps = []
+ }
+ public_deps += [ ":$_shared_library_bundle_data" ]
+
+ bundle_root_dir = _framework_root_dir
+ bundle_resources_dir = "$bundle_root_dir/Resources"
+ bundle_executable_dir = "$bundle_root_dir"
+ }
+
+ if (defined(_framework_version)) {
+ action(_target_name) {
+ forward_variables_from(invoker, [ "testonly" ])
+
+ if (defined(invoker.visibility)) {
+ visibility = invoker.visibility
+ visibility += [ ":$_target_name+link" ]
+ }
+
+ script = "$root_out_dir/gyp-mac-tool"
+ outputs = [
+ "$root_out_dir/$_framework_name/Versions/Current",
+ ]
+ args = [
+ "package-framework",
+ "$_framework_name",
+ "$_framework_version",
+ ]
+ public_deps = [
+ ":$_framework_target",
+ ]
+ }
+ }
+
+ group(_target_name + "+link") {
+ forward_variables_from(invoker,
+ [
+ "visibility",
+ "testonly",
+ ])
+ public_deps = [
+ ":$_target_name",
+ ]
+ public_configs = [ ":$_framework_public_config" ]
+ }
+}
+
+# Template to combile .xib or .storyboard files.
+#
+# Arguments
+#
+# sources:
+# list of string, sources to compile
+#
+# ibtool_flags:
+# (optional) list of string, additional flags to pass to the ibtool
+template("compile_xibs") {
+ action_foreach(target_name) {
+ forward_variables_from(invoker,
+ [
+ "testonly",
+ "visibility",
+ ])
+ assert(defined(invoker.sources),
+ "Sources must be specified for $target_name")
+
+ ibtool_flags = []
+ if (defined(invoker.ibtool_flags)) {
+ ibtool_flags = invoker.ibtool_flags
+ }
+
+ script = "//build/config/mac/compile_xib.py"
+ sources = invoker.sources
+ outputs = [
+ "$target_gen_dir/{{source_name_part}}.nib",
+ ]
+ args = [
+ "--input",
+ "{{source}}",
+ "--output",
+ rebase_path("$target_gen_dir/{{source_name_part}}.nib"),
+ ] + ibtool_flags
+ }
+}
« no previous file with comments | « build/config/mac/OWNERS ('k') | build/config/mac/compile_xib.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698