Вопрос о синтаксисе команды cmake - PullRequest
8 голосов
/ 22 марта 2010

Мне требуется синтаксис макроса CMAKE , который генерирует файлы .cc и .h из такого инструмента, как lex / yacc.

Может ли кто-нибудь показать мне синтаксис для следующего надуманного примера:

скажем, у меня есть файл y.cc, который зависит от x.cc и x.h, два упомянутых файла генерируются инструментом z_tool из файла x.z. Какой будет синтаксис для этого?

В этом примере предположим, что y.cc будет превращен в статическую библиотеку, и, поскольку я совсем новичок в CMAKE, полный CMakellist.txt для этого надуманного примера будет очень полезен. Я ищу инструменты, которые я использую, доступны как в Windows, так и в вариантах UNIX.

Ответы [ 3 ]

15 голосов
/ 22 марта 2010

Вместо того, чтобы дать вам ответ на надуманный пример, вот способ, которым вы бы сгенерировали исполняемый файл, используя flex и bison

find_package(BISON)
find_package(FLEX)

BISON_TARGET(MyParser parser.y ${CMAKE_CURRENT_BINARY_DIR}/parser.cc)
FLEX_TARGET(MyScanner lexer.l  ${CMAKE_CURRENT_BINARY_DIR}/lexer.cc)
ADD_FLEX_BISON_DEPENDENCY(MyScanner MyParser)

include_directories(${CMAKE_CURRENT_BINARY_DIR})
add_executable(Foo
  Foo.cc
  ${BISON_MyParser_OUTPUTS}
  ${FLEX_MyScanner_OUTPUTS})
target_link_libraries(Foo ${FLEX_LIBRARIES} ${BISON_LIBRARIES})

Пакеты поиска CMake для bison / flex включены в установку по умолчанию, поэтому это кроссплатформенная.

Как правило, для создания выходных данных, которые впоследствии будут использоваться в качестве входных данных, вы можете использовать функцию add_custom_command . Если вы используете выходные данные из пользовательской команды в качестве входных данных для библиотеки или исполняемого файла, то CMake знает, что нужно выполнить вашу пользовательскую команду перед компиляцией исходных файлов для целевой библиотеки / исполняемого файла.

1 голос
/ 23 января 2013

/ * Чтобы это работало на моем Mac с Lion. Я изменил имена файлов на y.tab.c и lex.yy.c, которые являются выходными файлами, если вы запускаете lex lex.l и yacc -D yacc.y из командной строки. Увидеть ниже. * /

cmake_minimum_required(VERSION 2.8)
project (LexYacc)

find_package(BISON)
find_package(FLEX)

BISON_TARGET(MyParser yacc.y ${CMAKE_CURRENT_BINARY_DIR}/y.tab.c) 
FLEX_TARGET(MyScanner lex.l  ${CMAKE_CURRENT_BINARY_DIR}/lex.yy.c)
ADD_FLEX_BISON_DEPENDENCY(MyScanner MyParser)

include_directories(${CMAKE_CURRENT_BINARY_DIR})
add_executable(LexYacc
  ${BISON_MyParser_OUTPUTS}
  ${FLEX_MyScanner_OUTPUTS})
target_link_libraries(LexYacc ${FLEX_LIBRARIES} ${BISON_LIBRARIES})
1 голос
/ 20 ноября 2012

Следующая строка имеет Typo

FLEX_TARGET(MyScanner lexer.l  ${CMAKE_CURRENT_BIANRY_DIR}/lexer.cc)

BIANRY следует записать как BINARY .

Примечание. В документации CMake есть и эта опечатка. (в 2.8.0 это исправлено в документации 2.8.10) ..

...