include/func_a.h
void func_a();
include/func_b.h
void func_b);
lib/func_a.c
#include <stdio.h>
#include "func_a.h"
void func_a()
{
printf("%s\n", __FUNCTION__);
}
lib/func_b.c
#include <stdio.h>
#include "func_b.h"
void func_b()
{
printf("%s\n", __FUNCTION__);
}
~
lib/Makefile
SRCS := func_a.c func_b.c
$(BUILT_IN): $(SRCS:.c=.o)
$(LD) $(LDFLAGS) -r -o $@ $^
$(SRCS:.c=.o):
$(CC) $(CFLAGS) -c $<
$(DEP): $(SRCS)
$(CC) $(CFLAGS) -MM $(SRCS) >$@
sed -i "s/: / $@: /g" $@
sinclude $(DEP)
.PHONY: clean
clean:
$(RM) $(SRCS:.c=.o) $(BUILT_IN) $(DEP)
~
main/main.c
#include <stdio.h>
#include "func_a.h"
#include "func_b.h"
int main()
{
func_a();
func_b();
return 0;
}
main/Makefile
SRCS := main.c
$(BUILT_IN): $(SRCS:.c=.o)
$(LD) $(LDFLAGS) -r -o $@ $^
$(SRCS:.c=.o):
$(CC) $(CFLAGS) -c $<
$(DEP): $(SRCS)
$(CC) $(CFLAGS) -MM $(SRCS) >$@
sed -i "s/: / $@: /g" $@
sinclude $(DEP)
.PHONY: clean
clean:
$(RM) $(SRCS:.c=.o) $(BUILT_IN) $(DEP)
Makefile
TGT := hello
SUBDIR := \
lib \
main
export TOPDIR := $(shell pwd)
export CFLAGS := -O2 -I$(TOPDIR)/include
export LDFLAGS :=
export CROSS_COMPILER_PREFIX :=
export CC := $(CROSS_COMPILER_PREFIX)gcc
export LD := $(CROSS_COMPILER_PREFIX)ld
export BUILT_IN := built_in.o
export DEP = dep
export MAKE := make
all: $(TGT)
$(TGT): $(SUBDIR)
$(CC) $(LDFLAGS) -o $@ $(^:=/$(BUILT_IN))
$(SUBDIR):
$(MAKE) -C $@
.PHONY: $(SUBDIR) clean all
clean:
for dir in $(SUBDIR); do \
$(MAKE) -C $$dir clean; \
done
$(RM) $(TGT)
~