2011-06-24 74 views
12

Tôi có một thư mục/src chứa tất cả các tệp nguồn của tôi và/bin để lưu trữ tất cả nhị phân sau khi chạy lệnh. Thư mục là một cái gì đó như dưới đây:Tự động biến để dọn dẹp Makefile.am

/BuildDirectory 
- - /src 
- - /bin 
- - configure 
- - Makefile.am 
- - configure.ac 
- - ... 

Bây giờ trong Makefile.am, tôi phải quy định:

bin_PROGRAMS = bin/x bin/y bin/z bin/k ... 

bin_x_SOURCES = src/x.cpp 
bin_y_SOURCES = src/y.cpp 
bin_z_SOURCES = src/z.cpp 

Có bất kỳ biến mà có thể giúp đỡ để thoát khỏi tất cả "bin /" và " src/"? Ví dụ: tôi chỉ cần chỉ định:

$BIN = bin 
$SRC = src 

Và họ sẽ tìm đúng tệp trong thư mục chính xác và biên dịch đúng vị trí.

Cảm ơn

Trả lời

4

Bạn có thể tận dụng lợi thế của tòa nhà từ xa. Đặt makefile này trong dir bin:

VPATH = ../src 
bin_PROGRAMS = x y z k ... 

x_SOURCES = x.cpp 
y_SOURCES = y.cpp 
z_SOURCES = z.cpp 

Bây giờ thay thế Makefile.am hiện với điều này một:

SUBDIRS = bin 

Bây giờ tinh chỉnh configure.ac của bạn cũng để tạo bin/Makefile

AC_CONFIG_FILES([Makefile 
     bin/Makefile]) 

và bạn nên đặt cuộc sống.

+0

Tôi nghĩ VPATH là những gì tôi cần! thông tin tuyệt vời – w00d

2

Không phải với kiến ​​thức của tôi. Nếu bạn đang tìm kiếm để tách các file biên soạn của bạn từ các tập tin nguồn của bạn, hãy nhớ rằng bạn có thể xây dựng bên ngoài của cây:

$ cd foo-1.2.3 
$ mkdir build 
$ cd build 
$ ../configure 
$ make 
$ make install 

Nếu đây là những gì bạn đang tìm kiếm để làm, bạn có thể làm đơn giản bằng cách Makefile.am tạo các tệp nhị phân không có tiền tố thư mục (và vẫn tham chiếu các thứ trong src/ bằng tay).

+0

Sử dụng hỗ trợ xây dựng từ xa được cung cấp bởi thực hiện là một giải pháp tốt hơn mặc dù tôi không biết điều này :) – DipSwitch

1

Nếu bạn đang cố gắng làm là những gì tôi nghĩ rằng bạn đang cố gắng để làm, bạn đang cố gắng để đạt được một cái gì đó như:

SRCDIR = src 
BINDIR = bin 

bin_PROGRAMS = $(BINDIR)/x $(BINDIR)/y $(BINDIR)/z 

bin_x_SOURCES = $(SRCDIR)/x.cpp 
bin_y_SOURCES = $(SRCDIR)/y.cpp 
bin_z_SOURCES = $(SRCDIR)/z.cpp 

Tôi đã thử nghiệm điều này một vài lần trong các hình thức khác nhau và nó sẽ không biên dịch mã như ví dụ của bạn; Tôi bằng cách nào đó đã thuyết phục rằng nó đang biên dịch C ở một giai đoạn:

gmake[1]: *** No rule to make target `bin/x.c', needed by `x.o'. Stop. 

Tôi chắc chắn rằng điều đó là không thể. Lấy làm tiếc.

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