Могу ли я получить CMake для генерации Makefile-ов с использованием инкрементальной компоновки gcc?

Недавно я узнал о функции инкрементальной компоновки в gcc, и я хочу использовать ее. Дело в том, что я не пишу свой собственный Makefile - я использую CMake. Межфайловые зависимости и цели по сути одинаковы, но я хочу, чтобы CMake пытался получить их, используя инкрементные ссылки, а не ссылки с нуля?

Более того, если это возможно, даже для файлов внутри библиотек, т.е. при перекомпиляции .o в пределах .a файл, а не весь этот файл будет пересмотрен при связывании исполняемого файла, только один .o внутри него пересматривается / повторно применяется.

Для иллюстрации предположим, что мой CMakeLists.txt имеет:

add_executable(
    foo
    a.cpp
    b.cpp
    c.cpp
)

Прямо сейчас, когда a.cpp изменения, мы получаем компиляцию a.cpp -> a.o тогда обычная связь a.o b.o c.o -> foo, Я хочу чтобы это было a.o foo something_else_maybe -> foo

Примечание. Этот вопрос не о MSVC и его собственных возможностях инкрементного связывания.

1 ответ

Недавно я узнал о функции инкрементальной компоновки в gcc

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

У GNU ld такой функции нет. Он может перемещать ссылку, т.е. объединять несколько объектов в один. Если вы ссылку a.o а также b.o в ab.o а затем изменить a.o, он не сможет повторно использовать результаты перемещаемой ссылки, поэтому вам придется повторно связать ab.o с нуля (в отличие от честных добавочных ссылок).

Я хочу, чтобы CMake пытался получить их, используя инкрементные ссылки, а не ссылки с нуля

Я боюсь, что CMake (или любая другая система сборки) не обеспечивает поддержку по нескольким причинам.

Прежде всего в этом случае вам придется кэшировать результаты ld -rдля всех возможных подмножеств ваших объектных файлов. Это число растет в геометрической прогрессии, что делает его не совсем практичным.

Во-вторых, помимо связывания его объектных файлов есть еще кое-что: связывание библиотек, генерация динамических разделов (PLT, перемещения и т. Д.), Расслабление и т. Д., Которые придется выполнять каждый раз с нуля, даже если вы каким-то образом умудриться использовать -r, Это может легко оказаться намного дольше, чем просто связывание объектных файлов.

Другие вопросы по тегам