Makefile包含5部分内容:
包含其它Makefile:
include filenames…
MAKEFILE环境变量: make会先运行环境变量的MAKEFILE文件
注: $需要转义”\(", 如果开了辅助扩展的话需要使用"\)$$”. 使用”"分行
target … : prerequisites … recipe … …
target: 可以是目标文件如a.o, 或者一个动作clean, 可以是多个(用space分隔, 使用 $@引用每个目标) prerequisites: 处理target的前提条件, 可以是target或者文件名, 分为普通条件 和顺序条件(用”|”分开) recipe: 一组shell命令, 需要使用tab
objects = main.o kbd.o command.o display.o
insert.o search.o files.o utils.o
edit : $(objects) cc -o edit $(objects)
$(objects) : defs.h kbd.o command.o files.o : command.h display.o insert.o search.o files.o : buffer.h
pattern target:
%.d: %.c
@set -e; rm -f $@;
$(CC) -M $(CPPFLAGS) $< > $@.\(\);
sed ‘s,($).o[ :],\1.o $@ : ,g’ < $@.\(\) > $@;
rm -f $@.\(\)
static pattern target:
targets …: target-pattern: prereq-patterns … recipe …
objects = foo.o bar.o
all: $(objects)
$(objects): %.o: %.c $(CC) -c $(CFLAGS) $< -o $@
跳过错误:
phony target:
通配符: “*“表示所以 “~”表示主目录
内建隐式规则 编写没有规则的target, 或者不写target, 隐匿规则就会启动
隐式推断:
一些隐式规则也会被视为特殊目标
‘$(foo)’ or ‘${foo}’ 来引用变量
注: 小心变量结尾空格
变量扩展:
目标特定变量值: target … : variable-assignment 模版特定变量值: pattern … : variable-assignment
特殊变量:
引用替换: ‘$(var:a=b)’ (or ‘${var:a=b}’)
自动变量 在recipe中使用自动变量, 可以自动引用target name, prerequisites等
ifeq ifneq ifdef ifndef
conditional-directive-one text-if-one-is-true else conditional-directive-two text-if-two-is-true else text-if-one-and-two-are-false endif
$(function arguments)
$(wildcard pattern…) # 通配符在target里自动展开 , 然而在变量和函数里不能展开, 这时需要使用通配符函数
make项目有很多共通的步骤, 每个项目都要写, 并且配置target很繁琐, 每个人都要学习Makefile 语法, 所以诞生产生Makefile的工具, 主要负责:
autotools | cmake | |
---|---|---|
变量定义 | name=… | set(name, “…”) |
环境检测 | AC_INIT | find_library(lib libname pathllist) |
测试程序 | find_package(packename) | |
AC_PROG_CC | find_path(var name pathlist) | |
测试函数库 | find_program(var name pathlist) | |
AC_CHECK_LIB([pthread], [pthread_rwlock_init]) | ||
AC_PROG_RANLIB | ||
测试头文件 | ||
测试类型定义 | ||
测试结构 | ||
测试编译器特性 | ||
测试库函数 | ||
测试系统调用 | ||
AC_OUTPUT | ||
子目录 | SUBDIRS= | add_subdirectory(list) |
可执行文件 | bin_PROGRAMS=binname | add_executable(binname ${sources}) |
binname_SOURCES= | target_link_libraries(binname librarylist) | |
binname_LDADD= | ||
binname_CFLAGS= | ||
binname_LDFLAGS= | ||
动态库 | lib_LIBRARIES=libname.so | add_library(libname shared ${source} ) |
libname_SOURCES= | ||
静态库 | lib_LIBRARIES=libname.a | add_library(libname static ${source} ) |
libname_a_SOURCES= | ||
头文件 | INCLUDES= | include_directories(list) |
include_HEADES= 或CFLAGS=-I | ||
源码搜索 | aux_source_directories(. list) | |
依赖库 | LIBS= | target_link_libraries(binname librarylist) |
LDADD= | ||
标志 | CFLAGS= | set(CMAKE_C_FLAGS …) |
LDFLAGS= | ||
libtool | AC_PROG_LIBTOOL | |
lib_LTLIBRARIES=name.la | ||
name_la_SOURCES= | ||
安装设置 | install(TARGETS targets… | |
[[ARCHIVE,LIBRARY,RUNTIME][DESTINATION | ||
< dir >][PERMISSIONS permissions…] | ||
[CONFIGURATIONS[Debug,Release,…]] | ||
[COMPONENT < component >][OPTIONAL]] […]) | ||
其他文件 | EXTRA_DIST | install(FILES files.. ) |
install(DIRECTORY dirs..) | ||
条件语句 | 使用Make的条件语句 | if(my) |
else(my) | ||
endif(my) | ||
while(condition) | ||
endwhile(condition) | ||
执行外部命令 | exec_program(commd ) | |
子模块 | include() | |
信息输出 | messge(STATUS “messge”) | |
项目 | project(name) |