用不同的宏定义生成不同的目标程序

本文介绍如何使用automake实现根据不同宏定义编译同一源代码,以满足单元测试中对不同环境的需求。通过设置特定的编译标志,可以生成带有不同预处理指令的可执行文件。

 


在单元测试的时候,因为环境不同,代码中需要使用不同的宏来隔断对环境或条件的需求,
之前一直使用手工编写的Makefile,里面不知道如果编译出使用不同宏定义的程序

后来在看automake的文档时发现,automake可以针对每个目标的编译选项(per-target compilation flags)生成不同的临时文件
详见GNU Automake (Forversion1.9.6,9July2005) 第26.6节的内容

 

Makefile.am

  1. AUTOMAKE_OPTIONS = foreign 
  2. bin_PROGRAMS = true false
  3. true_SOURCES = generic.cpp
  4. true_CPPFLAGS = -DTRUE_MACRO=1
  5. false_SOURCES = generic.cpp
  6. false_CPPFLAGS = -DTRUE_MACRO=0

generic.cpp


  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5.         cout <<
  6. //#ifdef TRUE_MACRO
  7. #if TRUE_MACRO==1
  8.                 "true"
  9. #else
  10.                 "false"
  11. #endif
  12.                         << endl;
  13.         return 0;
  14. }

configure.in

  1. #                                               -*- Autoconf -*-
  2. # Process this file with autoconf to produce a configure script.
  3. AC_PREREQ(2.59)
  4. AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
  5. #AC_CONFIG_SRCDIR([hello.cpp])
  6. #AC_CONFIG_HEADER([config.h])
  7. AM_CONFIG_HEADER([config.h]) 
  8. AM_INIT_AUTOMAKE
  9. # Checks for programs.
  10. AC_PROG_CXX
  11. # Checks for libraries.
  12. # Checks for header files.
  13. # Checks for typedefs, structures, and compiler characteristics.
  14. # Checks for library functions.
  15. AC_CONFIG_FILES([Makefile])
  16. AC_OUTPUT

autogen.sh

  1. aclocal
  2. autoheader
  3. autoconf
  4. automake --add
  5. ./configure
  6. make

其实挺简单的,后来想明白起来,就是分别为不同的对象用各种的flag生成不同的临时文件
Makefile.manul

 

  1. TRUE_FLAG=-DTRUE_MACRO=1
  2. all: true false
  3. true:true.o
  4.         g++ true.o -o true
  5. false:false.o
  6.         g++ false.o -o false
  7. true.o:generic.cpp
  8.         g++ generic.cpp -c -o true.o $(TRUE_FLAG)
  9. false.o:generic.cpp
  10.         g++ generic.cpp -c -o false.o $(FALSE_FALG)
  11. .cpp.o:
  12.         g++ -c -o $@ $<

不过还是automake方便,定义flag之后就不用管了

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值