2013-05-04 33 views
5

Tôi có một ứng dụng như sau (tôi đã có thể nghĩ khá phổ biến) thư mục hệ thống cấp bậc:xây dựng liên quan đến src/thư mục với SCons

/src 
    subdir1/ # Subdirs with more source files. 
     more.c 
     SConscript 
    foo.c  # Source files. 
    foo.h 
    SConscript 
/other  # Other top-level directories with no source code. 
/stuff  # However, there are other assets I may want to build. 
README  # Other top-level files. 
SConstruct 

Vấn đề là khi tôi chạy scons từ thư mục cấp cao nhất , nó gọi gcc từ thư mục đó mà không cd ing vào src, như thế này:

gcc -o src/foo.o src/foo.c 

Đây là vấn đề vì nhiều lý do:

  1. Trong chương trình của tôi, tôi #include tệp cung cấp đường dẫn tương đối với thư mục src. Ví dụ: more.c có thể bao gồm foo.h với #include "foo.h". Điều này không thành công vì GCC được chạy từ thư mục mẹ. Tôi không muốn thay đổi số của mình thành #include "src/foo.h".
  2. Tôi sử dụng các macro đặc biệt __FILE__ cho những thứ như đăng nhập. Khi được xây dựng từ thư mục cấp cao nhất, GCC đặt "src/" ở phía trước của tất cả tên tệp, vì đó là đường dẫn được biên dịch. Điều này có vẻ cầu kỳ, nhưng tôi không muốn điều đó, bởi vì tôi nghĩ về cây nguồn của tôi là tương đối so với thư mục src.

(Sửa:. Tôi nên thêm rằng rõ ràng là # 1 có thể được cố định bằng cách thêm -Isrc như một lá cờ để GCC, nhưng điều này có vẻ như nhiều hacks xung quanh vấn đề chính)

Làm thế nào tôi có thể làm SCB cd vào thư mục src trước khi gọi gcc?

  • Tôi không muốn để thoát khỏi thư mục src và di chuyển tất cả mọi thứ lên, bởi vì có rất nhiều (không mã hóa) khác file ở cấp cao nhất.
  • Tôi không muốn SCons là cd vào mọi thư mục con. Chỉ cần cd vào src và sau đó xây dựng tất cả các tệp trong cấu trúc phân cấp từ đó.
  • Tôi có thể giải quyết vấn đề này bằng cách di chuyển SConscript bên trong thư mục src và chạy nó từ đó, có thể sử dụng Makefile ở cấp cao nhất. Nhưng điều này có vẻ khá khó khăn, và tôi cũng muốn sử dụng SCons để xây dựng (phi mã) tài sản trong các thư mục khác hơn src.

Tôi đã đọc rằng bạn có thể tạo Builder tùy chỉnh và thay đổi thư mục. Tuy nhiên, tôi không muốn viết hoàn toàn mới Builder cho C/C++. Có cách nào để sửa đổi hành vi của một người xây dựng hiện có mà không cần viết một từ đầu? Ngoài ra, trên một diễn đàn, một người nào đó nói rằng việc thay đổi các thư mục từ trong một Builder sẽ phá vỡ các bản dựng song song vì nó sẽ thay đổi thư mục mà các tác vụ khác đang xây dựng. Điều này có đúng không?

+0

Điều này có vẻ như những gì tôi muốn cho vấn đề của mình: https://stackoverflow.com/questions/45519577/scons-link-program-without-build-directory-in-link-path –

Trả lời

3

Hành vi này chỉ là cách SCons hoạt động và không thể tránh/thay đổi. Tôi đã tìm kiếm một số tài liệu hỗ trợ trong lợi của nó, và havent tìm thấy bất kỳ. Nó chỉ là một cái gì đó Ive trở thành sử dụng để.

Như bạn đã đề cập, các đường dẫn bao gồm rất dễ khắc phục. Phần khó hơn là macro __FILE__. Tôi đã không bao giờ nhận thấy điều này cho đến khi bạn đề cập đến nó.Thật không may, tôi nghĩ rằng cách duy nhất xung quanh này là để tách đường dẫn trong logger, mà là một sửa chữa khá xấu xí.

+0

Cảm ơn bạn đã xác nhận sự nghi ngờ của tôi. Vâng, tôi đã cập nhật nhật ký của mình để nó thoát ra khỏi toàn bộ đường dẫn và chỉ hiển thị tên tệp (điều này có thể tốt hơn, vì nhật ký trông sạch hơn nhiều và bạn thường có thể đoán đường dẫn nếu cần). Tôi đoán tôi có thể sống với điều này ngay bây giờ :) – mgiuca

Các vấn đề liên quan