Makefile
#makefile template
#install dir
INSTALL_DIR_INCLUDE :=
INSTALL_DIR_BINARY :=
#
#$(warning $(INSTALL_DIR_BINARY))
#current-src
SRC_DIR := $(shell pwd)
SRC_FILES := $(wildcard $(SRC_DIR)/*.c) $(wildcard $(SRC_DIR)/*.cc) $(wildcard $(SRC_DIR)/*.cpp)
SRC_DIR_INCLUDE :=
SRC_DIR_LIBRARY :=
#sub-src
VPATH := ./
#$(warning $(VPATH))
#
#$(warning $(SRC_FILES))
#target
TARGET_NAME :=
TARGET_VERSION := .1.0.0.0
TARGET_SHARE_NAME := lib$(TARGET_NAME).so
TARGET_STATIC_NAME := lib$(TARGET_NAME).a
#dst
DST_DIR_OBJECT := $(SRC_DIR)/../obj
DST_DIR_BINARY := $(SRC_DIR)/../bin
DST_DIR := $(DST_DIR_OBJECT) $(DST_DIR_BINARY)
DST_TARGET_EXEC := $(addprefix $(DST_DIR_BINARY)/, $(TARGET_NAME))
DST_TARGET_SHARE := $(addprefix $(DST_DIR_BINARY)/, $(TARGET_SHARE_NAME)$(TARGET_VERSION))
DST_TARGET_STATIC := $(addprefix $(DST_DIR_BINARY)/, $(TARGET_STATIC_NAME)$(TARGET_VERSION))
#DST_OBJECTS := $(SRC_DIR:%.c=%.o)
DST_OBJECTS := $(addprefix $(DST_DIR_OBJECT)/, $(notdir $(patsubst %.c, %.o, $(patsubst %.cc, %.o, $(patsubst %.cpp, %.o, $(SRC_FILES))))))
#
#$(warning $(DST_OBJECTS))
#ld
LD_INCLUDE := $(addprefix -I, $(SRC_DIR_INCLUDE))
LD_STATIC_BINARY := #libFoo.a
LD_SHARE_BINARY := pthread
LD_STATIC_LIBRARY := $(addprefix $(SRC_DIR_LIBRARY), $(LD_STATIC_BINARY))
LD_SHARE_LIBRARY := $(addprefix -L, $(SRC_DIR_LIBRARY)) $(addprefix -l, $(LD_SHARE_BINARY))
#
#$(warning $(LD_SHARE_LIBRARY))
#c-flag
CC := gcc
CFLAGS := -g -O2 -std=c99 -Wall -MD
CXXFLAGS := $(CFLAGS) -DHAVE_CONFIG_H
LDFLAGS := #-Xlinker "-(" $^ -Xlinker "-)"
ARFLAGS := crs #u
#
#$(warning $(CXXFLAGS))
#
all: $(DST_DIR) $(DST_TARGET_EXEC) $(DST_TARGET_SHARE) $(DST_TARGET_STATIC)
#
$(DST_DIR): clean
@mkdir $@
#$(info "linking '$<' ...")
#
$(DST_TARGET_SHARE): $(DST_OBJECTS) $(LD_STATIC_LIBRARY)
$(CC) -fPIC -shared -o $@ $^ $(LD_SHARE_LIBRARY)
#
$(DST_TARGET_STATIC): $(DST_OBJECTS) $(LD_STATIC_LIBRARY)
$(AR) $(ARFLAGS) $@ $^
#
$(DST_TARGET_EXEC): $(DST_OBJECTS) $(LD_STATIC_LIBRARY)
$(CC) $^ -o $@ $(LD_SHARE_LIBRARY)
#search vpath
$(DST_DIR_OBJECT)/%.o:%.c
$(CC) $(CXXFLAGS) -o $@ -c $< $(LD_INCLUDE)
#
build: clean
#
rebuild: build
#
install:
# @/bin/cp -rf $(SRC_DIR)/*.h $(INSTALL_DIR_INCLUDE)
# @/bin/cp -rf $(DST_TARGET_SHARE) $(INSTALL_DIR_BINARY)
# @chmod 0777 $(INSTALL_DIR_BINARY)$(notdir $(DST_TARGET_SHARE))
# @ln -s $(INSTALL_DIR_BINARY)$(notdir $(DST_TARGET_SHARE)) $(INSTALL_DIR_BINARY)$(TARGET_SHARE_NAME)
$(info "intall done.")
# -rm -f *.*
clean:
$(RM) -r $(DST_DIR_OBJECT) $(DST_DIR_BINARY)
#
.PHONY: all build rebuild install clean
################################## Makefile tips ##################################
#
#
# https://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html
#
#
############## 参数 ##############
# 1. 头文件目录 -I
# [-Idir [...]]
# 2. 库文件目录 -L
# [-Ldir [...]]
# 3. 库文件 -l
# [-llib [...]]
# 4. 预处理(不)使用宏 -(U)D
# [-(U)Dmarc[=def]]
# 5. 启用(关闭)警告 -W(all)
# 6. 定义语言标准 -std=c1x
# 7. 编译整合源文件为o文件, 但不连接 -c
# 8. 输出文件 -o
# 9. 启用调试信息 -g
# 10.使编译器预处理结束时停止编译(用于保留预处理输出文件.i) -E
# 11.依赖关系
# -M: 包含标准库的头文件依赖关系规则(默认-E开启)
# -MM: 同-M,不包含标准库的头文件依赖关系规则
# -MD: 同-M, -MF 给予-o输出.d文件(默认-E关闭)
# -MF: 将依赖关系写入文件
# -MMD: 同-MD不包含标准库的头文件依赖关系
# 12.位置无关代码PIC(Position-Independent Code)
# 13.动态链接库 -shared
# 14.静态链接库 -static
# 15.AR参数-c 创建库
# 16.AR参数-r 插入(替换)模块
# 17.AR参数-s 增加文件索引
# 18.AR参数-u 平常库
# 19.
#
############## 符号 ##############
# 1. 目标符号 $@
# 2. 依赖符号 $^ (所有不重复), $< (第一个)
# 3. 通配符号 %
# 4. 伪符号 .PHONY
# 5. 追加符号 += 或 :=
# 6. 目录搜索 VPATH(环境变量), vpath(方法变量)
#
#
############## 函数 ##############
# 1. 模式匹配字符替换 patsubst
# 2. 添加前缀函数 addprefix
# 3. 通配符有效下的匹配列表 wildcard
# 4. 取字符串的非路径部分 notdir
# 5. 文件引用 -include 等价于 sinclude
#
#
############## 注释 ##############
# 1. 当连接Object文件时, 指定的写法有指定的效果
# 'foo.o -lz bar.o' 此时bar.o有可能未引用到z库
# 2. 多项用空格隔开(VPATH/vpath 可以用:隔开)
#
#
################################## Makefile tips ##################################
cmake 设置编译程序输出的可运行程序调用当前目录下的动态链接库的方法
#Local Libs First
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
#set(CMAKE_SKIP_BUILD_RPATH TRUE)
set(CMAKE_INSTALL_RPATH .)
set(CMAKE_LIBRARY_PATH .)