LINUX.ORG.RU

[c/c++] Объединить несколько исходников перед компиляцией в один


0

1

Есть такой известный проект sqlite. Так вот, пишут его как обычный сишный проект, разделённый на десятки-сотни модулей. Но эти же ребята придумали у себя такую хрень как SQLite Amalgamation, примерно то, что вынесено в заголовке. Цель понятна - оптимизация. Так вот, интересует как они это делают? Очевидно же не вручную. Наверняка есть какие-то программы/скрипты. Хорошо, если бы они оказались универсальными и применимыми для любого проекта.

Получается некоторая lto выполняемая ещё до стадии компиляции. Своего рода альтернатива: можно сравнить что лучше и выбрать. Кроме этого, такой механизм может оказаться единственно применимым: у меня, например, gcc при попытке использовать lto падает.


все нормальные системы сборки позволяют выполнять pre-build и post-build таски

shty ★★★★★
()
Ответ на: комментарий от shty

>все нормальные системы сборки позволяют выполнять pre-build и post-build таски

Ну позволяют, это и так ясно. А собственно какие это должны быть таски?

gogi
() автор топика

классическое решение

$ cat all.c
#include "file1.c"
#include "file2.c"
#include "file3.c"
#include "file4.c"
#include "file5.c"
// ....
arsi ★★★★★
()
Ответ на: комментарий от ryk

После препроцессора ни макросов, ни дефинов нету. А в одном большом sqlite.c они есть. То есть, исходник как бы полноценный получается.

gogi
() автор топика
Ответ на: комментарий от gogi

Ну позволяют, это и так ясно. А собственно какие это должны быть таски?

какие? какие нужно - такие и должны быть, от задачи надо идти, вот, например, надо объединить какие-то файлы - тупо копируете содержимое одного файла в другой перед сборкой

shty ★★★★★
()
Ответ на: классическое решение от arsi

>классическое решение

Это понятно. Но получается программа должна быть написана в стиле это позволяющее. А для произвольной программы это так просто не провернёшь ведь.

gogi
() автор топика
Ответ на: классическое решение от arsi

Да и опять же, в этом же sqlite это сделано не на уровне препроцессора.
Пытаюсь читать его исходники, но конечно там с наскоку просто так не разберёшься.

gogi
() автор топика
Ответ на: комментарий от gogi

для плюсов, наверное, можно, там неймспейсы есть. для си не всегда, ибо static'и и другие локальные символы, которые окажутся не такими локальными, как предполагалось... можно провести рефакторинг и сделать локальные символы уникальными...

arsi ★★★★★
()

> Но эти же ребята придумали у себя такую хрень как SQLite Amalgamation, примерно то, что вынесено в заголовке. Цель понятна - оптимизация.

ИМХО, тут цель - не оптимизация. Тут цель - сделать процедуру встраивания SQLite тривиальной. Добавил один файл в Makefile, и не нужно указывать путей к библиотекам, вызывать pkg-config, и пр.

nozh
()
Ответ на: комментарий от gogi

а вот в том же μC/OS — через включение всех исходников в один через #include. так что...

arsi ★★★★★
()
Ответ на: комментарий от nozh

Ну и это тоже, но тем не менее оптимизация тоже происходит

We have measured performance improvements of between 5 and 10% when we use the amalgamation to compile SQLite rather than individual source files.

gogi
() автор топика

Я писал для этого скриптик на Python'е. Сам скрипт и то что он объединяет (а это то, что нагенерировал asn1c) есть на atoken.sf.net в исходниках asn. Но это строго заточено под asn1c. Для всех static'ов и локальных структур генерируются уникальные имена, которые перед включением файла определяются через #define, а после делается #undef. Все включаемые заголовки располагаются в начале файла.

rymis ★★
()

да, увлекаться такими штуками не советую особо, потом без бутылки «вотки» не поймёшь что, где и зачем было написано

shty ★★★★★
()

> Так вот, интересует как они это делают?

скачай - посмотри, в папке с сырцами все есть

aho
()
Ответ на: комментарий от shty

>да, увлекаться такими штуками не советую особо, потом без бутылки «вотки» не поймёшь что, где и зачем было написано

Да такие «штуки» не отменяют обычных исходников. Просто лишний этап перед сборкой появляется.

gogi
() автор топика
Ответ на: комментарий от Murr

Это если чисто для доп. оптимизации или анализа.

Murr ★★
()
Ответ на: комментарий от gogi

После препроцессора

зачем тебе смотреть исходники после препроцессора?

true_admin ★★★★★
()
Ответ на: комментарий от Murr

С какой версии gcc combine работает не только для Си?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.