# Copyright 2018 the Deno authors. All rights reserved. MIT license. import("//third_party/v8/gni/v8.gni") import("//third_party/v8/snapshot_toolchain.gni") import("//build_extra/flatbuffers/flatbuffer.gni") import("//build_extra/flatbuffers/rust/rust_flatbuffer.gni") import("//build_extra/deno.gni") import("//build_extra/rust/rust.gni") group("all") { testonly = true deps = [ ":deno", ":deno_ns", ":test_cc", ":test_rs", ] } config("deno_config") { include_dirs = [ "third_party/v8" ] # This allows us to v8/src/base/ libraries. configs = [ "third_party/v8:external_config" ] if (is_debug) { defines = [ "DEBUG" ] } # Targets built with the `rust_executable()` template automatically pick up # these dependencies, but those built with `executable()` need them when they # have Rust inputs. Currently, there's only one such target, `test_cc`. if (is_mac) { libs = [ "resolv" ] } if (is_win) { libs = [ "userenv.lib" ] } } main_extern = [ "$rust_build:libc", "$rust_build:log", "$rust_build:sha1", "$rust_build:tempfile", "$rust_build:tokio", "$rust_build:url", "//build_extra/flatbuffers/rust:flatbuffers", ":msg_rs", # Indirect rust depdendencies also need to be listed here: # * Linking to `:handlers` or `:libdeno` isn't possible, because they # already contain some symbols exported by `handlers.rs`. These duplicate # symbols trip up the linker. # * The `rust_test` and `rust_executable` templates only produce an object # file, and then invoke an external linker. Transitive rust depencenies # are not resolved in either step. "$rust_build:arrayvec", "$rust_build:byteorder", "$rust_build:bytes", "$rust_build:crossbeam_deque", "$rust_build:crossbeam_epoch", "$rust_build:crossbeam_utils", "$rust_build:futures", "$rust_build:idna", "$rust_build:iovec", "$rust_build:kernel32", "$rust_build:lazy_static", "$rust_build:lazycell", "$rust_build:memoffset", "$rust_build:mio", "$rust_build:miow", "$rust_build:net2", "$rust_build:nodrop", "$rust_build:num_cpus", "$rust_build:percent_encoding", "$rust_build:rand", "$rust_build:rand_core", "$rust_build:remove_dir_all", "$rust_build:scopeguard", "$rust_build:slab", "$rust_build:tokio_executor", "$rust_build:tokio_fs", "$rust_build:tokio_io", "$rust_build:tokio_reactor", "$rust_build:tokio_tcp", "$rust_build:tokio_threadpool", "$rust_build:tokio_current_thread", "$rust_build:tokio_timer", "$rust_build:tokio_udp", "$rust_build:unicode_bidi", "$rust_build:unicode_normalization", "$rust_build:winapi", "$rust_build:ws2_32", ] # Old version of the 'winapi' crate, required by 'mio', 'miow', and 'iovec'. # This exceptional! Generally we don't allow multiple versions of a crate. # TODO: Remove this dependency. https://github.com/denoland/deno/issues/484 main_extern_version = [ { label = "$rust_build:winapi-0.2" crate_name = "winapi" crate_version = "0.2" }, ] rust_executable("deno") { source_root = "src/main.rs" extern = main_extern extern_version = main_extern_version deps = [ ":libdeno", ] } # This target is for fast incremental development. # When modifying the javascript runtime, this target will not go through the # extra process of building a snapshot and instead load the bundle from disk. # ns = no snapshot rust_executable("deno_ns") { source_root = "src/main.rs" extern = main_extern extern_version = main_extern_version deps = [ ":libdeno_nosnapshot", ] } rust_test("test_rs") { source_root = "src/main.rs" extern = main_extern extern_version = main_extern_version deps = [ ":libdeno", ] } executable("test_cc") { testonly = true sources = [ "src/flatbuffer_builder_test.cc", "src/test.cc", ] deps = [ ":deno_base_test", ":deno_flatbuffer_builder", "//testing/gtest:gtest", ] configs += [ ":deno_config" ] } static_library("libdeno") { complete_static_lib = true sources = [ "src/from_snapshot.cc", ] inputs = [ "$target_gen_dir/snapshot_deno.bin", ] deps = [ ":create_snapshot_deno", ":deno_bindings", ] configs += [ ":deno_config" ] } # Only functionality needed for libdeno_test and snapshot_creator # In particular no flatbuffers, no assets, no rust, no msg handlers. # Because snapshots are slow, it's important that snapshot_creator's # dependencies are minimal. v8_source_set("deno_base") { sources = [ "src/binding.cc", "src/deno.h", "src/file_util.cc", "src/file_util.h", "src/internal.h", ] public_deps = [ "third_party/v8:v8_monolith", ] configs = [ ":deno_config" ] } v8_source_set("deno_base_test") { testonly = true sources = [ "src/file_util_test.cc", "src/from_snapshot.cc", "src/libdeno_test.cc", ] inputs = [ "$target_gen_dir/snapshot_libdeno_test.bin", ] deps = [ ":create_snapshot_libdeno_test", ":deno_base", "//testing/gtest:gtest", ] defines = [ "LIBDENO_TEST" ] configs = [ ":deno_config" ] } v8_source_set("deno_flatbuffer_builder") { sources = [ "src/flatbuffer_builder.cc", "src/flatbuffer_builder.h", ] deps = [ ":deno_base", ] public_deps = [ "build_extra/flatbuffers:flatbuffers", ] configs = [ ":deno_config" ] } v8_source_set("deno_bindings") { sources = [ "src/reply.cc", "src/reply.h", ] deps = [ ":deno_base", ":deno_flatbuffer_builder", ":msg_cpp", ] configs = [ ":deno_config" ] } executable("snapshot_creator") { sources = [ "src/snapshot_creator.cc", ] deps = [ ":deno_base", ] configs += [ ":deno_config" ] } flatbuffer("msg_cpp") { sources = [ "src/msg.fbs", ] } # Generates type declarations for files that need to be included # in the runtime bundle run_node("gen_declarations") { out_dir = target_gen_dir sources = [ "js/console.ts", "js/deno.ts", "js/globals.ts", "js/os.ts", "js/timers.ts", "js/tsconfig.generated.json", "js/util.ts", ] outputs = [ out_dir + "/js/console.d.ts", out_dir + "/js/deno.d.ts", out_dir + "/js/globals.d.ts", out_dir + "/js/os.d.ts", out_dir + "/js/timers.d.ts", out_dir + "/js/util.d.ts", ] deps = [ ":msg_ts", ] args = [ "./node_modules/typescript/bin/tsc", "-p", rebase_path("js/tsconfig.generated.json", root_build_dir), "--baseUrl", rebase_path(root_build_dir), "--outDir", rebase_path(out_dir), ] } run_node("bundle") { out_dir = "$target_gen_dir/bundle/" sources = [ "js/assets.ts", "js/console.ts", "js/globals.ts", "js/lib.globals.d.ts", "js/main.ts", "js/os.ts", "js/plugins.d.ts", "js/runtime.ts", "js/text_encoding.ts", "js/timers.ts", "js/types.d.ts", "js/util.ts", "js/v8_source_maps.ts", "rollup.config.js", "src/msg.fbs", "tsconfig.json", ] outputs = [ out_dir + "main.js", out_dir + "main.js.map", ] deps = [ ":gen_declarations", ":msg_ts", ] args = [ "./node_modules/rollup/bin/rollup", "-c", rebase_path("rollup.config.js", root_build_dir), "-i", rebase_path("js/main.ts", root_build_dir), "-o", rebase_path(out_dir + "main.js", root_build_dir), "--sourcemapFile", rebase_path("."), "--silent", "--environment", "BASEPATH:" + rebase_path(".", root_build_dir), ] } source_set("libdeno_nosnapshot") { bundle_outputs = get_target_outputs(":bundle") bundle_location = rebase_path(bundle_outputs[0]) bundle_rel_location = rebase_path(bundle_outputs[0], root_build_dir) bundle_map_location = rebase_path(bundle_outputs[1]) inputs = bundle_outputs sources = [ "src/from_filesystem.cc", ] deps = [ ":bundle", ":deno_bindings", ] configs += [ ":deno_config" ] defines = [ "BUNDLE_LOCATION=\"$bundle_location\"", "BUNDLE_REL_LOCATION=\"$bundle_rel_location\"", "BUNDLE_MAP_LOCATION=\"$bundle_map_location\"", ] } ts_flatbuffer("msg_ts") { sources = [ "src/msg.fbs", ] } rust_flatbuffer("msg_rs") { sources = [ "src/msg.fbs", ] } # Generates $target_gen_dir/snapshot_deno.bin create_snapshot("deno") { js = "$target_gen_dir/bundle/main.js" source_map = "$target_gen_dir/bundle/main.js.map" deps = [ ":bundle", ] } # Generates $target_gen_dir/snapshot_libdeno_test.bin create_snapshot("libdeno_test") { testonly = true js = "js/libdeno_test.js" }