diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..d09476a
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,53 @@
+cmake_minimum_required(VERSION 3.12)
+
+project(CTGL VERSION 1.0 LANGUAGES CXX)
+
+
+add_library(${PROJECT_NAME} INTERFACE)
+
+include(GNUInstallDirs)
+
+target_include_directories(${PROJECT_NAME} INTERFACE
+ $
+ $)
+
+
+set(CMAKE_INSTALL_INCLUDEDIR "include/${PROJECT_NAME}")
+
+include(CMakePackageConfigHelpers)
+
+# Create version file
+write_basic_package_version_file("${PROJECT_NAME}ConfigVersion.cmake"
+ VERSION ${PROJECT_VERSION}
+ COMPATIBILITY SameMajorVersion)
+
+# Create a configuration file
+configure_package_config_file(
+ "${PROJECT_SOURCE_DIR}/cmake/config.cmake.in"
+ "${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
+ INSTALL_DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/cmake/${PROJECT_NAME}
+ PATH_VARS CMAKE_INSTALL_INCLUDEDIR)
+
+# Install config and version files
+install(FILES "${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
+ "${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
+ DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/cmake/${PROJECT_NAME})
+
+# Define the install targets
+install(TARGETS ${PROJECT_NAME}
+ EXPORT ${PROJECT_NAME}Targets
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+ INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
+
+
+# Install the public headers
+install(DIRECTORY src/h/
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
+
+# Install the targets
+install(EXPORT ${PROJECT_NAME}Targets
+ FILE ${PROJECT_NAME}Targets.cmake
+ NAMESPACE ${PROJECT_NAME}::
+ DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/cmake/${PROJECT_NAME})
diff --git a/cmake/config.cmake.in b/cmake/config.cmake.in
new file mode 100644
index 0000000..6e1cd02
--- /dev/null
+++ b/cmake/config.cmake.in
@@ -0,0 +1,7 @@
+
+@PACKAGE_INIT@
+
+include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
+
+set_and_check(@PROJECT_NAME@_INCLUDE_DIR "@PACKAGE_CMAKE_INSTALL_INCLUDEDIR@")
+check_required_components("@PROJECT_NAME@")
diff --git a/makefile b/makefile
deleted file mode 100644
index dbab5f5..0000000
--- a/makefile
+++ /dev/null
@@ -1,40 +0,0 @@
-# Flags
-# ------------------------------------------------------------------------------
-# Allow users to specify their preferred C++ compiler.
-COMPILER=g++
-# Allow users to specify custom compiler flags.
-FLAGS=-O2
-
-
-# Paths
-# ------------------------------------------------------------------------------
-# Directories
-BIN_DIR=./bin
-CPP_DIR=./src/cpp
-TEST_DIR=./src/test
-
-# Executables
-MAIN_EXE=$(BIN_DIR)/ctgl.exe
-TEST_EXE=$(BIN_DIR)/ctgl_test.exe
-
-# Files
-TEST_FILES=$(wildcard $(TEST_DIR)/*_test.cpp)
-
-
-# Rules
-# ------------------------------------------------------------------------------
-all: bin
- @rm -f $(MAIN_EXE)
- @$(COMPILER) $(FLAGS) -std=c++17 -pedantic-errors -Wall -Wfatal-errors -o $(MAIN_EXE) $(CPP_DIR)/ctgl.cpp
- @$(MAIN_EXE)
-
-test: bin
- @rm -f $(TEST_EXE)
- @$(COMPILER) $(FLAGS) -std=c++17 -pedantic-errors -Wall -Wfatal-errors -o $(TEST_EXE) $(TEST_FILES) -lgtest -lgtest_main
- @$(TEST_EXE)
-
-bin:
- @mkdir -p $(BIN_DIR)
-
-clean:
- @rm -rf $(BIN_DIR)