|
|
@@ -8,65 +8,91 @@ if(POLICY CMP0007)
|
|
|
endif()
|
|
|
|
|
|
function(ParseMakefile MKFile)
|
|
|
- _ParseMakefile(${MKFile})
|
|
|
+ _ParseMakefile(${MKFile} ${ARGN})
|
|
|
endfunction()
|
|
|
|
|
|
macro(_ParseMakefile MKFile)
|
|
|
- message(VERBOSE "Parsing ${MKFile}")
|
|
|
+ message(CHECK_START "Parsing Makefile")
|
|
|
+ list(APPEND CMAKE_MESSAGE_INDENT " ")
|
|
|
+ message(STATUS "Reading \"${MKFile}\"")
|
|
|
+
|
|
|
file(READ "${MKFile}" FileContents)
|
|
|
+ # replace the \ newlines with spaces
|
|
|
string(REGEX REPLACE "\\\\\r?\n *" " " FileContents ${FileContents})
|
|
|
- string(REGEX REPLACE "(\r?\n)+" ";" FileLines ${FileContents})
|
|
|
+ # turn each line into an item in a list
|
|
|
+ string(REGEX REPLACE "\r?\n" ";" FileLines ${FileContents})
|
|
|
list(REMOVE_ITEM FileLines "")
|
|
|
|
|
|
foreach(line ${FileLines})
|
|
|
- # if(line MATCHES "\\$\\((.+)\\)")
|
|
|
- # set(MAKE_VARIABLE "${CMAKE_MATCH_1}")
|
|
|
- # string(REPLACE "$(${MAKE_VARIABLE})" "${${MAKE_VARIABLE}}" line ${line})
|
|
|
- # endif()
|
|
|
- # message(STATUS "From: ${line}")
|
|
|
+ # remove comments from the ends of each line
|
|
|
string(REGEX REPLACE "#.*" "" line ${line})
|
|
|
|
|
|
+ # remove now-empty lines
|
|
|
if("${line}" STREQUAL "")
|
|
|
continue()
|
|
|
endif()
|
|
|
|
|
|
- string(REGEX REPLACE "\\$\\(([^\\(\\)]+)\\)" "${CHIBIOS}" line ${line})
|
|
|
+ # try to process includes, if the file exists
|
|
|
+ if(line MATCHES "^-?include (.+)$")
|
|
|
+ set(MAKE_CHILD ${CMAKE_MATCH_1})
|
|
|
+ if(EXISTS ${MAKE_CHILD})
|
|
|
+ _ParseMakefile("${MAKE_CHILD}" ${ARGN})
|
|
|
+ else()
|
|
|
+ message(STATUS "Could not read ${MAKE_CHILD}")
|
|
|
+ endif()
|
|
|
+ continue()
|
|
|
+ endif()
|
|
|
|
|
|
- # message(STATUS "To : ${line}")
|
|
|
- # if(line MATCHES "^include (.+)$")
|
|
|
- # set(MAKE_CHILD ${CMAKE_MATCH_1})
|
|
|
- # message(STATUS "Reading ${MAKE_CHILD}")
|
|
|
- # _ParseMakefile("${MAKE_CHILD}")
|
|
|
- # else()
|
|
|
+ # turn the assignment into a list with the first item being the variable name
|
|
|
string(REPLACE "=" ";" line_split ${line})
|
|
|
list(LENGTH line_split count)
|
|
|
|
|
|
if(count LESS 2)
|
|
|
- message(VERBOSE "Skipping ${line}")
|
|
|
+ message(STATUS "Skipping ${line}")
|
|
|
continue()
|
|
|
endif()
|
|
|
|
|
|
list(GET line_split -1 value)
|
|
|
string(STRIP ${value} value)
|
|
|
- separate_arguments(value)
|
|
|
+ # separate_arguments(value)
|
|
|
+ # string(REPLACE " " ";" value ${value})
|
|
|
list(REMOVE_AT line_split -1)
|
|
|
|
|
|
foreach(var_name ${line_split})
|
|
|
string(STRIP ${var_name} var_name)
|
|
|
+ # replace $(?) with the variable ? from cmake
|
|
|
+ if(value MATCHES "\\$\\(([^\\(\\)]+)\\)")
|
|
|
+ set(MAKE_VARIABLE "${CMAKE_MATCH_1}")
|
|
|
+ string(REPLACE "$(${MAKE_VARIABLE})" "${${MAKE_VARIABLE}}" value ${value})
|
|
|
+ endif()
|
|
|
+
|
|
|
+ # look for +, assuming it used to be +=
|
|
|
if(${var_name} MATCHES "([^ \\+]+) *\\+")
|
|
|
- message(VERBOSE "Appending '${CMAKE_MATCH_1}' with '${value}'")
|
|
|
- set(${CMAKE_MATCH_1} ${${CMAKE_MATCH_1}} ${value} PARENT_SCOPE)
|
|
|
+ message(STATUS "Appending \"${CMAKE_MATCH_1}\" with \"${value}\"")
|
|
|
+ # read parent variable in local & append
|
|
|
+ set(LOCAL_${CMAKE_MATCH_1} ${CMAKE_MATCH_1})
|
|
|
+ # APPEND accepts spaces between values
|
|
|
+ list(APPEND LOCAL_${CMAKE_MATCH_1} ${value})
|
|
|
+ set(${CMAKE_MATCH_1} ${LOCAL_${CMAKE_MATCH_1}})
|
|
|
+ set(${CMAKE_MATCH_1} ${LOCAL_${CMAKE_MATCH_1}} PARENT_SCOPE)
|
|
|
else()
|
|
|
+ # set needs ; between elements to be considered a list
|
|
|
+ string(REGEX REPLACE " +" ";" value ${value})
|
|
|
+ # try to find variable in cache and FORCE wtih INTERNAL if it exists
|
|
|
if(DEFINED CACHE${${var_name}})
|
|
|
- message(VERBOSE "Caching '${var_name}' to '${value}'")
|
|
|
+ message(STATUS "Caching \"${var_name}\" to \"${value}\"")
|
|
|
+ # set locally so replacement still work
|
|
|
+ set(${var_name} ${value})
|
|
|
set(${var_name} ${value} CACHE INTERNAL "")
|
|
|
else()
|
|
|
- message(VERBOSE "Setting '${var_name}' to '${value}'")
|
|
|
+ message(STATUS "Setting \"${var_name}\" to \"${value}\"")
|
|
|
+ set(${var_name} ${value})
|
|
|
set(${var_name} ${value} PARENT_SCOPE)
|
|
|
endif()
|
|
|
endif()
|
|
|
endforeach()
|
|
|
-
|
|
|
- # endif()
|
|
|
endforeach()
|
|
|
+
|
|
|
+ list(POP_BACK CMAKE_MESSAGE_INDENT)
|
|
|
+ message(CHECK_PASS "Complete")
|
|
|
endmacro()
|