summaryrefslogtreecommitdiffstats
path: root/cmake
diff options
context:
space:
mode:
authorAlexey Gavrilov <alexey.gavrilov@mail.com>2026-07-16 09:20:13 +0700
committerAlexey Gavrilov <alexey.gavrilov@mail.com>2026-07-16 09:20:13 +0700
commitd956972bff16b495dbeb4d8fe9218c37423dc378 (patch)
treecfbcfa9a6e2825524ddb438aab2f036ffa6be624 /cmake
parentb0b096e37613df9b718b5bc7cc254ebaf82fe367 (diff)
Cmake feature module generates functions body
Add a new macros `createFeatureModuleFunction` that cover functions definition. If module suspends, generates all blank function. Blank function is only show a warning about module status. Generate according body and arguments of function when module is active. Signed-off-by: Alexey Gavrilov <alexey.gavrilov@mail.com>
Diffstat (limited to 'cmake')
-rw-r--r--cmake/module/feature.cmake162
1 files changed, 86 insertions, 76 deletions
diff --git a/cmake/module/feature.cmake b/cmake/module/feature.cmake
index 193df46..c8dd56a 100644
--- a/cmake/module/feature.cmake
+++ b/cmake/module/feature.cmake
@@ -15,42 +15,66 @@
# ObjectiveOS. If not, see <https://www.gnu.org/licenses/>.
]]
-get_property(IS_INITIALZIED GLOBAL PROPERTY POPULATING_FEATURES SET)
+include_guard(GLOBAL)
+
+# Used to suppress a warning: "variable were not used by the project"
+set(warnhandle ${FEATURES_SUSPEND})
+
+# Create a blank function when this module needs to suppress.
+# name - name of creating function.
+# args - names arguments of creating function. Arguments are list if they count
+# bigger than one. For instance, "first;second;third".
+# bodyfunc - body of the function instead of blank body if module doesn't
+# suspend.
+
+macro(createFeatureModuleFunction name args bodyfunc)
+ if(DEFINED FEATURES_SUSPEND)
+ function(${name} ${args})
+ message(WARNING "Feature module suspend")
+ endfunction()
+ else()
+ function(${name} ${args})
+ cmake_language(EVAL CODE "${bodyfunc}")
+ endfunction()
+ endif()
+endmacro()
-if(NOT IS_INITIALZIED)
- set_property(GLOBAL PROPERTY POPULATING_FEATURES "")
+createFeatureModuleFunction("featureModuleInitialization" ""
+[[ set_property(GLOBAL PROPERTY POPULATING_FEATURES "")
set_property(GLOBAL PROPERTY FEATURES_LIST "")
- # Features list that cannot to finish the save process
+ # Features list for cannot to finish the save process
set_property(GLOBAL PROPERTY CONSERVED_FEATURES "")
# Name of out file
set(FEATURE_OUT_FILE "CMakeFeatureOut.txt" CACHE STRING "Features data
out filename")
set(FEATURE_AVAILABLE_FIELDS "NAME;DESCRIPTION;TAGS;HASHCOMMIT;AUTHORSHIP"
- CACHE STRING "Available feature fields")
-endif()
+ CACHE STRING "Available feature fields")]]
+)
-function(startFeatureRecording target)
- get_property(
+featureModuleInitialization()
+
+createFeatureModuleFunction("startFeatureRecording" "target"
+[[ get_property(
POPULATING_FEATURES_PROPERTY
GLOBAL PROPERTY
POPULATING_FEATURES
)
- if(TARGET ${target})
- list(APPEND POPULATING_FEATURES_PROPERTY ${target})
+ if(TARGET \${target})
+ list(APPEND POPULATING_FEATURES_PROPERTY \${target})
else()
- message(WARNING "${target} isn't target")
+ message(WARNING "\${target} isn't a target")
endif()
set_property(
GLOBAL PROPERTY
- POPULATING_FEATURES ${POPULATING_FEATURES_PROPERTY}
- )
-endfunction()
+ POPULATING_FEATURES \${POPULATING_FEATURES_PROPERTY}
+ )]]
+)
-function(saveRecordingFeature)
- get_property(
+createFeatureModuleFunction("saveRecordinfFunction" ""
+[[ get_property(
POPULATING_FEATURES_PROPERTY GLOBAL PROPERTY
POPULATING_FEATURES)
get_property(
@@ -67,28 +91,28 @@ function(saveRecordingFeature)
message(WARNING "Nothing feature to save")
elseif(POPULATING_FEATURES_LENGTH EQUAL 1)
list(POP_BACK POPULATING_FEATURES_PROPERTY SAVING_FEATURE)
- list(APPEND FEATURES_LIST_PROPERTY ${SAVING_FEATURE})
+ list(APPEND FEATURES_LIST_PROPERTY \${SAVING_FEATURE})
# Finish save process for all features in CONSERVED_FEATURES list
- while(NOT "${CONSERVED_FEATURES_PROPERTY}" STREQUAL "")
+ while(NOT "\${CONSERVED_FEATURES_PROPERTY}" STREQUAL "")
list(POP_BACK CONSERVED_FEATURES_PROPERTY CONSERVED_FEATURE)
# Get last saved feature
list(GET FEATURES_LIST_PROPERTY -1 LAST_SAVED_FEATURE)
get_property(
- INHERITED_DEPENDENCIES TARGET ${LAST_FEATURE} PROPERTY
+ INHERITED_DEPENDENCIES TARGET \${LAST_FEATURE} PROPERTY
FEATURE_DEPENDENCIES)
get_property(
- CONSERVED_FEATURE_DEPENDENCIES TARGET ${CONSERVED_FEATURE} PROPERTY
+ CONSERVED_FEATURE_DEPENDENCIES TARGET \${CONSERVED_FEATURE} PROPERTY
FEATURE_DEPENDENCIES)
# Next conserved features are inherit dependencies from parent feature
- list(APPEND CONSERVED_FEATURE_DEPENDENCIES ${INHERITED_DEPENDENCIES})
- set_property(TARGET ${CONSERVED_FEATURE} PROPERTY
- FEATURE_DEPENDENCIES ${CONSERVED_FEATURE_DEPENDENCIES})
+ list(APPEND CONSERVED_FEATURE_DEPENDENCIES \${INHERITED_DEPENDENCIES})
+ set_property(TARGET \${CONSERVED_FEATURE} PROPERTY
+ FEATURE_DEPENDENCIES \${CONSERVED_FEATURE_DEPENDENCIES})
# Save conserved feature
- list(APPEND FEATURES_LIST_PROPERTY ${CONSERVED_FEATURE})
+ list(APPEND FEATURES_LIST_PROPERTY \${CONSERVED_FEATURE})
endwhile()
elseif(POPULATING_FEATURES_LENGTH GREATER 1)
list(POP_BACK POPULATING_FEATURES_PROPERTY UNFINISHED_FEATURE)
@@ -97,22 +121,22 @@ function(saveRecordingFeature)
set_property(GLOBAL PROPERTY
POPULATING_FEATURES
- ${POPULATING_FEATURES_PROPERTY})
+ \${POPULATING_FEATURES_PROPERTY})
set_property(GLOBAL PROPERTY
FEATURES_LIST
- ${FEATURES_LIST_PROPERTY})
+ \${FEATURES_LIST_PROPERTY})
set_property(GLOBAL PROPERTY
CONSERVED_FEATURES
- ${CONSERVED_FEATURES_PROPERTY})
-endfunction()
+ \${CONSERVED_FEATURES_PROPERTY})]]
+)
#[[
# Available fields are: STRING:NAME, STRING:DESCRIPTION, LIST:TAGS,
# STRING:HASHCOMMIT, STRING:AUTHORSHIP
# NAME and HASHCOMMIT must be specified.
]]
-function(setFeatureField field value)
- get_property(
+createFeatureModuleFunction("setFeatureField" "field;value"
+[[ get_property(
POPULATING_FEATURES_PROPERTY
GLOBAL PROPERTY
POPULATING_FEATURES
@@ -125,21 +149,21 @@ function(setFeatureField field value)
# associated value
if(field IN_LIST FEATURE_AVAILABLE_FIELDS AND value)
set_property(
- TARGET ${RECORDING_FEATURE}
+ TARGET \${RECORDING_FEATURE}
PROPERTY
- "FEATURE_${field}" ${value}
+ "FEATURE_\${field}" \${value}
)
endif()
else()
message(WARNING "No recording feature")
- endif()
-endfunction()
+ endif()]]
+)
#[[
# Element in names must be an architecture, compiler or another feature. Would be a list.
]]
-function(setFeatureDependency names)
- get_property( POPULATING_FEATURES_PROPERTY GLOBAL PROPERTY POPULATING_FEATURES)
+createFeatureModuleFunction("setFeatureDependency" "names"
+[[ get_property( POPULATING_FEATURES_PROPERTY GLOBAL PROPERTY POPULATING_FEATURES)
list(POP_BACK POPULATING_FEATURES_PROPERTY RECORDING_FEATURE)
list(GET -1 POPULATING_FEATURES_PROPERTY FEATURE_DEP_INHERIT)
@@ -152,75 +176,61 @@ function(setFeatureDependency names)
if(
(dependency IN_LIST FEATURES_LIST_PROPERTY
OR dependency IN_LIST POPULATING_FEATURES_PROPERTY
- AND NOT dependency STREQUAL ${RECORDING_FEATURE})
+ AND NOT dependency STREQUAL \${RECORDING_FEATURE})
OR (dependency IN_LIST OBJECTIVE_SUPPORTED_PROCESSORS)
OR (dependency MATCHES "gcc" OR dependency MATCHES "clang")
)
- list(APPEND featdep ${dependency})
+ list(APPEND featdep \${dependency})
else()
- message(WARNING "\"${dependency}\" is wrong")
+ message(WARNING "\\"\${dependency}\\" is wrong")
endif()
endforeach()
- set_property(TARGET ${RECORDING_FEATURE} PROPERTY FEATURE_DEPENDENCIES
- ${featdep})
+ set_property(TARGET \${RECORDING_FEATURE} PROPERTY FEATURE_DEPENDENCIES
+ \${featdep})
else()
message(WARNING "No recording feature")
- endif()
-endfunction()
+ endif()]]
+)
#[[
# Function that push features data into file. Content is like cmake variables.
# <FEATURE_PROPERTY> = "<VARIABLE>"
]]
-function(outFeaturesToFile)
- get_directory_property(cacheVars CACHE_VARIABLES)
+createFeatureModuleFunction("outFeaturesToFile" ""
+[[ get_directory_property(cacheVars CACHE_VARIABLES)
get_property(FEATURES_LIST GLOBAL PROPERTY FEATURES_LIST)
- set(OUT_FILE "${CMAKE_BINARY_DIR}/${FEATURE_OUT_FILE}")
- file(WRITE "${OUT_FILE}"
- "# This file contains list of kernel configurable objects\n\n")
+ set(OUT_FILE "\${CMAKE_BINARY_DIR}/\${FEATURE_OUT_FILE}")
+ file(WRITE "\${OUT_FILE}" "# This file contains list of kernel configurable objects\n\n")
- file(APPEND "${OUT_FILE}" "# Toolset variables\n")
- if("CMAKE_TOOLCHAIN_FILE" IN_LIST cacheVars
- AND NOT "${CMAKE_TOOLCHAIN_FILE}" STREQUAL "")
+ file(APPEND "\${OUT_FILE}" "# Toolset variables\n")
+ if("CMAKE_TOOLCHAIN_FILE" IN_LIST cacheVars AND NOT "\${CMAKE_TOOLCHAIN_FILE}" STREQUAL "")
cmake_path(GET CMAKE_TOOLCHAIN_FILE FILENAME TOOLCHAIN_FILE_NAME)
- file(APPEND "${OUT_FILE}"
- " -DCMAKE_TOOLCHAIN_FILE="
- "${ObjectiveProject_SOURCE_DIR}/cmake/toolchain/${TOOLCHAIN_FILE_NAME}")
+ file(APPEND "\${OUT_FILE}" " -DCMAKE_TOOLCHAIN_FILE=" "\${ObjectiveProject_SOURCE_DIR}/cmake/toolchain/\${TOOLCHAIN_FILE_NAME}")
else()
cmake_path(GET CMAKE_CXX_COMPILER FILENAME CXX_COMPILER_EXECUTABLE)
- file(APPEND "${OUT_FILE}"
- "CMAKE_CXX_COMPILER = \"${CXX_COMPILER_EXECUTABLE}\"\n")
- file(APPEND "${OUT_FILE}"
- "ObjectiveProject_ARCHITECTURE = "
- "\"${ObjectiveProject_ARCHITECTURE}\"\n")
+ file(APPEND "\${OUT_FILE}" "CMAKE_CXX_COMPILER= \\"\${CXX_COMPILER_EXECUTABLE}\\"\n")
+ file(APPEND "\${OUT_FILE}" "ObjectiveProject_ARCHITECTURE = " "\\"\${ObjectiveProject_ARCHITECTURE}\\"\n")
endif()
- file(APPEND "${OUT_FILE}" "\n\n")
+ file(APPEND "\${OUT_FILE}" "\n\n")
foreach(feature IN LISTS FEATURES_LIST)
- get_property(FEATURE_DEPENDENCIES TARGET ${feature} PROPERTY
- FEATURE_DEPENDENCIES)
+ get_property(FEATURE_DEPENDENCIES TARGET \${feature} PROPERTY FEATURE_DEPENDENCIES)
- file(APPEND "${OUT_FILE}" "# Properties for ${feature} feature\n")
+ file(APPEND "\${OUT_FILE}" "# Properties for \${feature} feature\n")
foreach(FIELD_NAME IN LISTS FEATURE_AVAILABLE_FIELDS)
- get_property("FEATURE_${FIELD_NAME}" TARGET ${feature} PROPERTY
- "FEATURE_${FIELD_NAME}")
+ get_property("FEATURE_\${FIELD_NAME}" TARGET \${feature} PROPERTY "FEATURE_\${FIELD_NAME}")
- file(APPEND "${OUT_FILE}"
- "FEATURE_${feature}_${FIELD_NAME} = \"${FEATURE_${FIELD_NAME}}\"\n")
+ file(APPEND "\${OUT_FILE}" "FEATURE_\${feature}_\${FIELD_NAME} = \\"\${FEATURE_\${FIELD_NAME}}\\"\n")
endforeach()
# Check if feature is enable, and push them to file
- if("FEATURE_${feature}" IN_LIST cacheVars
- AND NOT "${FEATURE_${feature}}" STREQUAL "")
- file(APPEND "${OUT_FILE}"
- "FEATURE_${feature}_IS_ENABLING = "
- "\"TRUE\"\n")
+ if("FEATURE_\${feature}" IN_LIST cacheVars AND NOT "\${FEATURE_\${feature}}" STREQUAL "")
+ file(APPEND "\${OUT_FILE}" "FEATURE_\${feature}_IS_ENABLING = " "\\"TRUE\\"\n")
endif()
- file(APPEND "${OUT_FILE}"
- "FEATURE_${feature}_DEPENDENCIES = \"${FEATURE_DEPENDENCIES}\"\n\n\n")
+ file(APPEND "\${OUT_FILE}" "FEATURE_\${feature}_DEPENDENCIES = \\"\${FEATURE_DEPENDENCIES}\\"\n\n\n")
- endforeach()
-endfunction()
+ endforeach()]]
+)