目录结构如下
第一层 makefile
CC=gcc
SRC_DIR=$(shell pwd)
BUILD_DIR:=$(SRC_DIR)/build
export CC SRC_DIR BUILD_DIR
all:build lib bin
build:ECHO
@mkdir -p -m 755 $(BUILD_DIR)
lib:ECHO
@mkdir -p -m 755 $(BUILD_DIR)/lib
$(MAKE) -C $(SRC_DIR)/lib CURRENT_DIR=lib
bin:ECHO
@mkdir -p -m 755 $(BUILD_DIR)/bin
$(MAKE) -C $(SRC_DIR)/bin CURRENT_DIR=bin
ECHO:
@echo $(SUBDIRS)
clean:
$(MAKE) -C $(SRC_DIR)/lib clean
$(MAKE) -C $(SRC_DIR)/bin clean
@rm -rf $(BUILD_DIR)/*
lib目录下的makefile
SUBDIRS= $(shell ls -l | grep ^d | awk '{print $$9}')
CUR_SOURCE=$(wildcard *.c)
CUR_OBJS=$(patsubst %.c, %.o, $(CUR_SOURCE))
all:$(SUBDIRS) $(CUR_OBJS)
$(SUBDIRS):ECHO
make -C $@
$(CUR_OBJS):%.o:%.c
$(CC) -c $^ -o $(ROOT_DIR)/$(OBJS_DIR)/$@
ECHO:
echo $(SUBDIRS)
clean:
for dir in $(SUBDIRS);\
do $(MAKE) -C $$dir clean||exit 1;\
done
libtest1目录下 makefile
SHELL = /bin/bash
CFLAGS += -g -fPIC
CFLAGS += -I. -I../../include
CFLAGS += $(EXTRA_FLAGS)
SHARED = -shared -fPIC
TARGET = libtest1.so
TARGET_SRC := $(patsubst %.c, %.o, $(wildcard *.c))
all: clean lib1
lib1:$(TARGET_SRC)
$(CC) $^ $(SHARED) -o $(TARGET)
@mv -f $(TARGET) $(BUILD_DIR)/$(CURRENT_DIR)
clean:
@rm -f *.o */*.o $(TARGET)
bin目录下makefile
SUBDIRS= $(shell ls -l | grep ^d | awk '{print $$9}')
CUR_SOURCE=$(wildcard *.c)
CUR_OBJS=$(patsubst %.c, %.o, $(CUR_SOURCE))
all:$(SUBDIRS) $(CUR_OBJS)
$(SUBDIRS):ECHO
make -C $@
$(CUR_OBJS):%.o:%.c
$(CC) -c $^ -o $(ROOT_DIR)/$(OBJS_DIR)/$@
ECHO:
echo $(SUBDIRS)
clean:
for dir in $(SUBDIRS);\
do $(MAKE) -C $$dir clean||exit 1;\
done
test目录下makefile
SHELL = /bin/bash
CFLAGS += -g -fPIC
CFLAGS += -I. -I../../include
CFLAGS += $(EXTRA_FLAGS)
SHARE_LIB = -ltest1
LIBPATH = -L $(BUILD_DIR)/lib
LDFLAGS = -Wl,-rpath=$(BUILD_DIR)/lib //,后面不能加空格
TARGET = test1
TARGET_SRC := $(patsubst %.c, %.o, $(wildcard *.c))
all: clean test
test:$(TARGET_SRC)
$(CC) $^ -o $(TARGET) $(LIBPATH) $(SHARE_LIB) $(LDFLAGS)
@mv -f $(TARGET) $(BUILD_DIR)/$(CURRENT_DIR)
clean:
@rm -f *.o */*.o $(TARGET)
内核编译模板:
SHELL = /bin/bash
EXTAR_CFLAGS =-I$(SRC_DIR)/include
TARGET_MODULE:module
ifneq ($(KERNELRELEASE),)
$(TARGET_MODULE)-objs := hello_world.o main.o
obj-m := $(TARGET_MODULE).o
else
BUILDSYSTEM_DIR :=/lib/modules/$(shell uname -r)/build
PWD:=$(shell pwd)
all:
$(MAKE) -C $(BUILDSYSTEM_DIR) M=$(PWD) modules
clean:
$(MAKE) -C $(BUILDSYSTEM_DIR) M=$(PWD) clean
install:all
$(MAKE) -C $(BUILDSYSTEM_DIR) M=$(PWD) modules_install/*临时*/
上一层Makefile make install
install:
mkdir -p -m 755 /lib/modules/$(shell uname -r)/extra/hello
install --v -m 755 $(SRC_DIR)/hello.ko /lib/modules/$(shell uname -r)/extra/hello/
depmod -a || true
uninstall:
/bin/rm -rf /lib/modules/$(shell uname -r)/extra/hello/
depmod -a