--- a
+++ b/setup.py
@@ -0,0 +1,107 @@
+import sys
+
+import numpy
+from setuptools import Extension, setup
+from setuptools.command.build_ext import build_ext
+
+
+class build_ext_cxx17(build_ext):
+    def build_extensions(self):
+        std_flag = (
+            "-std:c++17" if self.compiler.compiler_type == "msvc" else "-std=c++17"
+        )
+        for e in self.extensions:
+            e.extra_compile_args.append(std_flag)
+        super().build_extensions()
+
+
+macros = [("NPY_NO_DEPRECATED_API", "NPY_1_7_API_VERSION")]
+profiling = False
+linetrace = False
+if "--profile" in sys.argv:
+    profiling = True
+    linetrace = True
+    macros += [("CYTHON_TRACE_NOGIL", "1")]
+    sys.argv.remove("--profile")
+
+common_cpp = Extension(
+    "inmoose.common_cpp",
+    [
+        "inmoose/common_cpp/common_cpp.pyx",
+        "inmoose/common_cpp/matrix.cpp",
+    ],
+    include_dirs=[numpy.get_include()],
+    define_macros=macros,
+)
+
+stats_cpp = Extension(
+    "inmoose.utils.stats_cpp",
+    [
+        "inmoose/utils/_stats.pyx",
+    ],
+    include_dirs=[numpy.get_include()],
+    define_macros=macros,
+)
+
+edgepy_cpp = Extension(
+    "inmoose.edgepy.edgepy_cpp",
+    [
+        "inmoose/edgepy/edgepy_cpp/edgepy_cpp.pyx",
+        "inmoose/edgepy/edgepy_cpp/interpolator.cpp",
+    ],
+    include_dirs=[numpy.get_include(), "inmoose/common_cpp/"],
+    define_macros=macros,
+)
+
+
+setup(
+    cmdclass={"build_ext": build_ext_cxx17},
+    packages=[
+        "inmoose",
+        "inmoose/consensus_clustering",
+        "inmoose/data",
+        "inmoose/data/airway",
+        "inmoose/data/pasilla",
+        "inmoose/pycombat",
+        "inmoose/limma",
+        "inmoose/common_cpp",
+        "inmoose/edgepy",
+        "inmoose/edgepy/edgepy_cpp",
+        "inmoose/sim",
+        "inmoose/utils",
+        "inmoose/deseq2",
+        "inmoose/diffexp",
+        "inmoose/cohort_qc",
+    ],
+    package_data={
+        "inmoose/edgepy/edgepy_cpp": [
+            "edgepy_cpp.pyx",
+            "__init__.pxd",
+            "edgepy_cpp.h",
+            "interpolator.h",
+            "maximize_interpolant.cpp",
+            "utils.h",
+        ],
+        "inmoose/common_cpp": [
+            "matrix.h",
+        ],
+        "inmoose/data/airway": [
+            "airway.h5ad",
+        ],
+        "inmoose/data/pasilla": [
+            "Dmel.BDGP5.25.62.DEXSeq.chr.gff",
+            "geneIDsinsubset.txt",
+            "pasilla_gene_counts.tsv",
+            "pasilla_sample_annotation.csv",
+            "treated1fb.txt",
+            "treated2fb.txt",
+            "treated3fb.txt",
+            "untreated1fb.txt",
+            "untreated2fb.txt",
+            "untreated3fb.txt",
+            "untreated4fb.txt",
+        ],
+        "inmoose/cohort_qc": ["qc_report.html"],
+    },
+    ext_modules=[common_cpp, edgepy_cpp, stats_cpp],
+)