#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, вам придется жить без параллельных сборок.