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:
- 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ụcsrc
. Ví dụ:more.c
có thể bao gồmfoo.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"
. - 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ụcsrc
.
(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ầncd
vàosrc
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ụcsrc
và chạy nó từ đó, có thể sử dụngMakefile
ở 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ơnsrc
.
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?
Đ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 –