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.

È stato utile?

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?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top