From 84830c81c9e0188c840d13b99e077d557f210c21 Mon Sep 17 00:00:00 2001 From: Jacob McDonnell Date: Wed, 25 Feb 2026 21:35:50 -0500 Subject: feat: Support for menuconfig & genconfig Support for menuconfig and genconfg as targets in cmake. --- .gitignore | 2 ++ CMakeLists.txt | 18 ++++++++++++++++++ Kconfig | 26 ++++++++++++++++++++++++++ cmake/Kconfig.cmake | 31 +++++++++++++++++++++++++++++++ cmake/TC-clang.cmake | 7 +++++++ configs/example_config | 3 +++ source/test.c | 8 ++++++++ tools/make-cmake-config | 3 +++ 8 files changed, 98 insertions(+) create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 Kconfig create mode 100644 cmake/Kconfig.cmake create mode 100644 cmake/TC-clang.cmake create mode 100644 configs/example_config create mode 100644 source/test.c create mode 100755 tools/make-cmake-config diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..772f2de --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.config* +build diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..2a13540 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,18 @@ +######################################################################################################################## +# General Configuration +######################################################################################################################## +cmake_minimum_required(VERSION 3.22) +project(KconfigCmake VERSION 0.0.1 LANGUAGES C) + +list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) + +include(Kconfig) + +if(CONFIG_USE_TOOLCHAIN_FILE) + include(${CONFIG_CMAKE_TOOLCHAIN_FILE}) +endif() + +include_directories(${CMAKE_BINARY_DIR}) + +add_executable(test ${CMAKE_CURRENT_SOURCE_DIR}/source/test.c) + diff --git a/Kconfig b/Kconfig new file mode 100644 index 0000000..2c34b88 --- /dev/null +++ b/Kconfig @@ -0,0 +1,26 @@ +mainmenu "Example Configuration" + +config USE_TOOLCHAIN_FILE + bool "Use Toolchain File" + default n + help + Enable toolchain file option. + +config CMAKE_TOOLCHAIN_FILE + string "Toolchain File Path" + default "TC-clang.cmake" + depends on USE_TOOLCHAIN_FILE + help + Path to toolchain file from CMake Current Source Dir. + +config AGE + int "Age" + default 18 + help + Example Int Config + +config NAME + string "Name" + default "John" + help + Example String Config diff --git a/cmake/Kconfig.cmake b/cmake/Kconfig.cmake new file mode 100644 index 0000000..e19a539 --- /dev/null +++ b/cmake/Kconfig.cmake @@ -0,0 +1,31 @@ +set(TOOL_DIR ${CMAKE_CURRENT_SOURCE_DIR}/tools) +set(KCONFIG_DIR ${TOOL_DIR}/Kconfiglib) +set(LOCAL_CONFIG ${CMAKE_CURRENT_SOURCE_DIR}/.config) + +function(parse_dot_config) +endfunction() + +if(DEFCONFIG) + execute_process(COMMAND ${KCONFIG_DIR}/defconfig.py ${CMAKE_CURRENT_SOURCE_DIR}/configs/${DEFCONFIG}) +else() + message(FATAL_ERROR "DEFCONFIG not set.") +endif() + +#if(EXISTS ${LOCAL_CONFIG}) +#endif() + +add_custom_target(menuconfig + COMMAND ${KCONFIG_DIR}/menuconfig.py + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} +) + +add_custom_target(genconfig + COMMAND ${KCONFIG_DIR}/genconfig.py --header-path ${CMAKE_BINARY_DIR}/generated.h --config-out ${CMAKE_BINARY_DIR}/config.make + COMMAND ${TOOL_DIR}/make-cmake-config ${CMAKE_BINARY_DIR}/config.make + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} +) + +if(EXISTS ${CMAKE_BINARY_DIR}/config.cmake) + include(${CMAKE_BINARY_DIR}/config.cmake) +endif() + diff --git a/cmake/TC-clang.cmake b/cmake/TC-clang.cmake new file mode 100644 index 0000000..992011f --- /dev/null +++ b/cmake/TC-clang.cmake @@ -0,0 +1,7 @@ +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR amd64) + +set(tools /usr/lib/llvm/21/) +set(CMAKE_C_COMPILER ${tools}/bin/clang) +set(CMAKE_CXX_COMPILER ${tools}/bin/clang++) +add_compile_options(-g) diff --git a/configs/example_config b/configs/example_config new file mode 100644 index 0000000..0c34f1e --- /dev/null +++ b/configs/example_config @@ -0,0 +1,3 @@ +CONFIG_USE_TOOLCHAIN_FILE=y +CONFIG_AGE=22 +CONFIG_NAME="John Smith" diff --git a/source/test.c b/source/test.c new file mode 100644 index 0000000..eac9f91 --- /dev/null +++ b/source/test.c @@ -0,0 +1,8 @@ +#include +#include "generated.h" + +int main(void) { + printf("CONFIG_AGE: %d\n", CONFIG_AGE); + printf("CONFIG_NAME: %s\n", CONFIG_NAME); +} + diff --git a/tools/make-cmake-config b/tools/make-cmake-config new file mode 100755 index 0000000..6fa7ba4 --- /dev/null +++ b/tools/make-cmake-config @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +cat $1 | awk '{print gensub(/(.*)=(.*)/, "set(\\1 \\2)", 1)}' > "$(dirname $1)/$(basename -s .make $1).cmake" -- cgit v1.2.3