| # Copyright 2015 The Native Client 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/config/nacl/config.gni") |
| import("//build/config/python.gni") |
| |
| # Generate a nmf file |
| # |
| # Native Client Manifest (nmf) is a JSON file that tells the browser where to |
| # download and load Native Client application files and libraries. |
| # |
| # Variables: |
| # executables: .nexe/.pexe/.bc executables to generate nmf for |
| # lib_prefix: path to prepend to shared libraries in the nmf |
| # nmf: the name and the path of the output file |
| # nmfflags: additional flags for the nmf generator |
| # stage_dependencies: directory for staging libraries |
| template("generate_nmf") { |
| assert(defined(invoker.executables), "Must define executables") |
| assert(defined(invoker.nmf), "Must define nmf") |
| |
| # TODO(crbug.com/1112471): Get this to run cleanly under Python 3. |
| python2_action(target_name) { |
| forward_variables_from(invoker, |
| [ |
| "deps", |
| "data_deps", |
| "executables", |
| "lib_prefix", |
| "nmf", |
| "nmfflags", |
| "public_deps", |
| "stage_dependencies", |
| "testonly", |
| "visibility", |
| ]) |
| if (!defined(nmfflags)) { |
| nmfflags = [] |
| } |
| |
| # TODO(phosek): Remove this conditional once |
| # https://bugs.chromium.org/p/nativeclient/issues/detail?id=4339 is |
| # resolved. |
| if (current_cpu == "pnacl") { |
| objdump = rebase_path("${nacl_toolchain_bindir}/x86_64-nacl-objdump") |
| } else { |
| objdump = rebase_path("${nacl_toolprefix}objdump") |
| } |
| if (host_os == "win") { |
| objdump += ".exe" |
| } |
| |
| script = "//native_client_sdk/src/tools/create_nmf.py" |
| inputs = [ objdump ] |
| sources = executables |
| outputs = [ nmf ] |
| if (is_nacl_glibc) { |
| if (defined(stage_dependencies)) { |
| nmfflags += [ "--stage-dependencies=" + |
| rebase_path(stage_dependencies, root_build_dir) ] |
| lib_path = stage_dependencies |
| } else { |
| lib_path = root_build_dir |
| } |
| if (defined(lib_prefix)) { |
| nmfflags += [ "--lib-prefix=" + lib_prefix ] |
| lib_path += "/${lib_prefix}" |
| } |
| |
| # Starts empty so the code below can use += everywhere. |
| data = [] |
| |
| nmfflags += |
| [ "--library-path=" + rebase_path(root_out_dir, root_build_dir) ] |
| |
| # NOTE: There is no explicit dependency for the lib directory |
| # (lib32 and lib64 for x86/x64) created in the product directory. |
| # They are created as a side-effect of nmf creation. |
| if (current_cpu != "x86" && current_cpu != "x64") { |
| nmfflags += |
| [ "--library-path=" + |
| rebase_path("${nacl_toolchain_tooldir}/lib", root_build_dir) ] |
| if (current_cpu == "arm") { |
| data += [ "${lib_path}/libarm/" ] |
| } else { |
| data += [ "${lib_path}/lib/" ] |
| } |
| } else { |
| # For x86-32, the lib/ directory is called lib32/ instead. |
| if (current_cpu == "x86") { |
| nmfflags += |
| [ "--library-path=" + |
| rebase_path("${nacl_toolchain_tooldir}/lib32", root_build_dir) ] |
| data += [ "${lib_path}/lib32/" ] |
| } |
| |
| # x86-32 Windows needs to build both x86-32 and x86-64 NaCl |
| # binaries into the same nmf covering both architectures. That |
| # gets handled at a higher level (see the nacl_test_data template), |
| # so a single generate_nmf invocation gets both x86-32 and x86-64 |
| # nexes listed in executables. |
| if (current_cpu == "x64" || target_os == "win") { |
| # For x86-64, the lib/ directory is called lib64/ instead |
| # when copied by create_nmf.py. |
| glibc_tc = "//build/toolchain/nacl:glibc" |
| assert(current_toolchain == "${glibc_tc}_${current_cpu}") |
| if (current_cpu == "x64") { |
| x64_out_dir = root_out_dir |
| } else { |
| x64_out_dir = get_label_info(":${target_name}(${glibc_tc}_x64)", |
| "root_out_dir") |
| } |
| nmfflags += [ |
| "--library-path=" + rebase_path(x64_out_dir, root_build_dir), |
| "--library-path=" + |
| rebase_path("${nacl_toolchain_tooldir}/lib", root_build_dir), |
| ] |
| data += [ "${lib_path}/lib64/" ] |
| } |
| } |
| } |
| args = [ |
| "--no-default-libpath", |
| "--objdump=" + rebase_path(objdump, root_build_dir), |
| "--output=" + rebase_path(nmf, root_build_dir), |
| ] + nmfflags + rebase_path(sources, root_build_dir) |
| if (is_nacl_glibc && current_cpu == "arm") { |
| deps += [ "//native_client/src/untrusted/elf_loader:elf_loader" ] |
| } |
| } |
| } |
| |
| # Generate a nmf file for Non-SFI tests |
| # |
| # Non-SFI tests use a different manifest format from regular Native Client and |
| # as such requires a different generator. |
| # |
| # Variables: |
| # executable: Non-SFI .nexe executable to generate nmf for |
| # nmf: the name and the path of the output file |
| # nmfflags: additional flags for the nmf generator |
| template("generate_nonsfi_test_nmf") { |
| assert(defined(invoker.executable), "Must define executable") |
| assert(defined(invoker.nmf), "Must define nmf") |
| |
| action(target_name) { |
| forward_variables_from(invoker, |
| [ |
| "deps", |
| "data_deps", |
| "executable", |
| "nmf", |
| "testonly", |
| "public_deps", |
| "visibility", |
| ]) |
| |
| script = "//ppapi/tests/create_nonsfi_test_nmf.py" |
| sources = [ executable ] |
| outputs = [ nmf ] |
| |
| # NOTE: We use target_cpu rather than current_cpu on purpose because |
| # current_cpu is always going to be pnacl for Non-SFI, but the Non-SFI |
| # .nexe executable is always translated to run on the target machine. |
| if (target_cpu == "x86") { |
| arch = "x86-32" |
| } else if (target_cpu == "x64") { |
| arch = "x86-64" |
| } else { |
| arch = target_cpu |
| } |
| args = [ |
| "--program=" + rebase_path(executable, root_build_dir), |
| "--arch=${arch}", |
| "--output=" + rebase_path(nmf, root_build_dir), |
| ] |
| if (defined(invoker.nmfflags)) { |
| args += invoker.nmfflags |
| } |
| } |
| } |