Параллельное создание программы на языке Си

#c #gcc #makefile #parallel-builds

Вопрос:

У меня есть проект среднего размера, который состоит из множества *.c единичных файлов.

В «обычном» упражнении по компиляции программа строится из ее *.o объектных файлов, которые передаются в качестве предварительного условия основной программы в Makefile рецепте. Это хорошо работает для параллельных сборок : при make -j этом все эти объектные файлы компилируются параллельно , а затем в конце соединяются вместе. Это делает весь процесс сборки намного быстрее.

Однако в других случаях список предварительных условий передается как список *.c файлов модулей, а не *.o объектных файлов. Первоначальное намерение состоит в том, чтобы не создавать эти объектные файлы, так как они могут загрязнить кэш. Теперь, вероятно, это можно было бы сделать по-другому, но для данного конкретного проекта Makefile это неизменяемый объект, поэтому он не может быть обновлен, и мы должны смириться с этим.

В этом случае использование make -j не эффективно, так как gcc будет эффективно получать полный список единиц непосредственно в одной командной строке. А это значит, make что больше не в состоянии организовать параллелизм.

Единственная оставшаяся у меня возможность-передать флаги и параметры make . Я пытался найти тот, который заставил gcc бы составить список единиц параллельно, внутренне. Я не смог найти ни одного. Порывшись в Интернете, я нашел предположения о том, что «поскольку make можно выполнять параллельную сборку, gcc не нужно копировать эту функциональность». Но решения нет.

Итак, вопрос в следующем : как с этим бороться ?

Предполагая такую строку компиляции gcc *.c -o final_exe , которая может быть изменена с помощью стандартных флагов ( CC , CFLAGS , CPPFLAGS , LDFLAGS ), есть ли какая-либо опция, позволяющая создавать эти блоки параллельно ?

Комментарии:

1. » для данного конкретного проекта Makefile это неизменяемый объект » — Разветвите проект и создайте правильный файл makefile вместо того, чтобы пытаться построить что-то на сломанном фундаменте.

2. Возможно, вы могли бы попробовать написать конструктор оболочек для имени, CC который разделит работу на gcc -c команды и шаг ссылки. Но на самом деле, исправить файл Makefile или полностью перейти на другую систему сборки-лучший способ.

3. Для gcc было бы относительно легко разрешить -j флаг. Но это не Microsoft. Философия Unix такова: Одна программа решает одну проблему. В GCC также нет функций электронной почты.

4. Короткий ответ на ваш вопрос: нет, этого сделать невозможно. Если вы не можете изменить файл makefile, вам придется жить без параллельных сборок.