Как заставить gcc использовать march = native по умолчанию? - PullRequest
5 голосов
/ 03 января 2012

Есть ли способ изменить файл спецификаций так, чтобы он передавал -march=native, если в командной строке ничего не указано?

Связанные вещи в файле спецификаций по умолчанию:

*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)}

Я не уверен, как работает спецификация.Простое указание -march=native до или после %(cc1_cpu) не работает.Однако эта строка вступает в силу, потому что GCC сообщит об ошибке, если я поставлю -something_wierd вместо -march=native.

Еще одна вещь, которую я заметил, если я поставлю %{march=i386:-something_wierd} перед %(cc1_cpu), gcc сообщает об ошибке такпохоже, что -march=i386 всегда передается, если ничего не указано, так есть ли способ отличить ничего не указанное от -march=i386 в файле спецификаций?

Кстати, что делает %>?Похоже, он не указан в документации .

Я использую MinGW gcc-4.6.2.

Ответы [ 3 ]

4 голосов
/ 04 января 2012

Ссылаясь на ваш последний вопрос: Источники gcc 4.6.1 (gcc/gcc.c) содержат следующий комментарий к %>:

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

Для полноты после комментария к %< сформируйте тот же файл:

 %<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.

Чтобы ответить на первый вопрос вкратце: да, но ....

... единственное общее решение, которое я нашел, имеет существенный недостаток, заключающийся в том, что опция -march будет игнорироваться, поэтому каждая сборка выполняется так, как если бы был указан -march=native. Во всяком случае, есть обходной путь к этому.

1 Раствор (без обходного пути)

Создайте spec-файл с именем скажем specs.nativealways, содержащий:

*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)}

При использовании spec-файла (например, путем вызова gcc с параметром -specs=specs.nativealways) сборка будет выполняться так, как если бы был указан -march=native (с указанным недостатком, что любое вхождение параметра -march=<arch> будет были просто проигнорированы).

2 Обходной путь

Чтобы по-прежнему переопределять вновь настроенное поведение по умолчанию, можно использовать модифицированную версию описанного выше файла спецификации, вводя новую опцию под названием -myarch с использованием того же синтаксиса, что и -march (за исключением -myarch=native , который не будет работать, что не учитывается, так как native теперь является значением по умолчанию).

Модифицированный spec-файл выглядит так:

*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: это было протестировано с gcc 4.6.2 в Linux, но должно работать на MinGW.

1 голос
/ 31 мая 2012
*cc1_cpu:
+ %{!march*:-march=native}
1 голос
/ 04 января 2012

Хотя это и не прямой ответ на ваш вопрос, вы можете достичь очень похожего эффекта, определив CFLAGS и CXXFLAGS в файле инициализации вашей оболочки.99% файлов Makefile достаточно стандартны, чтобы подобрать значения среды и передать флаги gcc.

...