Я хочу сказать, что он всегда будет использовать параметр -j4
, даже если я не указал его в командной строке. Обычно я делал это в каком-то файле конфигурации (т.е. ~/.makerc
).
Существует ли такой файл для gnu make?
Я хочу сказать, что он всегда будет использовать параметр -j4
, даже если я не указал его в командной строке. Обычно я делал это в каком-то файле конфигурации (т.е. ~/.makerc
).
Существует ли такой файл для gnu make?
Прочитайте о переменной $(MAKEFLAGS):
export MAKEFLAGS=j4
Однако это, вероятно, будет мешать рекурсивным make-based сборкам (не потому, что разумные люди используют рекурсивный make anyway!), препятствуя тому, чтобы GNU позволял общаться с его суб-марками.
Таким образом, более разумный подход, вероятно, является оболочкой script или функцией псевдонима или оболочки.
Хорошо, да и нет --- обычно вы использовали бы include file. Поместите ваши общие элементы конфигурации вместе в файл, скажем common.mk
и добавьте
include common.mk
вверху вашего файла makefile. Если у флага нет подходящего способа его настройки из файла make, вы можете использовать функцию
function mk {
make -j4 $*
}
Это не существует, но вы можете сделать это, получив рекурсивный вызов make.
Например:
Makefile:
-include $(HOME)/.makerc
.DEFAULT_GOAL: all
# This will handle a default goal if make is just called without any target
all:
$(MAKE) $(MAKE_OPTIONS) -f Makefile.real $(MAKECMDGOALS)
# This handles all targets and passes it through
%:
$(MAKE) $(MAKE_OPTIONS) -f Makefile.real $(MAKECMDGOALS)
$(HOME)/makerc:.
MAKE_OPTIONS := -j4
Я хотел бы немного расширить решение, намеченное в ответ Джона Маршалла.
Вы можете просто поместить однострочную оболочку script где-то раньше в $PATH
со следующим содержимым:
#!/bin/bash
$(type -ap make | sed -n 2p) -j4 "[email protected]"
(script не нужно называть make
, и это упростит, но я считаю удобным, если оно есть.)
Я бы сказал, что это лучше, чем другие подходы по следующим причинам:
MAKEFLAGS
он не нарушает рекурсивных построений (которые на самом деле довольно распространены в моем опыте).include .makerc
, его можно применять локально без изменения каких-либо существующих make файлов или вашего рабочего процесса. Мне нравится подход MAKEFLAGS
предложенный Джоном Маршаллом вместо того, make
поддерживать что-то вроде автоматического файла конфигурации проекта.makerc. Тем не менее, я не хотел задумываться, чтобы заранее указать переменную.env или аналогичные переменные среды (и затем отключить их).
Решением этого является назначение MAKEFLAGS
в верхней части самого MAKEFLAGS
Makefile
:
#!/usr/bin/env make
MAKEFLAGS=s
.PHONY: foo
foo:
echo "hello, make"
Запустить его:
$ make foo
hello, make
По сравнению с запуском без MAKEFLAGS=...
line:
$ make foo
echo "hello, make"
hello, make