# Copyright 2015 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/config/nacl/config.gni") import("//build/config/nacl/rules.gni") import("//components/nacl/features.gni") assert(enable_nacl) if (current_cpu == "pnacl") { if (is_nacl_nonsfi) { nacl_toolchain_variant = "nonsfi" } else { nacl_toolchain_variant = "pnacl" } } else if (is_nacl_glibc) { nacl_toolchain_variant = "glibc" } else { nacl_toolchain_variant = "newlib" } # Assemble data for Native Client based test # # Build a Native Client based test, including any additional support files # and copy them over to a toolchain-specific target directory. # # Variables: # output_name: name of the ouput file other than the default # sources: source files for a target # generate_nmf: whether to generate a manifest (default true) # pretranslate_pexe: whether to pre-translate pexe to nexe during build # (default true for Non-SFI, otherwise false) # nonstable_pexe: use non-finalized pexe (default false) # debug_pexe: copy both non-finalized and finalized pexe (default false) # destination_dir: the output directory relative to the $root_build_dir, # if ommitted the output directory is $root_build_dir and the manifest # will be suffixed with the name of the toolchain (optional) # test_files: additional test files to copy to $destination_dir (optional) # nmfflags: additional flags for the nmf generator (optional) template("nacl_test_data") { assert(defined(invoker.sources)) forward_variables_from(invoker, [ "destination_dir" ]) if (defined(invoker.output_name)) { output_name = invoker.output_name } else { output_name = target_name } if (current_cpu == "x64") { nmf_cpu = "x86_64" } else if (current_cpu == "x86") { nmf_cpu = "x86_32" } else { nmf_cpu = current_cpu } if (current_cpu == "pnacl") { if (defined(invoker.pretranslate_pexe)) { pretranslate_pexe = invoker.pretranslate_pexe } else { pretranslate_pexe = is_nacl_nonsfi } } else { pretranslate_pexe = false } # Note this can't test "is_win" because it's evaluated in the NaCl # toolchain context where is_win==false because current_os=="nacl". # It tests target_cpu rather than current_cpu because it's also # needed in the current_cpu=="pnacl" && pretranslate_pexe case. if (target_os == "win" && target_cpu == "x86" && !is_nacl_nonsfi && (current_cpu == "x86" || pretranslate_pexe)) { # x86 Windows builds of Chrome run on both x86 Windows and x64 # Windows. On x64 Windows, only x64 NaCl is supported, so those # tests are needed too. extra_tc_cpu = "x64" if (current_cpu == "x86") { extra_nmf_cpu = "x86_64" } } if (is_nacl_glibc) { suffix = "glibc_${nmf_cpu}" if (defined(extra_nmf_cpu)) { extra_suffix = "glibc_${extra_nmf_cpu}" glibc_tc = "//build/toolchain/nacl:glibc" assert(current_toolchain == "${glibc_tc}_${current_cpu}") extra_toolchain = "${glibc_tc}_${extra_tc_cpu}" } } else { suffix = "newlib_${nmf_cpu}" if (defined(extra_nmf_cpu)) { extra_suffix = "newlib_${extra_nmf_cpu}" newlib_tc = "//build/toolchain/nacl:clang_newlib" assert(current_toolchain == "${newlib_tc}_${current_cpu}") extra_toolchain = "${newlib_tc}_${extra_tc_cpu}" } } suffixed_output_name = "${output_name}_${suffix}" if (defined(extra_nmf_cpu)) { extra_suffixed_output_name = "${output_name}_${extra_suffix}" } if (pretranslate_pexe) { pexe_translate_target_name = target_name + "_translate_pexe_" if (defined(extra_tc_cpu)) { # There will be an extra pretranslation done below for the # extra CPU (i.e. for x64 on x86 Windows). extra_pexe_translate_target_name = pexe_translate_target_name + extra_tc_cpu } pexe_translate_target_name += target_cpu } if (defined(invoker.generate_nmf)) { generate_nmf = invoker.generate_nmf } else { generate_nmf = true } nexe_target_name = target_name + "_nexe" nexe_copy_target_name = target_name + "_copy_nexe" if (current_cpu == "pnacl" && !is_nacl_nonsfi) { if (defined(invoker.debug_pexe) && invoker.debug_pexe) { pexe_copy_debug_target_name = target_name + "_copy_pexe_debug" } } if (generate_nmf) { nmf_target_name = target_name + "_nmf" } if (defined(invoker.test_files)) { test_files_target_name = target_name + "_test_files" } final_target_name = target_name # When the destination_dir is specified, the build artifacts end up # in the that directory and the manifest is the same as the target name. # When the destination_dir is not specified, the artifacts end up # in the root build directory and the manifests are suffixed to ensure # they do not overlap in case when we build the same test using multiple # different toolchains. if (defined(invoker.destination_dir)) { target_dir = "${root_build_dir}/${destination_dir}/${nacl_toolchain_variant}" if (generate_nmf) { nmf_name = output_name } } else { target_dir = root_build_dir if (generate_nmf) { if (is_nacl_nonsfi) { nacl_toolchain_name = "pnacl_${nacl_toolchain_variant}" } else { nacl_toolchain_name = nacl_toolchain_variant } nmf_name = "${output_name}_${nacl_toolchain_name}" } } executable(nexe_target_name) { visibility = [ ":*" ] output_name = suffixed_output_name sources = invoker.sources forward_variables_from(invoker, [ "cflags", "defines", "include_dirs", "ldflags", "libs", ]) deps = [ "//build/config/nacl:nacl_base", "//ppapi/native_client:ppapi_lib", ] ldflags = [ "-pthread" ] if (defined(invoker.deps)) { deps += invoker.deps } } if (current_cpu == "pnacl" && pretranslate_pexe) { # This is a template so it can be invoked twice in the # defined(extra_tc_cpu) case below. template("nacl_test_data_pretranslate_pexe") { action(target_name) { translate_cpu = invoker.translate_cpu visibility = [ ":$nexe_copy_target_name" ] # We specify the toolchain explicitly because in the Non-SFI case, we # still want to use the pexe built using the newlib_pnacl toolchain. tests = ":ppapi_nacl_tests_nexe(//build/toolchain/nacl:newlib_pnacl)" pexe = get_label_info(tests, "root_out_dir") + "/${suffixed_output_name}.pexe" if (translate_cpu == "x86" || (is_nacl_nonsfi && (translate_cpu == "x86" || translate_cpu == "x64"))) { nmf_cpu = "x32" } else { nmf_cpu = translate_cpu } if (is_nacl_nonsfi) { suffix = "pnacl_newlib_${nmf_cpu}_nonsfi" } else { suffix = "pnacl_newlib_${nmf_cpu}" } nexe = "${root_out_dir}/${output_name}_${suffix}.nexe" script = "${nacl_toolchain_bindir}/pydir/loader.py" sources = [ pexe, ] outputs = [ nexe, ] if (is_nacl_nonsfi) { if (translate_cpu == "x86" || translate_cpu == "x64") { arch = "x86-32-nonsfi" } else if (translate_cpu == "arm") { arch = "arm-nonsfi" } } else { # TODO(phosek): remove the following once change 1360243003 is rolled # into Chrome and use translate_cpu directly. if (translate_cpu == "x86") { arch = "i686" } else if (translate_cpu == "x64") { arch = "x86-64" } else if (translate_cpu == "arm") { arch = "armv7" } else if (translate_cpu == "mipsel") { arch = "mipsel" } } # The pre-translated object file has to be linked with an IRT shim to # get a runnable nexe. This is handled by pnacl-translate, which passes # -l:libpnacl_irt_shim.a to native linker, and we need to ensure the # linker can find the correct library. if (is_nacl_nonsfi) { pnacl_irt_shim = "//ppapi/native_client/src/untrusted/pnacl_irt_shim:aot(//build/toolchain/nacl:newlib_pnacl_nonsfi)" } else { pnacl_irt_shim = "//ppapi/native_client/src/untrusted/pnacl_irt_shim:aot(//build/toolchain/nacl:clang_newlib_${translate_cpu})" } args = [ "pnacl-translate", rebase_path(pexe, root_build_dir), "-o", rebase_path(nexe, root_build_dir), "-arch", arch, "-Wl,-L" + rebase_path(get_label_info(pnacl_irt_shim, "target_out_dir"), root_build_dir), ] deps = [ ":$nexe_target_name(//build/toolchain/nacl:newlib_pnacl)", ] data_deps = [ pnacl_irt_shim, ] } } nacl_test_data_pretranslate_pexe(pexe_translate_target_name) { translate_cpu = target_cpu } if (defined(extra_tc_cpu)) { nacl_test_data_pretranslate_pexe(extra_pexe_translate_target_name) { translate_cpu = extra_tc_cpu } } } copy(nexe_copy_target_name) { visibility = [ ":$final_target_name" ] if (generate_nmf) { visibility += [ ":$nmf_target_name" ] } if (current_cpu == "pnacl") { if (pretranslate_pexe) { sources = get_target_outputs(":${pexe_translate_target_name}") if (defined(extra_tc_cpu)) { sources += get_target_outputs(":${extra_pexe_translate_target_name}") } } else if (defined(invoker.nonstable_pexe) && invoker.nonstable_pexe) { sources = [ "${root_out_dir}/exe.unstripped/${suffixed_output_name}.pexe", ] } else { sources = [ "${root_out_dir}/${suffixed_output_name}.pexe", ] } } else { sources = [ "${root_out_dir}/${suffixed_output_name}.nexe", ] if (defined(extra_nmf_cpu)) { extra_root_out_dir = get_label_info(":${nexe_target_name}(${extra_toolchain})", "root_out_dir") sources += [ "${extra_root_out_dir}/${extra_suffixed_output_name}.nexe" ] } } outputs = [ "${target_dir}/{{source_file_part}}", ] if (current_cpu == "pnacl" && pretranslate_pexe) { deps = [ ":$pexe_translate_target_name", ] if (defined(extra_tc_cpu)) { deps += [ ":$extra_pexe_translate_target_name" ] } } else { deps = [ ":$nexe_target_name", ] if (defined(extra_nmf_cpu)) { deps += [ ":${nexe_target_name}(${extra_toolchain})" ] } } } if (current_cpu == "pnacl" && !is_nacl_nonsfi) { if (defined(invoker.debug_pexe) && invoker.debug_pexe) { copy(pexe_copy_debug_target_name) { visibility = [ ":$final_target_name" ] sources = [ "${root_out_dir}/exe.unstripped/${suffixed_output_name}.pexe", ] outputs = [ "${target_dir}/{{source_name_part}}.pexe.debug", ] deps = [ ":$nexe_target_name", ] } } } if (generate_nmf) { if (is_nacl_nonsfi) { generate_nonsfi_test_nmf(nmf_target_name) { visibility = [ ":$final_target_name" ] forward_variables_from(invoker, [ "nmfflags" ]) nmf = "${target_dir}/${nmf_name}.nmf" files = get_target_outputs(":$nexe_copy_target_name") executable = files[0] deps = [ ":$nexe_copy_target_name", ] } } else { generate_nmf(nmf_target_name) { visibility = [ ":$final_target_name" ] forward_variables_from(invoker, [ "nmfflags" ]) nmf = "${target_dir}/${nmf_name}.nmf" executables = get_target_outputs(":$nexe_copy_target_name") if (is_nacl_glibc) { lib_prefix = "${output_name}_libs" stage_dependencies = target_dir } deps = [ ":$nexe_copy_target_name", ] } } } if (defined(invoker.test_files)) { copy(test_files_target_name) { visibility = [ ":$final_target_name" ] sources = invoker.test_files outputs = [ "${target_dir}/{{source_file_part}}", ] } } group(final_target_name) { data_deps = [ ":$nexe_copy_target_name", ] if (current_cpu == "pnacl" && !is_nacl_nonsfi) { if (defined(invoker.debug_pexe) && invoker.debug_pexe) { data_deps += [ ":$pexe_copy_debug_target_name" ] } } if (generate_nmf) { data_deps += [ ":$nmf_target_name" ] } if (defined(invoker.test_files)) { data_deps += [ ":$test_files_target_name" ] } } }