簡體   English   中英

具有混合依賴關系的Makefile模式規則

[英]Makefile pattern rule with mixed dependencies

我在我的Makefile中編碼了以下幾行:

PROJECTS  = ExamsGenerator ExercisesImporter
VERSION   = .v0.0
EXTENSION = .Exe

BINDIR    = ../bin
CONFDIR   = ../config
DATADIR   = ../data
DOCDIR    = ../doc
INCDIR    = ../include
LIBDIR    = ../lib
OBJDIR    = ../obj
SRCDIR    = ../src

INCDIRS   = $(INCDIR:%=-I%)

CC        = g++
CCVAR     = -D__DATADIR__=\"$(DATADIR)\"

CFLAGS    = -g -Wall $(shell root-config --cflags)  $(INCDIRS)
LDFLAGS   = -g -Wall $(shell root-config --ldflags)
LDLIBS    =          $(shell root-config --glibs)

MEG_DEP  = Functions.h Parser.h Test.h
MEG_DEPS = $(patsubst %,$(INCDIR)/%,$(MEG_DEP))

MEI_DEP  = Functions.h Parser.h Exercise.h
MEI_DEPS = $(patsubst %,$(INCDIR)/%,$(MEI_DEP))

MEG_OBJ   = mainExamsGenerator.o Parser.o Test.o
MEG_OBJS  = $(patsubst %,$(OBJDIR)/%,$(MEG_OBJ))

MEI_OBJ   = mainExercisesImporter.o Parser.o Exercise.o
MEI_OBJS  = $(patsubst %,$(OBJDIR)/%,$(MEI_OBJ))

$(OBJDIR)/%.o: $(SRCDIR)/%.cpp $(MEG_DEPS) $(MEI_DEPS)
    @echo "\nCreating object: $@"
    $(CC) $(CCVAR) $(CFLAGS) -c -o $@ $<

all: $(PROJECTS)
    @echo "\n"

ExamsGenerator: $(MEG_OBJS)
    @echo "\nLinking $@"
    $(CC) $(CCVAR) $(CFLAGS) $(LDLIBS) -o $(BINDIR)/$(@)$(VERSION)$(EXTENSION) $^

ExercisesImporter: $(MEI_OBJS)
    @echo "\nLinking $@"
    $(CC) $(CCVAR) $(CFLAGS) $(LDLIBS) -o $(BINDIR)/$(@)$(VERSION)$(EXTENSION) $^

.SILENT:

.PHONY: clean

clean:
    \rm -f $(BINDIR)/*$(EXTENSION) $(OBJDIR)/*.o *~ $(INCDIR)/*~ $(SRCDIR)/*~

我是Makefile的新手,所以我從幾個地方收集了一些提示,但我可能沒有以最優雅的方式編寫它。 我有幾個問題可以改善它們:

  1. 我真的需要將$(OBJDIR)/%。o添加到依賴項中嗎?
  2. 這樣編寫的Parser.h被列出兩次。 是否可以重寫此模式規則以避免它? 例如,如果修改了Exercise.h,我不想重新編譯MEG內容。 將添加新的依賴關系,我想以一種聰明的方式來管理它們。
  3. 還有其他建議嗎?

在此先感謝您的幫助。

再見...

不,您不需要(也不想)將目標列出為自己的先決條件。 那沒有道理,也行不通。

$(patsubst %,prefix/%,$(var))可以寫為$(addprefix prefix,$(var))

您可能需要閱讀自動依賴性生成 ,以獲取一種自動為.o文件生成正確依賴性的方法。 這將有助於解決您的一些問題。

但是,如果您不想花大價錢,那么您需要記住的是,您需要針對每個目標列出該目標所依賴的所有文件,而無需列出其他文件。

所以

  1. Parser.o大概取決於(至少) Parser.h

    因此添加$(OBJDIR)/Parser.o: $(INCDIR)/Parser.h

  2. Exercise.o大概取決於(至少) Exercise.h (可能還Parser.h嗎?)

    因此添加$(OBJDIR)/Exercise.o: $(INCDIR)/Exercise.h (或者可能是$(OBJDIR)/Exercise.o: $(INCDIR)/Exercise.h $(INCDIR)/Parser.h

  3. 等等...

請注意,前提條件從任何地方都可以組合,因此上述建議的行將與$(OBJDIR)/%.o: $(SRCDIR)/%.cpp規則組合,以形成給定.o文件的全套前提條件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM