diff --git a/.gitignore b/.gitignore index 67d5e87c61fb..81ca17d9160b 100644 --- a/.gitignore +++ b/.gitignore @@ -23,7 +23,6 @@ /brightray/brightray.v12.suo /brightray/brightray.vcxproj* /brightray/brightray.xcodeproj/ -/build/ /dist/ /external_binaries/ /out/ diff --git a/BUILD.gn b/BUILD.gn new file mode 100644 index 000000000000..f2d102cd65c9 --- /dev/null +++ b/BUILD.gn @@ -0,0 +1,515 @@ +import("//build/config/locales.gni") +import("//tools/grit/repack.gni") +import("build/asar.gni") +import("build/npm.gni") + +if (is_mac) { + import("//build/config/mac/rules.gni") + import("//third_party/icu/config.gni") + import("//v8/gni/v8.gni") +} + +declare_args() { + electron_project_name = "electron" + electron_product_name = "Electron" + electron_company_name = "GitHub, Inc" + electron_company_abbr = "github" + electron_version = "0.0.0-dev" + + enable_run_as_node = true + enable_osr = true +} + +filenames_gypi = exec_script( + "//build/gypi_to_gn.py", + [ + rebase_path("filenames.gypi"), + "--replace=<(SHARED_INTERMEDIATE_DIR)=$target_gen_dir", + ], + "scope", + [ "filenames.gypi" ] +) + +config("branding") { + defines = [ + "ATOM_PRODUCT_NAME=\"$electron_product_name\"", + "ATOM_PROJECT_NAME=\"$electron_project_name\"", + ] +} + +config("features") { + defines = [] + if (enable_run_as_node) { + defines += [ "ENABLE_RUN_AS_NODE=1" ] + } + if (enable_osr) { + defines += [ "ENABLE_OSR=1" ] + } +} + +config("native_mate_config") { + include_dirs = [ + "//third_party/native_mate", + ] + cflags_cc = [ + "-Wno-deprecated-declarations", + ] + cflags_objcc = cflags_cc +} + +source_set("native_mate") { + deps = [ + "//base", + "//net", + "//v8:v8_headers", + "build/node", + ] + public_configs = [ ":native_mate_config" ] + sources = [ + "//third_party/native_mate/native_mate/arguments.cc", + "//third_party/native_mate/native_mate/arguments.h", + "//third_party/native_mate/native_mate/compat.h", + "//third_party/native_mate/native_mate/constructor.h", + "//third_party/native_mate/native_mate/converter.cc", + "//third_party/native_mate/native_mate/converter.h", + "//third_party/native_mate/native_mate/dictionary.cc", + "//third_party/native_mate/native_mate/dictionary.h", + "//third_party/native_mate/native_mate/function_template.cc", + "//third_party/native_mate/native_mate/function_template.h", + "//third_party/native_mate/native_mate/handle.h", + "//third_party/native_mate/native_mate/object_template_builder.cc", + "//third_party/native_mate/native_mate/object_template_builder.h", + "//third_party/native_mate/native_mate/persistent_dictionary.cc", + "//third_party/native_mate/native_mate/persistent_dictionary.h", + "//third_party/native_mate/native_mate/scoped_persistent.h", + "//third_party/native_mate/native_mate/wrappable.cc", + "//third_party/native_mate/native_mate/wrappable.h", + "//third_party/native_mate/native_mate/wrappable_base.h", + ] +} + +npm_action("atom_browserify_sandbox") { + deps = [ ":atom_js2c_copy" ] + + sandbox_args = [ + "lib/sandboxed_renderer/init.js", + "-r", "./lib/sandboxed_renderer/api/exports/electron.js:electron", + "-r", "./lib/sandboxed_renderer/api/exports/fs.js:fs", + "-r", "./lib/sandboxed_renderer/api/exports/os.js:os", + "-r", "./lib/sandboxed_renderer/api/exports/path.js:path", + "-r", "./lib/sandboxed_renderer/api/exports/child_process.js:child_process", + ] + + inputs = [ + "lib/sandboxed_renderer/init.js", + "lib/sandboxed_renderer/api/exports/electron.js", + "lib/sandboxed_renderer/api/exports/fs.js", + "lib/sandboxed_renderer/api/exports/os.js", + "lib/sandboxed_renderer/api/exports/path.js", + "lib/sandboxed_renderer/api/exports/child_process.js", + ] + outputs = [ "$target_gen_dir/js2c/preload_bundle.js" ] + + script = "browserify" + args = sandbox_args + [ + "-o", rebase_path(outputs[0]) + ] +} + +npm_action("atom_browserify_isolated") { + deps = [ ":atom_js2c_copy" ] + + inputs = [ "lib/isolated_renderer/init.js" ] + outputs = [ "$target_gen_dir/js2c/isolated_bundle.js" ] + + script = "browserify" + args = inputs + [ + "-o", rebase_path(outputs[0]) + ] +} + +copy("atom_js2c_copy") { + sources = [ + "lib/common/asar.js", + "lib/common/asar_init.js", + ] + outputs = [ "$target_gen_dir/js2c/{{source_file_part}}" ] +} + +action("atom_js2c") { + deps = [ + ":atom_js2c_copy", + ":atom_browserify_sandbox", + ":atom_browserify_isolated", + ] + + js2c_sources = filenames_gypi.js2c_sources + + browserify_sources = [ + "$target_gen_dir/js2c/isolated_bundle.js", + "$target_gen_dir/js2c/preload_bundle.js", + ] + + inputs = js2c_sources + browserify_sources + + outputs = [ "$target_gen_dir/atom_natives.h" ] + + script = "tools/js2c.py" + args = [ + rebase_path("//third_party/electron_node") + ] + rebase_path(outputs, root_build_dir) + [ + rebase_path("$target_gen_dir/js2c", root_build_dir) + ] +} + +asar("js2asar") { + sources = filenames_gypi.js_sources + outputs = [ "$root_out_dir/electron.asar" ] + root = "lib" +} + +asar("app2asar") { + sources = filenames_gypi.default_app_sources + outputs = [ "$root_out_dir/default_app.asar" ] + root = "default_app" +} + +group("electron") { + deps = [ ":electron_lib" ] +} + +static_library("electron_lib") { + configs += [ + "//v8:external_startup_data", + ] + public_configs = [ + ":branding", + ":features", + ] + deps = [ + "//chrome/common:constants", + "//components/cdm/renderer", + "//components/network_session_configurator/common", + "//components/prefs", + "//components/printing/common", + "//components/security_state/content", + "//content/public/browser", + "//device/geolocation", + "//gin", + "//net:net_resources", + "//ppapi/host", + "//ppapi/proxy", + "//ppapi/shared_impl", + "//printing", + "//services/device/wake_lock/power_save_blocker", # TODO: this requires a visibility patch to chromium src + "//skia", + "//third_party/WebKit/public:blink", + "//third_party/boringssl", + "//third_party/crashpad/crashpad/client", + "//third_party/leveldatabase", + "//third_party/libyuv", + "//third_party/webrtc/modules/desktop_capture", + "//third_party/webrtc/modules/desktop_capture:primitives", + "//ui/events:dom_keycode_converter", + "//ui/views", + "//v8", + ":atom_js2c", + ":native_mate", + "brightray", + "build/node", + ] + if (is_mac) { + deps += [ + "//ui/accelerated_widget_mac", + "//base/allocator:features", + ] + } + defines = [ + # This is defined in skia/skia_common.gypi. + "SK_SUPPORT_LEGACY_GETTOPDEVICE", + # Disable warnings for g_settings_list_schemas. + "GLIB_DISABLE_DEPRECATION_WARNINGS", + + # Import V8 symbols from shared library (node.dll / libnode.so) + "USING_V8_SHARED", + "USING_V8_PLATFORM_SHARED", + "USING_V8_BASE_SHARED", + + # Enables SkBitmap size 64 operations + #"SK_SUPPORT_LEGACY_SAFESIZE64", # doesn't seem to be needed to build? + ] + include_dirs = [ + "chromium_src", + ".", + "$target_gen_dir", + # TODO(nornagon): replace usage of SchemeRegistry by an actually exported + # API of blink, then delete this include dir. + "//third_party/WebKit/Source", + # NOTE(nornagon): other chromium files use the full path to include + # crashpad; this is just here for compatibility between GN and GYP, so that + # the #includes can be agnostic about where crashpad is vendored. + "//third_party/crashpad", + ] + + extra_source_filters = [] + if (!is_linux) { + extra_source_filters += [ + "*\bx/*", + "*_x11.h", + "*_x11.cc", + "*_gtk.h", + "*_gtk.cc", + ] + } + if (is_mac) { + extra_source_filters += [ + "*_views.cc", + "*_views.h", + "*\bviews/*", + "*/autofill_popup.cc", + "*/autofill_popup.h", + ] + } + + set_sources_assignment_filter(sources_assignment_filter + extra_source_filters) + sources = filenames_gypi.lib_sources + set_sources_assignment_filter(sources_assignment_filter) + + if (enable_run_as_node) { + sources += [ + "atom/app/node_main.cc", + "atom/app/node_main.h", + ] + } + + if (enable_osr) { + sources += [ + "atom/browser/api/atom_api_web_contents_osr.cc", + "atom/browser/osr/osr_output_device.cc", + "atom/browser/osr/osr_output_device.h", + "atom/browser/osr/osr_render_widget_host_view.cc", + "atom/browser/osr/osr_render_widget_host_view.h", + "atom/browser/osr/osr_render_widget_host_view_mac.mm", + "atom/browser/osr/osr_view_proxy.cc", + "atom/browser/osr/osr_view_proxy.h", + "atom/browser/osr/osr_web_contents_view.cc", + "atom/browser/osr/osr_web_contents_view.h", + "atom/browser/osr/osr_web_contents_view_mac.mm", + ] + deps += [ + "//ui/compositor", + "//components/viz/service", + ] + } + + if (is_mac) { + libs = [ + "Squirrel.framework", + "ReactiveCocoa.framework", + "Mantle.framework", + ] + cflags_objcc = [ + "-F", rebase_path("external_binaries", root_build_dir) + ] + if (true) { # !is_mas_build + # ReactiveCocoa which is used by Squirrel requires using __weak. + cflags_objcc += [ "-fobjc-weak" ] + } + } + if (is_linux) { + sources += filenames_gypi.lib_sources_linux + } +} + +if (is_mac) { + electron_framework_name = electron_product_name + " Framework" + electron_helper_name = electron_product_name + " Helper" + electron_framework_version = "A" + electron_mac_bundle_id = "com.$electron_company_abbr.$electron_project_name" + + mac_xib_bundle_data("electron_xibs") { + sources = [ "atom/common/resources/mac/MainMenu.xib" ] + } + + bundle_data("electron_framework_resources") { + public_deps = [ + "//content/shell:pak", + ":electron_locales", + ] + sources = [ + "$root_out_dir/content_shell.pak", + ] + if (icu_use_data_file) { + sources += [ "$root_out_dir/icudtl.dat" ] + public_deps += [ "//third_party/icu:icudata" ] + } + if (v8_use_external_startup_data) { + sources += [ + "$root_out_dir/natives_blob.bin", + "$root_out_dir/snapshot_blob.bin", + ] + public_deps += [ "//v8" ] + } + outputs = [ + "{{bundle_resources_dir}}/{{source_file_part}}", + ] + } + + bundle_data("electron_framework_libraries") { + public_deps = [ "build/node" ] + sources = [ + "$root_out_dir/libnode.dylib" + ] + outputs = [ + "{{bundle_contents_dir}}/Libraries/{{source_file_part}}" + ] + } + + bundle_data("electron_framework_helpers") { + sources = [ + "$root_out_dir/crashpad_handler", + ] + + outputs = [ + "{{bundle_resources_dir}}/{{source_file_part}}", + ] + + public_deps = [ + "//third_party/crashpad/crashpad/handler:crashpad_handler", + ] + } + + mac_framework_bundle("electron_framework") { + output_name = electron_framework_name + framework_version = electron_framework_version + framework_contents = [ "Resources" ] + public_deps = [ ":electron_lib" ] + deps = [ + "//base", + "//base:i18n", + ":electron_framework_helpers", + ":electron_framework_libraries", + ":electron_framework_resources", + ":electron_xibs", + ] + info_plist = "atom/common/resources/mac/Info.plist" + extra_substitutions = [ + "ATOM_BUNDLE_ID=$electron_mac_bundle_id.framework", + ] + + include_dirs = [ + ".", + ] + sources = filenames_gypi.framework_sources + + libs = [ + "Carbon.framework", + "QuartzCore.framework", + "Quartz.framework", + "Security.framework", + "SecurityInterface.framework", + "ServiceManagement.framework", + "StoreKit.framework", + ] + ldflags = [ + "-F", rebase_path("external_binaries", root_build_dir), + "-Wl,-install_name,@rpath/$output_name.framework/$output_name", + "-rpath", + "@loader_path/Libraries", + ] + if (is_component_build) { + ldflags += [ + "-rpath", + "@executable_path/../../../../../.." + ] + } + } + + mac_app_bundle("electron_helper_app") { + output_name = electron_helper_name + deps = [ ":electron_framework+link" ] + sources = filenames_gypi.app_sources + include_dirs = [ "." ] + info_plist = "atom/renderer/resources/mac/Info.plist" + extra_substitutions = [ + "ATOM_BUNDLE_ID=$electron_mac_bundle_id.helper", + ] + ldflags = [ + "-rpath", + "@executable_path/../../..", + ] + } + + bundle_data("electron_app_framework_bundle_data") { + sources = [ + "$root_out_dir/$electron_framework_name.framework", + "$root_out_dir/$electron_helper_name.app", + "external_binaries/Squirrel.framework", + "external_binaries/ReactiveCocoa.framework", + "external_binaries/Mantle.framework", + ] + outputs = [ + "{{bundle_contents_dir}}/Frameworks/{{source_file_part}}", + ] + public_deps = [ + ":electron_framework+link", + ":electron_helper_app", + ] + } + + bundle_data("electron_app_resources") { + public_deps = [ + ":js2asar", + ":app2asar", + ] + sources = [ + "$root_out_dir/electron.asar", + "$root_out_dir/default_app.asar", + ] + outputs = [ + "{{bundle_resources_dir}}/{{source_file_part}}" + ] + } + + repack_locales("electron_locales") { + source_patterns = [ + "${root_gen_dir}/content/app/strings/content_strings_", + ] + deps = [ + "//content/app/strings", + ] + + input_locales = locales + + if (is_mac) { + output_locales = locales_as_mac_outputs + } else { + output_locales = locales + } + + if (is_mac) { + output_dir = "$root_gen_dir/repack" + copy_data_to_bundle = true + } else { + output_dir = root_out_dir + } + } + + mac_app_bundle("electron_app") { + output_name = electron_product_name + sources = filenames_gypi.app_sources + include_dirs = [ "." ] + deps = [ + ":electron_app_framework_bundle_data", + ":electron_app_resources", + ] + info_plist = "atom/browser/resources/mac/Info.plist" + extra_substitutions = [ + "ATOM_BUNDLE_ID=$electron_mac_bundle_id", + ] + ldflags = [ + "-rpath", + "@executable_path/../Frameworks", + ] + } +} diff --git a/DEPS b/DEPS new file mode 100644 index 000000000000..32fe2377e358 --- /dev/null +++ b/DEPS @@ -0,0 +1,73 @@ +vars = { + 'chromium_version': + '63.0.3239.150', + 'libchromiumcontent_revision': + '0e8b7216fe616405ea14ff5bece3ca087ead613c', + 'node_version': + 'v9.7.0-33-g538a5023af', + 'native_mate_revision': + '4cd7d113915de0cc08e9a218be35bff9c7361906', + + 'chromium_git': + 'https://chromium.googlesource.com', + + 'electron_git': + 'https://github.com/electron', +} + +deps = { + 'src': + (Var("chromium_git")) + '/chromium/src.git@' + (Var("chromium_version")), + 'src/libchromiumcontent': + (Var("electron_git")) + '/libchromiumcontent.git@' + (Var("libchromiumcontent_revision")), + 'src/third_party/electron_node': + (Var("electron_git")) + '/node.git@' + (Var("node_version")), + 'src/third_party/native_mate': + (Var("electron_git")) + '/native-mate.git@' + (Var("native_mate_revision")), +} + +hooks = [ + { + 'action': [ + 'src/libchromiumcontent/script/apply-patches' + ], + 'pattern': + 'src/libchromiumcontent', + 'name': + 'patch_chromium' + }, + { + 'action': [ + 'src/electron/script/update-external-binaries.py' + ], + 'pattern': + 'src/electron/script/update-external-binaries.py', + 'name': + 'electron_external_binaries' + }, + { + 'action': [ + 'bash', + '-c', + # NOTE(nornagon): this ridiculous {{}} stuff is because these strings get + # variable-substituted twice by gclient. + 'echo -e "#\\n{{{{\'variables\':{{{{}}}}}}}}" > src/third_party/electron_node/config.gypi', + ], + 'pattern': 'src/third_party/electron_node', + 'name': 'touch_node_config_gypi' + }, + { + 'action': [ + 'bash', + '-c', + 'cd src/electron; npm install', + ], + 'pattern': 'src/electron/package.json', + 'name': 'electron_npm_deps' + }, +] + +recursedeps = [ + 'src', + 'src/libchromiumcontent', +] diff --git a/brightray/BUILD.gn b/brightray/BUILD.gn new file mode 100644 index 000000000000..f82f52a903e4 --- /dev/null +++ b/brightray/BUILD.gn @@ -0,0 +1,42 @@ +import("//build/config/ui.gni") + +filenames_gypi = exec_script( + "//build/gypi_to_gn.py", + [ rebase_path("filenames.gypi") ], + "scope", + [ "filenames.gypi" ] +) + +static_library("brightray") { + deps = [ + "//base", + "//components/network_session_configurator/common", + "//components/prefs", + "//content/public/browser", + "//content/shell:resources", + "//net:net_with_v8", + "//skia", + "//ui/views", + ] + + include_dirs = [ + "..", + ] + + defines = [ + "DISABLE_NACL=1", + ] + + extra_source_filters = [] + if (is_mac) { + extra_source_filters += [ + "*_views.cc", + "*_views.h", + "*\bviews/*", + ] + } + + set_sources_assignment_filter(sources_assignment_filter + extra_source_filters) + sources = filenames_gypi.brightray_sources + set_sources_assignment_filter(sources_assignment_filter) +} diff --git a/build/asar.gni b/build/asar.gni new file mode 100644 index 000000000000..d9298e82d42b --- /dev/null +++ b/build/asar.gni @@ -0,0 +1,29 @@ +import("npm.gni") + +template("asar") { + assert(defined(invoker.sources), + "Need sources in $target_name listing the JS files.") + assert(defined(invoker.outputs), + "Need asar name (as 1-element array, e.g. \$root_out_dir/foo.asar)") + assert(defined(invoker.root), + "Need asar root directory") + asar_root = invoker.root + copy_target_name = target_name + "_inputs" + copy(copy_target_name) { + sources = invoker.sources + outputs = [ + "$target_gen_dir/$target_name/{{source_target_relative}}" + ] + } + npm_action(target_name) { + forward_variables_from(invoker, ["deps", "public_deps"]) + deps = [":$copy_target_name"] + sources = invoker.sources + script = "asar" + outputs = invoker.outputs + args = [ + "pack", + rebase_path("$target_gen_dir/$target_name/$asar_root") + ] + rebase_path(outputs) + } +} diff --git a/build/node/BUILD.gn b/build/node/BUILD.gn new file mode 100644 index 000000000000..0ce0ceee3f8b --- /dev/null +++ b/build/node/BUILD.gn @@ -0,0 +1,72 @@ +action("gyp_node") { + script = "//tools/gyp/gyp_main.py" + inputs = [ + "//third_party/electron_node/common.gypi", + "//third_party/electron_node/node.gyp", + "//third_party/electron_node/node.gypi", + "node.gypi", + ] + outputs = [ + "$target_out_dir/Release_Base/build.ninja", + ] + args = [ + "-I", rebase_path("node.gypi", root_build_dir), + "-D", "component=shared_library", + "-D", "buildtype=Custom", + "-D", "target_arch=x64", + "-D", "host_arch=x64", + "-Goutput_dir=./$target_out_dir", # bizarrely, gyp generates from the build root instead of from cwd + "-fninja", + rebase_path("//third_party/electron_node/node.gyp", root_build_dir), + ] +} + +action("build_node") { + deps = [ + "//third_party/icu", + "//v8", + "//v8:v8_libbase", + "//v8:v8_libplatform", + ":gyp_node", + ] + script = "//electron/build/run-ninja.py" + args = [ + "-C", rebase_path(target_out_dir, root_build_dir) + "/Release_Base", + "node_lib" + ] + outputs = [ + "$target_out_dir/Release_Base/libnode.dylib" + ] +} + +copy("copy_node") { + deps = [ ":build_node" ] + sources = [ "$target_out_dir/Release_Base/libnode.dylib" ] + outputs = [ "$root_out_dir/{{source_file_part}}" ] +} + +config("node_config") { + include_dirs = [ + "//third_party/electron_node/src", + "//third_party/electron_node/deps/uv/include", + "//third_party/electron_node/deps/cares/include", + ] + libs = [ + "$target_out_dir/Release_Base/libnode.dylib" + ] + cflags_cc = [ + "-Wno-deprecated-declarations", + ] + defines = [ + # We need to access internal implementations of Node. + "NODE_WANT_INTERNALS=1", + "NODE_SHARED_MODE", + "HAVE_OPENSSL=1", + "HAVE_INSPECTOR=1", + ] +} + +group("node") { + public_configs = [ ":node_config" ] + public_deps = [ ":copy_node" ] +} diff --git a/build/node/node.gypi b/build/node/node.gypi new file mode 100644 index 000000000000..be563fe822be --- /dev/null +++ b/build/node/node.gypi @@ -0,0 +1,305 @@ +{ + #'includes': [ 'v8.gypi' ], + 'variables': { + 'openssl_fips': '', + 'openssl_no_asm': 1, + 'use_openssl_def': 0, + 'openssl_product': 'libopenssl.a', + 'clang': 1, + # XXX(alexeykuzmin): Must match the clang version we use. See `clang -v`. + 'llvm_version': '6.0', + 'node_release_urlbase': 'https://atom.io/download/electron', + 'node_byteorder': '