diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index e0b4c5dea27817da10d7ff5f0d2cd5042d27dfba..3b9e2c2101dd9a2c13a186080675fa3b030f974a 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -24,7 +24,10 @@ build-img:
   needs: ['build-img']
   script:
     - conan install -if build -g cmake_find_package catch2/2.13.7@
-    - if [ "$ENABLE_CSG" == "ON" ]; then conan install -if build -g cmake_find_package cgal/5.2.1@; fi
+    - |
+      if [ "$ENABLE_CGAL" == "ON" ]; then
+        conan install -if build -g cmake_find_package cgal/5.2.1@
+      fi
     - conan install -if build -g cmake_find_package taocpp-pegtl/3.2.1@
 
     - cmake -S.
@@ -32,7 +35,7 @@ build-img:
             -GNinja
             -DCMAKE_MODULE_PATH=$PWD/build
             -DCMAKE_BUILD_TYPE=Debug
-            -DCSG_CGAL_ENABLED=${ENABLE_CSG}
+            -DCSG_CGAL_ENABLED=${ENABLE_CGAL}
     - cmake --build build --target unit_tests_csg
     - cd build
     - ctest
@@ -41,12 +44,12 @@ build-img:
 
 test:cgal:
   variables:
-    ENABLE_CSG: "ON"
+    ENABLE_CGAL: "ON"
   <<: *cmake_def
 
 test:no_cgal:
   variables:
-    ENABLE_CSG: "OFF"
+    ENABLE_CGAL: "OFF"
   <<: *cmake_def
 
 .test:spack: &spack_def
@@ -69,3 +72,32 @@ spack:no_cgal:
   variables:
     NO_CSG: "~cgal"
   <<: *spack_def
+
+.test:gnumake: &gnumake_def
+  stage: test
+  variables:
+    BUILD: ${CI_PROJECT_DIR}/build
+    BOOST_HOME: ${BUILD}/boost
+    CATCH2_HOME: ${BUILD}/catch2
+    CGAL_HOME: ${BUILD}/cgal
+    PEGTL_HOME: ${BUILD}/taocpp-pegtl
+  image: $CI_REGISTRY_IMAGE:latest
+  needs: ['build-img']
+  script:
+    - conan install -if build -g deploy catch2/2.13.7@
+    - |
+      if [ "$ENABLE_CGAL" == "ON" ]; then
+        conan install -if build -g deploy cgal/5.2.1@
+      fi
+    - conan install -if build -g deploy taocpp-pegtl/3.2.1@
+    - make install DESTDIR=the_destination
+  tags:
+    - docker
+
+gnumake:cgal:
+  variables:
+    ENABLE_CGAL: "ON"
+  <<: *gnumake_def
+
+gnumake:no_cgal:
+  <<: *gnumake_def
diff --git a/GNUmakefile b/GNUmakefile
new file mode 100644
index 0000000000000000000000000000000000000000..6e409f086b7cf31c754202a87ab89d0f0604d15c
--- /dev/null
+++ b/GNUmakefile
@@ -0,0 +1,62 @@
+###
+### Makefile for building libcsgeb.a with GNU Make.
+### Only works with GCC compiler
+### Expects to find paths for dependencies defined in: BOOST_HOME, CATCH2_HOME, CGAL_HOME, PEGTL_HOME
+###
+
+
+
+TARGET ?= libcsgeb.a
+BUILD_DIR ?= ./build
+
+SRCFILENAMES := csg.cpp \
+	levelset_2d.cpp \
+	levelset_3d.cpp \
+	matrix_functions.cpp \
+	parser.cpp \
+	exception.cpp \
+	$(if $(ENABLE_CGAL),cgal_helper_polygon.cpp,) \
+	$(if $(ENABLE_CGAL),cgal_helper_polyhedron.cpp,)
+
+SRCS := $(SRCFILENAMES:%=./src/csg/%)
+OBJS := $(SRCS:%=$(BUILD_DIR)/%.o)
+DEPS := $(OBJS:.o=.d)
+
+INC_DIRS := src include
+INC_DIRS += $(BOOST_HOME)/include
+INC_DIRS += $(CATCH2_HOME)/include
+INC_DIRS += $(CGAL_HOME)/include
+INC_DIRS += $(PEGTL_HOME)/include
+
+INC_FLAGS := $(addprefix -I,$(INC_DIRS))
+
+CPPFLAGS ?= $(INC_FLAGS) -MMD -MP
+
+ifdef $(ENABLE_CGAL)
+	CPPFLAGS += -DUSE_CGAL
+endif
+
+$(TARGET): $(OBJS)
+	@ar rcs $(TARGET) $(OBJS)
+
+$(BUILD_DIR)/$(TARGET): $(OBJS)
+	$(CXX) $(OBJS) -o $@ $(LDFLAGS)
+
+$(BUILD_DIR)/%.cpp.o: %.cpp
+	$(MKDIR_P) $(dir $@)
+	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -std=c++17 -c $< -o $@
+
+.PHONY: install
+install: $(TARGET)
+	@$(MKDIR_P) $(DESTDIR)/lib $(DESTDIR)/include
+	install -m 0755 $< $(DESTDIR)/lib
+	install -m 0755 include/*.hpp $(DESTDIR)/include
+
+.PHONY: clean
+clean:
+	$(RM) -r $(BUILD_DIR)
+
+
+-include $(DEPS)
+
+MKDIR_P ?= mkdir -p