diff options
Diffstat (limited to 'cmake/module')
| -rw-r--r-- | cmake/module/feature.cmake | 162 |
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()]] +) |
