Come verificare se esiste un file in un makefile
-
05-07-2019 - |
Domanda
Ho un modello di makefile per compilare una singola DLL (per un sistema di plugin). Il makefile dell'utente è simile al seguente:
EXTRA_SRCS=file1 file2
include makefile.in
Nel makefile.in
Ho:
plugin.dll: plugin.os $(patsubst %,%.os,$(EXTRA_SRCS))
Dove plugin.os
è il file C ++ principale da compilare. A proposito, il file che termina è .os
sono i file oggetto compilati per la libreria condivisa (ovvero utilizzando l'opzione -fpic
con gcc
)
Ora, il problema è che probabilmente le fonti extra (ma non necessariamente) saranno file di intestazione. Idealmente, vorrei aggiungerli come dipendenze per l'obiettivo file.cpp
e il <=>, ma solo se esistono.
Il metodo dovrebbe funzionare sia per Windows che per Linux, o almeno essere adattabile a ciascuno. Tuttavia, utilizzo solo la versione GNU di make.
Soluzione
Utilizza il " carattere jolly " Funzione:
$(wildcard *.h)
EDIT: per abbinare un elenco specifico, fare
$(wildcard $(HEADER_FILES))
Non è necessario utilizzare $ (filtro ...), la funzione jolly filtra automaticamente i file che non esistono.
Altri suggerimenti
Non hai specificato quali compilatori stai utilizzando, ma se hai accesso a gcc / g ++ puoi usare l'opzione -MM.
Quello che faccio è creare un file con l'estensione .d per ogni file .c o .cpp, quindi " include " i file .d. Uso qualcosa del genere nel mio Makefile:
%.d: %.c
gcc $(INCS) $(CFLAGS) -MM $< -MF $@
%.d: %.cpp
g++ $(INCS) $(CXXFLAGS) -MM $< -MF $@
Quindi creo le dipendenze in questo modo:
C_DEPS=$(C_SRCS:.c=.d)
CPP_DEPS=$(CPP_SRCS:.cpp=.d)
DEPS=$(C_DEPS) $(CPP_DEPS)
e questo in fondo al Makefile:
include $(DEPS)
È questo il tipo di comportamento che stai cercando? Il bello di questo metodo è che anche se si utilizza un compilatore non GNU per la compilazione effettiva, i compilatori GNU fanno un buon lavoro nel calcolo delle dipendenze.
Fa il semplice
$(filter $(wildcard *.h),$(HEADER_FILES))
fai quello che vuoi?