diff --git a/.gitignore b/.gitignore index b12c5fa..07a8c66 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,4 @@ **/.mypy_cache **/__pycache__ **/build -ccgen.* dist \ No newline at end of file diff --git a/README.md b/README.md index 03bd09e..82e3312 100644 --- a/README.md +++ b/README.md @@ -14,11 +14,13 @@ pip install -U git+https://github.com/BraynStorm/ccgen ``` ## Usage -Set your CMake Module Path like this: -``` --DCMAKE_MODULE_PATH=%LOCALAPPDATA%\Python\PythonXXX\Lib\site-packages\ccgen\share\cmake +Use the following snippet in your top-level CMakeLists.txt +```cmake +find_package(Python3 REQUIRED COMPONENTS Interpreter) +execute_process(COMMAND ${Python3_EXECUTABLE} -m ccgen.cmake OUTPUT_VARIABLE CCGEN_CMAKE OUTPUT_STRIP_TRAILING_WHITESPACE) +list(APPEND CMAKE_MODULE_PATH "${CCGEN_CMAKE}") +include(ccgen) ``` -on Windows or the equivalent on your operating system. ## Example CMake project See the examples/ folder for full examples. @@ -44,10 +46,13 @@ enums: ### CMakeLists.txt ```cmake -cmake_minimum_required(VERSION 3.15) +cmake_minimum_required(VERSION 3.23) project(MyProject) +find_package(Python3 REQUIRED COMPONENTS Interpreter) +execute_process(COMMAND ${Python3_EXECUTABLE} -m ccgen.cmake OUTPUT_VARIABLE CCGEN_CMAKE OUTPUT_STRIP_TRAILING_WHITESPACE) +list(APPEND CMAKE_MODULE_PATH "${CCGEN_CMAKE}") include(ccgen) # Important: Name your YAML files *.ccgen.yaml diff --git a/ccgen/cmake.py b/ccgen/cmake.py new file mode 100644 index 0000000..fd9e527 --- /dev/null +++ b/ccgen/cmake.py @@ -0,0 +1,3 @@ +from pathlib import Path + +print(Path(__file__).parent / "share" / "cmake") diff --git a/ccgen/share/cmake/ccgen.cmake b/ccgen/share/cmake/ccgen.cmake new file mode 100644 index 0000000..4c3b83e --- /dev/null +++ b/ccgen/share/cmake/ccgen.cmake @@ -0,0 +1,39 @@ +# Auxiliary file for CCGEN in Cmake +# +# Provides a ccgen(...) function to compile all *.ccgen.yaml files to a .c/.h pair +# Usage: after you define your target do: +# include(ccgen.cmake) +# ... +# add_executable(MY_TARGET src1.c, src2.c, src3.yaml) +# ... +# ccgen(MY_TARGET) +# target +# +# To use, feel free to copy this file to your CMakeLists.txt directory. + +function(ccgen target) + get_target_property(sources ${target} SOURCES) + foreach(yaml_file in ${sources}) + cmake_path(GET yaml_file EXTENSION ext) + if("${ext}" MATCHES ".*\.ccgen\.yaml$") + cmake_path(GET yaml_file STEM gen) + add_custom_command( + COMMAND ${Python3_EXECUTABLE} -m ccgen "${yaml_file}" -o "${CMAKE_BINARY_DIR}" + OUTPUT + "${CMAKE_BINARY_DIR}/${gen}.ccgen.c" + "${CMAKE_BINARY_DIR}/${gen}.ccgen.h" + DEPENDS + "${yaml_file}" + COMMENT "CCGen - genetate files." + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" + ) + target_sources( + ${target} + PRIVATE + "${CMAKE_BINARY_DIR}/${gen}.ccgen.c" + "${CMAKE_BINARY_DIR}/${gen}.ccgen.h" + ) + endif() + endforeach() + target_include_directories(${target} PUBLIC "${CMAKE_BINARY_DIR}") +endfunction() diff --git a/examples/01_poc/CMakeLists.txt b/examples/01_poc/CMakeLists.txt index 5b24f39..9d97478 100644 --- a/examples/01_poc/CMakeLists.txt +++ b/examples/01_poc/CMakeLists.txt @@ -1,8 +1,12 @@ cmake_minimum_required(VERSION 3.23) project(MyProject) -include(ccgen.cmake) +find_package(Python3 REQUIRED COMPONENTS Interpreter) -add_executable(MyExec main.c enums.ccgen.yaml) +execute_process(COMMAND ${Python3_EXECUTABLE} -m ccgen.cmake OUTPUT_VARIABLE CCGEN_CMAKE OUTPUT_STRIP_TRAILING_WHITESPACE) +list(APPEND CMAKE_MODULE_PATH "${CCGEN_CMAKE}") + +include(ccgen) +add_executable(MyExec main.c enums.ccgen.yaml) ccgen(MyExec) diff --git a/pyproject.toml b/pyproject.toml index 3f6def2..2dd50c2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "ccgen" description = "Simple C code generator for enums." -version = "0.1.1" +version = "0.1.2" classifiers = [ "License :: OSI Approved :: MIT License", ]