diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..8480c19cb63498036b762d96f45cbad3096c3673
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,56 @@
+cmake_minimum_required(VERSION 3.16.0)
+
+project(qt6ct LANGUAGES CXX)
+
+set(CMAKE_CXX_STANDARD 11)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+
+set(CMAKE_AUTOMOC ON)
+set(CMAKE_AUTORCC ON)
+set(CMAKE_AUTOUIC ON)
+
+find_package(Qt6 COMPONENTS BuildInternals Core Concurrent Gui REQUIRED)
+find_package(Qt6 COMPONENTS Widgets)
+
+add_subdirectory(src/qt6ct)
+#add_subdirectory(qt6ct-qtplugin)
+#add_subdirectory(qt6ct-style)
+
+if(UNIX)
+    add_custom_target(distclean @echo cleaning for source distribution)
+
+    add_custom_command(
+        COMMENT "distribution clean"
+        COMMAND make
+        ARGS -C ${CMAKE_CURRENT_BINARY_DIR} clean
+        COMMAND find
+        ARGS ${CMAKE_CURRENT_BINARY_DIR} -name "CMakeCache.txt" | xargs rm -rf
+        COMMAND find
+        ARGS ${CMAKE_CURRENT_BINARY_DIR} -name "CMakeFiles" | xargs rm -rf
+        COMMAND find
+        ARGS ${CMAKE_CURRENT_BINARY_DIR} -name "Makefile" | xargs rm -rf
+        COMMAND find
+        ARGS ${CMAKE_CURRENT_BINARY_DIR} -name \"*.cmake\" | xargs rm -rf
+        COMMAND find
+        ARGS ${CMAKE_CURRENT_SOURCE_DIR} -name "*.qm" | xargs rm -rf
+        COMMAND find
+        ARGS ${CMAKE_CURRENT_BINARY_DIR} -name "*.pc" | xargs rm -rf
+        COMMAND find
+        ARGS ${CMAKE_CURRENT_BINARY_DIR} -name "*.depends" | xargs rm -rf
+        COMMAND find
+        ARGS ${CMAKE_CURRENT_BINARY_DIR} -name "*.cxx_parameters" | xargs rm -rf
+        COMMAND find
+        ARGS ${CMAKE_CURRENT_BINARY_DIR} -name "moc_*.cpp" | xargs rm -rf
+        COMMAND find
+        ARGS ${CMAKE_CURRENT_BINARY_DIR} -name "qrc_*.cxx" | xargs rm -rf
+        COMMAND find
+        ARGS ${CMAKE_CURRENT_BINARY_DIR} -name "*_automoc.cpp" | xargs rm -rf
+        COMMAND rm
+        ARGS -rf ${CMAKE_CURRENT_BINARY_DIR}/install_manifest.txt
+        COMMAND find
+        ARGS ${CMAKE_CURRENT_BINARY_DIR} -name *_automoc.dir | xargs rm -rf
+        COMMAND rm
+        ARGS -rf ${CMAKE_CURRENT_BINARY_DIR}/doc/html
+        TARGET  distclean
+    )
+endif(UNIX)
diff --git a/src/qt6ct/CMakeLists.txt b/src/qt6ct/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..4e5df1abb507a3f724b9860c07cced9bfa4feffb
--- /dev/null
+++ b/src/qt6ct/CMakeLists.txt
@@ -0,0 +1,31 @@
+project(app)
+
+add_definitions(-DUSE_WIDGETS)
+
+set(app_SRCS
+  appearancepage.cpp
+  fontconfigdialog.cpp
+  fontspage.cpp
+  iconthemepage.cpp
+  interfacepage.cpp
+  main.cpp
+  mainwindow.cpp
+  paletteeditdialog.cpp
+  qsseditordialog.cpp
+  qsspage.cpp
+  qt6ct.cpp
+  tabpage.cpp
+  appearancepage.ui
+  fontconfigdialog.ui
+  fontspage.ui
+  iconthemepage.ui
+  interfacepage.ui
+  mainwindow.ui
+  paletteeditdialog.ui
+  previewform.ui
+  qsseditordialog.ui
+  qsspage.ui
+)
+
+add_executable(qt6ct ${app_SRCS})
+target_link_libraries(qt6ct PRIVATE Qt6::Widgets Qt6::Concurrent Qt6::WidgetsPrivate)