2013-02-10 32 views
5

Làm cách nào để thêm đường dẫn bao gồm vào wscript?Thêm đường dẫn vào cấu hình Waf (C++)

Tôi biết tôi có thể tuyên bố mà tập tin từ thư mục mà tôi muốn bao gồm mỗi bất kỳ tập tin cpp, như:

def build(bld): 
    bld(features='c cxx cxxprogram', 
     includes='include', 
     source='main.cpp', 
     target='app', 
     use=['M','mylib'], 
     lib=['dl']) 

nhưng tôi không muốn thiết lập nó mỗi mỗi tập tin. Tôi muốn thêm một đường dẫn đến "toàn cầu bao gồm" vì vậy nó sẽ được bao gồm mọi lúc mọi tập tin sẽ được biên dịch.

Trả lời

8

Tôi đã tìm thấy câu trả lời. Bạn chỉ cần đặt giá trị của 'BAO GỒM' thành danh sách đường dẫn bạn muốn. Đừng quên để chạy waf configure nữa :)

def configure(cfg): 
    cfg.env.append_value('INCLUDES', ['include']) 
+0

Tôi hội tụ vào câu trả lời này một cách độc lập, nhưng tôi lang thang ở đây hy vọng có một cách độc lập hơn để thực hiện điều này. – meawoppl

2

tôi đã dành một số thời gian làm việc ra một cách tốt để làm điều này bằng cách sử dụng "sử dụng" tùy chọn trong bld.program() phương pháp. Làm việc với các thư viện tăng như một ví dụ, tôi đã đưa ra những điều sau đây. Tôi hy vọng nó sẽ giúp!

''' 
run waf with -v option and look at the command line arguments given 
to the compiler for the three cases. 

you may need to include the boost tool into waf to test this script. 
''' 
def options(opt): 
    opt.load('compiler_cxx boost') 

def configure(cfg): 
    cfg.load('compiler_cxx boost') 
    cfg.check_boost() 

    cfg.env.DEFINES_BOOST = ['NDEBUG'] 

    ### the following line would be very convenient 
    ###  cfg.env.USE_MYCONFIG = ['BOOST'] 
    ### but this works too: 
    def copy_config(cfg, name, new_name): 
     i = '_'+name 
     o = '_'+new_name 
     l = len(i) 
     d = {} 
     for key in cfg.env.keys(): 
      if key[-l:] == i: 
       d[key.replace(i,o)] = cfg.env[key] 
     cfg.env.update(d) 

    copy_config(cfg, 'BOOST', 'MYCONFIG') 

    # now modify the new env/configuration 
    # this adds the appropriate "boost_" to the beginning 
    # of the library and the "-mt" to the end if needed 
    cfg.env.LIB_MYCONFIG = cfg.boost_get_libs('filesystem system')[-1] 

def build(bld): 

    # basic boost (no libraries) 
    bld.program(target='test-boost2', source='test-boost.cpp', 
       use='BOOST') 

    # myconfig: boost with two libraries 
    bld.program(target='test-boost', source='test-boost.cpp', 
       use='MYCONFIG') 

    # warning: 
    # notice the NDEBUG shows up twice in the compilation 
    # because MYCONFIG already includes everything in BOOST 
    bld.program(target='test-boost3', source='test-boost.cpp', 
       use='BOOST MYCONFIG') 
0

tôi figured này ra và các bước như sau:

gia tăng kiểm tra sau trong chức năng cấu hình trong tập tin wscript. Điều này cho kịch bản lệnh kiểm tra tệp thư viện đã cho (libmongoclient trong trường hợp này), và chúng tôi lưu trữ kết quả của việc kiểm tra này trong MONGOCLIENT.

conf.check_cfg(package='libmongoclient', args=['--cflags', '--libs'], uselib_store='MONGOCLIENT', mandatory=True) 

Sau bước này, chúng ta cần thêm tệp cấu hình gói (.pc) vào đường dẫn/usr/local/lib/pkgconfig. Đây là tệp mà chúng tôi chỉ định đường dẫn đến lib và tiêu đề. Đang dán nội dung của tệp này bên dưới.

prefix=/usr/local 
libdir=/usr/local/lib 
includedir=/usr/local/include/mongo 

Name: libmongoclient 
Description: Mongodb C++ driver 
Version: 0.2 
Libs: -L${libdir} -lmongoclient 
Cflags: -I${includedir} 

Đã thêm phụ thuộc vào chức năng xây dựng của chương trình riêng biệt phụ thuộc vào thư viện ở trên (ví dụ: MongoClient). Dưới đây là một ví dụ.

mobility = bld(target='bin/mobility', features='cxx cxxprogram', source='src/main.cpp', use='mob-objects MONGOCLIENT',) 

Sau đó, chạy lại cấu hình và tạo mã của bạn.

+1

Trong tương lai, vui lòng chỉnh sửa câu trả lời của bạn cho câu hỏi trong tầm tay và không chỉ lặp lại câu trả lời. Ở đây, câu trả lời * xảy ra * để áp dụng cho cả hai câu hỏi, và các câu hỏi khác nhau đủ để bạn không thể lừa chúng (một yêu cầu thêm vào bao gồm, câu hỏi còn lại thêm một thư viện). Ít nhất giải thích trong mỗi cách nó áp dụng cho * tình huống cụ thể * trong câu hỏi. –