--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,3 +1,8 @@
 include include/olm/*.h
-include Makefile
 include olm_build.py
+include libolm/*
+include libolm/cmake/*
+include libolm/include/olm/*
+recursive-include libolm/lib *
+include libolm/src/*
+recursive-include libolm/tests *
--- a/olm_build.py
+++ b/olm_build.py
@@ -25,12 +25,29 @@
 
 DEVELOP = os.environ.get("DEVELOP")
 
-compile_args = ["-I../include"]
+compile_args = ["-Ilibolm/include"]
 
 if DEVELOP and DEVELOP.lower() in ["yes", "true", "1"]:
     link_args.append('-Wl,-rpath=../build')
 
-headers_build = subprocess.Popen("make headers", shell=True)
-headers_build.wait()
+# Try to build with cmake first, fall back to GNU make
+try:
+    subprocess.run(
+        ["cmake", ".", "-Bbuild", "-DBUILD_SHARED_LIBS=NO"],
+        cwd="libolm", check=True,
+    )
+    subprocess.run(
+        ["cmake", "--build", "build"],
+        cwd="libolm", check=True,
+    )
+except FileNotFoundError:
+    try:
+        # try "gmake" first because some systems have a non-GNU make
+        # installed as "make"
+        subprocess.run(["gmake", "static"], cwd="libolm", check=True)
+    except FileNotFoundError:
+        # some systems have GNU make installed without the leading "g"
+        # so give that a try (though this may fail if it isn't GNU make)
+        subprocess.run(["make", "static"], cwd="libolm", check=True)
 
 ffibuilder.set_source(
@@ -43,7 +60,7 @@
         #include <olm/sas.h>
     """,
     libraries=["olm"],
-    library_dirs=[os.path.join("..", "build")],
+    library_dirs=[os.path.join("libolm", "build")],
     extra_compile_args=compile_args,
     source_extension=".cpp", # we need to link the C++ standard library, so use a C++ extension
 )
