[CMake] cmake, lex & yacc

Maik Beckmann maikbeckmann at gmx.de
Mon Jul 30 12:46:07 EDT 2007


Am Montag, 30. Juli 2007 16:46:44 schrieb Timur Ivanov:
> YACC=bison
> LEX=flex
>
> config_yacc.c: config_yacc.y config.h
>         $(YACC) -d -o config_yacc.c config_yacc.y
>
> config_lex.c: config_lex.l config_yacc.c
>         $(LEX) -oconfig_lex.c config_lex.l
>

<CMakeLists.txt>
project(parsing_foo)

find_program(LEX_EXE
    flex
)
if(LEX_EXE STREQUAL "LEX_EXE-NOTFOUND")
    message(FATAL_ERROR "dear user, plase install flex!")
endif(LEX_EXE STREQUAL "LEX_EXE-NOTFOUND")

find_program(YACC_EXE
    bison
)
if(YACC_EXE STREQUAL "YACC_EXE-NOTFOUND")
    message(FATAL_ERROR "dear user, plase install bison!")
endif(YACC_EXE STREQUAL "YACC_EXE-NOTFOUND")

# reuseable cmake macro for yacc
MACRO(YACC_FILE _filename)
    GET_FILENAME_COMPONENT(_basename ${_filename} NAME_WE)
    ADD_CUSTOM_COMMAND(
        OUTPUT  ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.c
                ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.h
        COMMAND ${YACC_EXE} -d
                --output=${_basename}.c
                ${CMAKE_CURRENT_SOURCE_DIR}/${_filename}
        DEPENDS ${_filename}
    )
ENDMACRO(YACC_FILE)

# reuseable cmake macro for lex
MACRO(LEX_FILE _filename)
    GET_FILENAME_COMPONENT(_basename ${_filename} NAME_WE)
    ADD_CUSTOM_COMMAND(
        OUTPUT  ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.c
        COMMAND ${LEX_EXE}
                -o${_basename}.c
                ${CMAKE_CURRENT_SOURCE_DIR}/${_filename}
        DEPENDS ${_filename} )
ENDMACRO(LEX_FILE)

YACC_FILE(config_yacc.y)
LEX_FILE(config_lex.l)

add_executable(my_parsing_exe
    ... # whatever
    config_yacc.c
    config_lex.c
)

# just one more parsing executable
YACC_FILE(xyz_yacc.y)
LEX_FILE(xyz_lex.l)

add_executable(xyz_parsing_exe
    ... # whatever
    xyz_yacc.c
    xyz_lex.c
)
</CMakeLists.txt>


HTH, Maik Beckmann


More information about the CMake mailing list