18

ビルド システムを configure/make から cmake システムに変換しています

システムには、bison/flex から自動生成されたファイルがいくつかあります。元のメイクファイル コマンドは次のとおりです。

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

その方法を説明しているように見えるこの古代のリンクに出くわしましたが、次のカスタムコマンドで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 が何であるかを知っている人はいますか?

4

2 に答える 2

31

bison の使用に関する新しいホットネスは、実際にはcmake.orgで文書化されています。単純なパーサー プロジェクトの場合:

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

あなたがすることです。フレックスも同様。

于 2014-07-03T18:59:51.740 に答える
13

あなたの s の形式はadd_custom_command完全には正しくありませんが、ほとんど正しいようです。には 2 つのバージョンがあり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_libraryoradd_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})
于 2013-10-16T08:35:13.027 に答える