Есть ли файл конфигурации для gnu make?

Я хочу сказать, что он всегда будет использовать параметр -j4, даже если я не указал его в командной строке. Обычно я делал это в каком-то файле конфигурации (т.е. ~/.makerc).

Существует ли такой файл для gnu make?

Ответ 1

Прочитайте о переменной $(MAKEFLAGS):

export MAKEFLAGS=j4

Однако это, вероятно, будет мешать рекурсивным make-based сборкам (не потому, что разумные люди используют рекурсивный make anyway!), препятствуя тому, чтобы GNU позволял общаться с его суб-марками.

Таким образом, более разумный подход, вероятно, является оболочкой script или функцией псевдонима или оболочки.

Ответ 2

Хорошо, да и нет --- обычно вы использовали бы include file. Поместите ваши общие элементы конфигурации вместе в файл, скажем common.mk и добавьте

include common.mk

вверху вашего файла makefile. Если у флага нет подходящего способа его настройки из файла make, вы можете использовать функцию

function mk {
    make -j4 $*
}

Ответ 3

Это не существует, но вы можете сделать это, получив рекурсивный вызов 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

Ответ 4

Я хотел бы немного расширить решение, намеченное в ответ Джона Маршалла.

Вы можете просто поместить однострочную оболочку script где-то раньше в $PATH со следующим содержимым:

#!/bin/bash
$(type -ap make | sed -n 2p) -j4 "[email protected]"

(script не нужно называть make, и это упростит, но я считаю удобным, если оно есть.)

Я бы сказал, что это лучше, чем другие подходы по следующим причинам:

  • В отличие от подхода MAKEFLAGS он не нарушает рекурсивных построений (которые на самом деле довольно распространены в моем опыте).
  • В отличие от подхода include .makerc, его можно применять локально без изменения каких-либо существующих make файлов или вашего рабочего процесса.
  • В отличие от алиаса или функционального подхода оболочки, он несовместим с оболочкой (не привязывает вас к какой-либо конкретной оболочке) и работает в любых дополнительных скриптах сборки, которые вам также могут понадобиться, если вы запускаете их в такая же среда.

Ответ 5

Мне нравится подход 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