Это немного неуклюже, и я не знаю достаточно о различных версиях Make, чтобы знать, действительно ли он переносим, но он может работать и удовлетворяет вашим строгим условиям (без генерации make-файла, без 'include', и все может зависеть от $ (NAME) .out). Если есть только одна цель, которую вы собираетесь сделать из командной строки (скажем, «все»), тогда вы можете написать это так:
ifeq ($(origin NAME), undefined)
all:
@$(MAKE) -s all NAME=some_commands_using_substituion_and_quotes
else
all: some_preqs_maybe_including_NAME
do_other_things
endif
Когда вы запускаете Make, NAME не определено, поэтому правило снова запускает Make с определенным NAME, поскольку команда интерпретируется оболочкой. («@» И «-s» предназначены только для того, чтобы сделать его тише.) И если вы попытаетесь сделать другие цели «вручную», у вас будет много проблем, так как $ (NAME) ничего не даст.