]> granicus.if.org Git - llvm/commitdiff
[gn build] Add build files for unittests that load shared libraries
authorNico Weber <nicolasweber@gmx.de>
Sat, 5 Jan 2019 01:39:18 +0000 (01:39 +0000)
committerNico Weber <nicolasweber@gmx.de>
Sat, 5 Jan 2019 01:39:18 +0000 (01:39 +0000)
This is slightly ugly for three reasons:

- The shlib needs to go next to the binary to be found on all platforms, so the
  build files refer to target_out_dir
- The explicit -fPIC flag needed on the shared lib side, and the -rdynamic flag
  needed on the host side, on Linux
- Plugins that refer to LLVM code and assume that the host will resolve them
  don't work on Windows -- PluginsTests won't test anything on Windows (but
  DynamicLibraryTests will, since the dll here doesn't call LLVM code)

If we get lots more of these plugin / plugin host targets it might make sense
to add a template for them. But for now, these are the last ones we need.

(We're at 6 plugin hosts, 2 of them tests, and at 6 shared libraries, 2 of them
tests as well. clang is a plugin host by default in the CMake build but not
(yet?) in the GN build.)

Differential Revision: https://reviews.llvm.org/D56330

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@350454 91177308-0d34-0410-b5e6-96231b3b80d8

utils/gn/secondary/llvm/unittests/BUILD.gn
utils/gn/secondary/llvm/unittests/Passes/BUILD.gn [new file with mode: 0644]
utils/gn/secondary/llvm/unittests/Support/DynamicLibrary/BUILD.gn [new file with mode: 0644]

index abdcbd37b91df7efbeb13b6bca65471479f89c1a..4f0450bcacc5905d112bb8e63fa9237fb812dda3 100644 (file)
@@ -33,14 +33,10 @@ group("unittests") {
     "ObjectYAML:ObjectYAMLTests",
     "OptRemarks:OptRemarksTests",
     "Option:OptionTests",
-
-    # FIXME: Add.
-    #"Passes:PluginsTests",
+    "Passes:PluginsTests",
     "ProfileData:ProfileDataTests",
     "Support:SupportTests",
-
-    # FIXME: Add.
-    #"Support/DynamicLibrary:DynamicLibraryTests",
+    "Support/DynamicLibrary:DynamicLibraryTests",
     "TextAPI:TextAPITests",
     "Transforms/IPO:IPOTests",
     "Transforms/Scalar:ScalarTests",
diff --git a/utils/gn/secondary/llvm/unittests/Passes/BUILD.gn b/utils/gn/secondary/llvm/unittests/Passes/BUILD.gn
new file mode 100644 (file)
index 0000000..6bf6e70
--- /dev/null
@@ -0,0 +1,53 @@
+import("//llvm/utils/unittest/unittest.gni")
+
+# Keyed off LLVM_ENABLE_PLUGINS in the CMake build, which is usually false
+# on Windows and true elsewhere.
+if (host_os != "win") {
+  loadable_module("TestPlugin") {
+    # Put plugin next to the unit test executable.
+    output_dir = target_out_dir
+
+    sources = [
+      "TestPlugin.cpp",
+    ]
+
+    deps = [
+      # TestPlugin doesn't want to link in any LLVM code, it just needs its
+      # headers.
+      "//llvm/include/llvm/IR:public_tablegen",
+    ]
+
+    if (host_os == "linux") {
+      # The GN build currently doesn't globally pass -fPIC, but that's
+      # needed for building .so files on Linux.  Just pass it manually
+      # for loadable_modules for now.
+      cflags = [ "-fPIC" ]
+    }
+  }
+}
+
+unittest("PluginsTests") {
+  deps = [
+    "//llvm/include/llvm/Config:config",
+    "//llvm/lib/IR",
+    "//llvm/lib/Passes",
+    "//llvm/lib/Support",
+    "//llvm/lib/Testing/Support",
+  ]
+  sources = [
+    "PluginsTest.cpp",
+  ]
+
+  # If plugins are disabled, this test will disable itself at runtime.
+  # Otherwise, reconfiguring with plugins disabled will leave behind a stale
+  # executable.
+  if (host_os != "win") {
+    deps += [ ":TestPlugin" ]
+    defines = [ "LLVM_ENABLE_PLUGINS" ]
+  }
+
+  if (host_os == "linux") {
+    # Corresponds to export_executable_symbols() in cmake.
+    ldflags = [ "-rdynamic" ]
+  }
+}
diff --git a/utils/gn/secondary/llvm/unittests/Support/DynamicLibrary/BUILD.gn b/utils/gn/secondary/llvm/unittests/Support/DynamicLibrary/BUILD.gn
new file mode 100644 (file)
index 0000000..a04559e
--- /dev/null
@@ -0,0 +1,49 @@
+import("//llvm/utils/unittest/unittest.gni")
+
+# FIXME: If we add -Wl,-z,nodelete to the global ldflags, we need to remove
+# it again for these tests (cf CMake).
+
+template("dynlib_add_module") {
+  not_needed(invoker, "*")
+
+  loadable_module(target_name) {
+    # Put plugin next to the unit test executable.
+    # This assumes that unittest() puts tests in target_out_dir.
+    output_dir = target_out_dir
+
+    sources = [
+      "PipSqueak.cpp",
+    ]
+
+    if (host_os == "linux") {
+      # The GN build currently doesn't globally pass -fPIC, but that's
+      # needed for building .so files on Linux.  Just pass it manually
+      # for loadable_modules for now.
+      cflags = [ "-fPIC" ]
+    }
+  }
+}
+
+dynlib_add_module("PipSqueak") {
+}
+
+dynlib_add_module("SecondLib") {
+}
+
+unittest("DynamicLibraryTests") {
+  deps = [
+    ":PipSqueak",
+    ":SecondLib",
+    "//llvm/include/llvm/Config:config",
+    "//llvm/lib/Support",
+  ]
+  sources = [
+    "DynamicLibraryTest.cpp",
+    "ExportedFuncs.cpp",
+  ]
+
+  if (host_os == "linux") {
+    # Corresponds to export_executable_symbols() in cmake.
+    ldflags = [ "-rdynamic" ]
+  }
+}