blob: 1450227fe287c494edaee961ccfb6e9e76719b95 [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("mojo.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
}
if (defined(invoker.resources)) {
copy_step_name = "${base_target_name}__copy_resources"
copy(copy_step_name) {
sources = invoker.resources
outputs = [
"${root_out_dir}/${base_target_name}/resources/{{source_file_part}}",
]
if (defined(invoker.testonly)) {
testonly = invoker.testonly
}
deps = mojo_deps
}
mojo_deps += [ ":$copy_step_name" ]
}
if (!is_nacl) {
output = base_target_name + ".mojo"
library_target_name = base_target_name + "_library"
if (is_linux || is_android) {
library_name = "lib${library_target_name}.so"
} else if (is_win) {
library_name = "${library_target_name}.dll"
} else if (is_mac) {
library_name = "lib${library_target_name}.dylib"
} else {
assert(false, "Platform not supported.")
}
if (is_android) {
# On android, use the stripped version of the library, because
# applications are always fetched over the network.
library_dir = "${root_out_dir}/lib.stripped"
} else {
library_dir = root_out_dir
}
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.data_deps)) {
data_deps = invoker.data_deps
}
# Copy any necessary prebuilt artifacts.
if (mojo_use_prebuilt_mojo_shell) {
data_deps +=
[ rebase_path("mojo/public/tools:copy_mojo_shell", ".", mojo_root) ]
}
if (mojo_use_prebuilt_network_service) {
data_deps += [ rebase_path("mojo/public/tools:copy_network_service",
".",
mojo_root) ]
}
deps = rebase_path([
"mojo/public/c/system",
"mojo/public/platform/native:system",
],
".",
mojo_root)
deps += mojo_deps
if (defined(invoker.forward_dependent_configs_from)) {
forward_dependent_configs_from = invoker.forward_dependent_configs_from
}
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
}
visibility = [ ":${final_target_name}" ]
}
copy(final_target_name) {
if (defined(invoker.testonly)) {
testonly = invoker.testonly
}
if (defined(invoker.visibility)) {
visibility = invoker.visibility
}
deps = [
":${library_target_name}",
]
sources = [
"${library_dir}/${library_name}",
]
outputs = [
"${root_out_dir}/${base_target_name}/${output}",
]
}
} else {
nexe_target_name = base_target_name + "_nexe"
nexe_name = base_target_name + ".nexe"
output = "${base_target_name}_${target_cpu}.nexe.mojo"
executable(nexe_target_name) {
output_name = base_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.data_deps)) {
data_deps = invoker.data_deps
}
# Copy any necessary prebuilt artifacts.
if (mojo_use_prebuilt_mojo_shell) {
data_deps +=
[ rebase_path("mojo/public/tools:copy_mojo_shell", ".", mojo_root) ]
}
if (mojo_use_prebuilt_network_service) {
data_deps += [ rebase_path("mojo/public/tools:copy_network_service",
".",
mojo_root) ]
}
deps = rebase_path([
"mojo/public/c/system",
"mojo/public/platform/nacl:system",
],
".",
mojo_root)
deps += mojo_deps
if (defined(invoker.forward_dependent_configs_from)) {
forward_dependent_configs_from = invoker.forward_dependent_configs_from
}
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
}
visibility = [ ":${final_target_name}" ]
}
action(target_name) {
if (defined(invoker.testonly)) {
testonly = invoker.testonly
}
if (defined(invoker.visibility)) {
visibility = invoker.visibility
}
script = rebase_path("mojo/public/tools/prepend.py", ".", mojo_root)
input_path = "${root_out_dir}/${nexe_name}"
inputs = [
input_path,
]
output_path = "${root_build_dir}/${base_target_name}/${output}"
outputs = [
output_path,
]
deps = [
":${nexe_target_name}",
]
rebase_input = rebase_path(input_path, root_build_dir)
rebase_output = rebase_path(output_path, root_build_dir)
args = [
"--input=$rebase_input",
"--output=$rebase_output",
"--line=#!mojo mojo:nacl_content_handler",
]
}
}
}
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))
zip_action_name = "${target_name}_zip"
zip_action_output = "$target_gen_dir/${target_name}.zip"
prepend_action_name = target_name
action(zip_action_name) {
visibility = [ ":$prepend_action_name" ]
script = "//build/android/gn/zip.py"
inputs = [
invoker.input_so,
invoker.input_dex_jar,
]
output = zip_action_output
outputs = [
output,
]
rebase_inputs = rebase_path(inputs, root_build_dir)
rebase_output = rebase_path(output, root_build_dir)
args = [
"--inputs=$rebase_inputs",
"--output=$rebase_output",
]
if (defined(invoker.deps)) {
deps = invoker.deps
}
if (defined(invoker.public_deps)) {
public_deps = invoker.public_deps
}
if (defined(invoker.data_deps)) {
data_deps = invoker.data_deps
}
}
action(target_name) {
script = rebase_path("mojo/public/tools/prepend.py", ".", mojo_root)
base_target_name = target_name
if (defined(invoker.output_name)) {
base_target_name = invoker.output_name
}
input = zip_action_output
inputs = [
input,
]
output = "${root_out_dir}/${base_target_name}/${base_target_name}.mojo"
outputs = [
output,
]
rebase_input = rebase_path(input, root_build_dir)
rebase_output = rebase_path(output, root_build_dir)
args = [
"--input=$rebase_input",
"--output=$rebase_output",
"--line=#!mojo mojo:android_handler",
]
public_deps = [
":$zip_action_name",
]
}
}
}