嵌套Makefile模板

101 阅读1分钟

目录结构

Througput
├── Makefile
├── CPP_Throughput_Data
│   ├── Makefile
├── CPP_Throughput_Pub
│   ├── Makefile
├── CPP_Throughput_Sub
│__ ├── Makefile

外层

PARENT_NAME = Throughput

LIB_NAME = CPP_${PARENT_NAME}_Data
PUB_NAME = CPP_${PARENT_NAME}_Pub
SUB_NAME = CPP_${PARENT_NAME}_Sub

export         # 传递所有变量

.PHONY: all clean

all: pub sub

pub: lib
	$(MAKE) -C $(PUB_NAME)

sub: lib
	$(MAKE) -C $(SUB_NAME)

lib:
	$(MAKE) -C $(LIB_NAME)

clean:
	make clean -C $(LIB_NAME)
	make clean -C $(PUB_NAME)
	make clean -C $(SUB_NAME)

#unexport    # 取消传递

静态库

ifeq ($(BUILD_TARGET), Debug)            # ifeq后一定要一个空格
    CXXFLAGS = -pipe -g -std=gnu++11 -Wall -W -D_REENTRANT
else
    CXXFLAGS = -pipe -std=gnu++11 -Wall -W -D_REENTRANT
endif

MKDIR   = mkdir -p
DESTDIR =  ../../lib/$(BUILD_TARGET)/
TARGET  = $(DESTDIR)/lib$(LIB_NAME).a
$(shell $(MKDIR) $(DESTDIR))

DEFINES = -D
INCPATH = \
          -I../../generated \
          -I$(RTSB_HOME)/OS/include \
          -I$(RTSB_HOME)/KN/include \
          -I$(RTSB_HOME)/DB/include \
          -I$(RTSB_HOME)/UI/include \
          -I$(RTSB_HOME)/C++/CPPI

head_list := $(wildcard ../../generated/*.h)
src_list := $(wildcard ../../generated/*.cpp)
src_file_list := $(notdir $(src_list))
objs := $(src_file_list:%.cpp=%.o)

$(TARGET): $(objs)
	ar cqs $(TARGET) $^

$(objs): %.o : ../../generated/%.cpp $(head_list) idlpp_target
	g++ -c $(CXXFLAGS) $(INCPATH) $<

idlpp_target:
	idlpp -I "${RTSB_HOME}/etc/idl" -l cpp -d ../../generated ../../../idl/${PARENT_NAME}.idl

.PHONY: clean

clean:
	-rm *.o $(TARGET)

动态库


ifeq ($(BUILD_TARGET), Debug)            # ifeq后一定要一个空格
    CXXFLAGS = -pipe -g -fPIC -std=gnu++11 -Wall -W -D_REENTRANT
else
    CXXFLAGS = -pipe -fPIC -std=gnu++11 -Wall -W -D_REENTRANT
endif

MKDIR   = mkdir -p
DESTDIR =  ../../lib/$(BUILD_TARGET)/
TARGET  = $(DESTDIR)/lib$(LIB_NAME).so
$(shell $(MKDIR) $(DESTDIR))

DEFINES = -D
INCPATH = \
          -I../../generated \
          -I$(RTSB_HOME)/OS/include \
          -I$(RTSB_HOME)/KN/include \
          -I$(RTSB_HOME)/DB/include \
          -I$(RTSB_HOME)/UI/include \
          -I$(RTSB_HOME)/C++/CPPI

head_list := $(wildcard ../../generated/*.h)
src_list := $(wildcard ../../generated/*.cpp)
src_file_list := $(notdir $(src_list))
objs := $(src_file_list:%.cpp=%.o)

$(TARGET): $(objs)
	g++ -shared -o $(TARGET) $^

$(objs): %.o : ../../generated/%.cpp $(head_list) idlpp_target
	g++ -c $(CXXFLAGS) $(INCPATH) $<

idlpp_target:
	idlpp -I "${RTSB_HOME}/etc/idl" -l cpp -d ../../generated ../../../idl/${PARENT_NAME}.idl

.PHONY: clean

clean:
	-rm *.o $(TARGET)

可执行程序

ifeq ($(BUILD_TARGET), Debug)            # ifeq后一定要一个空格
    CXXFLAGS = -pipe -g -fPIC -std=gnu++11 -Wall -W -D_REENTRANT
else
    CXXFLAGS = -pipe -fPIC -std=gnu++11 -Wall -W -D_REENTRANT
endif

MKDIR   = mkdir -p
DESTDIR =    ../../bin/$(BUILD_TARGET)/$(OSNAME)/$(OS_DIST_NAME)/$(OSARCH)/$(OS_VERSION)
TARGET  = $(DESTDIR)/$(PUB_NAME)
$(shell $(MKDIR) $(DESTDIR))

DEFINES = -D
INCPATH = \
	  -I../../src/common \
          -I../../generated \
          -I$(RTSB_HOME)/OS/include \
          -I$(RTSB_HOME)/KN/include \
          -I$(RTSB_HOME)/DB/include \
          -I$(RTSB_HOME)/UI/include \
          -I$(RTSB_HOME)/C++/CPPI

LIBS = -L../../lib/$(BUILD_TARGET) -l$(LIB_NAME) -L$(RTSB_HOME)/lib/$(BUILD_TARGET)/$(OSNAME)/$(OS_DIST_NAME)/$(OSARCH)/$(OS_VERSION) -lOS -lKN -lCPPI

head_list := $(shell find ../../src -name '*.h**')
src_list := ../../src/implementation.cpp ../../src/publisher.cpp
src_file_list := $(notdir $(src_list))
objs := $(src_file_list:%.cpp=%.o)

$(TARGET): $(objs)
	g++ -o $(TARGET) $^ $(LIBS)

$(objs): %.o : ../../src/%.cpp $(head_list)
	g++ -c $(CXXFLAGS) $(INCPATH) $<


.PHONY: clean

clean:
	-rm *.o $(TARGET)