makefile 模版

来源:互联网 发布:台州网络平台赌博 编辑:程序博客网 时间:2024/05/21 22:33

1C语言makefile规则:

#******************************************************************************
#*                                                                            *
#* This program is distributed in the hope that it will be useful, but        *
#* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY *
#* or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed    *
#* under the GNU Lesser General Public License Version 3, 29 June 2007.       *
#* The complete license can be accessed from the following location:          *
#* http://opensource.org/licenses/lgpl-3.0.html                               *
#*                                                                            *
#* Author: Yun Li (yunli.open@gmail.com)                                      *
#*   Date: 05/22/2010                                                         *
#*                                                                            *
#******************************************************************************


#******************************************************************************
# REVISION HISTORY
# ================

# Date     Version  Name          Description
# -------- -------  ------------  --------------------------------------------
#
# -------- -------  ------------  --------------------------------------------
#
#******************************************************************************
 
MKDIR = mkdir
RM = rm
CHKER = lint-nt.exe


RMFLAGS = -fr
ARFLAGS = crs
CFLAGS += -std=gnu99
CHKFLAGS = -v std.lnt


ROOT := $(abspath $(ROOT))
BUILD := $(abspath $(BUILD))


ifeq ("$(MAKECMDGOALS)", "")
MAKECMDGOALS = release
endif


ifeq ("$(MAKECMDGOALS)", "release")
DIR_OBJS = robjs
AR = ar
CC = gcc
CFLAGS += -Wall -gdwarf-2 -g3 -O2
endif


ifeq ("$(MAKECMDGOALS)", "debug")
DIR_OBJS = dobjs
AR = ar
CC = gcc
CFLAGS += -Werror -gdwarf-2 -g3
endif


ifeq ("$(MAKECMDGOALS)", "unitest")
DIR_OBJS = uobjs
AR = ar
CC = gcc
CFLAGS += -Werror -gdwarf-2 -g3 -DUNITEST -fprofile-arcs -ftest-coverage
LINK_LIBS += gcov
endif


ifeq ("$(MAKECMDGOALS)", "scheck")
DIR_OBJS = sobjs
endif


DIR_TARGET = $(BUILD)/$(MAKECMDGOALS)
DIRS = $(DIR_OBJS) $(DIR_TARGET)
DIR_CHKER = $(ROOT)/tools/lint


SRCS = $(wildcard *.c)
ASMS = $(wildcard *.S)
UTS = $(wildcard unitest_*.c)
OBJS := $(addprefix $(DIR_OBJS)/, $(SRCS:.c=.o)) $(addprefix $(DIR_OBJS)/, $(ASMS:.S=.o))
DEPS := $(addprefix $(DIR_OBJS)/, $(SRCS:.c=.dep)) $(addprefix $(DIR_OBJS)/, $(ASMS:.S=.dep))
CHKS := $(addprefix $(DIR_OBJS)/, $(SRCS:.c=.chk))
RMS = robjs dobjs uobjs sobjs


ifneq ("$(EXE)", "")
EXE := $(addprefix $(DIR_TARGET)/, $(EXE))
RMS += $(EXE)
endif
ifneq ("$(UTS)", "")
UTS := $(addprefix $(DIR_TARGET)/, $(UTS:.c=.exe))
RMS += $(UTS)
endif
ifneq ("$(LIB)", "")
LIB := $(addprefix $(DIR_TARGET)/, $(LIB))
RMS += $(LIB)
endif


ifeq ("$(wildcard $(DIR_OBJS))", "")
DEP_DIR_OBJS := $(DIR_OBJS)
endif
ifeq ("$(wildcard $(DIR_TARGET))", "")
DEP_DIR_TARGET := $(DIR_TARGET)
endif


