在单元测试的时候,因为环境不同,代码中需要使用不同的宏来隔断对环境或条件的需求,
之前一直使用手工编写的Makefile,里面不知道如果编译出使用不同宏定义的程序
后来在看automake的文档时发现,automake可以针对每个目标的编译选项(per-target compilation flags)生成不同的临时文件
详见GNU Automake (Forversion1.9.6,9July2005) 第26.6节的内容
Makefile.am
- AUTOMAKE_OPTIONS = foreign
- bin_PROGRAMS = true false
- true_SOURCES = generic.cpp
- true_CPPFLAGS = -DTRUE_MACRO=1
- false_SOURCES = generic.cpp
- false_CPPFLAGS = -DTRUE_MACRO=0
generic.cpp
- #include <iostream>
- using namespace std;
- int main()
- {
- cout <<
- //#ifdef TRUE_MACRO
- #if TRUE_MACRO==1
- "true"
- #else
- "false"
- #endif
- << endl;
- return 0;
- }
configure.in
- # -*- Autoconf -*-
- # Process this file with autoconf to produce a configure script.
- AC_PREREQ(2.59)
- AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
- #AC_CONFIG_SRCDIR([hello.cpp])
- #AC_CONFIG_HEADER([config.h])
- AM_CONFIG_HEADER([config.h])
- AM_INIT_AUTOMAKE
- # Checks for programs.
- AC_PROG_CXX
- # Checks for libraries.
- # Checks for header files.
- # Checks for typedefs, structures, and compiler characteristics.
- # Checks for library functions.
- AC_CONFIG_FILES([Makefile])
- AC_OUTPUT
autogen.sh
- aclocal
- autoheader
- autoconf
- automake --add
- ./configure
- make
其实挺简单的,后来想明白起来,就是分别为不同的对象用各种的flag生成不同的临时文件
Makefile.manul
- TRUE_FLAG=-DTRUE_MACRO=1
- all: true false
- true:true.o
- g++ true.o -o true
- false:false.o
- g++ false.o -o false
- true.o:generic.cpp
- g++ generic.cpp -c -o true.o $(TRUE_FLAG)
- false.o:generic.cpp
- g++ generic.cpp -c -o false.o $(FALSE_FALG)
- .cpp.o:
- g++ -c -o $@ $<
不过还是automake方便,定义flag之后就不用管了
本文介绍如何使用automake实现根据不同宏定义编译同一源代码,以满足单元测试中对不同环境的需求。通过设置特定的编译标志,可以生成带有不同预处理指令的可执行文件。
1357

被折叠的 条评论
为什么被折叠?



