Fixes for macOS build.  Also run tests in CMake test.
diff --git a/BUILD b/BUILD
index 97380a4..a0eadb3 100644
--- a/BUILD
+++ b/BUILD
@@ -407,7 +407,7 @@
 make_shell_script(
     name = "gen_run_cmake_build",
     out = "run_cmake_build.sh",
-    contents = "mkdir build && cd build && cmake .. && make -j8"
+    contents = "mkdir build && cd build && cmake .. && make -j8 && make test"
 )
 
 sh_test(
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5c6d5fa..412cdcd 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -117,11 +117,9 @@
   upb/json/printer.h)
 target_link_libraries(upb_json
   upb)
-add_library(upb_cc_bindings
-  upb/bindings/stdc++/string.h)
-target_link_libraries(upb_cc_bindings
+add_library(upb_cc_bindings INTERFACE)
+target_link_libraries(upb_cc_bindings INTERFACE
   upb)
-set_target_properties(upb_cc_bindings PROPERTIES LINKER_LANGUAGE CXX)
 add_library(upb_test
   tests/testmain.cc
   tests/test_util.h
diff --git a/build_defs.bzl b/build_defs.bzl
index 5bbbc4f..362691a 100644
--- a/build_defs.bzl
+++ b/build_defs.bzl
@@ -147,7 +147,7 @@
         srcs = [script_src],
         testonly = 1,
         cmd = "cat $(location " + script_src + ") > $@; " +
-              "sed -i 's|INSERT_FILE_LIST_HERE|" + "\\n  ".join(file_list) + "|' $@",
+              "sed -i '' -e 's|INSERT_FILE_LIST_HERE|" + "\\\n  ".join(file_list) + "|' $@",
     )
 
     native.py_test(
diff --git a/tools/make_cmakelists.py b/tools/make_cmakelists.py
index d7996d8..b8f46b9 100755
--- a/tools/make_cmakelists.py
+++ b/tools/make_cmakelists.py
@@ -22,11 +22,12 @@
   def __init__(self, converter):
     self.converter = converter
 
-  def _add_deps(self, kwargs):
+  def _add_deps(self, kwargs, keyword=""):
     if "deps" not in kwargs:
       return
-    self.converter.toplevel += "target_link_libraries(%s\n  %s)\n" % (
+    self.converter.toplevel += "target_link_libraries(%s%s\n  %s)\n" % (
         kwargs["name"],
+        keyword,
         "\n  ".join(StripColons(kwargs["deps"]))
     )
 
@@ -37,17 +38,22 @@
     if kwargs["name"] == "amalgamation" or kwargs["name"] == "upbc_generator":
       return
     files = kwargs.get("srcs", []) + kwargs.get("hdrs", [])
-    self.converter.toplevel += "add_library(%s\n  %s)\n" % (
-        kwargs["name"],
-        "\n  ".join(files)
-    )
-    self._add_deps(kwargs)
 
-    # CMake wants to know if each library is C or C++.
-    # If there are only .h files, it can't infer. Assume C++.
-    if not filter(IsSourceFile, files):
-      line = "set_target_properties(%s PROPERTIES LINKER_LANGUAGE CXX)\n"
-      self.converter.toplevel += line % (kwargs["name"])
+    if filter(IsSourceFile, files):
+      # Has sources, make this a normal library.
+      self.converter.toplevel += "add_library(%s\n  %s)\n" % (
+          kwargs["name"],
+          "\n  ".join(files)
+      )
+      self._add_deps(kwargs)
+    else:
+      # Header-only library, have to do a couple things differently.
+      # For some info, see:
+      #  http://mariobadr.com/creating-a-header-only-library-with-cmake.html
+      self.converter.toplevel += "add_library(%s INTERFACE)\n" % (
+          kwargs["name"]
+      )
+      self._add_deps(kwargs, " INTERFACE")
 
   def cc_binary(self, **kwargs):
     pass