CMakeAutoGenScript.cmake 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. # CMake implementation of AutoGen
  2. # Copyright (C) 2017 Anonymous Maarten <[email protected]>
  3. set(WS " \t\r\n")
  4. function(cutoff_first_occurrence TEXT OCCURRENCE RESULT)
  5. string(FIND "${TEXT}" "${OCCURRENCE}" OCCURRENCE_INDEX)
  6. if (OCCURRENCE_INDEX EQUAL -1)
  7. set(${TEXT} "" PARENT_SCOPE)
  8. return()
  9. endif()
  10. string(LENGTH "${OCCURRENCE}" OCCURRENCE_LENGTH)
  11. math(EXPR CUTOFF_INDEX "${OCCURRENCE_INDEX}+${OCCURRENCE_LENGTH}")
  12. string(SUBSTRING "${TEXT}" ${CUTOFF_INDEX} -1 TEXT_REMAINDER)
  13. set(${RESULT} "${TEXT_REMAINDER}" PARENT_SCOPE)
  14. endfunction()
  15. function(read_definition DEFINITION_FILENAME TEMPLATE_FILENAME DATA)
  16. file(READ "${DEFINITION_FILENAME}" DEFINITION_CONTENTS)
  17. string(REGEX MATCH "autogen definitions ([a-zA-Z\\._-]+);[${WS}]*" TEMPLATE_MATCH "${DEFINITION_CONTENTS}")
  18. if (NOT TEMPLATE_MATCH)
  19. message(FATAL_ERROR "${DEFINITION_FILENAME} doest not contain an AutoGen definition.")
  20. endif()
  21. get_filename_component(DEFINITION_DIR "${DEFINITION_FILENAME}" PATH)
  22. set(${TEMPLATE_FILENAME} "${DEFINITION_DIR}/${CMAKE_MATCH_1}" PARENT_SCOPE)
  23. if (DEBUG)
  24. message("found: TEMPLATE_FILENAME=${CMAKE_MATCH_1}")
  25. endif()
  26. cutoff_first_occurrence("${DEFINITION_CONTENTS}" "${TEMPLATE_MATCH}" DEFINITION_CONTENTS)
  27. set(DEFINITION "")
  28. while (1)
  29. string(REGEX MATCH "([a-zA-Z_][a-zA-Z0-9_]*)[${WS}]*=[${WS}]*{[${WS}]*" GROUPSTART_MATCH "${DEFINITION_CONTENTS}")
  30. if (NOT GROUPSTART_MATCH)
  31. break()
  32. endif()
  33. set(GROUPNAME "${CMAKE_MATCH_1}")
  34. cutoff_first_occurrence("${DEFINITION_CONTENTS}" "${GROUPSTART_MATCH}" DEFINITION_CONTENTS)
  35. if (DEBUG)
  36. message("found: GROUPNAME=${GROUPNAME}")
  37. endif()
  38. set(NBKEYS 0)
  39. set(GROUP_KEY_VALUES "")
  40. while (1)
  41. string(REGEX MATCH "^([a-zA-Z_][a-zA-Z0-9_]*)[${WS}]*=[${WS}]*(([\"']([${WS}a-zA-Z0-9_%\\\"<>\(\)\\.*+/?:,\\-]+)[\"'])|([a-zA-Z0-9_%\\]+))[${WS}]*;[${WS}]*" KEY_VALUE_MATCH "${DEFINITION_CONTENTS}")
  42. if (NOT KEY_VALUE_MATCH)
  43. break()
  44. endif()
  45. set(KEY "${CMAKE_MATCH_1}")
  46. if ("${CMAKE_MATCH_4}" STREQUAL "")
  47. set(VALUE "${CMAKE_MATCH_5}")
  48. else()
  49. string(REPLACE "\\\"" "\"" VALUE "${CMAKE_MATCH_4}")
  50. #set(VALUE "${CMAKE_MATCH_4}")
  51. endif()
  52. if (DEBUG)
  53. message("found: KEY=${KEY}, VALUE=${VALUE}")
  54. endif()
  55. math(EXPR NBKEYS "${NBKEYS}+1")
  56. list(APPEND GROUP_KEY_VALUES "${KEY}" "${VALUE}")
  57. cutoff_first_occurrence("${DEFINITION_CONTENTS}" "${KEY_VALUE_MATCH}" DEFINITION_CONTENTS)
  58. endwhile()
  59. string(REGEX MATCH "^[${WS}]*}[${WS}]*;[${WS}]*" GROUPEND_MATCH "${DEFINITION_CONTENTS}")
  60. if (NOT GROUPEND_MATCH)
  61. message(FATAL_ERROR "Group ${GROUPNAME} did not finish.")
  62. endif()
  63. cutoff_first_occurrence("${DEFINITION_CONTENTS}" "${GROUPEND_MATCH}" DEFINITION_CONTENTS)
  64. list(APPEND DEFINITION "${GROUPNAME}" ${NBKEYS} ${GROUP_KEY_VALUES})
  65. endwhile()
  66. set(${DATA} "${DEFINITION}" PARENT_SCOPE)
  67. endfunction()
  68. function(match_autogen_group TEXT START POS0 POS1 MATCH FOUND)
  69. string(SUBSTRING "${TEXT}" "${START}" -1 TEXT)
  70. string(REGEX MATCH "\\[\\+[${WS}]*([ a-zA-Z0-9=_$%\\(\\)\"\\+\\-]+)[${WS}]*\\+\\]" MATCH_GROUP "${TEXT}")
  71. if ("${MATCH_GROUP}" STREQUAL "")
  72. set(${FOUND} 0 PARENT_SCOPE)
  73. return()
  74. endif()
  75. string(FIND "${TEXT}" "${MATCH_GROUP}" START_TEXT)
  76. math(EXPR POS0_var "${START}+${START_TEXT}")
  77. string(LENGTH "${MATCH_GROUP}" MATCH_LENGTH)
  78. math(EXPR POS1_var "${POS0_var}+${MATCH_LENGTH}")
  79. set(${POS0} "${POS0_var}" PARENT_SCOPE)
  80. set(${POS1} "${POS1_var}" PARENT_SCOPE)
  81. set(${FOUND} 1 PARENT_SCOPE)
  82. string(STRIP "${CMAKE_MATCH_1}" CONTENT)
  83. set("${MATCH}" "${CONTENT}" PARENT_SCOPE)
  84. endfunction()
  85. function(append_output SUFFICES_FILENAMES TEXT POS0 POS1 FILTER)
  86. math(EXPR POS_LENGTH "${POS1}-${POS0}")
  87. string(LENGTH "${TEXT}" TEXT_LENGTH)
  88. string(SUBSTRING "${TEXT}" "${POS0}" "${POS_LENGTH}" TEXT_APPEND)
  89. if (DEBUG)
  90. message("appending ${POS0}:${POS1}, length=${POS_LENGTH}")
  91. endif()
  92. append_output_text("${SUFFICES_FILENAMES}" "${TEXT_APPEND}" "${FILTER}")
  93. endfunction()
  94. function(append_output_text SUFFICES_FILENAMES TEXT_APPEND FILTER)
  95. string(LENGTH "${TEXT_APPEND}" TEXT_LENGTH)
  96. list(LENGTH SUFFICES_FILENAMES NB)
  97. math(EXPR NB_END "${NB}-1")
  98. foreach(INDEX RANGE 0 ${NB_END} 3)
  99. math(EXPR INDEX_1 "${INDEX}+1")
  100. math(EXPR INDEX_2 "${INDEX}+2")
  101. list(GET SUFFICES_FILENAMES ${INDEX} SUFFIX)
  102. list(GET SUFFICES_FILENAMES ${INDEX_1} FILENAME)
  103. list(GET SUFFICES_FILENAMES ${INDEX_2} TEMPFILENAME)
  104. set(WRITE_OK 1)
  105. if (FILTER)
  106. if (NOT "${SUFFIX}" STREQUAL "${FILTER}")
  107. set(WRITE_OK 0)
  108. endif()
  109. endif()
  110. if (WRITE_OK)
  111. if (DEBUG)
  112. message("Write: ${TEXT_LENGTH} characters to ${FILENAME}")
  113. endif()
  114. file(APPEND "${TEMPFILENAME}" "${TEXT_APPEND}")
  115. endif()
  116. endforeach()
  117. endfunction()
  118. function(output_finish SUFFICES_FILENAMES)
  119. list(LENGTH SUFFICES_FILENAMES NB)
  120. math(EXPR NB_END "${NB}-1")
  121. foreach(INDEX RANGE 0 ${NB_END} 3)
  122. math(EXPR INDEX_1 "${INDEX}+1")
  123. math(EXPR INDEX_2 "${INDEX}+2")
  124. list(GET SUFFICES_FILENAMES ${INDEX_1} FILENAME)
  125. list(GET SUFFICES_FILENAMES ${INDEX_2} TEMPFILENAME)
  126. file(RENAME "${TEMPFILENAME}" "${FILENAME}")
  127. endforeach()
  128. endfunction()
  129. function(stack_push STACK_ARG)
  130. set(STACK_LIST "${${STACK_ARG}}")
  131. string(REPLACE ";" " " NEWITEM "${ARGN}")
  132. if (DEBUG)
  133. list(LENGTH STACK_LIST STACK_LENGTH)
  134. message("Pushing \"${NEWITEM}\" onto stack (length=${STACK_LENGTH})")
  135. endif()
  136. list(APPEND STACK_LIST "${NEWITEM}")
  137. set(${STACK_ARG} "${STACK_LIST}" PARENT_SCOPE)
  138. endfunction()
  139. function(stack_pop STACK_ARG ITEM)
  140. set(STACK_LIST "${${STACK_ARG}}")
  141. list(LENGTH STACK_LIST STACK_LENGTH)
  142. if (STACK_LENGTH EQUAL 0)
  143. message(FATAL_ERROR "ENDFOR: stack is empty")
  144. endif()
  145. math(EXPR LAST_ITEM_INDEX "${STACK_LENGTH}-1")
  146. list(GET STACK_LIST "${LAST_ITEM_INDEX}" LAST_ITEM)
  147. list(REMOVE_AT STACK_LIST "${LAST_ITEM_INDEX}")
  148. string(REPLACE " " ";" LAST_ITEM_LIST "${LAST_ITEM}")
  149. if (DEBUG)
  150. message("Popping \"${LAST_ITEM}\" from stack (length=${STACK_LENGTH})")
  151. endif()
  152. set(${ITEM} "${LAST_ITEM_LIST}" PARENT_SCOPE)
  153. set(${STACK_ARG} "${STACK_LIST}" PARENT_SCOPE)
  154. endfunction()
  155. function(stack_top STACK_ARG ITEM)
  156. set(STACK_LIST "${${STACK_ARG}}")
  157. list(LENGTH STACK_LIST STACK_LENGTH)
  158. if (STACK_LENGTH EQUAL 0)
  159. message(FATAL_ERROR "ENDFOR: stack is empty")
  160. endif()
  161. math(EXPR LAST_ITEM_INDEX "${STACK_LENGTH}-1")
  162. list(GET STACK_LIST "${LAST_ITEM_INDEX}" LAST_ITEM)
  163. string(REPLACE " " ";" LAST_ITEM_LIST "${LAST_ITEM}")
  164. if (DEBUG)
  165. message("Top of stack: \"${LAST_ITEM}\" from stack (length=${STACK_LENGTH})")
  166. endif()
  167. set(${ITEM} "${LAST_ITEM_LIST}" PARENT_SCOPE)
  168. endfunction()
  169. function(stack_find_key STACK_LIST TEMPLATE_PARAMETERS KEY VALUE)
  170. list(REVERSE STACK_LIST)
  171. foreach(STACK_ITEM ${STACK_LIST})
  172. string(REPLACE " " ";" STACK_ITEM_LIST "${STACK_ITEM}")
  173. list(GET STACK_ITEM_LIST 3 TP_INDEX)
  174. math(EXPR TP_SIZE_INDEX "${TP_INDEX}+1")
  175. list(GET TEMPLATE_PARAMETERS ${TP_SIZE_INDEX} TP_SIZE)
  176. math(EXPR TP_KV_INDEX_START "${TP_INDEX}+2")
  177. math(EXPR TP_KV_INDEX_END "${TP_KV_INDEX_START}+2*${TP_SIZE}-1")
  178. foreach(TP_KV_INDEX RANGE ${TP_KV_INDEX_START} ${TP_KV_INDEX_END} 2)
  179. list(GET TEMPLATE_PARAMETERS ${TP_KV_INDEX} TP_KEY)
  180. if("${TP_KEY}" STREQUAL "${KEY}")
  181. math(EXPR TP_VALUE_INDEX "${TP_KV_INDEX}+1")
  182. list(GET TEMPLATE_PARAMETERS ${TP_VALUE_INDEX} TP_VALUE)
  183. set(${VALUE} "${TP_VALUE}" PARENT_SCOPE)
  184. return()
  185. endif()
  186. endforeach()
  187. endforeach()
  188. message(FATAL_ERROR "Unknown KEY=${KEY}")
  189. endfunction()
  190. function(template_parameters_find_next_groupname_index TEMPLATE_PARAMETERS GROUPNAME INDEX_LAST INDEX_NEXT)
  191. if (${INDEX_LAST} LESS 0)
  192. set(INDEX 0)
  193. else ()
  194. math(EXPR INDEX_1 "1+(${INDEX_LAST})")
  195. list(GET TEMPLATE_PARAMETERS ${INDEX_1} GROUPNAME_INDEX_SIZE)
  196. math(EXPR INDEX "${INDEX_LAST}+1+2*${GROUPNAME_INDEX_SIZE}+1")
  197. endif()
  198. list(LENGTH TEMPLATE_PARAMETERS PARAMETERS_LENGTH)
  199. while (${INDEX} LESS ${PARAMETERS_LENGTH})
  200. list(GET TEMPLATE_PARAMETERS ${INDEX} GROUPNAME_AT_INDEX)
  201. if ("${GROUPNAME}" STREQUAL "${GROUPNAME_AT_INDEX}")
  202. set("${INDEX_NEXT}" ${INDEX} PARENT_SCOPE)
  203. return()
  204. endif()
  205. math(EXPR INDEX_1 "${INDEX}+1")
  206. list(GET TEMPLATE_PARAMETERS ${INDEX_1} GROUPNAME_INDEX_SIZE)
  207. math(EXPR INDEX "${INDEX}+1+2*${GROUPNAME_INDEX_SIZE}+1")
  208. endwhile()
  209. set("${INDEX_NEXT}" -1 PARENT_SCOPE)
  210. endfunction()
  211. function(calculate_line_number TEXT POSITION LINENUMBER_ARG)
  212. #math(EXPR INDEX_MAX "${POSITION}-1")
  213. string(SUBSTRING "${TEXT}" 0 ${POSITION} SUBTEXT)
  214. string(REGEX MATCHALL "\n" MATCH_NEWLINES "${SUBTEXT}")
  215. list(LENGTH MATCH_NEWLINES NBLINES)
  216. math(EXPR NBLINES "${NBLINES}+1")
  217. set(${LINENUMBER_ARG} ${NBLINES} PARENT_SCOPE)
  218. endfunction()
  219. function(parse_template TEMPLATE_FILENAME OUTPUT_DIR TEMPLATE_PARAMETERS)
  220. file(READ ${TEMPLATE_FILENAME} TEMPLATE_CONTENTS)
  221. set(POSITION 0)
  222. match_autogen_group("${TEMPLATE_CONTENTS}" "${POSITION}" POS0 POS1 AUTOGEN FOUND)
  223. if (NOT FOUND)
  224. message(FATAL_ERROR "Header of template not found")
  225. endif()
  226. string(REGEX MATCH "AutoGen5 template ([ a-zA-Z0-9]*)" SUFFICES_MATCH "${AUTOGEN}")
  227. if (NOT SUFFICES_MATCH)
  228. message(FATAL_ERROR "No output suffices found")
  229. endif()
  230. string(STRIP "${CMAKE_MATCH_1}" SUFFICES)
  231. string(REPLACE " " ";" SUFFICES "${SUFFICES}")
  232. set(SUFFICES_FILENAMES "")
  233. get_filename_component(TEMPLATE_NAME_WE "${TEMPLATE_FILENAME}" NAME_WE)
  234. foreach(SUFFIX ${SUFFICES})
  235. if ("${OUTPUT_DIR}" STREQUAL "")
  236. set(DIR_PREFIX "")
  237. else()
  238. set(DIR_PREFIX "${OUTPUT_DIR}/")
  239. endif()
  240. string(RANDOM LENGTH 64 RANDOMSTRING)
  241. set(FILENAME "${DIR_PREFIX}${TEMPLATE_NAME_WE}.${SUFFIX}")
  242. set(TEMPFILENAME "${DIR_PREFIX}${TEMPLATE_NAME_WE}${RANDOMSTRING}.${SUFFIX}")
  243. list(APPEND SUFFICES_FILENAMES "${SUFFIX}" "${FILENAME}" "${TEMPFILENAME}")
  244. file(WRITE "${FILENAME}" "")
  245. endforeach()
  246. if (DEBUG)
  247. message("Output files: ${SUFFICES_FILENAMES}")
  248. endif()
  249. set(WRITE_FILTER "")
  250. append_output("${SUFFICES_FILENAMES}" "${TEMPLATE_CONTENTS}" 0 "${POS0}" "${WRITE_FILTER}")
  251. math(EXPR POS1 "${POS1}+1")
  252. set(POSITION "${POS1}")
  253. if (DEBUG)
  254. message("Output: ${SUFFICES_FILENAMES}")
  255. endif()
  256. set(STACK "")
  257. while (1)
  258. match_autogen_group("${TEMPLATE_CONTENTS}" "${POSITION}" POS0 POS1 GROUP_MATCH FOUND)
  259. if (NOT FOUND)
  260. if (DEBUG)
  261. message("No group found. Dumping rest of file.")
  262. endif()
  263. if (NOT "${STACK}" STREQUAL "")
  264. message(FATAL_ERROR "Stack not empty at end of file")
  265. endif()
  266. string(LENGTH "${TEMPLATE_CONTENTS}" TEXT_LENGTH)
  267. append_output("${SUFFICES_FILENAMES}" "${TEMPLATE_CONTENTS}" ${POSITION} ${TEXT_LENGTH} "${WRITE_FILTER}")
  268. break()
  269. endif()
  270. append_output("${SUFFICES_FILENAMES}" "${TEMPLATE_CONTENTS}" ${POSITION} ${POS0} "${WRITE_FILTER}")
  271. set(POSITION "${POS1}")
  272. if (GROUP_MATCH MATCHES "^FOR")
  273. string(REPLACE " " ";" GROUP_MATCH_LIST "${GROUP_MATCH}")
  274. list(GET GROUP_MATCH_LIST 1 FOR_KEY)
  275. template_parameters_find_next_groupname_index("${TEMPLATE_PARAMETERS}" "${FOR_KEY}" -1 FOR_INDEX)
  276. if (DEBUG)
  277. message("FOR_KEY: ${FOR_KEY}")
  278. message("FOR_INDEX: ${FOR_INDEX}")
  279. endif()
  280. if (${FOR_KEY} LESS 0)
  281. message(FATAL_ERROR "FOR has key with empty list. Not implemented yet..")
  282. endif()
  283. stack_push(STACK FOR ${POSITION} ${FOR_KEY} ${FOR_INDEX})
  284. elseif (GROUP_MATCH MATCHES "^ENDFOR")
  285. string(REPLACE " " ";" GROUP_MATCH_LIST "${GROUP_MATCH}")
  286. list(GET GROUP_MATCH_LIST 1 ENDFOR_KEY)
  287. stack_pop(STACK FOR_ITEM)
  288. list(GET FOR_ITEM 0 FOR_FOR)
  289. if (NOT "${FOR_FOR}" STREQUAL "FOR")
  290. message(FATAL_ERROR "ENDFOR does not match last item: ${FOR_FOR}")
  291. endif()
  292. list(GET FOR_ITEM 1 FOR_POSITION)
  293. list(GET FOR_ITEM 2 FOR_KEY)
  294. if (NOT "${FOR_KEY}" STREQUAL "${ENDFOR_KEY}")
  295. calculate_line_number("${TEMPLATE_CONTENTS}" "${POSITION}" LINENUMBER)
  296. message("FOR and ENDFOR do not match. (line number ${LINENUMBER}) (FOR:${FOR_KEY}, ENDFOR:${ENDFOR_KEY})")
  297. endif()
  298. list(GET FOR_ITEM 3 FOR_INDEX_PREV)
  299. template_parameters_find_next_groupname_index("${TEMPLATE_PARAMETERS}" "${FOR_KEY}" ${FOR_INDEX_PREV} FOR_INDEX)
  300. if (DEBUG)
  301. message("FOR_INDEX was ${FOR_INDEX_PREV}, is now ${FOR_INDEX}")
  302. endif()
  303. if (${FOR_INDEX} LESS 0)
  304. if (DEBUG)
  305. message("ENDFOR: FOR_INDEX < 0 (no more key) ==> Continue")
  306. endif()
  307. else()
  308. set(POSITION ${FOR_POSITION})
  309. stack_push(STACK FOR ${FOR_POSITION} ${FOR_KEY} ${FOR_INDEX})
  310. if (DEBUG)
  311. message("ENDFOR: FOR_INDEX >= 0 (more keys available) ==> Back to position=${FOR_POSITION}")
  312. endif()
  313. endif()
  314. elseif (GROUP_MATCH MATCHES "^CASE")
  315. string(REGEX MATCH "^CASE[${WS}]+\\(([a-zA-Z]+)\\)" CASE_MATCH "${GROUP_MATCH}")
  316. if ("${CASE_MATCH}" STREQUAL "")
  317. message(FATAL_ERROR "Wrong CASE syntax")
  318. endif()
  319. set(CASE_KEY "${CMAKE_MATCH_1}")
  320. if (DEBUG)
  321. message("CASE: KEY=${CASE_KEY}")
  322. endif()
  323. stack_push(STACK CASE "${CASE_KEY}" ${POSITION})
  324. elseif (GROUP_MATCH MATCHES "^==")
  325. math(EXPR POSITION "${POSITION}+1")
  326. string(REGEX MATCH "^==[${WS}]+([a-zA-Z_][a-zA-Z0-9_]*)" CASE_MATCH "${GROUP_MATCH}")
  327. if ("${CASE_MATCH}" STREQUAL "")
  328. message(FATAL_ERROR "Wrong == syntax")
  329. endif()
  330. stack_top(STACK CASE_ITEM)
  331. list(GET CASE_ITEM 0 CASE_CASE)
  332. if(NOT "${CASE_CASE}" STREQUAL "CASE")
  333. message(FATAL_ERROR "== block must be in CASE. Top of stack=${CASE_CASE}")
  334. endif()
  335. set(CASE_VALUE "${CMAKE_MATCH_1}")
  336. if (DEBUG)
  337. message("case: == VALUE=${CASE_VALUE}")
  338. endif()
  339. list(GET CASE_ITEM 1 CASE_KEY)
  340. if ("${CASE_KEY}" STREQUAL "suffix")
  341. if (DEBUG)
  342. message("Setting write filter to ${CASE_VALUE}")
  343. endif()
  344. set(WRITE_FILTER "${CASE_VALUE}")
  345. else()
  346. message(FATAL_ERROR "CASE: unsupported argument ${CASE_KEY}")
  347. endif()
  348. elseif (GROUP_MATCH MATCHES "^ESAC")
  349. stack_pop(STACK CASE_ITEM)
  350. if (DEBUG)
  351. message("ESAC")
  352. endif()
  353. list(GET CASE_ITEM 0 CASE_CASE)
  354. if (NOT "${CASE_CASE}" STREQUAL "CASE")
  355. message(FATAL_ERROR "ESAC does not match last item: ${CASE_CASE}")
  356. endif()
  357. if ("${CASE_KEY}" STREQUAL "suffix")
  358. if (DEBUG)
  359. message("Removing write filter")
  360. endif()
  361. set(WRITE_FILTER "")
  362. else()
  363. message(FATAL_ERROR "CASE: unsupported argument ${CASE_KEY}")
  364. endif()
  365. else()
  366. string(REGEX MATCH "\\(([a-zA-Z0-9_$%\"${WS}\\+\\-]+)\\)" PARENTHESE_MATCH "${GROUP_MATCH}")
  367. if (NOT "${PARENTHESE_MATCH}" STREQUAL "")
  368. set(PARENTHESE_CONTENT "${CMAKE_MATCH_1}")
  369. string(REPLACE " " ";" PARENTHESE_LIST "${PARENTHESE_CONTENT}")
  370. list(GET PARENTHESE_LIST 0 PARENTHESE_COMMAND)
  371. if ("${PARENTHESE_COMMAND}" STREQUAL "get")
  372. list(GET PARENTHESE_LIST 1 KEY_QUOTED)
  373. string(REGEX MATCH "\\\"([a-zA-Z_${WS}]+)\\\"" KEY_MATCH "${KEY_QUOTED}")
  374. if ("${KEY_MATCH}" STREQUAL "")
  375. message(FATAL_ERROR "get: empty key")
  376. endif()
  377. set(KEY "${CMAKE_MATCH_1}")
  378. if (DEBUG)
  379. message("Get: key=${KEY}")
  380. endif()
  381. stack_find_key("${STACK}" "${TEMPLATE_PARAMETERS}" "${KEY}" VALUE)
  382. if (DEBUG)
  383. message("Get key=${KEY} ==> value=${VALUE}")
  384. endif()
  385. append_output_text("${SUFFICES_FILENAMES}" "${VALUE}" "${WRITE_FILTER}")
  386. elseif("${PARENTHESE_COMMAND}" STREQUAL "tpl-file-line")
  387. list(GET PARENTHESE_LIST 1 FORMAT_LINE)
  388. calculate_line_number("${TEMPLATE_CONTENTS}" "${POSITION}" LINENUMBER)
  389. append_output_text("${SUFFICES_FILENAMES}" "${LINENUMBER}" "${WRITE_FILTER}")
  390. else()
  391. message(FATAL_ERROR "Unknown parenthese command: ${PARENTHESE_COMMAND}")
  392. endif()
  393. else()
  394. message(FATAL_ERROR "Unknown command: ${GROUP_MATCH}")
  395. endif()
  396. endif()
  397. endwhile()
  398. if (NOT "${STACK}" STREQUAL "")
  399. message(FATAL_ERROR "STACK was not empty at EOF")
  400. endif()
  401. output_finish("${SUFFICES_FILENAMES}")
  402. endfunction()
  403. if ("${DEFINITION}" STREQUAL "")
  404. message(FATAL_ERROR "Need definition file")
  405. endif()
  406. if (NOT EXISTS "${DEFINITION}")
  407. message(FATAL_ERROR "Definition file does not exist (${DEFINITION})")
  408. endif()
  409. read_definition("${DEFINITION}" TEMPLATE_FILENAME DATA)
  410. if (DEBUG)
  411. message("${TEMPLATE_FILENAME}")
  412. message("${DATA}")
  413. endif()
  414. parse_template("${TEMPLATE_FILENAME}" "${OUTPUTDIR}" "${DATA}")