Альтернатива Makefile для тех, кто не хочет, чтобы вкладка отступала от всего содержимого под открытым небом

Есть ли альтернатива GNU, если вы не хотите использовать вкладки в моей программе make (или make like)?

Например, когда я использую make , мне нужно отступать все после make открывателя ( % : . Это рецепт некоторых проблем в некоторых случаях (например, я работаю в кросс-платформенной среде, и я использую механизм AutoHotkey Windows10, который разбивает вкладки с кодов, которые я вставляю в терминалы Linux по разным причинам, и не пропускает make поэтому мне нужно без вкладки, включая решение).

Необходимость вставлять все под проценты в % : делает мою работу без всяких ошибок.

Это make я использую для создания новых файлов conf conf. Я выполняю его с make domain.tld.conf :

 % : printf '%s\n' \ '<VirtualHost *:80>' \ 'DocumentRoot "/var/www/html/$@"' \ 'ServerName $@' \ '<Directory "/var/www/html/$@">' \ 'Options +SymLinksIfOwnerMatch' \ 'Require all granted' \ '</Directory>' \ 'ServerAlias www.$@' \ '</VirtualHost>' \ > "$@" a2ensite "$@" systemctl restart apache2.service 

Есть ли какая-нибудь альтернатива, может быть, что-то, что поставляется с самой Unix, которая обеспечивает аналогичную функциональность, но без использования вкладок вкладок в самом файле шаблона?

Если это ваш весь Makefile и вы не отслеживаете зависимости между файлами, просто используйте сценарий оболочки:

 #!/bin/sh for domain; do > "/etc/apache2/sites-available/${domain}.conf" cat <<EOF <VirtualHost *:80> DocumentRoot "/var/www/html/${domain}" ServerName "${domain}" <Directory "/var/www/html/${domain}"> Options +SymLinksIfOwnerMatch Require all granted </Directory> ServerAlias www.${domain} </VirtualHost> EOF a2ensite "${domain}" done systemctl restart apache2.service 

Скопируйте приведенное выше в файл, например, create-vhost , сделайте его исполняемым:

 chmod 755 create-vhost 

затем запустите его как

 ./create-vhost domain.tld 

Это даже поддерживает создание файлов конфигурации нескольких виртуальных хостов (с одним перезапуском в конце):

 ./create-vhost domain1.tld domain2.tld 

Переменная GNU Make .RECIPEPREFIX (примечание: не специальная цель) может использоваться для изменения символа, который устанавливает строки рецептов.

Например:

 .RECIPEPREFIX=> %: >printf '%s\n' \ >'<VirtualHost *:80>' \ >'DocumentRoot "/var/www/html/$@"' \ >'ServerName $@' \ >'<Directory "/var/www/html/$@">' \ >'Options +SymLinksIfOwnerMatch' \ >'Require all granted' \ >'</Directory>' \ >'ServerAlias www.$@' \ >'</VirtualHost>' \ >> "$@" >a2ensite "$@" >systemctl restart apache2.service 

У меня есть «новейшая» функция bash, которая используется следующим образом:

 newest ${target} ${dependencies} || { ${command} ${dependencies} > $target } 

Он не анализирует скрипт, частью которого он является; Я никогда не был поклонником функции «транзитивного закрытия» make, поэтому необходимо только выполнить инструкции в «makefile».

функции с более высоким уровнем «bystdout» и «bycommand» используются

  bystdout ${target} ${command} ${dependencies} bycommand ${target} ${command} ${dependencies} 

где «по команде» обертывает тех, выход которых может быть выведен из зависимостей.

я когда-то был достаточно сумасшедшим, чтобы написать aws-разборный язык, который разворачивал вложенные зависимости:

  output ={ command }{ dependencies }. 

это не такая уж большая задача.

Если вы используете GNU make вы можете эффективно использовать пользовательские функции и выполнять то, что вы хотите:

 # variables utilized NULL := SPC := $(NULL) $(NULL) TAB := $(NULL)$(shell printf '\t\n')$(NULL) # macro to repeat a string ($2) ($1) times _rep_str = $(if $(filter $1,$(words $3)),$(strip $3),$(call _rep_str,$1,$2,$3 $2)) rep_str = $(subst $(SPC),$(NULL),$(subst x,$2,$(call _rep_str,$1,x))) # TABs for depth of 1, 2, 3, ... T1 := $(call rep_str,1,$(TAB)) T2 := $(call rep_str,2,$(TAB)) T3 := $(call rep_str,3,$(TAB)) # multiline macro to be used in recipes for generating .conf files define create_conf printf '%s\n' \ '<VirtualHost *:80>' \ '$(T1)DocumentRoot "/var/www/html/$@"' \ '$(T1)ServerName $@' \ '$(T1)<Directory "/var/www/html/$@">' \ '$(T2)Options +SymLinksIfOwnerMatch' \ '$(T2)Require all granted' \ '$(T1)</Directory>' \ '$(T1)ServerAlias www.$@' \ '</VirtualHost>' > $@ a2ensite "$@" systemctl restart apache2.service endef # Now there are no leading TABs/spaces in the makefile % :; @$(call create_conf)