2010-03-17 11 views
7

Non sembra possibile chiamare i comandi di sistema di Windows (ad esempio del, move, ecc.) Utilizzando GNU Make. Sto cercando di creare un makefile che non si basi sull'utilizzo di strumenti aggiuntivi (ad esempio rm.exe da Cygwin).Chiamare i comandi di Windows (ad esempio del) da un makefile GNU

quando viene eseguito il seguente regola, viene segnalato un errore del: command not found:

clean: 
    del *.o 

Questo è presumibilmente perché non v'è tale execuatable non come "del". Ho anche provato a fare funzionare come opzione per cmd ma con questo sembra solo per aprire un nuovo prompt:

clean: 
    cmd /C del *.o 

Sto usando Windows XP (5.1.2600) con GNU Make 3.79.1 che viene fornito in bundle come parte di MSys.

+0

hai provato 'rm'? – hasen

+0

Quale versione di Windows stai usando? – hlovdal

risposta

9

Sembra che lo switch /C debba essere sottoposto a escape perché un valore / viene interpretato come percorso in GNU Make. I seguenti funziona come previsto: risposta

clean: 
    cmd //C del *.o 
3

Stai usando Cygwin? Perché non chiamare rm?

+2

Sto scrivendo un makefile per andare su macchine di altri utenti che potrebbero non avere Cygwin/rm. – TomLongridge

3

del è un comando incorporato di cmd.exe (come pure command.com). Il tuo comando cmd /C del *.o dovrebbe funzionare, se avvia un nuovo prompt dei comandi sospetto che cmd potrebbe essere un wrapper. Hai provato a chiamare cmd con il suo percorso completo (ad esempio c: /WINDOWS/system32/cmd.exe)?

+0

Non avvia una nuova finestra del prompt dei comandi, stampa il banner del copyright MS e quindi si arresta. L'utilizzo del percorso completo non ha alcun effetto. – TomLongridge

+0

Provate a citare il comando (es. Cmd/C "del * .o") - se non funziona, provate cmd/K per vedere qual è l'errore (/ K manterrà la finestra di cmd fino a chiuderla) –

+0

È interessante notare che funziona con 'cmd/K del * .o', tuttavia ti lascia nella nuova sessione e continuerà solo con il makefile quando digiti' exit'. Citando non sembra fare alcuna differenza. – TomLongridge

0

Tom Longridge era vicino alla verità per me, ma l'escape bisogno di essere fatto utilizzando una barra rovesciata prima la barra sulla macchina Windows Vista Business sono stato bisogno di questo per:

RM=cmd \/C del 
0

Un'altra soluzione è quella di creare un file contenente del.bat:

@echo off 
del %* 

poi il makefile può semplicemente contenere

clean: 
    del *.o 

questo pulisce il makefile, ma potrebbe ingombrare leggermente la directory di costruzione.

1

Poiché i sistemi basati su DOS hanno due comandi diversi per la rimozione di file e directory, trovo che avere due differenti definisce funziona meglio:

ifeq ($(OS),Windows_NT) 
    RM = cmd //C del //Q //F 
    RRM = cmd //C rmdir //Q //S 
else 
    RM = rm -f 
    RRM = rm -f -r 
endif 

clean: 
    $(RM) $(TARGET).elf $(TARGET).map 
    $(RRM) $(BUILD_DIR) 
0

successo anche a me. Nella parte superiore del makefile aggiungere:

SHELL=cmd 

Dal momento che si sta compilando in Windows, selezionare 'cmd' come shell di default. Questo è importante perché GNU make cercherà il percorso di una shell simile a linux/unix e se ne trova uno lo userà invece. Questo è il caso in cui Cygwin è installato. L'effetto collaterale di questo comportamento è che i comandi come "del" e "echo" non vengono trovati. Se diciamo a GNU make di usare 'cmd' come sua shell, allora 'del' e tale sarà disponibile.

Problemi correlati