Hi. I'm working on a project and I use cmake for generating "projects", that is, under Linux, a Makefile.
I also use an external tool (re2c) to generate the scanner, and an included tool to generate the parser (lemon, part of sqlite).
The problem is I need to "cmake" every time I change something in the grammar (lemon_parser.y) or in the scanner (scanner.re).
I'd rather need them be regenerated by make itself.
The cmake files are:
./CMakeLists.txt:
./parser/CMakeLists.txtCode:1 cmake_minimum_required(VERSION 2.6) 2 project(Calc C) 3 #set(CMAKE_USE_RELATIVE_PATHS ON FORCE) 4 set(CMAKE_BUILD_TYPE Debug) 5 #set(CMAKE_VERBOSE_MAKEFILE true) 6 include_directories(${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR}/parser) 7 8 IF ( ${CMAKE_SOURCE_DIR} EQUAL ${CMAKE_BINARY_DIR} AND NOT ${ACCEPT_SOURCE_DIR} ) 9 MESSAGE( FATAL "Please choose a different directory for building" ) 10 ENDIF( ${CMAKE_SOURCE_DIR} EQUAL ${CMAKE_BINARY_DIR} AND NOT ${ACCEPT_SOURCE_DIR} ) 11 12 add_subdirectory(lemon) 13 add_subdirectory(hash) 14 add_subdirectory(parser) 15 #memory safety 16 #add_subdirectory(memory_safety) 17 18 add_executable(calc main.c) 19 target_link_libraries(calc hash parser)
and a file irrelevant to the problem:Code:1 set(parser_odir "${CMAKE_CURRENT_BINARY_DIR}/") 2 include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${parser_odir}) 3 4 add_custom_command( 5 OUTPUT "${parser_odir}lemon_parser.c" "${parser_odir}lemon_parser.h" "${parser_odir}lemon_parser.out" 6 #COMMAND ${PROJECT_BINARY_DIR}/lemon/lemon d="${CMAKE_CURRENT_SOURCE_DIR}/lempar.c" "${CMAKE_CURRENT_BINARY_DIR}/lemon_parser.y" 7 COMMAND ${PROJECT_BINARY_DIR}/lemon/lemon d="${CMAKE_CURRENT_SOURCE_DIR}/lempar.c" "${parser_odir}lemon_parser.y" 8 DEPENDS lemon "${CMAKE_CURRENT_SOURCE_DIR}/lemon_parser.y" 9 ) 10 #add_custom_target(lemon_parser) 11 file(READ lemon_parser.y parser_content) 12 file(WRITE "${parser_odir}lemon_parser.y" "${parser_content}") 13 14 add_custom_command( 15 OUTPUT "${parser_odir}scanner.c" 16 COMMAND re2c -i "${CMAKE_CURRENT_SOURCE_DIR}/scanner.re" > "${parser_odir}scanner.c" 17 DEPENDS "${parser_odir}lemon_parser.h" "${CMAKE_CURRENT_SOURCE_DIR}/scanner.re" 18 ) 19 #add_custom_target(re2c_scanner) 20 21 #add_custom_target(lemon_parser ALL DEPENDS "${parser_odir}lemon_parser.c" "${parser_odir}lemon_parser.h") 22 add_library(parser STATIC "${parser_odir}lemon_parser.c" "${parser_odir}scanner.c" parser.c ast.c)
./hash/CMakeLists.txt:
I suppose it's a trivial task for the experienced cmake user.Code:1 add_library(hash STATIC hash_table.c hash_functions.c)
Thanks in advance.
Cheers.



LinkBack URL
About LinkBacks


