Как ускорить сборку Meson, когда многие цели используют одни и те же источники C ++

У меня есть новый мезонный проект с 58 целями. Многие из них используют одни и те же файлы * .cc, а meson создает каждый файл * .cc один раз для каждой цели, что намного медленнее, чем autotools. Кроме того, флаги компиляции должны быть одинаковыми для разных целей, поэтому теоретически мезон должен иметь возможность повторно использовать объекты.

Хорошо ли поддерживается построение многих целей в мезоне? Есть ли стандартное решение для подобных ситуаций? Я мог бы попытаться организовать все источники в моем проекте в разделяемые библиотеки, но тогда мне пришлось бы решить, как их сгруппировать, а с автоинструментами мне не нужно это решать. Мне не удалось найти документацию по этому поводу.

-BenRI

P.S. Вот минимальный пример:

-------- файл: app1.cc -------

int f(int x ,int y) {return x;}
int main() { return f(0,1);}

------ файл: meson.build -----

project('app12','cpp')
executable('app1',['app1.cc'])
executable('app2',['app1.cc'])

---------- команда -----------

% meson . meson
% cd meson
% meson configure -Dwarning_level=3
% ninja

Вы должны увидеть предупреждение о том, что неиспользуемый параметр «y» появляется дважды. В файле compile_commands.json также есть две записи для app1.cc.


person Benjamin Redelings    schedule 08.12.2017    source источник
comment
Читали ли вы документацию, в которой обсуждается повторное использование объектных файлов между целями? Невозможно быть более конкретным, поскольку вы не создали MCVE для демонстрации   -  person Useless    schedule 08.12.2017
comment
Да, я это читал. Настоятельно [рекомендует] использовать эту функцию только для создания исполняемых файлов модульного теста описанным выше способом. Кроме того, ручное создание извлеченного объекта для каждого исходного файла, совместно используемого целевыми объектами сборки, не похоже на мезонный способ, поскольку он требует, чтобы пользователь указывал вещи, которые система уже знает, и пользователь может ошибиться.   -  person Benjamin Redelings    schedule 08.12.2017
comment
Я могу добавить MCVE, если это действительно поможет, но поскольку восстановление каждого исходного файла для каждой цели является признанным поведением (я думаю), я не уверен, что он покажет.   -  person Benjamin Redelings    schedule 08.12.2017
comment
Лично я бы сказал, что нужно реструктурировать код для использования библиотек.   -  person TingPing    schedule 09.12.2017


Ответы (1)


Один и тот же исходный код, снова и снова компилируемый с одними и теми же флагами компиляции, - это просто потеря мощности процессора, потому что он будет генерировать один и тот же двоичный файл, если у вас нет невоспроизводимые хитрости сборки, такие как дата и время.

Если вы имели в виду создать общий код для всех целей, вы можете просто использовать static_library для создания вашего кода и повторного использования его из всего вашего целевого двоичного файла.

Переместите свой f() в lib.cc и используйте следующий meson.build.

project('app12','cpp')
mylib = static_library('mylib', 'lib.cc')
executable('app1', 'app1.cc', link_with : mylib)
executable('app2', 'app1.cc', link_with : mylib)
person Yasushi Shoji    schedule 09.12.2017
comment
Я думаю, что перенос общего кода в статическую библиотеку - это действительно подход, рекомендованный мезонными разработчиками. Я сделал это, и он отлично работает. Интересно, что я был обеспокоен тем, что привязка статической библиотеки, содержащей такое количество объектов, к каждой цели увеличит размер исполняемых файлов, но на самом деле размер значительно уменьшился. - person Benjamin Redelings; 11.12.2017