blob: 28c8a8d0936996cbb9c796737369e7cd8431bfb0 [file] [log] [blame]
# Copyright 2014 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.
import("//build/toolchain/toolchain.gni")
import("//mojo/public/mojo_constants.gni")
if (is_android) {
import("//build/config/android/rules.gni")
import("//build/config/zip.gni")
}
# Generate a binary Mojo application in a self-named directory.
# Application resources are copied to a "resources" directory alongside the app.
# The parameters of this template are those of a shared library.
template("mojo_native_application") {
base_target_name = target_name
if (defined(invoker.output_name)) {
base_target_name = invoker.output_name
}
final_target_name = target_name
mojo_deps = []
if (defined(invoker.deps)) {
mojo_deps += invoker.deps
}
mojo_data_deps = []
if (defined(invoker.resources)) {
copy_step_name = "${base_target_name}__copy_resources"
copy(copy_step_name) {
sources = invoker.resources
outputs = [
"${root_out_dir}/${mojo_application_subdir}/${base_target_name}/resources/{{source_file_part}}",
]
if (defined(invoker.testonly)) {
testonly = invoker.testonly
}
deps = mojo_deps
}
mojo_data_deps += [ ":$copy_step_name" ]
}
output = base_target_name + ".mojo"
library_target_name = base_target_name + "_library"
library_name = "${shlib_prefix}${library_target_name}${shlib_extension}"
shared_library(library_target_name) {
if (defined(invoker.cflags)) {
cflags = invoker.cflags
}
if (defined(invoker.cflags_c)) {
cflags_c = invoker.cflags_c
}
if (defined(invoker.cflags_cc)) {
cflags_cc = invoker.cflags_cc
}
if (defined(invoker.cflags_objc)) {
cflags_objc = invoker.cflags_objc
}
if (defined(invoker.cflags_objcc)) {
cflags_objcc = invoker.cflags_objcc
}
if (defined(invoker.defines)) {
defines = invoker.defines
}
if (defined(invoker.include_dirs)) {
include_dirs = invoker.include_dirs
}
if (defined(invoker.ldflags)) {
ldflags = invoker.ldflags
}
if (defined(invoker.lib_dirs)) {
lib_dirs = invoker.lib_dirs
}
if (defined(invoker.libs)) {
libs = invoker.libs
}
data_deps = []
if (!defined(invoker.avoid_runner_cycle) || !invoker.avoid_runner_cycle) {
# Give the user an out; as some mojo services are depended on by the
# runner.
data_deps += [ "//services/shell/standalone" ]
}
if (defined(invoker.data_deps)) {
data_deps += invoker.data_deps
}
data_deps += mojo_data_deps
deps = [
"//mojo/public/c/system:set_thunks_for_app",
"//services/shell/public/cpp:application_support",
]
deps += mojo_deps
if (defined(invoker.public_deps)) {
public_deps = invoker.public_deps
}
if (defined(invoker.all_dependent_configs)) {
all_dependent_configs = invoker.all_dependent_configs
}
if (defined(invoker.public_configs)) {
public_configs = invoker.public_configs
}
if (defined(invoker.check_includes)) {
check_includes = invoker.check_includes
}
if (defined(invoker.configs)) {
configs += invoker.configs
}
if (defined(invoker.data)) {
data = invoker.data
}
if (defined(invoker.inputs)) {
inputs = invoker.inputs
}
if (defined(invoker.public)) {
public = invoker.public
}
if (defined(invoker.sources)) {
sources = invoker.sources
}
if (defined(invoker.testonly)) {
testonly = invoker.testonly
}
}
copy(final_target_name) {
forward_variables_from(invoker,
[
"testonly",
"visibility",
])
deps = [
":${library_target_name}",
]
sources = [
"${root_shlib_dir}/${library_name}",
]
outputs = [
"${root_out_dir}/${mojo_application_subdir}/${base_target_name}/${output}",
]
}
if (is_android) {
android_assets("${final_target_name}_assets") {
forward_variables_from(invoker, [ "testonly" ])
deps = [
":${library_target_name}",
]
if (defined(invoker.deps)) {
deps += invoker.deps
}
renaming_sources = [ "${root_shlib_dir}/${library_name}" ]
renaming_destinations = [ "${base_target_name}/${output}" ]
if (defined(invoker.resources)) {
renaming_sources += invoker.resources
renaming_destinations += process_file_template(
invoker.resources,
[ "$base_target_name/resources/{{source_file_part}}" ])
}
}
}
}
if (is_android) {
# Declares an Android Mojo application consisting of an .so file and a
# corresponding .dex.jar file.
#
# Variables:
# input_so: the .so file to bundle
# input_dex_jar: the .dex.jar file to bundle
# deps / public_deps / data_deps (optional):
# Dependencies. The targets that generate the .so/jar inputs should be
# listed in either deps or public_deps.
# output_name (optional): override for the output file name
template("mojo_android_application") {
assert(defined(invoker.input_so))
assert(defined(invoker.input_dex_jar))
base_target_name = target_name
if (defined(invoker.output_name)) {
base_target_name = invoker.output_name
}
mojo_data_deps = []
if (defined(invoker.resources)) {
copy_step_name = "${base_target_name}__copy_resources"
copy(copy_step_name) {
sources = invoker.resources
outputs = [
"${root_out_dir}/${mojo_application_subdir}/${base_target_name}/resources/{{source_file_part}}",
]
if (defined(invoker.testonly)) {
testonly = invoker.testonly
}
if (defined(invoker.deps)) {
deps = invoker.deps
}
}
mojo_data_deps += [ ":$copy_step_name" ]
}
zip_action_name = "${target_name}_zip"
zip_action_output = "$target_gen_dir/${target_name}.zip"
prepend_action_name = target_name
zip(zip_action_name) {
visibility = [ ":$prepend_action_name" ]
inputs = [
invoker.input_so,
invoker.input_dex_jar,
]
output = zip_action_output
forward_variables_from(invoker,
[
"deps",
"public_deps",
"data_deps",
])
}
_mojo_output = "${root_out_dir}/${mojo_application_subdir}/${base_target_name}/${base_target_name}.mojo"
action(target_name) {
script = "//mojo/public/tools/prepend.py"
input = zip_action_output
inputs = [
input,
]
outputs = [
_mojo_output,
]
rebase_input = rebase_path(input, root_build_dir)
rebase_output = rebase_path(_mojo_output, root_build_dir)
args = [
"--input=$rebase_input",
"--output=$rebase_output",
"--line=#!mojo mojo:android_handler",
]
data_deps = mojo_data_deps
public_deps = [
":$zip_action_name",
]
}
android_assets("${target_name}_assets") {
forward_variables_from(invoker, [ "testonly" ])
deps = [
":$prepend_action_name",
]
renaming_sources = [ _mojo_output ]
renaming_destinations = [ "${base_target_name}/${base_target_name}.mojo" ]
if (defined(invoker.resources)) {
renaming_sources += invoker.resources
renaming_destinations += process_file_template(
invoker.resources,
[ "$base_target_name/resources/{{source_file_part}}" ])
}
}
}
}