| # Copyright 2016 The Fuchsia 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/components.gni") |
| import("//build/fidl/fidl.gni") |
| import("//build/testing/host_test.gni") |
| |
| # This can be built as a Fuchsia executable or as a host executable. |
| # The latter allows running some of the benchmarks on Linux for |
| # comparison against Fuchsia. |
| # |
| # In principle this could be built for Mac too, but it may require |
| # changes to build and run successfully on Mac. |
| executable("bin") { |
| output_name = "fuchsia_microbenchmarks" |
| testonly = true |
| sources = [ |
| "atomics.cc", |
| "clock_posix.cc", |
| "example.cc", |
| "filesystem.cc", |
| "main.cc", |
| "malloc.cc", |
| "memcpy.cc", |
| "null.cc", |
| "pthreads.cc", |
| "random_memcpy.cc", |
| "round_trips_futex.cc", |
| "round_trips_posix.cc", |
| ] |
| if (is_host) { |
| sources += [ |
| # The getpid() microbenchmark would work on Fuchsia, but it is |
| # not useful to run it on Fuchsia because Fuchsia's getpid() |
| # function does not return a real process ID. |
| "getpid.cc", |
| "process_spawn_posix.cc", |
| ] |
| } |
| if (is_fuchsia) { |
| sources += [ |
| "async_loop.cc", |
| "channels.cc", |
| "clock.cc", |
| "context_switch_overhead.cc", |
| "events.cc", |
| "fdio_spawn.cc", |
| "fifos.cc", |
| "get_info.cc", |
| "handle.cc", |
| "handle_creation.cc", |
| "inspect.cc", |
| "lazy_dir.cc", |
| "mem_alloc.cc", |
| "mmu.cc", |
| "mutex.cc", |
| "object_wait.cc", |
| "ports.cc", |
| "prng.cc", |
| "pseudo_dir.cc", |
| "round_trips.cc", |
| "sleep.cc", |
| "sockets.cc", |
| "streams.cc", |
| "syscalls.cc", |
| "threads.cc", |
| "timer.cc", |
| "tracing.cc", |
| "util.cc", |
| "vmar.cc", |
| "vmo.cc", |
| ] |
| } |
| deps = [ |
| "//sdk/lib/syslog/cpp", |
| "//src/lib/fxl", |
| "//zircon/system/ulib/fbl", |
| ] |
| if (is_fuchsia) { |
| deps += [ |
| ":fuchsia.zircon.benchmarks", |
| "//sdk/lib/fdio", |
| "//src/lib/fsl", |
| "//src/lib/storage/vfs/cpp", |
| "//src/zircon/lib/zircon", |
| "//zircon/system/ulib/async-loop:async-loop-cpp", |
| "//zircon/system/ulib/async-loop:async-loop-default", |
| "//zircon/system/ulib/inspect", |
| "//zircon/system/ulib/zx", |
| ] |
| } |
| public_deps = [ "//zircon/system/ulib/perftest" ] |
| } |
| |
| # This is an executable that immediately exits when run. This is used by the |
| # process-spawn benchmarks. |
| executable("no_op_executable") { |
| output_name = "no_op_executable" |
| testonly = true |
| sources = [ "no_op_executable.cc" ] |
| deps = [] |
| public_deps = [] |
| } |
| |
| # "Helper" executable used to implement the context_switch_overhead benchmark. |
| executable("context_switch_overhead_helper") { |
| output_name = "context_switch_overhead_helper" |
| testonly = true |
| sources = [ "context_switch_overhead_helper.cc" ] |
| deps = [ |
| "//sdk/fidl/fuchsia.scheduler", |
| "//sdk/lib/fdio", |
| "//sdk/lib/sys/cpp", |
| "//sdk/lib/syslog/cpp", |
| "//zircon/system/ulib/zx", |
| ] |
| } |
| |
| # "Helper" executable used to implement the get_info benchmark. |
| executable("get_info_helper") { |
| output_name = "get_info_helper" |
| testonly = true |
| sources = [ "get_info_helper.cc" ] |
| deps = [ |
| "//sdk/lib/fdio", |
| "//zircon/system/ulib/zx", |
| ] |
| } |
| |
| fidl("fuchsia.zircon.benchmarks") { |
| testonly = true |
| sources = [ |
| "async_loop.fidl", |
| "round_tripper.fidl", |
| ] |
| } |
| |
| # Installing this package causes fuchsia_microbenchmarks to be run in unit |
| # test mode (fast mode) via runtests. |
| # |
| # This package requires fuchsia_microbenchmarks_perftestmode to also be |
| # installed. |
| # |
| # This package's copy of fuchsia_microbenchmarks invokes both itself |
| # (fuchsia_microbenchmarks) and no_op_executable as subprocesses, but it |
| # does so via the redirector executables in /bin (via the shell-commands |
| # package). Those point to the copies of those executables in |
| # fuchsia_microbenchmarks_perftestmode, which is why that package is |
| # required. |
| # |
| # Since Fuchsia packages cannot declare dependencies on other packages, GN |
| # targets that require fuchsia_microbenchmarks_unittestmode should depend |
| # on the fuchsia_microbenchmarks group() instead. |
| # |
| # The reason for splitting fuchsia_microbenchmarks into two packages like |
| # this is that we don't want to run fuchsia_microbenchmarks in unit test |
| # mode on the terminal-x64-release builder that runs SL4F tests, for two |
| # reasons: |
| # |
| # 1) The unit tests run on other builders, so it's unnecessary to run them |
| # a second time. |
| # 2) Running unit tests on the terminal-x64-release builder currently does |
| # not work: It results in the creation of a shard to run tests under |
| # QEMU, but running Fuchsia on QEMU on that builder does not work |
| # (perhaps because of missing dependencies). |
| fuchsia_unittest_package("fuchsia_microbenchmarks_unittestmode") { |
| package_name = "fuchsia_microbenchmarks" |
| |
| manifest = "meta/fuchsia_microbenchmarks.cmx" |
| |
| deps = [ ":bin" ] |
| } |
| |
| # This package contains the fuchsia_microbenchmarks executable and installs |
| # a redirector executable for it in /bin (via the shell-commands package). |
| # Installing this package allows fuchsia_microbenchmarks to be run by SL4F |
| # tests as a performance test (i.e. outputting performance results data). |
| # This package can be installed without installing the |
| # fuchsia_microbenchmarks_unittestmode package. |
| fuchsia_shell_package("fuchsia_microbenchmarks_perftestmode") { |
| testonly = true |
| |
| manifest = "meta/fuchsia_microbenchmarks.cmx" |
| |
| deps = [ |
| ":bin", |
| ":context_switch_overhead_helper", |
| ":get_info_helper", |
| ":no_op_executable", |
| ] |
| } |
| |
| if (is_linux) { |
| host_test("fuchsia_microbenchmarks_host_unittestmode") { |
| binary_path = "$root_out_dir/fuchsia_microbenchmarks" |
| deps = [ |
| ":bin", |
| ":runtime_deps", |
| ] |
| } |
| host_test_data("runtime_deps") { |
| sources = [ "$root_out_dir/no_op_executable" ] |
| deps = [ ":no_op_executable" ] |
| } |
| } |
| |
| # This contains all the dependencies necessary for running |
| # fuchsia_microbenchmarks in unit test mode. |
| group("tests") { |
| testonly = true |
| deps = [ |
| ":fuchsia_microbenchmarks_perftestmode", |
| ":fuchsia_microbenchmarks_unittestmode", |
| ] |
| if (host_os == "linux") { |
| deps += [ ":fuchsia_microbenchmarks_host_unittestmode($host_toolchain)" ] |
| } |
| } |
| |
| # Convenience target so that one can pass "--with //src/tests/microbenchmarks" |
| # to "fx set". |
| group("microbenchmarks") { |
| testonly = true |
| deps = [ ":tests" ] |
| } |