因为自己记性太差,很多东西隔段时间就会忘记,就经常会写点小程序做个测试,这些程序非常小,基本都会将代码放在一个代码文件中。虽然编译它们也就是一条语句,但是有时候会差点头文件、或者敲错字符啥的,每次都要在终端下敲编译命令也挺烦的,索性就写了这个Makefile文件,在ubuntu下当作模板,下次即使不小心把测试代码都删了也还能拿来就用。
该Makefile主要是把当前目录下的所有“.c”文件都分别编译为一个小程序。
例如我的文件目录如下:
Makefile文件
CC=$(shell which gcc)
CXX=$(shell which g++)
# 设定目标程序和obj文件的保存路径,可以设置为空,即保存在当前目录下
OBJDIR=obj/
BINDIR=bin/
# source files:目前只扫描.c文件
SRC=$(wildcard *.c)
OBJS=$(patsubst %.c,%.o,$(SRC))
PROGRAMS=$(patsubst %.c,%,$(SRC))
# 拼接obj和目标路径
FULLOBJS=$(addprefix ${OBJDIR},${OBJS})
TARGETS=$(addprefix ${BINDIR},${PROGRAMS})
# whether has something to do
ifeq (,${TARGETS})
$(error No ".c" file found!)
endif
#### $(call rmdir-quiet,<directory>)
## If the directory is not empty, it will failure.
define rmdir-quiet
if [ -d $1 ]; then rmdir $1; fi
endef
# 将每个文件名作为目标,并全部定义为伪目标,方便单独编译某个模块
.PHONY : ${PROGRAMS}
# default to produce all targets
all: ${TARGETS}
${PROGRAMS}:%:${BINDIR}%
${TARGETS}: ${BINDIR}%:${OBJDIR}%.o
$(if ${BINDIR},$(shell mkdir -p ${BINDIR}))
$(CC) $< -o $@
${OBJDIR}%.o : %.c
$(if $(OBJDIR),$(shell mkdir -p $(OBJDIR)))
$(CC) -c $< -o $@
clean:
$(foreach tag, ${TARGETS}, rm -f ${tag})
$(foreach tag, ${FULLOBJS}, rm -f ${tag})
$(if ${OBJDIR}, $(call rmdir-quiet,$(OBJDIR)))
$(if ${BINDIR}, $(call rmdir-quiet,$(BINDIR)))
test_make.c文件
#include <stdio.h>
int main(int argc, char** argv)
{
printf("Hello world!\n");
return 0;
}
timer.c文件
#include <sys/time.h>
#include <signal.h>
#include <stdio.h>
#include <assert.h>
static long count = 0;
void setTimeVal(struct timeval* time, long sec, long usec)
{
assert(time);
time->tv_sec = sec;
time->tv_usec = usec;
}
void handleProf(int sig)
{
printf("sig[%d]--timer count--%ld\n", sig, count++);
}
int main(int argc, char** argv)
{
struct itimerval itimer;
setTimeVal(&itimer.it_value, 1, 0);
setTimeVal(&itimer.it_interval, 1, 0);// 设置循环使用定时器
//setTimeVal(&itimer.it_interval, 0, 0);// 设置单次定时器
signal(SIGPROF, handleProf);
setitimer(ITIMER_PROF, &itimer, NULL);
while (1);
return 0;
}
然后在终端输入
$make <两次TAB>
即可生成一个名为timer的程序:
如果新加入c文件,不需要作修改,可以直接编译。比如说你在这个目录中加入了一个test.c,只要执行make test就可以生成一个名为test的程序。