CMakeLists.txt 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. macro(complice_lex OUT_DEPENDS_LEX_LIST)
  2. set(DEPENDS_LIST)
  3. FILE(GLOB SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/*.l")
  4. foreach (FILE ${SRC_LIST})
  5. get_filename_component(NAME_WE ${FILE} NAME_WE)
  6. set(LEX_IN ${FILE})
  7. set(LEX_CPP ${NAME_WE}.lex.cpp)
  8. add_custom_command(
  9. OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/${LEX_CPP}
  10. WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
  11. DEPENDS ${LEX_IN}
  12. COMMAND flex --nounist ${LEX_IN}
  13. COMMENT "flex --nounist ${LEX_IN}")
  14. list(APPEND DEPENDS_LIST ${CMAKE_CURRENT_SOURCE_DIR}/${LEX_CPP})
  15. get_filename_component(PATH ${FILE} PATH)
  16. endforeach (FILE)
  17. set(OUT_DEPENDS_LEX_LIST ${DEPENDS_LIST})
  18. endmacro()
  19. macro(complice_yacc OUT_DEPENDS_YACC_LIST)
  20. set(DEPENDS_LIST)
  21. FILE(GLOB SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/*.y")
  22. foreach (FILE ${SRC_LIST})
  23. get_filename_component(NAME_WE ${FILE} NAME_WE)
  24. set(YACC_IN ${FILE})
  25. set(YACC_H ${NAME_WE}.tab.hpp)
  26. set(YACC_CPP ${NAME_WE}.tab.cpp)
  27. add_custom_command(
  28. OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/${YACC_H}
  29. WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
  30. DEPENDS ${YACC_IN}
  31. COMMAND bison ${YACC_IN} -o ${YACC_CPP}
  32. COMMENT "bison ${YACC_IN} -o ${YACC_CPP}")
  33. list(APPEND DEPENDS_LIST ${CMAKE_CURRENT_SOURCE_DIR}/${YACC_H})
  34. get_filename_component(PATH ${FILE} PATH)
  35. endforeach (FILE)
  36. endmacro()
  37. ##########################################################################################
  38. #生成.l和.y文件生成的代码文件copy到tarsparse目录下
  39. set(OUT_DEPENDS_LEX_LIST)
  40. complice_lex(OUT_DEPENDS_LEX_LIST)
  41. FILE(GLOB SRC_LEX_LIST "*.l")
  42. #set(CLEAN_LIST)
  43. #将生成代码文件copy到对应的目录
  44. foreach (FILE ${SRC_LEX_LIST})
  45. get_filename_component(NAME_WE ${FILE} NAME_WE)
  46. set(LEX_CPP ${NAME_WE}.lex.cpp)
  47. set(CP_SOURCE_CPP_DIR "${PROJECT_SOURCE_DIR}/tarsparse")
  48. add_custom_command(
  49. OUTPUT ${CP_SOURCE_CPP_DIR}/${LEX_CPP}
  50. WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
  51. COMMAND cp -rf ${LEX_CPP} ${CP_SOURCE_CPP_DIR}
  52. DEPENDS ${LEX_CPP}
  53. COMMENT "cp -rf ${LEX_CPP} ${CP_SOURCE_CPP_DIR}")
  54. #设置依赖
  55. list(APPEND OUT_DEPENDS_LEX_LIST ${CP_SOURCE_CPP_DIR}/${LEX_CPP})
  56. endforeach ()
  57. set(OUT_DEPENDS_YACC_LIST)
  58. complice_yacc(OUT_DEPENDS_YACC_LIST)
  59. FILE(GLOB SRC_YACC_LIST "*.y")
  60. #将生成代码文件copy到对应的目录
  61. foreach (FILE ${SRC_YACC_LIST})
  62. get_filename_component(NAME_WE ${FILE} NAME_WE)
  63. set(YACC_H ${NAME_WE}.tab.hpp)
  64. set(YACC_CPP ${NAME_WE}.tab.cpp)
  65. set(CP_SOURCE_H_DIR "${PROJECT_SOURCE_DIR}/tarsparse")
  66. add_custom_command(
  67. OUTPUT ${CP_SOURCE_H_DIR}/${YACC_H}
  68. WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
  69. COMMAND cp -rf ${YACC_H} ${YACC_CPP} ${CP_SOURCE_H_DIR}
  70. DEPENDS ${YACC_H}
  71. COMMENT "cp -rf ${YACC_H} ${YACC_CPP} ${CP_SOURCE_H_DIR}")
  72. #设置依赖
  73. list(APPEND OUT_DEPENDS_YACC_LIST ${CP_SOURCE_H_DIR}/${YACC_H})
  74. endforeach ()
  75. add_custom_target(COPY-LEX-YACC ALL DEPENDS ${OUT_DEPENDS_LEX_LIST} ${OUT_DEPENDS_YACC_LIST})