2012-01-02 19 views
5

Có cách nào thay đổi tệp thông số để nó sẽ vượt qua -march=native nếu không có gì được chỉ định trong dòng lệnh không?Cách sử dụng gcc sử dụng march = gốc làm mặc định?

thứ liên quan trong hồ sơ kỹ thuật mặc định là:

*cc1: 
%(cc1_cpu) 

*cc1_cpu: 
%{march=native:%>march=native %:local_cpu_detect(arch) %{!mtune=*:%>mtune=native %:local_cpu_detect(tune)}} %{mtune=native:%>mtune=native %:local_cpu_detect(tune)} 

Tôi không chắc chắn như thế nào thông số kỹ thuật hoạt động. Chỉ cần chỉ định -march=native trước hoặc sau %(cc1_cpu) không hoạt động. Tuy nhiên, dòng này không có hiệu lực vì GCC sẽ báo cáo lỗi nếu tôi đặt -something_wierd thay vì -march=native.

Một điều tôi nhận thấy là nếu tôi đặt %{march=i386:-something_wierd} trước %(cc1_cpu), báo cáo gcc lỗi để trông giống như -march=i386 luôn được thông qua năm nếu không có gì được chỉ định, như vậy là có một cách để phân biệt giữa không có gì cụ thể và -march=i386 trong tập tin thông số kỹ thuật?

BTW, những gì hiện %> làm gì? Có vẻ như nó không được chỉ định in the documentation.

Tôi đang sử dụng số gcc-4.6.2 của MinGW.

Trả lời

4

Đề cập đến câu hỏi cuối cùng của bạn: Các gcc 4.6.1 nguồn (gcc/gcc.c) chứa những nhận xét sau đây về %>:

%>S Similar to "%<S", but keep it in the GCC command line. 

Vì lợi ích của sự hoàn chỉnh sau khi bình luận cho %< hình thức cùng một tập tin:

%<S remove all occurrences of -S from the command line. 
     Note - this command is position dependent. % commands in the 
     spec string before this one will see -S, % commands in the 
     spec string after this one will not. 

Để trả lời câu thứ e câu hỏi đầu tiên trong ngắn hạn: có, nhưng ....

... giải pháp chung duy nhất tôi thấy có nhược điểm đáng kể rằng tùy chọn -march sẽ bị bỏ qua, vì vậy mỗi khi xây dựng được thực hiện như nếu -march=native đã được chỉ định . Nhưng dù sao cũng có một cách giải quyết khác.

1 Các giải pháp (không có workaround)

Tạo một số kỹ thuật-tập tin gọi là giả sử specs.nativealways chứa:

*cc1_cpu: 
%<march=* -march=native %>march=native %:local_cpu_detect(arch) %{!mtune=*:%>mtune=native %:local_cpu_detect(tune)} %{mtune=native:%>mtune=native %:local_cpu_detect(tune)} 

Khi sử dụng các thông số kỹ thuật-file (ví dụ bằng cách gọi gcc với các tùy chọn -specs=specs.nativealways) việc xây dựng sẽ được thực hiện như thể -march=native đã được chỉ định (với nhược điểm được đề cập là bất kỳ sự xuất hiện của tùy chọn -march=<arch> nào sẽ bị bỏ qua).

2 Cách giải quyết

Để vẫn bởi khả năng ghi đè lên hành vi mặc định mới được cấu hình người ta có thể sử dụng một phiên bản sửa đổi của các thông số kỹ thuật-file mô tả ở trên, giới thiệu một tùy chọn mới gọi -myarch sử dụng cú pháp giống như -march (ngoại trừ -myarch=native, không hoạt động, hiện không được chuyển đổi thành native bây giờ là mặc định).

Các thông số kỹ thuật modfied-file trông như thế này:

*cc1_cpu: 
%<march=* %{myarch=*:%<myarch* -march=%* ; :-march=native %>march=native %:local_cpu_detect(arch) %{!mtune=*:%>mtune=native %:local_cpu_detect(tune)}} %{mtune=native:%>mtune=native %:local_cpu_detect(tune)} 

PS: Điều này đã được thử nghiệm với với gcc 4.6.2 trên Linux, nhưng nên làm việc trên MinGW.

+0

Tôi thực sự đã đưa ra một số giải pháp tương tự như cách tiếp cận đầu tiên của bạn. Tôi thực sự nhận ra rằng vấn đề chính là -march = i386 luôn luôn được truyền theo mặc định và không có cách nào để nói nếu nó được truyền theo mặc định hoặc thông qua dòng lệnh. Tôi đoán việc thay đổi mã nguồn GCC gần như là cách duy nhất. –

+0

@icando: Bạn đặt tên cho nó! – alk

1

Mặc dù không phải là câu trả lời trực tiếp cho câu hỏi của bạn, bạn có thể đạt được hiệu ứng rất giống nhau bằng cách xác định CFLAGSCXXFLAGS trong tệp khởi tạo của trình bao. 99% của Makefiles là đủ tiêu chuẩn để nhận các giá trị môi trường và chuyển cờ đến gcc.

+0

Tôi đồng ý, có thể công việc này xung quanh là đủ trong hầu hết các trường hợp. –

1
*cc1_cpu: 
+ %{!march*:-march=native} 
+0

điều này sẽ không hoạt động, nếu tôi nhớ chính xác (câu hỏi quá cũ). Lý do là cc1 không chấp nhận native như tham số to -march. Nó thực sự gọi local_cpu_detect để có một giá trị đúng cho -march. –

+0

@icando Phần quan trọng là '% {! March *:'. Điều này sẽ chỉ phù hợp nếu '-march =' không nằm trong dòng lệnh, nghĩa là bạn nhận được một "mặc định" nếu không có gì khác được chỉ định. Tôi không biết gì về các thông số thực tế. – baruch

+0

@icando Và tôi biết câu hỏi này là cũ. Tôi đã chỉ tìm cách để làm một cái gì đó tương tự (thiết lập mặc định cho g ++ là C++ 11 nếu không có gì khác được xác định) và tìm thấy con đường của tôi ở đây thông qua Google. Một khi tôi đã tìm ra một giải pháp cho vấn đề của mình, tôi đã hình dung rằng tôi sẽ đặt nó ở đây vì lợi ích của bất kỳ ai khác đang tìm kiếm thứ gì đó tương tự trong tương lai. – baruch

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