平台特定的配置标头
我有一个系统可以将特定于平台的配置生成到所有构建中使用的标头中。AutoConf 名称是'config.h';您可以看到“platform.h”或“porting.h”或“port.h”或主题的其他变体。此文件包含正在构建的平台所需的信息。您可以通过将版本控制的特定于平台的变体复制到标准名称来生成文件。您可以使用链接而不是复制。或者,您可以运行配置脚本以根据脚本在机器上找到的内容来确定其内容。
配置参数的默认值
编码:
#if (DAN==YES)
char MasterSkipFile[MAXSTR] = "/home/dp120728/tools/testarea/MasterSkipFile";
#endif
#if (UNIX==YES)
char MasterSkipFile[MAXSTR] = "/home/tregrp/tre1/tretools/MasterSkipFile";
#endif
#if (LINUX==YES)
char MasterSkipFile[MAXSTR] = "/ptehome/tregrp/tre1/tretools/MasterSkipFile";
#endif
最好替换为:
#ifndef MASTER_SKIP_FILE_PATH
#define MASTER_SKIP_FILE_PATH "/opt/tretools/MasterSkipFile"
#endif
const char MasterSkipFile[] = MASTER_SKIP_FILE_PATH;
那些想要在不同位置构建的人可以通过以下方式设置位置:
-DMASTER_SKIP_FILE_PATH='"/ptehome/tregtp/tre1/tretools/PinkElephant"'
注意单引号和双引号的使用;尽量避免在命令行中使用路径中的反斜杠执行此操作。您可以对各种事情使用类似的默认机制:
#ifndef DEFAULTABLE_PARAMETER
#define DEFAULTABLE_PARAMETER default_value
#endif
如果您选择好默认值,则可以节省大量能源。
可重定位软件
我不确定只能安装在一个位置的软件的设计。在我的书中,你需要能够在机器上同时安装产品的旧版本 1.12 和新的 2.1 版本,并且它们应该能够独立运行。硬编码的路径名可以解决这个问题。
按功能而不是平台参数化
AutoConf 工具与一般替代系统之间的主要区别在于,配置是基于功能完成的,而不是基于平台。您将代码参数化以识别您要使用的功能。这一点至关重要,因为功能往往出现在原始平台以外的平台上。我照顾有如下行的代码:
#if defined(SUN4) || defined(SOLARIS_2) || defined(HP_UX) || \
defined(LINUX) || defined(PYRAMID) || defined(SEQUENT) || \
defined(SEQUENT40) || defined(NCR) ...
#include <sys/types.h>
#endif
拥有会好得多:
#ifdef INCLUDE_SYS_TYPES_H
#include <sys/types.h>
#endif
然后在需要的平台上,生成:
#define INCLUDE_SYS_TYPES_H
(不要太从字面上理解这个示例标题;这是我试图克服的概念。)
将平台视为一组功能
作为前一点的推论,您确实需要检测平台并定义适用于该平台的功能。这是您拥有定义配置功能的特定于平台的配置标头的地方。
应在标题中启用产品功能
(详细说明我对另一个答案的评论。)
假设您在产品中有一堆功能需要有条件地包含或排除。例如:
KVLOCKING
B1SECURITY
C2SECURITY
DYNAMICLOCKS
设置适当的定义时包含相关代码:
#ifdef KVLOCKING
...KVLOCKING stuff...
#else
...non-KVLOCKING stuff...
#endif
如果您使用诸如cscope之类的源代码分析工具,那么如果它可以在定义 KVLOCKING 时向您显示会很有帮助。如果定义它的唯一位置是散布在构建系统周围的一些随机 Makefile(假设有一百个子目录用于此),则很难判断该代码是否仍在使用你的平台。如果定义在某处的标题中 - 特定于平台的标题,或者可能是产品发布标题(因此版本 1.x 可以具有 KVLOCKING 并且版本 2.x 可以包含 C2SECURITY 但 2.5 包含 B1SECURITY 等),那么您可以看到KVLOCKING 代码仍在使用中。
相信我,经过二十年的发展和人员流动,人们不知道功能是否仍在使用(因为它是稳定的,从不引起问题 - 可能是因为它从未使用过)。而且,如果在 Makefiles 中查找是否仍然定义了 KVLOCKING 的唯一位置,那么 cscope 之类的工具就没有多大用处了——这使得在稍后尝试清理时修改代码更容易出错。