2010-01-26 13 views
20

Tôi đã tìm câu trả lời cho câu hỏi này nhưng không thể tìm thấy bất kỳ câu trả lời nào tốt. Có thể họ đã già và một cái gì đó đã thay đổi, vì vậy tôi hỏi lại.Tự động tạo các tệp nhị phân thành bin/thay vì bằng src/

Tôi có một cấu trúc thư mục như:

my_project

  • src

  • bin

Tôi muốn điều đó, khi tôi thực hiện trong thư mục gốc, các tập tin nhị phân được đặt trong ./bin, thay vì lộn xộn ./src. Nhưng bằng cách nào?

EDIT: Tôi đang sử dụng C++. Makefile.am của tôi không có gì đặc biệt cả. Chỉ các biến bin_PROGRAM và _SOURCES.

Khi tôi chạy, các tệp nhị phân được tạo sẽ được đặt vào ./src. Tôi chỉ đơn giản là muốn chúng trong ./bin.

+0

đăng những gì bạn đã làm (makefile), làm rõ cấu trúc thư mục của bạn ở trên, sau đó sẽ dễ dàng hơn nhiều để trợ giúp (ngoài ra, ngôn ngữ lập trình bạn đang sử dụng có thể liên quan) – KevinDTimm

+0

Bạn có đang sử dụng toàn bộ ngăn xếp Tự động không? Nếu vậy, như @Braden đã đề cập, chỉ cần sử dụng kịch bản lệnh shell 'configure' được tạo bởi Autoconf. – Plamen

+0

http: // stackoverflow.com/questions/1015700/autotools-library-and-object-file-output-control –

Trả lời

29

Bạn đã có ý tưởng sai ở đây.

Cây xây dựng của bạn ở bất cứ nơi nào bạn chạy configure. Đó là cách autoconf được thiết kế để hoạt động. Người dùng gói của bạn (những người không muốn lộn xộn cây nguồn của họ) sẽ mong đợi nó hoạt động theo cách này.

Cách tiếp cận này là giải pháp tổng quát hơn với tính linh hoạt hơn rất nhiều so với tổ chức bạn đang tưởng tượng. Ví dụ, nó không phải là khủng khiếp bất thường để muốn duy trì nguồn và xây dựng các tập tin trên hệ thống tập tin riêng biệt.

18

Tự động không đối phó tốt nếu bạn cố thiết lập thư mục theo cách khác với mong muốn. Những gì bạn muốn sẽ liên quan đến việc viết các quy tắc bổ sung để chuyển các tệp nhị phân sang ../bin sau khi biên dịch chúng, điều này không cần thiết phức tạp.

Nếu bạn không muốn lộn xộn thư mục nguồn của bạn, hãy thử này:

cd my_project 
mkdir build 
cd build 
../configure 
make 

Điều đó sẽ đặt tất cả các tập tin được tạo (như makefiles, nhị phân, các file object) trong thư mục con của my_project/build.

+0

Nó hoạt động, nhưng hơi lộn xộn một chút. Tôi có thể làm điều đó, nhưng nếu người khác sử dụng phần mềm của tôi thì sao? Họ sẽ có ./src của họ lộn xộn. Có lẽ tôi có thể chỉ cần thêm các lệnh này vào quy tắc của Makefile? –

+1

'configure' là những gì tạo ra các makefiles, vì vậy bạn không thể đặt lệnh đó trong makefile. Tôi có thể nói rằng hầu hết mọi người không quan tâm đến việc có ./src lộn xộn, vì Automake luôn hoạt động theo cách đó. Đây là giải pháp tiêu chuẩn cho những người chăm sóc. Và điều gì sẽ xảy ra nếu họ thích có các tệp nhị phân trong cùng một thư mục? Nếu bạn vẫn muốn thiết lập nó theo cách của bạn, tôi không nghĩ rằng có cách nào để làm điều đó mà không đưa lên Automake (mặc dù bạn vẫn có thể sử dụng Autoconf.) – ptomato

+2

Thêm vào đó, nếu người khác sử dụng phần mềm của bạn và thấy rằng nó sử dụng autoconf/automake, họ sẽ không mong đợi nó để xây dựng các công cụ trong một thư mục riêng biệt (trừ khi họ sắp xếp cho nó bằng cách chạy cấu hình elsewere như ptomato đã hiển thị). Nó chỉ là triết lý của Hệ thống Xây dựng GNU, và Autoconf/Automake là các công cụ để triển khai Hệ thống Xây dựng GNU và không phải cái gì khác. Bạn có thể muốn xem chương giới thiệu về Automake cho các trường hợp sử dụng điển hình của GNU Build System: http://sources.redhat.com/automake/automake.html#Use-Cases – adl

14

Một cách để yêu cầu Automake tạo các tệp nhị phân trong một thư mục nhất định là thêm thư mục này ngay vào tên trong biến "bin_PROGRAMS".

Xem xét src sau/Makefile.am:

bin_PROGRAMS = foo 
foo_SOURCES = ... 
foo_CPPFLAGS = ... 
foo_LDFLAGS = ... 

Nó tạo ra một nhị phân "src/foo", nhưng bạn có thể nói Automake sử dụng các nguồn trong src để tạo ra một nhị phân "bin/foo" :

bin_PROGRAMS = $(top_builddir)/bin/foo 
__top_builddir__bin_foo_SOURCES = ... 
__top_builddir__bin_foo_CPPFLAGS = ... 
__top_builddir__bin_foo_LDFLAGS = ... 

Tôi đã thử với một số gói và thậm chí là "làm cho dấu kiểm" nuốt nó. Mặc dù vậy, không thể có nhiều hack ...

+0

Đó là giải pháp tốt nhất, tôi nghĩ vậy. Không hoàn hảo, bởi vì tất cả .o và các tệp được tạo bởi quá trình biên dịch vẫn nằm trong src, nhưng ... –

+1

Có cách nào để di chuyển * mọi thứ * xây dựng liên quan đến thư mục con chẳng hạn như xây dựng/(bao gồm tệp đối tượng, tệp văn bản được tạo) , .desktop, vv), tương tự như những gì tôi phổ biến trong thế giới Java với ví dụ Maven. – lanoxx

+2

Bạn có thể thử thực thi kịch bản cấu hình từ một thư mục khác; ví dụ, bạn có thể tạo một thư mục con "build", thực hiện "cd build; ../configure; make". Điều này sẽ để lại mọi thứ bên ngoài "xây dựng" bị ảnh hưởng và tạo tất cả các tệp bên trong "xây dựng", bao gồm các đối tượng và tệp nhị phân. –

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