Подтвердить что ты не робот

GNU make: Извлечение аргумента в -j в Makefile

Я искал час, и эта информация нигде не...

Я хотел бы иметь возможность извлекать (и, возможно, использовать) количество запрошенных "заданий", которые передаются через параметр -j, или Сделать сам в случае суб-make в Makefile.

Самая многообещающая вещь, которую я видел до сих пор, это переменная $(MAKEFLAGS), но в моей системе (если я делаю, скажем, make -j2) содержимое этой переменной есть только "--jobserver-fds = 3,4-j". Есть ли способ получить фактическое количество заданий, переданных с -j?

4b9b3361

Ответ 1

На самом деле есть способ реализовать это полностью внутри вашего make файла в * nix.

MAKE_PID := $(shell echo $$PPID)
JOB_FLAG := $(filter -j%, $(subst -j ,-j,$(shell ps T | grep "^\s*$(MAKE_PID).*$(MAKE)")))
JOBS     := $(subst -j,,$(JOB_FLAG))

ps, grep тоже нужно установить, но это почти дано. Он также может быть улучшен для обработки --jobs

Версия, использующая регулярные выражения и поддерживающая --jobs, как было запрошено в комментариях:

MAKE_PID := $(shell echo $$PPID)
JOBS := $(shell ps T | sed -n 's/.*$(MAKE_PID).*$(MAKE).* \(-j\|--jobs\) *\([0-9][0-9]*\).*/\2/p')

Ответ 2

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

Проверьте исходный код http://cvs.savannah.gnu.org/viewvc/make/main.c?revision=1.246&root=make&view=markup. Найдите job_slots > 1.

Обновление. Если у вас есть контроль над рабочим диапазоном, вы можете обернуть приложение make своей собственной программой /script, проанализировать параметры, установить выделенную переменную среды и вызвать исходный код впоследствии.