2013-02-21 12 views
6

Czy istnieje sposób na uzyskanie spacji wewnątrz nazw docelowych działających przy użyciu programu make.exe? Wydaje się niemożliwe, jeśli to naprawdę starożytne raport o błędzie jest poprawna: http://savannah.gnu.org/bugs/?712Zezwalaj na miejsce w pliku GCC makefile

Dla porównania, dużym problemem jest to, że kawałki makefile komendy jak:

"foo bar baz": $(OBJ) 
    $(CPP) $(LINKOBJ) -o $(BIN) $(LIBS) 

... wydaje się traktować jako trzy oddzielne polecenia: jeden do zbudowania "foo (uwaga w załączeniu"), jeden do zbudowania paska, a na końcu jeden do zbudowania baz "(ponownie, w tym"). Dzieje się tak, ponieważ make.exe wydaje się używać spacji jako ogranicznika.

Można jednak założyć, że na przykład można zbudować "Hello World.exe". To nie wydaje się możliwe. Cudzysłowy nie pracują, ani nie uciekając oddzielne słów (Czytałem gdzieś, że nie pamięta link):

"foo\\ bar\\ baz": $(OBJ) 
    $(CPP) $(LINKOBJ) -o $(BIN) $(LIBS) 

jest jakiś inny sposób aby to naprawić? Oficjalna instrukcja potwierdza tylko rzeczy tokenize-by-przestrzeni, ale nie dostarcza sposób na wykorzystanie przestrzeni do innych celów: http://www.gnu.org/software/make/manual/make.html#Rule-Syntax

Edit: jak sugeruje, próbowałem też pojedyncze ukośniki, ale mają one dokładnie taki sam efekt, jak podwójne ukośniki. Make narzeka, że ​​nie może znaleźć zasady pierwszego słowa:

mingw32-make.exe: *** No rule to make target `foo', needed by `all'. Stop. 

wykonywalny „foo bar baz.exe” jest prawidłowo wytwarzana chociaż, ale łączenie odbywa się za każdym razem za słowa.

Odpowiedz

1

Zamiast podwójnego ukośnika odwrotnego użyj pojedynczych. Poniższy Makefile działa (przynajmniej dla GNU make):

goal: foo\ bar 

foo\ bar: 
    gcc -o "foo bar" "foo bar.c" 
+0

To nie działa, zobacz edycję. – Orwell

+0

@ Orrwell: Wtedy wydaje się, że to kwestia systemu operacyjnego. W jaki sposób określasz plik ze spacjami w nazwie w twojej powłoce? – Matthias

1

jako Matthias powiedział, że jest to kwestia „\”, ale z podwójnym cudzysłowem też. Oto w jaki sposób udało im się w ten sposób:

EXECUTABLE=foo\ bar\ baz 
all: $(SOURCES) $(EXECUTABLE) 
$(EXECUTABLE): $(OBJECTS) 
       $(CC) $(OBJECTS) -o "[email protected]" $(LDFLAGS) 

Uwaga podwójne cudzysłowy wokół $ @ Wydaje mi się, że gdy make osiągnąć cel „$ (wykonywalnego)” rozszerza się „\”, więc polecenie linia staje się inna, niż chcesz, chcesz podwójne cudzysłowy wokół nazwy pliku.

Teraz jesteś w systemie Windows i nie pamiętam, jak zajmuje się spacji w nazwach, tak jak powiedział Matthias, najpierw sprawdź, jak "cmd.exe" zajmuje się spacji (z wyjątkiem otaczającej nazwy z podwójnymi cytatami ...)

0

Być może łatwiejszy jest wzięcie pod uwagę prostszego Makefile, który ignoruje zależności w standardowej inwokacji targetRule: dependencies. OP jest dla systemu Windows, a poniżej jest wykonywany na Linuksie w powłoce bash; ale prawdopodobnie powinno to mieć zastosowanie w systemie Windows przy użyciu powłoki bash przez cygwin, jak sądzę.Mam następujących w moim Makefile (uwaga, nie powinno być TAB przed poleceniami echo, który SO zamienia na spacje):

testA: 
    echo "testA" 

unrelated: 
    echo "unrelated" 

testA\ clean: 
    echo "testA clean" 

clean: 
    echo "clean" 

Jeśli zadzwonię make z celami clean lub testA w terminalu bash powłoki , uzyskać oczekiwane rezultaty:

$ make testA 
echo "testA" 
testA 
$ make clean 
echo "clean" 
clean 

teraz, jeśli zadzwonię make testA clean tylko napisane jak to, że powłoka bash podzieli argumenty w przestrzeni, tak make otrzyma dwa argumenty, i uruchomić je oddzielnie:

$ make testA clean 
echo "testA" 
testA 
echo "clean" 
clean 

... ale jeśli mogę zawinąć cel dołączonego do make w cudzysłowie - czy mogę uciec z miejsca - skorupa zrozumie, że ma być pojedynczym argumentem z przestrzeni wewnątrz i będzie propagować je jako takie make, która wykona to, co jest napisane jako zasada testA\ clean docelowej:

$ make "testA clean" 
echo "testA clean" 
testA clean 
$ make testA\ clean 
echo "testA clean" 
testA clean 

konsekwencją tego jest to, że niestety nie można " TAB "w linii poleceń dla autouzupełniania testA\ clean; jeśli wpiszesz make teTAB w wierszu poleceń, tylko testA będzie automatycznie uzupełniany automatycznie (a testA\ clean nie zostanie pokazany jako opcja autouzupełniania).