Chúng tôi đang đánh giá scons là một hệ thống xây dựng, và tôi đang gặp vấn đề với hệ thống cũ của chúng tôi. Trong một số thư mục con mã nguồn của chúng ta, chúng ta có một tệp "sources.lib" liệt kê tên của các tệp C++ cần được biên dịch để lắp ráp thư viện đích của thư mục đó. Tuy nhiên, có thêm các tệp C++ trong cùng một thư mục, vì vậy tôi không thể chỉ sử dụng Glob() để tìm các tệp thích hợp.Các scon có biết trong thư mục nào có tệp SConscript không?
Làm cách nào để tìm ra thư mục chứa tệp SConscript nào? os.getcwd() luôn trả về thư mục build. Mặc dù tài liệu nói rằng các đường dẫn trong một SConscript có liên quan đến thư mục nguồn (hoặc khác Glob ('*. Cpp') sẽ không hoạt động), chỉ cần mở ('sources.lib') không thành công vì nó tìm kiếm trong thư mục xây dựng. Cuối cùng, môi trường xây dựng trong tệp SConscript đó không chứa thư mục nguồn hiện tại thực sự.
Sửa Từ this reply nó trông giống như
File('sources.lib').srcnode().abspath
trả về tên tập tin thích hợp và thư mục, nhưng nó sẽ không cho bạn biết nếu nó tồn tại (phải sử dụng os.path.isfile cho điều đó). Nó cũng xuất hiện rằng
Dir('.').srcnode().abspath
sẽ cho bạn biết nơi tệp SConstruct cư trú.
Ví dụ Khi xác định mà nguồn tập tin để biên dịch cho một thư viện, tôi không muốn sử dụng
lib = env.SharedLibrary('mylib', Glob('*.cpp'))
nhưng thay vì thà xây dựng một hàm rằng séc đầu tiên cho sự tồn tại của "sources.lib "và nếu nó không tồn tại, sử dụng globbing. Vì vậy, tôi xác định thư viện của tôi như vậy
lib = env.SharedLibrary('mylib', env.getSources('*.cpp'))
và thực hiện một chức năng mà đọc các tập tin nếu nó tồn tại
def getSources(self, pattern): # list of source files to assign to a target sources = [] # srcFile = 'sources.lib' # failed # srcFile = os.path.join(os.getcwd(), 'sources.lib') # failed srcFile = File('sources.lib').srcnode().abspath # works # look for sources.lib try: infile = open(srcFile,'r') except IOError: #print "Globbing to get sources" sources = Glob(pattern, strings=True) else: #print "Reading sources.lib" for line in infile.readlines(): line = line.rstrip('\n\r') if line != '': sources.append(line) return sources buildEnv.AddMethod(getSources)
Điều này dường như làm việc. Tôi không biết về File.srcnode(). Abspath cho đến ngày hôm nay.
Để xác định xem một tập tin tồn tại, bạn có thể sử dụng os.path.exists() – Brady
Tôi không hiểu vấn đề của bạn, tạo ra ví dụ nhỏ minh họa nó. – Torsten
Câu hỏi của bạn đã lưu cho tôi :) 'Dir ('.'). Srcnode(). Abspath' làm việc cho tôi. Tôi sử dụng tùy chọn này 'env.SConscriptChdir (0) 'để tránh thư mục" trang trình bày ". Cảm ơn! – Destroyica