2010-03-22 26 views
8

Lex'in/yacc gibi aracından .cc ve .h dosyaları üreten bir CKağıt makro sözdizimi gerektirir. cmake komut sözdizimi soru

Birisi bana şu yapmacık örneğin sözdizimi göstermek misiniz:

Ben x.cc ve x.h bağlı olan bir dosya y.cc söylüyorlar, söz iki dosya dosya x.z. gelen aracı z_tool tarafından oluşturulan Bunun sözdizimi ne olurdu?

Bu örnekte, y.cc'nin statik bir kitaplığa dönüştürüleceğini ve CMAKE için oldukça yeni olduğumdan, bu CMOS için tam CMakellist.txt dosyasının çok yararlı olacağını varsayalım. Taşınabilir bir çözüm arıyorum. Kullandığım araçlar, Windows ve UNIX varyantlarında kullanılabilir.

cevap

15

yerine size yapmacık örneğe cevap vermek, burada CKağıt bizon için paketler bulmak flex ve 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}) 

kullanarak bir yürütülebilir üretecek şekilde/esnek varsayılan kurulum dahil edilir, bu yüzden çapraz platform.

Genelde daha sonra giriş olarak kullanılacak bir çıktı oluşturmak için add_custom_command işlevini kullanabilirsiniz. Özel komuttan bir kitaplık veya yürütülebilir dosyaya girdi olarak bir çıktı kullanırsanız, CMake kitaplık/yürütülebilir hedef için kaynakları derlemeden önce özel komutunuzu çalıştırmayı bilir.

+0

Güzel açıkladı. Gist aslında çıktıları ve girişleri nasıl bağlayacaktı: D –

+0

Kestirim için: cmake dosyasında "target_link_libraries" (Foo $ {FLEX_LIBRARIES} $ {BISON_LIBRARIES}} gibi bir şey de var. – cheshirekow

1

aşağıdaki satırı Tipo

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

BIANRYİKİLİ olarak yazıldığından olmalıdır sahiptir.

Not: CMake Documentation'ın da orada yazım hatası var. (2.8.0'da, bu 2.8.10 belgesinde giderilmiştir) ..

1

/* Mac'le Mac'imde çalışmasını sağlamak için. Komut satırından lex lex.l ve yacc -D yacc.y çalıştırırsanız, çıktı dosyaları olan y.tab.c ve lex.yy.c dosya adlarını değiştirdim. Aşağıya bakınız. */

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