| # Copyright 2018 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| declare_args() { |
| # The OS build is running on. |
| OS = "" |
| |
| # Specifies pkg-config program to retrieve information about packages. |
| pkg_config = "" |
| |
| # The logical root directory for headers and libraries. |
| # Trailing slash should not be added (except root path). |
| sysroot = "" |
| |
| # The libdir of the target board. e.g. /usr/lib64 |
| libdir = "" |
| |
| # The path to the directory where build artifacts are located. |
| build_root = "" |
| |
| # The path to src/platform2. |
| platform2_root = "" |
| |
| # Libbase revision number read from BASE_VER variable or file. |
| libbase_ver = "" |
| |
| # Set true to allow C++ code to use exceptions. |
| enable_exceptions = false |
| |
| # Set true if clang is used for C compiler. |
| clang_cc = false |
| |
| # Set true if clang is used for C++ compiler. |
| clang_cxx = false |
| |
| # Additional flags for C compiler. |
| external_cflags = [] |
| |
| # Additional flags for C++ compiler. |
| external_cxxflags = [] |
| |
| # Additional flags for C and C++ preprocessor. |
| external_cppflags = [] |
| |
| # Additional flags for C and C++ linker. |
| external_ldflags = [] |
| |
| # Set this to true if you want to activate the debug mode. |
| is_debug = false |
| |
| # Subdir in platform2 where the package is located. |
| # TODO(oka): This value is public because it is used in ap/ package for common |
| # targets to use different default flags based on the package to be built. |
| # This is hacky, so remove such usages and move this variable back to |
| # gn_root/BUILD.gn . |
| platform_subdir = "" |
| } |
| import("//common-mk/use.gni") |
| |
| assert(pkg_config != "", "pkg-config script path must be set") |
| assert(libbase_ver != -1, "libbase_ver must be set") |
| assert(libdir != "", "libdir must be set") |
| |
| if (target_os == "") { |
| target_os = host_os |
| } |
| if (target_cpu == "") { |
| target_cpu = host_cpu |
| } |
| if (current_cpu == "") { |
| current_cpu = target_cpu |
| } |
| if (current_os == "") { |
| current_os = target_os |
| } |
| |
| # Practically sysroot is used as a prefix of paths, e.g. |
| # "${sysroot}/usr/include". If sysroot is root (= "/"), it will be |
| # "//usr/include". However, in GN, paths starting with "//" represents the path |
| # to the GN root, rather than the file system root, which is unexpected. |
| # To support that case, replace sysroot with "/.", if sysroot is "/". |
| if (sysroot == "/") { |
| sysroot = "/." |
| } |
| |
| # All binary targets will get this list of configs by default. |
| _binary_target_configs = [ "//common-mk:compiler_defaults" ] |
| |
| if (!enable_exceptions) { |
| _binary_target_configs += [ "//common-mk:no_exceptions" ] |
| } |
| |
| if (!clang_cc) { |
| _binary_target_configs += [ "//common-mk:gcc_cflags_c" ] |
| } |
| if (!clang_cxx) { |
| _binary_target_configs += [ "//common-mk:gcc_cflags_cc" ] |
| } |
| |
| set_defaults("executable") { |
| configs = _binary_target_configs |
| configs += [ "//common-mk:pie" ] |
| } |
| |
| set_defaults("static_library") { |
| configs = _binary_target_configs |
| configs += [ |
| "//common-mk:pie", |
| "//common-mk:use_thin_archive", |
| ] |
| } |
| |
| set_defaults("shared_library") { |
| configs = _binary_target_configs |
| configs += [ "//common-mk:pic" ] |
| } |
| |
| set_defaults("source_set") { |
| configs = _binary_target_configs |
| } |
| |
| set_default_toolchain("//common-mk/toolchain") |
| |
| # In Chrome OS, pkg-config is commonly and widely used. |
| # It is not natively supported by GN. Instead, here a few special fields are |
| # injected to the executable, shared_library and static_library targets |
| # to support pkg-config. |
| # src_install and src_test settings are also written in the same way. |
| # |
| # Args: |
| # pkg_deps(optional): A list of package names to be depend. |
| # A corresponding config is created, and then injected to |configs|. |
| # public_pkg_deps(optional): Similart to pkg_deps, but injected to |
| # |public_configs| instead. |
| # all_dependent_pkg_deps(optional): Similar to pkg_deps, but injected to |
| # |all_dependent_configs|. |
| # run_test(optional): A boolean if this is a unittest program that should be |
| # automatically run. A corresponding metadata is injected to itself. |
| # test_config(optional): A scope of configs for tests. |
| # A corresponding metadata is injected to itself. |
| # install_path(optional): A path to install into. |
| # A corresponding group is created, and then injected to |deps|. |
| |
| import("//common-mk/install_config.gni") |
| import("//common-mk/pkg_config.gni") |
| |
| template("_generate_config_rule") { |
| if (defined(invoker.pkg_deps) && invoker.pkg_deps != []) { |
| _pkg_deps_name = "_${target_name}-pkg_deps-config" |
| pkg_config(_pkg_deps_name) { |
| pkg_deps = invoker.pkg_deps |
| } |
| } |
| if (defined(invoker.public_pkg_deps) && invoker.public_pkg_deps != []) { |
| _public_pkg_deps_name = "_${target_name}-public_pkg_deps-config" |
| pkg_config(_public_pkg_deps_name) { |
| pkg_deps = invoker.public_pkg_deps |
| } |
| } |
| if (defined(invoker.all_dependent_pkg_deps) && |
| invoker.all_dependent_pkg_deps != []) { |
| _all_dependent_pkg_deps_name = |
| "_${target_name}-all_dependent_pkg_deps-config" |
| pkg_config(_all_dependent_pkg_deps_name) { |
| pkg_deps = invoker.all_dependent_pkg_deps |
| } |
| } |
| |
| if (defined(invoker.install_path)) { |
| _install_config_name = "_${target_name}-install_config" |
| source_name = invoker.target_name |
| if (defined(invoker.output_name)) { |
| source_name = invoker.output_name |
| } |
| source_dir = invoker.root_build_dir |
| if (defined(invoker.output_dir)) { |
| source_dir = invoker.output_dir |
| } |
| install_config(_install_config_name) { |
| if (defined(invoker.target_type)) { |
| type = invoker.target_type |
| } |
| if (invoker.target_type == "shared_library") { |
| sources = [ "${source_dir}/lib/${source_name}.so" ] |
| } else if (invoker.target_type == "static_library") { |
| sources = [ "${source_dir}/${source_name}.a" ] |
| } else { |
| sources = [ "${source_dir}/${source_name}" ] |
| } |
| install_path = invoker.install_path |
| } |
| } |
| |
| target(invoker.target_type, target_name) { |
| forward_variables_from(invoker, |
| "*", |
| [ |
| "all_dependent_pkg_deps", |
| "install_path", |
| "metadata", |
| "pkg_deps", |
| "public_pkg_deps", |
| "run_test", |
| "target_type", |
| "test_config", |
| ]) |
| if (defined(_pkg_deps_name)) { |
| if (!defined(configs)) { |
| configs = [] |
| } |
| configs += [ ":${_pkg_deps_name}" ] |
| } |
| if (defined(_public_pkg_deps_name)) { |
| if (!defined(public_configs)) { |
| public_configs = [] |
| } |
| public_configs += [ ":${_public_pkg_deps_name}" ] |
| } |
| if (defined(_all_dependent_pkg_deps_name)) { |
| if (!defined(all_dependent_configs)) { |
| all_dependent_configs = [] |
| } |
| all_dependent_configs += [ ":${_all_dependent_pkg_deps_name}" ] |
| } |
| if (defined(_install_config_name)) { |
| if (!defined(deps)) { |
| deps = [] |
| } |
| deps += [ ":${_install_config_name}" ] |
| } |
| _run_test = defined(invoker.run_test) && invoker.run_test |
| if (defined(invoker.metadata) || _run_test) { |
| metadata = { |
| if (defined(invoker.metadata)) { |
| forward_variables_from(invoker.metadata, "*") |
| } |
| if (_run_test) { |
| _run_test = [ true ] |
| if (defined(invoker.test_config)) { |
| _test_config = [ invoker.test_config ] |
| } |
| } |
| } |
| } |
| } |
| } |
| |
| template("executable") { |
| _generate_config_rule(target_name) { |
| forward_variables_from(invoker, "*") |
| target_type = "executable" |
| } |
| } |
| |
| template("shared_library") { |
| _generate_config_rule(target_name) { |
| forward_variables_from(invoker, "*") |
| target_type = "shared_library" |
| } |
| } |
| |
| template("static_library") { |
| _generate_config_rule(target_name) { |
| forward_variables_from(invoker, "*") |
| target_type = "static_library" |
| } |
| } |