ifneq ("$(INCLUDE_DIRS)", "")
ifeq ($(MAKECMDGOALS), scheck)
CHK_INCLUDE_DIRS += $(INCLUDE_DIRS)
CHK_INCLUDE_DIRS := $(shell cygpath -w -p $(CHK_INCLUDE_DIRS))
CHK_INCLUDE_DIRS := $(addprefix ", $(CHK_INCLUDE_DIRS))
CHK_INCLUDE_DIRS := $(addsuffix ", $(CHK_INCLUDE_DIRS))
CHK_INCLUDE_DIRS := $(addprefix -I, $(CHK_INCLUDE_DIRS))
CHK_INCLUDE_DIRS := $(strip $(CHK_INCLUDE_DIRS))
endif
INCLUDE_DIRS := $(addprefix -I, $(INCLUDE_DIRS))
INCLUDE_DIRS := $(strip $(INCLUDE_DIRS))
endif


ifneq ("$(LINK_LIBS)", "")
LINK_LIBS := $(strip $(LINK_LIBS))
LIB_ALL := $(notdir $(wildcard $(DIR_TARGET)/*))
LIB_FILTERED := $(addsuffix %, $(addprefix lib, $(LINK_LIBS)))
$(eval DEP_LIBS = $(filter $(LIB_FILTERED), $(LIB_ALL)))
DEP_LIBS := $(addprefix $(DIR_TARGET)/, $(DEP_LIBS))
LINK_LIBS := $(addprefix -l, $(LINK_LIBS))
endif


.PHONY: release debug clean unitest scheck
release debug unitest: $(EXE) $(UTS) $(LIB)
clean:
-$(RM) $(RMFLAGS) $(RMS)
scheck: $(CHKS)


ifneq ("$(MAKECMDGOALS)", "clean")
include $(DEPS)
endif


ifeq ($(MAKECMDGOALS), scheck)
CHK_CHKER_DIR += $(DIR_CHKER)
CHK_CHKER_DIR := $(shell cygpath -w -p $(CHK_CHKER_DIR))
CHK_CHKER_DIR := $(addprefix ", $(CHK_CHKER_DIR))
CHK_CHKER_DIR := $(addsuffix ", $(CHK_CHKER_DIR))
CHK_CHKER_DIR := $(addprefix -I, $(CHK_CHKER_DIR))
CHK_CHKER_DIR := $(strip $(CHK_CHKER_DIR))
CHK_ROOT_DIR := $(shell cygpath -w -p $(ROOT))
endif


$(DIRS):
$(MKDIR) $@
$(EXE): $(DEP_DIR_TARGET) $(OBJS) $(DEP_LIBS)
$(CC) -L$(DIR_TARGET) -o $@ $(filter %.o, $^) -Wl,-Map=$@.map $(LINK_LIBS)
$(UTS): $(DEP_DIR_TARGET) $(DEP_LIBS)
$(CC) -L$(DIR_TARGET) -o $@ $(filter %.o, $^) -Wl,-Map=$@.map $(LINK_LIBS)
$(LIB): $(DEP_DIR_TARGET) $(OBJS)
$(AR) $(ARFLAGS) $@ $(filter %.o, $^)


$(DIR_OBJS)/%.o: $(DEP_DIR_OBJS) %.c
$(CC) $(CFLAGS) $(INCLUDE_DIRS) -o $@ -c $(filter %.c, $^)
$(DIR_OBJS)/%.o: $(DEP_DIR_OBJS) %.S
$(CC) $(CFLAGS) $(INCLUDE_DIRS) -o $@ -c $(filter %.S, $^)
$(DIR_OBJS)/%.dep: $(DEP_DIR_OBJS) %.c
@echo "Creating $@ ..."
@set -e ; \
$(RM) $(RMFLAGS) $@.tmp ; \
$(CC) $(INCLUDE_DIRS) -E -MM $(filter %.c, $^) > $@.tmp ; \
sed 's,\(.*\)\.o[ :]*,$(DIR_OBJS)/\1.o $@ $(DIR_OBJS)/\1.chk: ,g' < $@.tmp > $@ ; \
$(RM) $(RMFLAGS) $@.tmp ; \
if [ -n "$(UTS)" ] ; then echo "$(DIR_TARGET)/$*.exe: $(DIR_OBJS)/$*.o" >> $@ ; fi
$(DIR_OBJS)/%.dep: $(DEP_DIR_OBJS) %.S
@echo "Creating $@ ..."
@set -e ; \
$(RM) $(RMFLAGS) $@.tmp ; \
$(CC) $(INCLUDE_DIRS) -E -MM $(filter %.S, $^) > $@.tmp ; \
sed 's,\(.*\)\.o[ :]*,$(DIR_OBJS)/\1.o $@: ,g' < $@.tmp > $@ ; \
$(RM) $(RMFLAGS) $@.tmp ; 
$(DIR_OBJS)/%.chk: $(DEP_DIR_OBJS) %.c
$(DIR_CHKER)/$(CHKER) $(CHK_CHKER_DIR) $(CHK_INCLUDE_DIRS) $(CHKFLAGS) -libdir"($(CHK_ROOT_DIR)\*)" $(filter %.c, $^)
@touch $@



2、C++语言makefile规则

#******************************************************************************
#*                                                                            *
#* This program is distributed in the hope that it will be useful, but        *
#* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY *
#* or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed    *
#* under the GNU Lesser General Public License Version 3, 29 June 2007.       *
#* The complete license can be accessed from the following location:          *
#* http://opensource.org/licenses/lgpl-3.0.html                               *
#*                                                                            *
#* Author: Yun Li (yunli.open@gmail.com)                                      *
#*   Date: 05/22/2010                                                         *
#*                                                                            *
#******************************************************************************


#******************************************************************************
# REVISION HISTORY
# ================

# Date     Version  Name          Description
# -------- -------  ------------  --------------------------------------------
#
# -------- -------  ------------  --------------------------------------------
#
#******************************************************************************
 
MKDIR = mkdir
RM = rm
CHKER = lint-nt.exe


RMFLAGS = -fr
ARFLAGS = crs
CXXFLAGS += -Wall -Weffc++ -Woverloaded-virtual
CHKFLAGS = -v std.lnt


ROOT := $(abspath $(ROOT))
BUILD := $(abspath $(BUILD))


ifeq ("$(MAKECMDGOALS)", "")
MAKECMDGOALS = release
endif


ifeq ("$(MAKECMDGOALS)", "release")
DIR_OBJS = robjs
AR = ar
CXX = g++
CXXFLAGS += -gdwarf-2 -g3 -O2
endif


ifeq ("$(MAKECMDGOALS)", "debug")
DIR_OBJS = dobjs
AR = ar
CXX = g++
CXXFLAGS += -gdwarf-2 -g3
endif


ifeq ("$(MAKECMDGOALS)", "unitest")
DIR_OBJS = uobjs
AR = ar
CXX = g++
CXXFLAGS += -gdwarf-2 -g3 -DUNITEST -fprofile-arcs -ftest-coverage
LINK_LIBS += gcov
endif


ifeq ("$(MAKECMDGOALS)", "scheck")
DIR_OBJS = sobjs
endif


DIR_TARGET = $(BUILD)/$(MAKECMDGOALS)
DIRS = $(DIR_OBJS) $(DIR_TARGET)
DIR_CHKER = $(ROOT)/tools/lint


SRCS = $(wildcard *.cpp)
UTS = $(wildcard unitest_*.cpp)
OBJS := $(addprefix $(DIR_OBJS)/, $(SRCS:.cpp=.o))
DEPS := $(addprefix $(DIR_OBJS)/, $(SRCS:.cpp=.dep))
CHKS := $(addprefix $(DIR_OBJS)/, $(SRCS:.cpp=.chk))
RMS = robjs dobjs uobjs sobjs


ifneq ("$(EXE)", "")
EXE := $(addprefix $(DIR_TARGET)/, $(EXE))
RMS += $(EXE)
endif
ifneq ("$(UTS)", "")
UTS := $(addprefix $(DIR_TARGET)/, $(UTS:.cpp=.exe))
RMS += $(UTS)
endif
ifneq ("$(LIB)", "")
LIB := $(addprefix $(DIR_TARGET)/, $(LIB))
RMS += $(LIB)
endif


ifeq ("$(wildcard $(DIR_OBJS))", "")
DEP_DIR_OBJS := $(DIR_OBJS)
endif
ifeq ("$(wildcard $(DIR_TARGET))", "")
DEP_DIR_TARGET := $(DIR_TARGET)
endif


ifneq ("$(INCLUDE_DIRS)", "")
ifeq ($(MAKECMDGOALS), scheck)
CHK_INCLUDE_DIRS += $(INCLUDE_DIRS)
CHK_INCLUDE_DIRS := $(shell cygpath -w -p $(CHK_INCLUDE_DIRS))
CHK_INCLUDE_DIRS := $(addprefix ", $(CHK_INCLUDE_DIRS))
CHK_INCLUDE_DIRS := $(addsuffix ", $(CHK_INCLUDE_DIRS))
CHK_INCLUDE_DIRS := $(addprefix -I, $(CHK_INCLUDE_DIRS))
CHK_INCLUDE_DIRS := $(strip $(CHK_INCLUDE_DIRS))
endif
INCLUDE_DIRS := $(addprefix -I, $(INCLUDE_DIRS))
INCLUDE_DIRS := $(strip $(INCLUDE_DIRS))
endif


ifneq ("$(LINK_LIBS)", "")
LINK_LIBS := $(strip $(LINK_LIBS))
LIB_ALL := $(notdir $(wildcard $(DIR_TARGET)/*))
LIB_FILTERED := $(addsuffix %, $(addprefix lib, $(LINK_LIBS)))
$(eval DEP_LIBS = $(filter $(LIB_FILTERED), $(LIB_ALL)))
DEP_LIBS := $(addprefix $(DIR_TARGET)/, $(DEP_LIBS))
LINK_LIBS := $(addprefix -l, $(LINK_LIBS))
endif


.PHONY: release debug clean unitest scheck
release debug unitest: $(EXE) $(UTS) $(LIB)
clean:
-$(RM) $(RMFLAGS) $(RMS)
scheck: $(CHKS)


ifneq ("$(MAKECMDGOALS)", "clean")
include $(DEPS)
endif


ifeq ($(MAKECMDGOALS), scheck)
CHK_CHKER_DIR += $(DIR_CHKER)
CHK_CHKER_DIR := $(shell cygpath -w -p $(CHK_CHKER_DIR))
CHK_CHKER_DIR := $(addprefix ", $(CHK_CHKER_DIR))
CHK_CHKER_DIR := $(addsuffix ", $(CHK_CHKER_DIR))
CHK_CHKER_DIR := $(addprefix -I, $(CHK_CHKER_DIR))
CHK_CHKER_DIR := $(strip $(CHK_CHKER_DIR))
CHK_ROOT_DIR := $(shell cygpath -w -p $(ROOT))
endif


$(DIRS):
$(MKDIR) $@
$(EXE): $(DEP_DIR_TARGET) $(OBJS) $(DEP_LIBS)
$(CXX) -L$(DIR_TARGET) -o $@ $(filter %.o, $^) $(LINK_LIBS)
$(UTS): $(DEP_DIR_TARGET) $(DEP_LIBS)
$(CXX) -L$(DIR_TARGET) -o $@ $(filter %.o, $^) $(LINK_LIBS)
$(LIB): $(DEP_DIR_TARGET) $(OBJS)
$(AR) $(ARFLAGS) $@ $(filter %.o, $^)


$(DIR_OBJS)/%.o: $(DEP_DIR_OBJS) %.cpp
$(CXX) $(CXXFLAGS) $(INCLUDE_DIRS) -o $@ -c $(filter %.cpp, $^)
$(DIR_OBJS)/%.dep: $(DEP_DIR_OBJS) %.cpp
@echo "Creating $@ ..."
@set -e ; \
$(RM) $(RMFLAGS) $@.tmp ; \
$(CXX) $(INCLUDE_DIRS) -E -MM $(filter %.cpp, $^) > $@.tmp ; \
sed 's,\(.*\)\.o[ :]*,$(DIR_OBJS)/\1.o $(DIR_OBJS)/\1.chk $@: ,g' < $@.tmp > $@ ; \
$(RM) $(RMFLAGS) $@.tmp ; \
if [ -n "$(UTS)" ] ; then echo "$(DIR_TARGET)/$*.exe: $(DIR_OBJS)/$*.o" >> $@ ; fi
$(DIR_OBJS)/%.chk: $(DEP_DIR_OBJS) %.cpp
$(DIR_CHKER)/$(CHKER) $(CHK_CHKER_DIR) $(CHK_INCLUDE_DIRS) $(CHKFLAGS) -libdir"($(CHK_ROOT_DIR)\*)" $(filter %.cpp, $^)
@touch $@


3、总makefile规则

#******************************************************************************
#*                                                                            *
#* This program is distributed in the hope that it will be useful, but        *
#* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY *
#* or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed    *
#* under the GNU Lesser General Public License Version 3, 29 June 2007.       *
#* The complete license can be accessed from the following location:          *
#* http://opensource.org/licenses/lgpl-3.0.html                               *
#*                                                                            *
#* Author: Yun Li (yunli.open@gmail.com)                                      *
#*   Date: 05/22/2010                                                         *
#*                                                                            *
#******************************************************************************


#******************************************************************************
# REVISION HISTORY
# ================

# Date     Version  Name          Description
# -------- -------  ------------  --------------------------------------------
#
# -------- -------  ------------  --------------------------------------------
#
#******************************************************************************
 
ROOT = $(realpath ..)
BUILD = $(realpath .)


COMMON_DIRS = \
    $(ROOT)/code/tools/err2str \
    $(ROOT)/code/platform/common/src \
    $(ROOT)/code/platform/arch/x86/simulator/src \
    $(ROOT)/code/platform/driver/ctrlc/src \
    $(ROOT)/code/platform/driver/flash/share/src \
    $(ROOT)/code/platform/driver/flash/39vf040/src \
    $(ROOT)/code/platform/board/simulator/src \
    $(ROOT)/code/platform/memory/v1/src \
    $(ROOT)/code/platform/memory/v2/src \
    $(ROOT)/code/platform/memory/v3/src \
    $(ROOT)/code/platform/timer/v1/src \
    $(ROOT)/code/platform/timer/v2/src \
    $(ROOT)/code/platform/timer/v3/src \
    $(ROOT)/code/platform/timer/v4/src \
    $(ROOT)/code/platform/task/v1/src \
    $(ROOT)/code/platform/task/v2/src \
    $(ROOT)/code/platform/task/v3/src \
    $(ROOT)/code/platform/sync/v1/src \
    $(ROOT)/code/platform/sync/v2/src \
    $(ROOT)/code/platform/sync/v3/src \
    $(ROOT)/code/platform/device/src \
    
NONUT_DIRS = \
    $(ROOT)/code/application/stackframe \
    $(ROOT)/code/application/return \
    $(ROOT)/code/application/memory/heap/v1 \
    $(ROOT)/code/application/memory/heap/v2 \
    $(ROOT)/code/application/memory/heap/v3 \
    $(ROOT)/code/application/memory/mpool \
    $(ROOT)/code/application/timer/v1 \
    $(ROOT)/code/application/timer/v2 \
    $(ROOT)/code/application/timer/v3 \
    $(ROOT)/code/application/timer/v4 \
    $(ROOT)/code/application/module \
    $(ROOT)/code/application/task/v1 \
    $(ROOT)/code/application/task/v2 \
    $(ROOT)/code/application/sync/semaphore \
    $(ROOT)/code/application/sync/mutex \
    $(ROOT)/code/application/sync/event \
    $(ROOT)/code/application/sync/prioinv \
    $(ROOT)/code/application/sync/prioinh \
    $(ROOT)/code/application/sync/queue \
    $(ROOT)/code/application/sync/deadlock \
    $(ROOT)/code/application/sync/recursive \
    
UT_DIRS = \
    $(ROOT)/tests/platform/common \
    $(ROOT)/tests/platform/task \


MAKE_DIRS := $(COMMON_DIRS)


ifeq ("$(MAKECMDGOALS)", "")
MAKECMDGOALS = release
endif


ifeq ("$(MAKECMDGOALS)", "release")
MAKE_DIRS += $(NONUT_DIRS)
endif
ifeq ("$(MAKECMDGOALS)", "debug")
MAKE_DIRS += $(NONUT_DIRS)
endif
ifeq ("$(MAKECMDGOALS)", "unitest")
MAKE_DIRS += $(UT_DIRS)
endif
ifeq ("$(MAKECMDGOALS)", "clean")
MAKE_DIRS += $(NONUT_DIRS) $(UT_DIRS)
endif
ifeq ("$(MAKECMDGOALS)", "creport")
MAKE_DIRS += $(UT_DIRS)
endif
ifeq ("$(MAKECMDGOALS)", "scheck")
MAKE_DIRS += $(NONUT_DIRS)
endif


RM = rm
MKDIR = mkdir
MV = mv
RMFLAGS = -fr
MKDIRFLAGS = -p
RMS = release debug unitest $(DIR_COVERAGE) scheck $(DIR_PROFILE)


DIR_UNITEST = unitest
DIR_COVERAGE = coverage
DIR_PROFILE = profile


.PHONY: release debug clean touch unitest test force creport scheck dcheck dreport profile


release debug clean unitest scheck:
@set -e; \
for DIR in $(MAKE_DIRS); \
do \
cd $$DIR && $(MAKE) -r ROOT=$(ROOT) BUILD=$(BUILD) $@; \
done
@set -e; \
if [ "$(MAKECMDGOALS)" = "clean" ] ; then $(RM) $(RMFLAGS) $(RMS) ; fi; \
if [ "$(MAKECMDGOALS)" = "unitest" ] ; then touch $(DIR_UNITEST)/unitested; fi
@echo ""
@echo ":-) Completed"
@echo ""


UTS = $(wildcard $(DIR_UNITEST)/unitest_*.exe)


ifeq ("$(MAKECMDGOALS)", "test")
ifeq ("$(wildcard $(DIR_UNITEST)/unitested)", "")
$(error Did you forget to run 'make unitest'?)
endif


$(DIR_UNITEST)/unitest_%: force 
./$@
endif


test: $(UTS)
@touch $(DIR_UNITEST)/tested


force:


touch:
@echo "Processing ..."
@find $(ROOT) -exec touch {} \;
@echo ""
@echo ":-) Completed"
@echo ""


REPORT = unitest.report
TEMP = temp.report


ifeq ("$(MAKECMDGOALS)", "creport")
ifeq ("$(wildcard $(DIR_UNITEST)/tested)", "")
$(error Did you forget to run 'make unitest' and 'make test'?)
endif
endif


$(DIR_COVERAGE):
$(MKDIR) $@


creport: $(DIR_COVERAGE)
@set -e; \
cd $(DIR_COVERAGE); \
$(RM) $(RMFLAGS) *; \
for DIR in $(MAKE_DIRS); \
do \
if ls $$DIR/uobjs/*.gcda > /dev/null 2>&1; then \
   lcov -c -d $$DIR/uobjs -b $$DIR >> $(TEMP); \
fi; \
done ; \
lcov -r $(TEMP) /usr/include/* tests/* tools/* c++/* unitest.h errstr.def -o $(REPORT); \
genhtml $(REPORT); \
$(RM) $(RMFLAGS) $(TEMP) $(REPORT)
@echo ""
@echo ":-) Generated"
@echo ""

ifeq ("$(MAKECMDGOALS)", "dcheck")
ifeq ("$(wildcard $(DIR_UNITEST)/unitested)", "")
$(error Did you forget to run 'make unitest'?)
endif


$(DIR_UNITEST)/unitest_%: force 
valgrind --leak-check=full --track-origins=yes --read-var-info=yes --malloc-fill=0xFF --log-file=$@.mem.log ./$@
valgrind --tool=exp-ptrcheck --enable-sg-checks=yes --log-file=$@.ptr.log ./$@
endif


dcheck: $(UTS)
@touch $(DIR_UNITEST)/dchecked
@echo ""
@echo ":-) Completed"
@echo ""


ifeq ("$(MAKECMDGOALS)", "dreport")
ifeq ("$(wildcard $(DIR_UNITEST)/dchecked)", "")
$(error Did you forget to run 'make unitest' and 'make dcheck'?)
endif
endif


dreport:
@cd $(DIR_UNITEST) && grep "ERROR SUMMARY" *.log | sed 's,\(.*\)\.log\(.*\)ERROR SUMMARY[ :]\(.*\),\1.log summary: \n   \3,g'
@echo ""
@echo ":-) Generated"
@echo ""

ifeq ("$(MAKECMDGOALS)", "profile")
ifeq ("$(wildcard $(DIR_UNITEST)/unitested)", "")
$(error Did you forget to run 'make unitest'?)
endif


$(DIR_UNITEST)/unitest_%: force 
valgrind -q --tool=callgrind --collect-jumps=yes --callgrind-out-file=$(basename $@).prof ./$@
endif


profile: $(UTS)
@$(MKDIR) $(MKDIRFLAGS) $(DIR_PROFILE) && $(MV) $(DIR_UNITEST)/*.prof $(DIR_PROFILE)
@echo ""
@echo ":-) Completed"
@echo ""

0 0
原创粉丝点击