自行編寫的Makefile文件的結構

對於文件較多的C++項目,目錄結構的組織清晰能方便開發,多個文件夾存放了多個源文件和頭文件,一般下方式在編譯之後都會生成與源文件同目錄下的目標文件,個人覺得這種方式不太好,各個目標文件分散不太集中,希望所有目標文件和可執行文件都放在bin目錄下,具體目錄結構如下:

--bin
  |--a.o
  |--b.o
  |--...
  |--module1
  |  |--ma1.o
  |  |--ma2.o
  |  |--...
  |--test
  |  |--test1.o
  |  |--...
  |--third
  |  |--third1.o
  |  |--...
  |--exec1
  |--exec2
  |--...
--src
  |--a.cpp/a.h
  |--b.cpp/b.h
  |--...
  |--module1
     |--ma1.cpp/ma1.h
     |--ma2.cpp/ma2.h
     ...
--third
  |--third1.cpp/third2.h
  |--...
--test
  |--test1.cpp/test1.h
  |--...
--Makefile
--README.md
...

爲了實現上述要求,自行編寫的Makefile如下。

INCLUDE_PATH=-I$(CURDIR)/src
LIB_PATH=-L$(CURDIR)/third
LIB=-lpthread -lcurl
#-ljsoncpp

CXXFLAGS=-Wall -pipe
#-std=c++11
CC=g++

BIN_PATH=$(CURDIR)/bin
SRC_PATH=$(CURDIR)/src \
    $(CURDIR)/src/module1 \
    $(CURDIR)/src/module2
    ...
TEST_PATH=$(CURDIR)/test

SOURCES:=$(foreach SRC,$(SRC_PATH),\
    $(wildcard $(SRC)/*.cpp)\
)
OBJECTS:=$(foreach S,$(SOURCES),\
    $(addprefix $(BIN_PATH)/,\
        $(patsubst %.cpp,%.o,\
            $(subst $(CURDIR)/src/,,$(S))\
        )\
    )\
)

TEST_SOURCES=$(wildcard $(TEST_PATH)/*.cpp)
TEST_OBJECTS=$(addprefix $(BIN_PATH)/,\
    $(addsuffix .o,\
        $(basename $(notdir $(TEST_SOURCES))))\
)

exec1=$(BIN_PATH)/exec1
exec2=$(BIN_PATH)/exec2

EXEC=$(exec1) $(exec2)


.PHONY: all
all: $(EXEC)

$(exec1): $(BIN_PATH)/a.o $(BIN_PATH)/third/third1.o
    @echo "Building $@ ..."
    $(CC) $(LIB) -o $@ $^
    @echo "Building $@ successfully!"

$(exec2): $(BIN_PATH)/b.o $(BIN_PATH)/third/third1.o
    @echo "Building $@ ..."
    $(CC) $(LIB) -o $@ $^
    @echo "Building $@ successfully!"

$(filter %.o,$(OBJECTS)) : $(BIN_PATH)/%.o:$(CURDIR)/src/%.cpp
    @echo "Compiling $@ from $<..."
    @$(shell mkdir -p $(dir $@))
    $(CC) $(INCLUDE_PATH) $(LIB_PATH) $(LIB) $(CXXFLAGS) -c $< -o $@

$(filter %.o,$(TEST_OBJECTS)) : $(BIN_PATH)/%.o:$(TEST_PATH)/%.cpp
    @echo "Compiling $@ ..."
    $(CC) $(INCLUDE_PATH) $(LIB_PATH) $(LIB) $(CXXFLAGS) -c $< -o $@

.PHONY : clean
clean:
    @$(RM) $(OBJECTS) $(TEST_OBJECTS) $(EXEC)
    @rm -rf $(BIN_PATH)/*

個人感覺比較好用,有需要者自行取用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章