2013-10-16 26 views
11

Ben bizon/esnek gelen bir cmake sisteminin sistem bazı otomatik olarak oluşturulan dosyaları vardırCKağıt ve Flex/Bison

yapmak/configure benim yapı sistemini dönüştürme ediyorum. Orijinal makefile komutlar şunlardır:

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

ben bunu nasıl açıklamak gibi görünüyor this ancient link karşılaştım, ama aşağıdaki özel komutlarla cmake çalıştırdığınızda, hiçbir şey (hiçbir hata iletileri, hiçbir dosya nesil) gerçekleşmesi görünüyor

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 konusunda yeniyim, bu yüzden biraz kafa karıştırıcı. Çalışan bir custom_command'ın ne olabileceği hakkında bir fikri olan var mı?

+0

Ayrıca oluşturulan dosyaları kullanan CMakeList parçasını da gönderebilir misiniz? – Angew

+0

Lütfen etiketlemenin farkında olun. Flex-lexer sözcük analizcisi içindir; esnek etiket Adobe/Apache UI Framework içindir. – JeffryHouser

+0

Üzgünüm, 'flex' bana otomatik olarak ne önerildi, ben açıklama kontrol etmeyi düşünmüyordum – LordAro

cevap

11

add_custom_command s biçiminiz oldukça doğru değil ama doğru görünüyor. Orada add_custom_command iki versiyonu vardır ve istediğiniz bir bir çıktı dosyası (köşeli parantez içindeki parçalar isteğe bağlıdır) üreten biridir:

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]) 

fikri dosya belirtilmişse özel komut yalnızca yürütür olmasıdır Bu komutun OUTPUT numarası aynı CMakeLists.txt dosyasında başka bir giriş olarak kullanılır (örneğin, bir add_library veya add_executable çağrısında).

Bu nedenle özel komut, yalnızca yapılandırma zamanında (yani, make'u çalıştırdığınızda), yapılandırmaya (CMake'i çalıştırdığınızda) ve yalnızca OUTPUT dosyasına doğrudan veya dolaylı olarak gereksinim duyan bir hedef oluşturuyorsanız çalışacaktır . komutlarınızı düzeltmek için

, şu (denenmemiş) çalışması gerekir düşünüyorum:

bizon kullanım için yeni hotness aslında Yani basit bir ayrıştırıcı projesi için cmake.org de belgelenmiştir
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

Bu güzel görünüyor, add_library için ne olduğundan emin değilim, ancak detaylandırır mısınız? – LordAro

+0

@LordAro - Üzgünüm, bunu biraz daha net yapabilirdim. Sadece çıktı dosyalarını başka bir komuta girdi olarak kullanmanın bir örneğini vermeye çalışıyordum. "MyLib" adlı bir kütüphaneye sahip olduğunuzu veya herhangi bir hedefin sadece bu 2 dosyayı kullandığını sanmıyorum. Bu dosyaların CMakeLists.txt dosyasında bir lib/exe içeren bir çoğunun 2 olacağını hayal ediyorum. – Fraser

+0

tamam, işte bu yüzden şüphe duyuyorum ve iş görüyor gibi görünüyor :) Çok teşekkürler – LordAro

15

:

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

ne yaparsın. Flex için de aynı şekilde.

+1

Eski sürümde çalışmıyor Flex sürümü bunun için 2.5.5 veya daha büyük olmalıdır. Nedeni bu işlevler tarafından geçirilen parametrelerdir. –