target: dependencies
command1
command2
W moim systemie (Mac OS X) make
wydaje się wymagać, aby pliki Makefiles miały znak tabulacji poprzedzający zawartość każdego command
wiersza lub generuje błąd składni.
Jest to irytujące podczas tworzenia lub edytowania plików Makefile, ponieważ mój edytor jest ustawiony na cały czas.
Czy możesz tworzyć poprawne pliki Makefile bez znaków tabulacji?
Odpowiedzi:
Jest to dziwactwo składniowe / wymaganie
make
, nie ma to nic wspólnego z Mac OS X. Niestety, jeśli zamierzasz używać, nic nie możesz z tym zrobićmake
.Edycja : GNU Make obsługuje teraz przedrostek niestandardowej receptury. Zobacz tę odpowiedź .
Nie jesteś pierwszą osobą, której nie lubisz tego aspektu
make
. Cytując podręcznik uniksowych hejterów :źródło
.RECIPEPREFIX
). Jedna z poniższych odpowiedzi również o tym wspomina i powinna być oznaczona jako „prawidłowa” zamiast mojej. stackoverflow.com/a/21920142Od czasu, gdy pierwotnie zadano to pytanie, została wydana wersja GNU Make, która pozwala na użycie czegoś innego niż Tabznak przedrostka. Z ogłoszenia listy mailingowej :
Ta funkcja została dodana w GNU Make 3.82, wydanym w lipcu 2010 (sześć miesięcy po pierwotnej dacie zadania pytania). Ponieważ z kolei minęły trzy lata i od tego czasu się zmieniły, jest prawdopodobne, że inne smaki Make podążyły za GNU Make.
źródło
Istnieje skomplikowany sposób posiadania prawidłowego pliku makefile bez zakładek.
Jeśli zmienisz plik makefile na:
Jeśli zadziała. Jeśli chcesz, aby był w więcej niż jednej linii, możesz zrobić:
Niechlujne, ale działa.
źródło
.RECIPEPREFIX
jest prawdopodobnie najlepszym podejściem. Jednak ponieważ nie miałem na to ochoty, ostatecznie skorzystałem z rozwiązania opartego na tym. Linia 1target:\
:, Linia 2: [wcięcie z czterema spacjami], a następnie;command
Jeśli masz vimrc w swoim profilu, możesz dodać tę linię, aby zapobiec zamianie vima na spacje:
Ja też się z tym zmagałem i to naprawiło to dla mnie. Daj znać!
źródło
Robi to dla mnie, jeśli chcesz używać spacji
Przykład
źródło
.RECIPEPREFIX
że „Jeśli zmienna jest pusta (jak jest domyślnie ), ten znak jest standardowym znakiem tabulacji”. Oznacza to, że zmienna jest zdefiniowana domyślnie. Potwierdza się to za pomocąifeq ($(origin .RECIPEPREFIX), undefined)
. Ponieważ+=
dołączamy pojedynczą spację i prawa do lewej strony,var +=
ustawiavar
się na pojedynczą spację (plus pusty ciąg), o ilevar
został już zdefiniowany. (Jeślivar
nie zdefiniowano,+=
oznacza to samo, co=
.)W trybie wstawiania vima, można użyć
Ctrl-v <TAB>
do wstawienia literału tabulacji, nawet jeśli ustawiłeś klawisz tabulacji na wstawianie spacji. To oczywiście nie odpowiada na twoje pytanie, ale może być alternatywą dla dostępnych metod, aby uniknąć konieczności stosowania dosłownych zakładek.źródło
Jeśli używasz EditorConfig , możesz dodać następujące wiersze do swojego
.editorconfig
pliku, aby wymusić na IDE użycie tabulatora zamiast spacji wMakefile
:źródło
Aż do GNU Make 4.2.0
Odpowiedź Stevena Penny'ego działa.
Powód, dla którego to działa, jest opisany w moim komentarzu .
Od GNU Make 4.3 (wydany 19 stycznia 2020 r.)
Zachowanie
+=
operatora zostało zmienione w sposób niekompatybilny wstecz. Jeśli lewy operand ma pustą wartość, spacja nie jest już dodawana.Możesz zamiast tego użyć
, gdzie
<space>
jest pojedyncza spacja. Chociaż$(.RECIPEPREFIX)
jest interpretowany jako pusta wartość, jest to potrzebne, aby GNU Make nie ignorowało<space>
. Zauważ, że ten kod działa nawet na GNU Make starszym niż wersja 4.3.źródło
w ubuntu: vi Makefiles zamień spację na tabulator (lub cokolwiek innego):
Na przykład zastąp 8 spacji tabulatorem:
Uwaga: ^ Wstawiam klawiszem tabulacji, a nie ^ i I znaki: D
źródło
Nie przenośnie. Niektóre smaki make absolutnie wymagają znaków tabulacji. Kolejny powód, dla którego warto przedkładać tabulatory nad spacje :-)
źródło