2013-10-16 76 views
11

我將我的編譯系統從配置/做出一個cmake的系統的CMake和Flex /野牛

該系統具有自動生成的一些文件,從野牛/柔性。原來的makefile命令是:

bison --defines=tokens.h --output=parser.cpp parser.y 
flex --outfile=scanner.cpp scanner.l 

我碰到this ancient link這似乎解釋瞭如何做到這一點,但是當我運行下面的自定義命令cmake的,好像沒有任何反應(沒有錯誤消息,沒有文件生成)

FIND_PACKAGE(BISON REQUIRED) 
IF(BISON_FOUND) 
    ADD_CUSTOM_COMMAND(
     SOURCE ${CMAKE_SOURCE_DIR}/src/rcdgen/parser.y 
     COMMAND ${BISON_EXECUTABLE} 
     ARGS --defines=${CMAKE_SOURCE_DIR}/src/rcdgen/tokens.h 
      -o ${CMAKE_SOURCE_DIR}/src/rcdgen/parser.cpp 
      ${CMAKE_SOURCE_DIR}/src/rcdgen/parser.y 
     COMMENT "Generating parser.cpp" 
     OUTPUT ${CMAKE_SOURCE_DIR}/src/rcdgen/parser.cpp 
    ) 
ENDIF(BISON_FOUND) 

FIND_PACKAGE(FLEX REQUIRED) 
IF(FLEX_FOUND) 
    ADD_CUSTOM_COMMAND(
     SOURCE ${CMAKE_SOURCE_DIR}/src/rcdgen/scanner.l 
     COMMAND ${FLEX_EXECUTABLE} 
     ARGS -o${CMAKE_SOURCE_DIR}/src/rcdgen/parser.cpp 
      ${CMAKE_SOURCE_DIR}/src/rcdgen/scanner.l 
     COMMENT "Generating scanner.cpp" 
     OUTPUT ${CMAKE_SOURCE_DIR}/src/rcdgen/scanner.cpp 
    ) 
ENDIF(FLEX_FOUND) 

我是cmake的新手,所以對我來說有點困惑。有沒有人有任何想法的工作custom_command會是什麼?

+0

你也可以發佈使用生成文件的CMakeList的一部分嗎? – Angew

+0

請注意標記。 Flex-lexer用於詞法分析器; flex標籤用於Adobe/Apache UI框架。 – JeffryHouser

+0

對不起,'flex'是我自動提示給我的,我沒有想到檢查描述 – LordAro

回答

11

您的add_custom_command s的格式並不完全正確,但它們看起來幾乎是正確的。還有的add_custom_command兩個版本,和你想要的是產生一個輸出文件(方括號中的部分是可選的)的一個:

add_custom_command(OUTPUT output1 [output2 ...] 
        COMMAND command1 [ARGS] [args1...] 
        [COMMAND command2 [ARGS] [args2...] ...] 
        [MAIN_DEPENDENCY depend] 
        [DEPENDS [depends...]] 
        [IMPLICIT_DEPENDS <lang1> depend1 
            [<lang2> depend2] ...] 
        [WORKING_DIRECTORY dir] 
        [COMMENT comment] [VERBATIM] [APPEND]) 

的想法是,如果指定的文件中的自定義命令只執行因爲此命令的OUTPUT被用作相同CMakeLists.txt中其他地方的輸入(例如,在add_libraryadd_executable調用中)。

自定義命令,因此只會在構建時(即當您運行make),而不是在配置時(當您運行CMake的)上運行,且僅當您正在構建一個目標直接或間接需要OUTPUT文件。

要解決你的命令,我認爲以下應工作(未經測試):

FIND_PACKAGE(BISON REQUIRED) 
SET(BisonOutput ${CMAKE_SOURCE_DIR}/src/rcdgen/parser.cpp) 
IF(BISON_FOUND) 
    ADD_CUSTOM_COMMAND(
     OUTPUT ${BisonOutput} 
     COMMAND ${BISON_EXECUTABLE} 
       --defines=${CMAKE_SOURCE_DIR}/src/rcdgen/tokens.h 
       --output=${BisonOutput} 
       ${CMAKE_SOURCE_DIR}/src/rcdgen/parser.y 
     COMMENT "Generating parser.cpp" 
    ) 
ENDIF() 

FIND_PACKAGE(FLEX REQUIRED) 
SET(FlexOutput ${CMAKE_SOURCE_DIR}/src/rcdgen/scanner.cpp) 
IF(FLEX_FOUND) 
    ADD_CUSTOM_COMMAND(
     OUTPUT ${FlexOutput} 
     COMMAND ${FLEX_EXECUTABLE} 
       --outfile=${FlexOutput} 
       ${CMAKE_SOURCE_DIR}/src/rcdgen/scanner.l 
     COMMENT "Generating scanner.cpp" 
    ) 
ENDIF() 

ADD_LIBRARY(MyLib ${BisonOutput} ${FlexOutput}) 
+0

這看起來不錯,但我不確定add_library是什麼,你能否詳細說明一下? – LordAro

+0

@LordAro - 對不起,我可以做得更清楚一些。我只是想舉一個實際使用輸出文件作爲另一個命令的輸入的例子。我不指望你實際上有一個名爲「MyLib」的庫,或者任何目標都使用這兩個文件。我想這些文件將是CMakeLists.txt中包含lib/exe的許多文件中的2個。 – Fraser

+0

好吧,這就是我懷疑的,而且,它似乎工作:) 非常感謝 – LordAro

15

野牛使用新的辣味實際上是在cmake.org記錄,以便爲一個簡單的解析器項目:

bison_target(parser fl.ypp fl.tab.cpp) 
add_executable(fl ${BISON_parser_OUTPUTS}) 

是你要做的。同樣適用於Flex。

+1

對舊版本無效Flex版本應爲2.5.5或更高版本。原因是這些函數傳遞的參數。 –