Makefile alternativa para quem não quer aba recuando todo o conteúdo sob o abridor

0

Existe uma alternativa de make do GNU se não quiser usar recuos de tabulação no meu programa make (ou make -like)?

Por exemplo, quando eu uso make , preciso recuar tudo depois do make opener, ( % : ). Esta é uma receita para alguns problemas em algumas circunstâncias (por exemplo, eu trabalho cross-platform e eu uso um mecanismo Windows10 AutoHotkey que retira guias de códigos que eu colo em terminais Linux de diferentes razões e não passa mais de make daqui Eu preciso de uma guia que não inclua solução).

A necessidade de recortar tudo em % : torna meu trabalho com make non fluent.

Este é o make que uso para criar novos arquivos conf do host virtual. Eu executo com 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

Existe alguma alternativa, talvez algo que vem com o próprio Unix, que fornece funcionalidade semelhante, mas sem ter que usar recuos de tabulação no próprio arquivo padrão?

    
por JohnDoea 05.05.2017 / 06:51

4 respostas

5

Se esse é todo o seu Makefile e você não está acompanhando nenhuma dependência entre os arquivos, basta usar um script de shell:

#!/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

Copie o texto acima em um arquivo chamado por exemplo create-vhost , torne-o executável:

chmod 755 create-vhost

depois, execute-o como

./create-vhost domain.tld

Isso ainda suporta a criação de vários arquivos de configuração de hosts virtuais (com uma única reinicialização no final):

./create-vhost domain1.tld domain2.tld
    
por 05.05.2017 / 08:33
3

O GNU Make é .RECIPEPREFIX variable (nota: não um alvo especial) pode ser usado para mudar o caractere que desencadeia linhas de receita.

Por exemplo:

.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
    
por 16.05.2017 / 21:32
1

Eu tenho uma função bash "mais recente" que é usada assim:

newest ${target} ${dependencies} || {

         ${command} ${dependencies} > $target 
}

Não analisa o script do qual faz parte; Eu nunca fui fã do recurso "fechamento transitivo" do make, então é necessário apenas sequenciar as instruções no "makefile".

funções de nível ligeiramente superior "bystdout" e "bycommand" são usadas

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

onde "bycommand" envolve aqueles cuja saída pode ser inferida das dependências.

Eu já fui louco o suficiente para escrever uma linguagem analisada que desembrulhava dependências aninhadas:

 output ={ command }{ dependencies }.

não é uma tarefa tão grande.

    
por 06.05.2017 / 18:06
1

Se você estiver usando GNU make , poderá usar bem as funções definidas pelo usuário e realizar o que deseja:

# 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)
    
por 05.05.2017 / 07:51

Tags