Browse Source

Merge pull request #13515 from nornagon/gn-linux

chore: [gn] fix linux build
John Kleinschmidt 6 years ago
parent
commit
376094fc0c
4 changed files with 69 additions and 29 deletions
  1. 9 12
      BUILD.gn
  2. 1 1
      brightray/BUILD.gn
  3. 30 10
      build/node/BUILD.gn
  4. 29 6
      build/node/node_override.gypi

+ 9 - 12
BUILD.gn

@@ -223,7 +223,6 @@ static_library("electron_lib") {
     "//skia",
     "//third_party/WebKit/public:blink",
     "//third_party/boringssl",
-    "//third_party/crashpad/crashpad/client",
     "//third_party/leveldatabase",
     "//third_party/libyuv",
     "//ui/events:dom_keycode_converter",
@@ -244,14 +243,20 @@ static_library("electron_lib") {
   if (is_mac) {
     deps += [
       "//ui/accelerated_widget_mac",
+      "//third_party/crashpad/crashpad/client",
+    ]
+    include_dirs += [
+      # 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",
     ]
   }
   if (is_linux) {
     deps += [
-      "//build/config/linux/gtk3",
+      "//build/config/linux/gtk",
       "//chrome/browser/ui/libgtkui",
       "//device/bluetooth",
-      "//third_party/breakpad:client",
       "//ui/events/devices/x11",
       "//ui/events/platform/x11",
       "//ui/native_theme",
@@ -260,11 +265,6 @@ static_library("electron_lib") {
     ]
     configs += [ ":gio_unix" ]
   }
-  if (is_win) {
-    deps += [
-      "//third_party/breakpad:client",
-    ]
-  }
   defines = [
     # Disable warnings for g_settings_list_schemas.
     "GLIB_DISABLE_DEPRECATION_WARNINGS",
@@ -281,12 +281,9 @@ static_library("electron_lib") {
     # 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",
   ]
   if (is_linux || is_win) {
+    deps += [ "//third_party/breakpad:client" ]
     include_dirs += [
       "//third_party/breakpad",
     ]

+ 1 - 1
brightray/BUILD.gn

@@ -51,7 +51,7 @@ static_library("brightray") {
 
   if (is_linux) {
     deps += [
-      "//build/config/linux/gtk3",
+      "//build/config/linux/gtk",
       ":libnotify",
     ]
   }

+ 30 - 10
build/node/BUILD.gn

@@ -1,3 +1,9 @@
+if (is_debug) {
+  node_configuration = "Debug"
+} else {
+  node_configuration = "Release"
+}
+
 action("configure_node") {
   script = "//third_party/electron_node/configure"
   ssl_libname_suffix = ""
@@ -39,9 +45,22 @@ action("gyp_node") {
     "node_override.gypi",
   ]
   outputs = [
-    "$target_out_dir/Release/build.ninja",
+    "$target_out_dir/$node_configuration/build.ninja",
   ]
 
+  # By default, node will build a dylib called something like
+  # libnode.$node_module_version.dylib, which is inconvenient for our
+  # purposes (since it makes the library's name unpredictable). This forces
+  # it to drop the module_version from the filename and just produce
+  # `libnode.dylib`.
+  if (is_mac) {
+    shlib_suffix = "dylib"
+  } else if (is_win) {
+    shlib_suffix = "dll"
+  } else if (is_linux) {
+    shlib_suffix = "so"
+  }
+
   args = [
     "-I", rebase_path("$target_gen_dir/config.gypi", root_build_dir),
     "-I", rebase_path("node_override.gypi", root_build_dir),
@@ -50,6 +69,12 @@ action("gyp_node") {
     "-D", "target_arch=$target_cpu",
     "-D", "host_arch=$host_cpu",
     "-D", "config_gypi=" + rebase_path("$target_gen_dir/config.gypi"),
+    # This has _gn suffixed otherwise it gets overridden by a shlib_suffix
+    # that's set in node's gyp files. Don't ask me 🤷
+    "-D", "shlib_suffix_gn=" + shlib_suffix,
+    "-D", "llvm_dir=" + rebase_path("//third_party/llvm-build/Release+Asserts"),
+    "-D", "libcxx_dir=" + rebase_path("//buildtools/third_party/libc++"),
+    "-D", "libcxxabi_dir=" + rebase_path("//buildtools/third_party/libc++abi"),
     "-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),
@@ -66,23 +91,18 @@ action("build_node") {
     ":gyp_node",
   ]
   script = "//electron/build/run-ninja.py"
-  if (is_debug) {
-    configuration = "Debug"
-  } else {
-    configuration = "Release"
-  }
   args = [
-    "-C", rebase_path(target_out_dir, root_build_dir) + "/$configuration",
+    "-C", rebase_path(target_out_dir, root_build_dir) + "/$node_configuration",
     "node_lib"
   ]
   if (is_mac) {
-    outputs = [ "$target_out_dir/$configuration/libnode.dylib" ]
+    outputs = [ "$target_out_dir/$node_configuration/libnode.dylib" ]
   }
   if (is_linux) {
-    outputs = [ "$target_out_dir/$configuration/lib/libnode.so" ]
+    outputs = [ "$target_out_dir/$node_configuration/lib/libnode.so" ]
   }
   if (is_win) {
-    outputs = [ "$target_out_dir/$configuration/node.dll.lib", "$target_out_dir/$configuration/node.dll" ]
+    outputs = [ "$target_out_dir/$node_configuration/node.dll.lib", "$target_out_dir/$node_configuration/node.dll" ]
   }
 }
 

+ 29 - 6
build/node/node_override.gypi

@@ -4,13 +4,36 @@
     # that we're building v8 with icu, so force it on.
     'v8_enable_inspector': 1,
 
-    # By default, node will build a dylib called something like
-    # libnode.$node_module_version.dylib, which is inconvenient for our
-    # purposes (since it makes the library's name unpredictable). This forces
-    # it to drop the module_version from the filename and just produce
-    # `libnode.dylib`.
-    'shlib_suffix': 'dylib',
+    'shlib_suffix': '<(shlib_suffix_gn)',
   },
+  'conditions': [
+    ['OS=="linux"', {
+      'make_global_settings': [
+        ['CC', '<(llvm_dir)/bin/clang'],
+        ['CXX', '<(llvm_dir)/bin/clang++'],
+        ['CC.host', '$(CC)'],
+        ['CXX.host', '$(CXX)'],
+      ],
+      'target_defaults': {
+        'target_conditions': [
+          ['_toolset=="target"', {
+            'cflags_cc': [
+              '-std=gnu++14',
+              '-nostdinc++',
+              '-isystem<(libcxx_dir)/trunk/include',
+              '-isystem<(libcxxabi_dir)/trunk/include',
+            ],
+            'ldflags': [
+              '-nostdlib++',
+            ],
+            'libraries': [
+              '../../../../../../libc++.so',
+            ],
+          }]
+        ]
+      }
+    }]
+  ],
   'target_defaults': {
     'target_conditions': [
       ['_target_name=="node_lib"', {