2010-06-25 30 views
19

Tôi muốn biết cách đặt trình biên dịch/trình liên kết mặc định/v.v. cờ nếu tôi sử dụng combo Autoconf/Automake.Cờ biên dịch mặc định với Autotools

Ví dụ: cờ trình biên dịch mặc định là "-O2 -g" nếu tôi không đặt bất kỳ thứ gì. Tôi chỉ có thể ghi đè lên nó với cái gì khác, ví dụ nếu tôi muốn debug:

./configure 'CXXFLAGS=-O0 -g' 

Nhưng tôi thấy cấu hình mặc định ngu ngốc vì nếu tôi bật tối ưu hóa, gỡ lỗi sẽ trở nên bất khả thi. Vì vậy, các cờ mặc định phải là "-O2" hoặc "-O0 -g", nếu tôi chạy configure không có đối số. Tôi phải làm nó như thế nào?

Edit: Tôi đã thử các giải pháp sau:

  • Đặt progname_CXXFLAGS=whatever để Makefile.am. Nó không hoạt động, bởi vì nó thêm cờ vào cờ mặc định thay vì thay thế chúng.
  • Đặt CXXFLAGS=whatever vào configure.ac. Điều này làm việc, nhưng sau đó tôi không thể ghi đè nó sau này.
+1

@ người dùng-không-hiểu-tại sao-này-không-làm việc-trong-một-C-dự án: CXXFLAGS nên được CFLAGS khi được thông qua như một arg. to ./configure – legends2k

Trả lời

6

Trong khi đó, tôi đã tìm ra cách thực hiện. Tôi sẽ giải thích cho điều này.

Điều cơ bản là Autoconf thay thế biến shell trong Makefile.in. Câu hỏi đặt ra là làm cách nào để tôi nhận được giá trị của các biến này? Câu trả lời là lệnh khởi tạo thay thế các biến được nói với chúng tại dòng lệnh (như ./configure 'CXXFLAGS=-O0 -g') và nếu không chúng được thay thế bằng bất kỳ lệnh nào định nghĩa mặc định (ví dụ, CXXFLAGS được đặt bởi AC_PROG_CXX) nếu chúng không trống. Vì vậy, giải pháp là thiết lập mặc định mới của chúng tôi trước AC_PROG_CXX nhưng sau khi thay thế từ các dòng lệnh được thực hiện. Ví dụ:

if test -z $CXXFLAGS; then 
    CXXFLAGS='-O2' 
fi 
AC_PROG_CXX 
+9

Giải pháp này hoàn toàn vi phạm hiệu trưởng ít gây ngạc nhiên nhất. Khi chạy cấu hình mà không đặt rõ ràng CXXFLAGS, mọi người mong đợi CXXFLAGS được đặt thành '-g -O2'. Nếu bạn muốn thay đổi nó cho chính mình, hãy làm như vậy với một config.site. Không thực hiện thay đổi trong configure.ac. Đó là nơi sai để làm điều đó. –

+2

Ngoài ra (mặc dù điều này có vẻ giống như trường hợp sử dụng bất thường), nếu người dùng đặt CXXFLAGS rõ ràng là trống (định cấu hình CXXFLAGS = --prefix ...), mã này sẽ ghi đè người dùng. Thay vì kiểm tra rằng CXXFLAGS trống, bạn nên kiểm tra xem nó có được xác định không bằng ": $ {CXXFLAGS = -O2} ' –

+1

Cảm ơn. Đây là giải pháp tôi muốn. Tôi muốn thay đổi tối ưu hóa mặc định từ -O2 thành -O3 nhưng cho phép mọi người thực hiện thay đổi của riêng họ. – vy32

0

On Makefile.am của bạn, bạn có thể xác định chúng với

programname_CXXFLAGS=-O0 -g 

Cập nhật: 20100628

Bạn nên cố gắng và thêm CXXFLAGS trong configure.in trước khi gọi AC_PROG_CXX. Tôi đã không kiểm tra nó, nhưng configure.in của bạn sẽ giống như

AC_INIT 
... 
CXXFLAGS=-MY -FLAGS 
... 
AC_PROG_CXX 

Xin vui lòng, cho tôi biết nếu làm việc này vì tôi :-) tò mò

+0

Tôi đã thử một cái đầu tiên. Nó không hoạt động. Nó thêm cờ vào cờ mặc định, vì vậy nó tạo ra "-O2 -g -O0 -g" hoặc một cái gì đó tương tự. – petersohn

+3

Tất cả tệp configure.in phải để trống hoặc không tồn tại. Tên 'configure.in' đã lỗi thời trong vài năm. 'configure.ac' là tên chính xác. –

2

Bạn có thể đặt giá trị mặc định mục tiêu cụ thể trong Makefile.am hoặc bạn có thể đặt mặc định trong configure.ac và điều đó sẽ áp dụng cho mọi thứ bạn xây dựng trong dự án.

Xem phần 4.8.1 (và 5.10.4) trong autoconf manual.

Lưu ý các nhận xét trong 4.8.1 về không đoán người dùng gói cuối cùng: nếu bạn muốn đặt cờ mà người dùng không nên quan tâm thì hãy đặt chúng bằng cách sử dụng AM_CXXFLAGS, cờ như vậy mà người dùng nên có thể ghi đè nên được đặt trong CXXFLAGS.

