Make

Makefile 替代那些不希望標籤縮進開瓶器下所有內容的人

  • May 16, 2017

make如果不想在我的make程序(或類似)程序中使用製表符縮進,是否有 GNU替代make方案?

例如,當我使用 時make,我需要在make開場符 ( % :) 之後縮進所有內容。這是在某些情況下解決某些問題的秘訣(例如,我跨平台工作,我使用 Windows10 AutoHotkey 機制,該機制從我粘貼到 Linux 終端的程式碼中剝離標籤,出於不同原因,它不會通過,make因此我需要一個非標籤包括解決方案)。

對所有內容進行製表符縮進的必要性% :使我的工作make不流暢。

這是make我用來創建新的虛擬主機 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,並且您沒有跟踪文件之間的任何依賴關係,則只需使用 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

將以上內容複製到名為 example 的文件中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

引用自:https://unix.stackexchange.com/questions/363169