Отправка определенных флагов компиляции для статической компиляции с помощью Bazel Build

В моем проекте у нас есть код, который при компиляции для статической компоновки должен быть добавлен при компиляции кода. Предположим, что это -DSTATIC_COMPILATION.

Мой вопрос: возможно ли контролировать флаги компиляции при запросе статической привязки или любых флагов компиляции на основе привязки привязки?

Думает, что я знаю, что могу сделать:

  1. Добавьте --copt '-DSTATIC_COMPILATION' в командную строку bazel build
  2. Настройте файл bazelrc, который может обеспечить такую ​​​​конфигурацию, передав bazel build --config=static_comp — это хорошо, но я не уверен, что он будет передаваться другим пакетам, когда этот пакет принимается как внешний пакет — здесь я могу ошибаться. ..

Какие варианты мне не хватает?


person John Basila    schedule 05.01.2017    source источник


Ответы (1)


Короткий ответ заключается в том, что сегодня в Bazel нет способа заставить его устанавливать флаг в зависимости от того, будет ли код компоноваться статически или динамически.

cc_library от Bazel дважды компилирует код для архитектур, которым требуется PIC для динамического связывания, но не требует PIC для статического связывания — один раз с PIC и один раз без него. В основном это делается для повышения производительности статически связанных исполняемых файлов, поскольку код без PIC обычно работает быстрее.

Обратите внимание, что правила cc_test в Bazel по умолчанию связаны динамически, а правила cc_binary по умолчанию связаны статически, поэтому различие PIC/no-PIC требует двойной компиляции почти всего исходного кода C/C++. Для дополнительной сложности обратите внимание, что для исполняемых файлов PIE требуется код, скомпилированный PIC, поэтому, если вы хотите ASLR, для которого требуются исполняемые файлы PIE, код всегда компилируется как PIC.

Однако поддержка PIC/no-PIC жестко запрограммирована в cc_library, и я не вижу очевидного способа «злоупотребить» ею, чтобы делать то, что вы хотите. Возможно, вы могли бы взломать кросс-инструмент, чтобы объявить, что архитектуре требуется PIC для динамической компоновки, но не для статической компоновки, а затем в любом случае объявить с PIC в обоих случаях, а также установить дополнительный флаг. Это приведет к выходным файлам .pic.o и .o, хотя оба будут содержать код PIC. Это невозможно, если вы не можете управлять crosstool, и я бы не рекомендовал этого делать.

Тем не менее, могут быть и другие способы добиться того, чего вы хотите. Не могли бы вы пояснить, почему вам нужен особый случай для статически скомпонованного кода?

person Ulf Adams    schedule 20.02.2017
comment
Причина, по которой существуют эти определения, заключается в том, что код ведет себя немного по-разному для динамической и статической компоновки, это связано с динамической загрузкой библиотеки во время выполнения. Для статического варианта библиотека не загружается и не должна загружаться, но код должен найти функцию для вызова, поэтому мы сделали это таким образом. - person John Basila; 21.02.2017