1*6777b538SAndroid Build Coastguard Worker# Copyright 2015 The Native Client Authors. All rights reserved. 2*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Workerimport("//build/config/nacl/config.gni") 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Worker# Generate a nmf file 8*6777b538SAndroid Build Coastguard Worker# 9*6777b538SAndroid Build Coastguard Worker# Native Client Manifest (nmf) is a JSON file that tells the browser where to 10*6777b538SAndroid Build Coastguard Worker# download and load Native Client application files and libraries. 11*6777b538SAndroid Build Coastguard Worker# 12*6777b538SAndroid Build Coastguard Worker# Variables: 13*6777b538SAndroid Build Coastguard Worker# executables: .nexe/.pexe/.bc executables to generate nmf for 14*6777b538SAndroid Build Coastguard Worker# lib_prefix: path to prepend to shared libraries in the nmf 15*6777b538SAndroid Build Coastguard Worker# nmf: the name and the path of the output file 16*6777b538SAndroid Build Coastguard Worker# nmfflags: additional flags for the nmf generator 17*6777b538SAndroid Build Coastguard Worker# stage_dependencies: directory for staging libraries 18*6777b538SAndroid Build Coastguard Workertemplate("generate_nmf") { 19*6777b538SAndroid Build Coastguard Worker assert(defined(invoker.executables), "Must define executables") 20*6777b538SAndroid Build Coastguard Worker assert(defined(invoker.nmf), "Must define nmf") 21*6777b538SAndroid Build Coastguard Worker 22*6777b538SAndroid Build Coastguard Worker action(target_name) { 23*6777b538SAndroid Build Coastguard Worker forward_variables_from(invoker, 24*6777b538SAndroid Build Coastguard Worker [ 25*6777b538SAndroid Build Coastguard Worker "deps", 26*6777b538SAndroid Build Coastguard Worker "data_deps", 27*6777b538SAndroid Build Coastguard Worker "executables", 28*6777b538SAndroid Build Coastguard Worker "lib_prefix", 29*6777b538SAndroid Build Coastguard Worker "nmf", 30*6777b538SAndroid Build Coastguard Worker "nmfflags", 31*6777b538SAndroid Build Coastguard Worker "public_deps", 32*6777b538SAndroid Build Coastguard Worker "stage_dependencies", 33*6777b538SAndroid Build Coastguard Worker "testonly", 34*6777b538SAndroid Build Coastguard Worker "visibility", 35*6777b538SAndroid Build Coastguard Worker ]) 36*6777b538SAndroid Build Coastguard Worker if (!defined(nmfflags)) { 37*6777b538SAndroid Build Coastguard Worker nmfflags = [] 38*6777b538SAndroid Build Coastguard Worker } 39*6777b538SAndroid Build Coastguard Worker 40*6777b538SAndroid Build Coastguard Worker # TODO(phosek): Remove this conditional once 41*6777b538SAndroid Build Coastguard Worker # https://bugs.chromium.org/p/nativeclient/issues/detail?id=4339 is 42*6777b538SAndroid Build Coastguard Worker # resolved. 43*6777b538SAndroid Build Coastguard Worker if (current_cpu == "pnacl") { 44*6777b538SAndroid Build Coastguard Worker objdump = rebase_path("${nacl_toolchain_bindir}/x86_64-nacl-objdump") 45*6777b538SAndroid Build Coastguard Worker } else { 46*6777b538SAndroid Build Coastguard Worker objdump = rebase_path("${nacl_toolprefix}objdump") 47*6777b538SAndroid Build Coastguard Worker } 48*6777b538SAndroid Build Coastguard Worker if (host_os == "win") { 49*6777b538SAndroid Build Coastguard Worker objdump += ".exe" 50*6777b538SAndroid Build Coastguard Worker } 51*6777b538SAndroid Build Coastguard Worker 52*6777b538SAndroid Build Coastguard Worker script = "//native_client_sdk/src/tools/create_nmf.py" 53*6777b538SAndroid Build Coastguard Worker inputs = [ objdump ] 54*6777b538SAndroid Build Coastguard Worker sources = executables 55*6777b538SAndroid Build Coastguard Worker outputs = [ nmf ] 56*6777b538SAndroid Build Coastguard Worker if (is_nacl_glibc) { 57*6777b538SAndroid Build Coastguard Worker if (defined(stage_dependencies)) { 58*6777b538SAndroid Build Coastguard Worker nmfflags += [ "--stage-dependencies=" + 59*6777b538SAndroid Build Coastguard Worker rebase_path(stage_dependencies, root_build_dir) ] 60*6777b538SAndroid Build Coastguard Worker lib_path = stage_dependencies 61*6777b538SAndroid Build Coastguard Worker } else { 62*6777b538SAndroid Build Coastguard Worker lib_path = root_build_dir 63*6777b538SAndroid Build Coastguard Worker } 64*6777b538SAndroid Build Coastguard Worker if (defined(lib_prefix)) { 65*6777b538SAndroid Build Coastguard Worker nmfflags += [ "--lib-prefix=" + lib_prefix ] 66*6777b538SAndroid Build Coastguard Worker lib_path += "/${lib_prefix}" 67*6777b538SAndroid Build Coastguard Worker } 68*6777b538SAndroid Build Coastguard Worker 69*6777b538SAndroid Build Coastguard Worker # Starts empty so the code below can use += everywhere. 70*6777b538SAndroid Build Coastguard Worker data = [] 71*6777b538SAndroid Build Coastguard Worker 72*6777b538SAndroid Build Coastguard Worker nmfflags += 73*6777b538SAndroid Build Coastguard Worker [ "--library-path=" + rebase_path(root_out_dir, root_build_dir) ] 74*6777b538SAndroid Build Coastguard Worker 75*6777b538SAndroid Build Coastguard Worker # NOTE: There is no explicit dependency for the lib directory 76*6777b538SAndroid Build Coastguard Worker # (lib32 and lib64 for x86/x64) created in the product directory. 77*6777b538SAndroid Build Coastguard Worker # They are created as a side-effect of nmf creation. 78*6777b538SAndroid Build Coastguard Worker if (current_cpu != "x86" && current_cpu != "x64") { 79*6777b538SAndroid Build Coastguard Worker nmfflags += 80*6777b538SAndroid Build Coastguard Worker [ "--library-path=" + 81*6777b538SAndroid Build Coastguard Worker rebase_path("${nacl_toolchain_tooldir}/lib", root_build_dir) ] 82*6777b538SAndroid Build Coastguard Worker if (current_cpu == "arm") { 83*6777b538SAndroid Build Coastguard Worker data += [ "${lib_path}/libarm/" ] 84*6777b538SAndroid Build Coastguard Worker } else { 85*6777b538SAndroid Build Coastguard Worker data += [ "${lib_path}/lib/" ] 86*6777b538SAndroid Build Coastguard Worker } 87*6777b538SAndroid Build Coastguard Worker } else { 88*6777b538SAndroid Build Coastguard Worker # For x86-32, the lib/ directory is called lib32/ instead. 89*6777b538SAndroid Build Coastguard Worker if (current_cpu == "x86") { 90*6777b538SAndroid Build Coastguard Worker nmfflags += 91*6777b538SAndroid Build Coastguard Worker [ "--library-path=" + 92*6777b538SAndroid Build Coastguard Worker rebase_path("${nacl_toolchain_tooldir}/lib32", root_build_dir) ] 93*6777b538SAndroid Build Coastguard Worker data += [ "${lib_path}/lib32/" ] 94*6777b538SAndroid Build Coastguard Worker } 95*6777b538SAndroid Build Coastguard Worker 96*6777b538SAndroid Build Coastguard Worker # x86-32 Windows needs to build both x86-32 and x86-64 NaCl 97*6777b538SAndroid Build Coastguard Worker # binaries into the same nmf covering both architectures. That 98*6777b538SAndroid Build Coastguard Worker # gets handled at a higher level (see the nacl_test_data template), 99*6777b538SAndroid Build Coastguard Worker # so a single generate_nmf invocation gets both x86-32 and x86-64 100*6777b538SAndroid Build Coastguard Worker # nexes listed in executables. 101*6777b538SAndroid Build Coastguard Worker if (current_cpu == "x64" || target_os == "win") { 102*6777b538SAndroid Build Coastguard Worker # For x86-64, the lib/ directory is called lib64/ instead 103*6777b538SAndroid Build Coastguard Worker # when copied by create_nmf.py. 104*6777b538SAndroid Build Coastguard Worker glibc_tc = "//build/toolchain/nacl:glibc" 105*6777b538SAndroid Build Coastguard Worker assert(current_toolchain == "${glibc_tc}_${current_cpu}") 106*6777b538SAndroid Build Coastguard Worker if (current_cpu == "x64") { 107*6777b538SAndroid Build Coastguard Worker x64_out_dir = root_out_dir 108*6777b538SAndroid Build Coastguard Worker } else { 109*6777b538SAndroid Build Coastguard Worker x64_out_dir = get_label_info(":${target_name}(${glibc_tc}_x64)", 110*6777b538SAndroid Build Coastguard Worker "root_out_dir") 111*6777b538SAndroid Build Coastguard Worker } 112*6777b538SAndroid Build Coastguard Worker nmfflags += [ 113*6777b538SAndroid Build Coastguard Worker "--library-path=" + rebase_path(x64_out_dir, root_build_dir), 114*6777b538SAndroid Build Coastguard Worker "--library-path=" + 115*6777b538SAndroid Build Coastguard Worker rebase_path("${nacl_toolchain_tooldir}/lib", root_build_dir), 116*6777b538SAndroid Build Coastguard Worker ] 117*6777b538SAndroid Build Coastguard Worker data += [ "${lib_path}/lib64/" ] 118*6777b538SAndroid Build Coastguard Worker } 119*6777b538SAndroid Build Coastguard Worker } 120*6777b538SAndroid Build Coastguard Worker } 121*6777b538SAndroid Build Coastguard Worker args = [ 122*6777b538SAndroid Build Coastguard Worker "--no-default-libpath", 123*6777b538SAndroid Build Coastguard Worker "--objdump=" + rebase_path(objdump, root_build_dir), 124*6777b538SAndroid Build Coastguard Worker "--output=" + rebase_path(nmf, root_build_dir), 125*6777b538SAndroid Build Coastguard Worker ] + nmfflags + rebase_path(sources, root_build_dir) 126*6777b538SAndroid Build Coastguard Worker if (is_nacl_glibc && current_cpu == "arm") { 127*6777b538SAndroid Build Coastguard Worker deps += [ "//native_client/src/untrusted/elf_loader:elf_loader" ] 128*6777b538SAndroid Build Coastguard Worker } 129*6777b538SAndroid Build Coastguard Worker } 130*6777b538SAndroid Build Coastguard Worker} 131