Nhưng ... bạn có thực sự muốn làm điều này không?

  1. Bạn nói 'gỡ lỗi sẽ trở thành không thể'. Bạn đã thử điều này và nhìn thấy một cái gì đó đi sai? Trình biên dịch/trình gỡ rối có thể thông minh hơn bạn cho nó tín dụng.
  2. Mặc định tốt cho bạn vào thời điểm phát triển không nhất thiết phải là mặc định tốt cho người dùng cuối cùng tại thời điểm xây dựng. Nếu nó thực sự là cần thiết để tắt tối ưu hóa trong quá trình phát triển, sau đó chỉ cần cấu hình hệ thống phát triển của bạn với ./configure CXXFLAGS='-O0 -g', chính xác như bạn mô tả. Nếu configure.ac của bạn được viết chính xác, cấu hình đó sẽ cấu hình của bạn xây dựng mà không tối ưu hóa trong khi vẫn giữ nguyên (mặc định) mặc định.

Phiên bản ngắn: cách bạn đang làm bây giờ là đúng cách.

Edited thêm:

Nói chung, nếu một biến vỏ xuất hiện như một cuộc tranh cãi để AC_SUBST (hoặc rõ ràng hoặc, như trong trường hợp của những thứ như CXXFLAGS, ngầm trong một số lệnh khác), sau đó nó được thay thế vào các tập tin đầu ra. Tức là, sau AC_SUBST(foo), giá trị của biến số $foo trong tập lệnh ./configure sẽ được thay thế thành @[email protected] trường hợp.

+1

Đầu tiên, bạn không trả lời câu hỏi của tôi. Bạn đã nhận xét về lý do tại sao tôi muốn làm điều đó, và đây là điều tôi không muốn tranh cãi, bởi vì nó không phải là vấn đề. Vấn đề là tôi muốn thay đổi cờ trình biên dịch mặc định. – petersohn

+0

Đủ công bằng. Tôi đã không thực sự nhận ra rằng câu hỏi của bạn là về sh-cơ học của thiết lập các biến, và tôi đã chỉnh sửa trong một nhận xét có thể hữu ích thêm về điều đó. –

+0

@NormanGray -O2 tối ưu hóa rất nhiều biến, do đó, có, trình gỡ lỗi không phải là thông minh hơn petersohn cho nó tín dụng cho. –

7

Nếu bạn chỉ muốn đặt cờ mặc định cho chính mình bất cứ khi nào bạn chạy định cấu hình, có (ít nhất) 3 cách tốt để thực hiện. Đặt CXXFLAGS trong môi trường của bạn (ví dụ: in .login hoặc .bashrc), sử dụng biến môi trường CONFIG_SITE để chỉ định tệp cấu hình hoặc đặt giá trị bạn muốn cho CXXFLAGS trong $ prefix/share/config.site. Nếu bạn muốn đặt cờ mặc định thành một cái gì đó khác với '-O2 -g' cho tất cả người dùng của gói của bạn, thì bạn cần phải thay đổi những gì bạn muốn bởi vì làm như vậy vi phạm hiệu trưởng ít nhất là bất ngờ. Bất kỳ ai quen thuộc với autoconf đều mong đợi các cờ mặc định là -O2 -g và bạn không nên thay đổi điều đó.

Go với tùy chọn thứ 3 đưa ra ở trên, và chỉ cần làm

 
$ echo 'CXXFLAGS="-O0 -g"' > /usr/local/share/config.site 

(hoặc chuyển hướng đến bất cứ nơi nào bạn thường đặt $ tiền tố, ví dụ: $ HOME/share/config.site) Là một tiền thưởng thêm, điều này sẽ đặt CXXFLAGS cho tất cả các dự án được tự động định cấu hình mà bạn định cấu hình chứ không phải chỉ riêng của bạn. (Giả sử bạn thiết lập tiền tố thích hợp Nếu bạn muốn có một config.site mới có giá trị cho tất cả các dự án bất kể tiền tố, sau đó sử dụng một thiết lập CONFIG_SITE.)

18

Theo autoconf tay (khoảng AC_PROG_CC):

Nếu bằng cách sử dụng trình biên dịch GNU C, đặt biến biến GCC thành 'có'. Nếu biến đầu ra CFLAGS chưa được đặt, hãy đặt nó thành -g -O2 cho trình biên dịch GNU C (-O2 trên các hệ thống mà GCC không chấp nhận -g) hoặc -g cho các trình biên dịch khác. Nếu gói của bạn không thích mặc định này, sau đó nó có thể chấp nhận để chèn dòng

: ${CFLAGS=""}

sau AC_INIT và trước AC_PROG_CC để chọn một mặc định rỗng để thay thế.

Tương tự, theo autoconf tay (khoảng AC_PROG_CXX):

Nếu sử dụng ++ biên dịch GNU C, đặt vỏ biến GXX thành ‘yes’. Nếu biến đầu ra CXXFLAGS chưa được đặt, hãy đặt nó thành -g -O2 cho trình biên dịch GNU C++ (-O2 trên các hệ thống mà G ++ không chấp nhận -g) hoặc -g cho các trình biên dịch khác. Nếu gói của bạn không thích mặc định này, sau đó nó có thể chấp nhận để chèn dòng

: ${CXXFLAGS=""}

sau AC_INIT và trước AC_PROG_CXX để chọn một mặc định rỗng để thay thế.

0

xây dựng trên những câu trả lời ở trên, tôi đã thêm này để configure.ac:

AC_ARG_WITH(debug, [ --with-debug   add the debugging module], [AC_DEFINE(WITH_DEBUG,1,0) 
AC_SUBST(WITH_DEBUG,1) 
CXXFLAGS="-O0 -ggdb"]) 

Nó cũng định nghĩa WITH_DEBUG trong AC_CONFIG_HEADERS (config.h) và thêm nó vào Makefile với AC_SUBST().

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