1、概要
本征描述EPICS构建设施,包括目录结构体,环境和系统要求,配置文件,Makefiles以及相关的构建工具
1.1 <top>目录结构
EPICS软件能够被划分为多个<top>区域。<top>区域的示例有EPICS base自身,EPICS extensios和简单或复杂的IOC应用程序。每个<top>可以被单独维护。不同的<top>区域可以在外部软件的不同发行版上,诸如EPICS base发行版。
一个<top>目录有以下目录结构:
<top>/
Makefile
configure/
dir1/
dir2/
...
此处configure是一个目录,包含用于构建的配置文件和一个Makefile,此处dir1, dir2, ...是用户创建的带有Makefiles的子目录树以及待被构建的源文件。因为构建规则允许像"make install.vxWorks-68040"的make命令,在<top>目录结构内子目录名称可以不包含一个点号"."字符。
1.2 安装目录
在构建过程中产生的文件被安装到了一个默认为$(TOP)的安装目录(<top>目录)的子目录中。对于base,extensions以及IOC应用程序,可以在configure/CONFIG_SITE文件中更改这个默认值。EPICS组件的安装目录是受控于INSTALL_LOCATION变量的定义。
由于构建规则的一个副作用,安装目录($(INSTALL_LOCATION)/..)的上一级目录不应该包含与如下列出的子目录相同名称的目录。
以下子目录可以存在于安装目录中。通过构建创建它们并且它们包含安装的构建组件。
- dbd:安装数据库定义文件到其的目录。
- include:安装C和C++头文件到其的目录。可以从菜单和记录类型定义产生这些头文件。
- bin:这个目录对应每种主机和目标机架构包含一个子目录。这些是安装可执行程序,二进制文件等到其的目录。
- lib:这个目录对应每种主机和目标机架构包含一个子目录。这些是安装库文件到其的目录。
- db:一个安装数据库记录实例,模板以及替换文件到其的目录。
- html:安装html文档到其的目录子树。
- templates:安装模板文件到其的目录子树。
- configure:如果INSTALL_LOCATION变量已经被显式地设置了,它不为TOP,从$(TOP)/configure复制配置文件。
- cfg:安装用户创建地配置文件到其的目录。
1.3 构建系统的元素
这个构建系统的主要成分是:
- 在EPICS base/configure目录中提供的一个配置文件和工具的集合。
- 待被构建的非base <top>目录结构的<top>/configure目录中一个配置文件的相应集合。MakeBaseApp.pl和makeBaseExt.pl脚本创建这些配置文件。这些文件中很多只是从base/configure目录包含一个相同名称的文件。
- 待被构建的<top>目录结构中每个目录的Makefiles。
- 用户创建的配置文件在构建创建的$(INSTALL_LOCATION)/cfg目录中
1.4 特性
此构建系统的主要特征:
- 在<top>目录结构的每个目录中需要一个Makefile
- 支持主机os厂家的本地编译器和GNU编译器
- 支持在单个目录树中构建多种软件类型(库文件,可执行文件,数据库,java class文件等)
- 支持构建EPICS base,extensions,和IOC应用程序
- 支持多种主机和目标操作系统+架构组合。
- 允许组件共享,诸如在<top>区域之间特殊的记录/设备/驱动
- gnumake是用于构建一个<top>区域的唯一命令。
1.5 多种主机和目标机系统
你可以在多种主机系统上并且使用单个EPICS目录结构为多个交叉目标机系统构建。由构建产生的中间和二进制文件将在单独的O.*子目录中被创建并且被安装到合适的单独主机或目标机安装目录中。EPICS可执行文件和脚本被安装到$(INSTALL_LOCATION)/bin/<arch>目录。库文件被安装到$(INSTALL_LOCATIN)/lib/<arch>。$(INSTALL_LOCATION)的默认定义是$(TOP),其是这个目录结构中根目录。创建的架构相关文件(例如:对象文件)被安装在O.<arch>源子目录中,而创建的架构无关文件被存储在O.Common源子目录。这使得能够同时维护对应多个交叉目标机架构的对象。
要为一个特定host/target组合构建EPICS base,你必须有合适的host/target C/C++交叉编译器和目标机头文件,CROSS_COMPLIER_HOST_ARCH必须为空或者在其列表值中包含这个主机架构,CROSS_COMPLIER_TARGET_ARCHS变量必须包含要被交叉编译的目标机,并且base/configure/os目录必须有合适的配置文件。
2 构建要求
2.1 主机环境变量
构建EPICS <top>区域只需要一个环境变量EPICS_HOST_ARCH。应该设置这个变量为你工作站操作系统-架构组合来使用用于本地构建的os厂家的C/C++编译器或者如果在你的系统上支持一个备用编译器,设置为操作系统-架构-备用编译器组合来为本地构建使用一个备用编译器。在base/configure/os中CONFIG.*.Common的文件名显式了当前受到支持的EPICS_HOST_ARCH值。示例有solaris-sparc, solaris-sparc-gnu, linux-x86, win32-x86和cygwin-x86。
[root@telecom os]# pwd
/usr/local/EPICS/base/configure/os
[root@telecom os]# ls CONFIG.*.Common
CONFIG.cygwin-x86_64.Common CONFIG.linux-686.Common CONFIG.solaris-sparc64-gnu.Common CONFIG.win32-x86-debug.Common
CONFIG.cygwin-x86.Common CONFIG.linux-arm.Common CONFIG.solaris-sparc.Common CONFIG.win32-x86-mingw.Common
CONFIG.darwin-ppc.Common CONFIG.linux-arm-debug.Common CONFIG.solaris-sparc-debug.Common CONFIG.win32-x86-static.Common
CONFIG.darwin-ppcx86.Common CONFIG.linux-ppc64.Common CONFIG.solaris-sparc-gnu.Common CONFIG.windows-x64.Common
CONFIG.darwin-x86.Common CONFIG.linux-ppc.Common CONFIG.solaris-x86_64.Common CONFIG.windows-x64-debug.Common
CONFIG.freebsd-x86_64.Common CONFIG.linux-x86_64.Common CONFIG.solaris-x86_64-gnu.Common CONFIG.windows-x64-mingw.Common
CONFIG.freebsd-x86.Common CONFIG.linux-x86_64-debug.Common CONFIG.solaris-x86.Common CONFIG.windows-x64-static.Common
CONFIG.linux-386.Common CONFIG.linux-x86.Common CONFIG.solaris-x86-gnu.Common
CONFIG.linux-486.Common CONFIG.linux-x86-debug.Common CONFIG.UnixCommon.Common
CONFIG.linux-586.Common CONFIG.solaris-sparc64.Common CONFIG.win32-x86.Common
2.2 必备软件
在你能够构建EPICS环境变化前,你的主机系统必须安装了以下软件:
- Perl版本5.8或者更高
- GNU make,版本3.81或更高
- C++编译器(主机操作系统厂家的编译器或者GNU编译器)
如果你为vxWorks目标机构建EPICS组件,你也将需要:Tornado II或者vxWorks 6.x以及一个或多个板卡支持包。详细咨询vxWorks文档。
如果你将为RTEMS目标机构建EPICS组件,你将也需要:运行EPICS IOC应用程序所需的RTEMS开发工具和库。
2.3 路径要求
你必须在你的搜索路径中有perl可执行文件以及需要C和C++编译器。检查在base/configuration/os/CONFIG.<host>.<host>中CC和CCC的定义或者如果在CONFIG_SITE中指定了ANSI=GCC和CPLUSPLUS=GCC检查GCC和G++的路径。对于构建base,你也必须在你的搜索路径中有echo。你可以在合适文件(通常configure/os/CONFIG_SITE.$EPICS_HOST_ARCH.Common)中通过定义PERL,CC和CCC,GCC和G++重写默认设置。
2.3.1 Unix路径
对于Unix主机构建,你也需要在你的搜索路径中有touch,cpp,cp,rm,mv和mkdir以及/bin/chmod必须存在。在某些Unix系统上,你也可能需要ar和ranlib在你路径中,以及c编译器可能需要ld在你的路径中。
2.3.2 Win32路径
在Wind32系统上,构建共享库是默认设置并且你需要添加完整路径名到$(INSTALL_LOCATION)/bin/$(EPICS_HOST_ARCH)到你的路径,因而在构建过程中能够找到共享库,dlls。构建共享库是由在CONFIG_SITE或os/CONFIG.Common.<host>中宏SHARED_LIBRARIES(YES或NO)决定的。
2.4 目录名称
因为构建规则允许像"make <dir>.<action>,<arch>"的make命令,在<top>目录结构中子目录不能包含一个点号"."字符。
2.5 EPICS_HOST_ARCH环境变量
在EPICS base中的startup目录包含一个perl脚本EpicsHostArch.pl,它可以用于定义EPICS_HOST_ARCH。可以用定义备选编译器的命令行参数调用这个脚本(例如:如果调用EpicsHostArch.pl产生solaris-sparc,则调用EpicsHostArch.pl gun将产生solaris-sparc-gnu)。
startup目录页包含有帮助用户设置路径和其它环境变量的脚本。
3 配置定义
3.1 站点特定的EPICS Base配置
3.1.1 站点配置
要为你的站点配置EPICS base,你可能想要更高在以下文件中的默认定义:
- configure/CONFIG_SITE:构建选项。指定目标机架构。
- configure/CONFIF_SITE_ENV:环境变量默认值。
3.1.2 主机配置
要为你的站点配置每种主机系统,你可以通过添加带有重写定义的新文件重写configure/os目录中的默认定义。除了在名称中CONFIG被更改为CONFIG_SITE,新文件应该与要被重写的发行版文件有相同名称。
- configure/os/CONFIG_SITE.<host>.<host>:主机构建设置
- configure/os/CONFIG_SITE.<host>.Common:对应所有目标机系统的主机构建设置
3.1.3 目标机配置
要配置每种目标系统,你可以通过添加一个带有重写定义的新文件重写configure/os目录中的默认定义。除了在名称中CONFIG被替换成CONFIG_SITE,新文件应该有与要被重写的发行版文件有相同的名称。
- configure/os/CONFIG_SITE.Common.<target>:目标机交叉设置
- configure/os/CONFIG_SITE.<host>.<target>:主机-目标机交叉设置
- configure/os/CONFIG_SITE.Common.vxWorksCommon:vxWorks完整路径
3.1.4 R3.13兼容性配置
要为用R3.13 extensionsw和ioc应用程序构建配置EPICS base,你必须修改base/config/CONFIG_SITE*文件中定义来符合你在base/configure和base/configure/os文件中做的站点定义。你页必须修改在base/configure/CONFIG_SITE文件中以下两个定义:
- COMPAT_TOOLS_313:设置为YES来用这个base构建R3.13 extensions。
- COMPAT_313:设置为YES来用这个base构建R3.13 ioc应用程序和extensions。
3.2 目录定义
配置文件包含了在其内安装各种组件的位置的定义。这些都是相对于INSTALL_LOCATION。INSTALL_LOCATION的默认值是$(TOP),而$(T_A)是当前构建的目标机架构。能够在configure/CONFIG_SITE文件中重写INSTALL_LOCATION的默认值。
INSTALL_LOCATION_LIB = $(INSTALL_LOCATION)/lib
INSTALL_LOCATION_BIN = $(INSTALL_LOCATION)/bin
INSTALL_HOST_BIN = $(INSTALL_LOCATION_BIN)/$(EPICS_HOST_ARCH)
INSTALL_HOST_LIB = $(INSTALL_LOCATION_LIB)/$(EPICS_HOST_ARCH)
INSTALL_INCLUDE = $(INSTALL_LOCATION)/include
INSTALL_DOC = $(INSTALL_LOCATION)/doc
INSTALL_HTML = $(INSTALL_LOCATION)/html
INSTALL_TEMPLATES = $(INSTALL_LOCATION)/templates
INSTALL_DBD = $(INSTALL_LOCATION)/dbd
INSTALL_DB = $(INSTALL_LOCATION)/db
INSTALL_CONFIG = $(INSTALL_LOCATION)/configure
INSTALL_JAVA = $(INSTALL_LOCATION)/javalib
INSTALL_LIB = $(INSTALL_LOCATION_LIB)/$(T_A)
INSTALL_SHRLIB = $(INSTALL_LOCATION_LIB)/$(T_A)
INSTALL_TCLLIB = $(INSTALL_LOCATION_LIB)/$(T_A)
INSTALL_BIN = $(INSTALL_LOCATION_BIN)/$(T_A)
3.3 extension和应用程序特定的配置
base/configure目录包含带有默认的构建定义和站点特定的构建定义的文件。extensions/configure目录包含extension特定的构建定义(例如:X11和Motif库文件的位置)和对应base/configure文件的"include <filename>"行。同样,<application>/configure目录包含应用程序特定的构建定义并且对应应用程序源文件的includes。能够在一个extension或应用程序中通过在<top>/configure/CONFIG_SITE文件中放置一个重写定义重写诸如CROSS_COMPLIER_TARGET_ARCHS的构建定义。
3.4 RELEASE文件
每个<top>/configure目录包含一个RELEASE文件。RELEASE文件包含一个用户指定的其它<top>目录结构的列表,这些其它<top>目录结构包含了当前<top>所需的文件,并且也可以包含其它文件来从别处获取那些定义。在RELEASE文件中定义的宏(或者其includes)可以引用其它已定义的宏,单不能依赖环境变量来提供定义。
当执行make时,为在RELEASE文件中指定的每个外部<top>定义自动产生对应include,bin和library目录的宏定义。也从在RELEASE文件中列出的每个外部<top>产生对应任意已有RULES_BUILD文件,cfg/RULES*文件和cfg/CONFIG*文件的include语句。
例如,如果configure/RELEASE包含这个定义:
CAMAC = /home/epics/modules/bus/camac
则产生的宏是:
CAMAC_HOST_BIN = /home/epics/modules/bus/camac/bin/$(EPICS_HOST_ARCH)
CAMAC_HOST_LIB = /home/epics/modules/bus/camac/lib/$(EPICS_HOST_ARCH
CAMAC_BIN = /home/epics/modules/bus/camac/bin/$(T_A)
CAMAC_LIB = /home/epics/modules/bus/camac/lib/$(T_A)
RELEASE_INCLUDES += -I/home/epics/modules/bus/camac/include/os
RELEASE_INCLUDES += -I/home/epics/modules/bus/camac/include
RELEASE_DBDFLAGS += -I /home/epics/modules/bus/camac/dbd
RELEASE_DBFLAGS += -I/home/epics/modules/bus/camac/db
RELEASE_PERL_MODULE_DIRS += /home/epics/modules/bus/camac/lib/perl
RELEASE_DBDFLAGS将出现在对应dbToRecordTypeH, mkmf.pl以及dbExpand工具的命令行上,而RELEASE_INCLUDES将显示在编译器命令行上。CAMAC_LIB和CAMAC_BIN可以用在Makefile中来定义所需脚本,可执行文件,对象文件,库文件或其它文件的位置。
可以通过提供包含了重写定义的合适文件,为一个特定主机和目标机架构重写在configure/RELEASE中的定义。
configure/RELEASE.<epics_host_arch>.Common
configure/RELEASE.Common.<targetarch>
configure/RELEASE.<epics_host_arch>.<targetarch>
对于由makeBaseApp.pl创建的<top>目录结构,一个EPICS base perl脚本convertRelease.pl可以为在RELEASE文件中外部<top>定义和其作为<top>层级构建组成的includes执行一致性检查。一致性检查是受控于在<top>/configure/CONFIG_SITE中定义的CHECK_RELEASE的值控制的。CHECK_RELEASE可以被设置成YES,NO或WARN,并且如果YES(默认值),将执行一致性检查。如果CHECK_RELEASE被设置成WARN,即使发现冲突,构建将继续。
3.5 修改configure/RELEASE*文件
在添加,更改或者移除configure/RELEASE*中任何定义前,你应该总是在<top>目录中进行一次gnumake clean uninstall,并且接着在进行更改后在顶层执行一次gnumake。
文件<top>/configure/RELEASE包含从<top>外部获取的组件的定义。如果你想要链接到一个在文件中定义的东西的一个新发行版,做以下事情:
cd <top>
gnumake clean uninstall
edit configure/RELEASE
更改相关的行指向新的发行:
gnumake
在<top>/configure/RELEASE中所有定义必须产生完整的路径定义,即:不允许相对路径名称。如果你的站点一次安装了有多个base和其它支持的<top>组件的发行版,这些路径定义应该包含一个发行号作为这些组件的一个部分。但由于RELEASE文件是被gnumake读取,使用宏替换来定义这些路径名是允许的,例如:
SUPPORT = /usr/local/iocapps/R3.14.9
EPICS_BASE = $(SUPPORT)/base/3-14-9-asd1
3.6 OS Class特定的定义
在Makefile中的定义将应用于这个主机系统(执行make所在的平台)以及由CROSS_COMPILER_TARGET_ARCHS定义的每个系统。
限制一个特定定义被用于哪种架构是可能的。可以用后跟一个下划线"_"再后跟一个osclass名称指定大部分Makefile定义名称。如果没有指定一个_<osclass>,则定义应用于主机以及所有CROSS_COMPLIER_TARGET_ARCHS系统。如果指定一个_<osclass>,则定义只用于有指定os class的系统。一个Makefile定义也可以有一个末尾的_DEFAULT格式。如果在末尾添加了_DEFAULT,则Makefile定义将应用于定义中末尾没有添加_<osclass>格式的所有系统。
每种系统在其configure/os/CONFIG.Common.<arch>文件中有一个OS_CLASS定义。一些示例是:
- 对于vxWorks-*目标机,<osclass>是vxWroks。
- 对于RTEMS-*目标机,<osclass>是RTEMS。
- 对于solaris-*目标机,<osclass>是solaris。
- 对于win32-*目标机,<osclass>是win32。
- 对于linux-*目标机,<osclass>是Linux。
- 对于darwin-*目标机,<osclass>是Darwin。
- 对于aix-*目标机,<osclass>是AIX。
例如,以下Makefile行指定应该为所有系统创建产品aaa。应该为没有定义OS_CLASS为solaris的系统创建产品bbb。
PROD = aaa
PROD_solaris = -nil-
PROD_DEFAULT = bbb
3.7 指定T_A特定的定义
对于用户要限制一个特定定义应用哪些系统到特定的目标系统的系统是可能的。
PROC_IOC = aaa
VX_PROC_vxWorks-68040 = bbb
VX_PROC_vxWorks-ppc603 = bbb
PROC_IOC += $(VX_PROD_$(T_A))
例如,以下Makefile行指定应该为允许IOC类型产品的所有目标机架构创建产品aaa,而只为vxWorks-68040和vxWorks-ppc603目标机架构创建产品bbb。记住T_A是构建的当前目标机架构。因而PROC_IOC只在当前构建的目标机架构是vxWorks-68040或vxWorks-ppc603时才有bbb值。
3.8 主机和Ioc目标机
构建创建了两种类型的makefile目标:Host和Ioc。Host目标是可执行文件,对象文件,库文件和脚本,它们不是iocCore的组成部分。Ioc目标是ioc库文件,可执行文件,对象文件或iocsh脚本的组件,将在一个ioc上运行它们。
每个可支持的目标系统有一个VALID_BUILDS定义,它指定了它能够支持的makefile目标的类型。此定义出现在configure/os/CONFIG.Common.<arch>或configure/os/CONFIG.<arch>.<arch>文件中。
- 对于vxWorks系统,VALID_BUILDS被设置为"Ioc"。
- 对于Unix类型系统,VALID_BUILDS被设置为"Host Ioc"。
- 对于RTEMS系统,VALID_BUILDS被设置为"Ioc"。
- 对于WIN32系统,VALID_BUILDS被设置为"Host Ioc"。
在一个Makefile中,限制为哪些系统构建一个特定的PROD, TESTPROD, LIBRARY, SCRIPTS和OBJS是可能的。例如,以下Makefile行指定了为支持Host类型构建的系统创建产品aaa。应该为支持ioc类型的构建的系统构建产品bbb。应该为所有目标系统创建产品ccc。
PROD_HOST = aaa
PROD_IOC = bbb
PROD = ccc
通过末尾指定下划线"_"后跟一个osclass或DEFAULT格式能够进一步限制这些定义。
3.9 用户特定的重写定义
在用户的<home>/configure/子目录中用户创建的文件中允许用户特定的重写定义。在所有<top>目录结构中这些重写的定义将用于构建。
<home>/configure/CONFIG_USER
<home>/configure/CONFIG_USER.<epics_host_arch>
<home>/configure/CONFIG_USER.Common.<targetarch>
<home>/configure/CONFIG_USER.<epics_host_arch>.<targetarch>
4 Makefile
4.1 名称
在每个目录中makefile的名称必须是Makefile。
4.2 Included Files
Makefiles通常从<top>/configure包含文件。因而makefile从confiure“继承”规则和定义。在<top>/configure中文件接着从另一个<top>/configure包含文件。这种技术使得在<top>目录之间共享变量甚至规则成为可能。
4.3 Makefiles的内容
4.3.1 在包含子目录的目录中的Makefiles
在这种类型目录中的Mafie必须定义<top>相对于这个目录在哪里,包含<top>/configure文件,并且按make执行所需顺序指定子目录。在带有以下Makefile行的目录中运行gnumake将使得gnumake现在<dir1>并且接着在<dir2>中被执行。构建规则不允许一个Makefile同时指定要被构建的子目录和组件。
TOP=../..
include $(TOP)/configure/CONFIG
DIRS += <dir1> <dir2>
include $(TOP)/configure/RULES_DIRS
4.3.2 在位于待构建组件的目录中的Makefiles
在这种类型目录中的Makefile必须定义<top>相对于这个目录在哪里,包含<top> configure文件,并且指定目标组件定义。它可以可选地包含用户定义的规则。在带有此类Makefile的目录中运行gnumake将使得gnumake产生一个O.<arch>子目录并且接着在这个子目录中执行gnumake去构建定义好的组件。它包含以下行:
TOP=../../..
include $(TOP)/configure/CONFIG
<component definition lines>
include $(TOP)/configure/RULES
<optional rules definitions>
4.4 简单的Makefile示例
从源文件asDbLib.c创建一个名为asIoc的IOC类型库并且安装其到$(INSTALL_LOCATION)/lib/<arch>目录。
TOP=../../..
include $(TOP)/configure/CONFIG
LIBRARY_IOC += asIoc
asIoc_SRCS += asDbLib.c
include $(TOP)/configure/RULES
对于每种主机类型目标架构,从catest1.c和catest2.c源文件链接已有EPICS base和Com库创建一个名为catest的可执行程序,并且接着调用这个catest可执行文件到$(INSTALL_LOCATION)/bin/<arch>目录。
TOP=../../..
include $(TOP)/configure/CONFIG
PROD_HOST = catest
catest_SRCS += catest1.c catest2.c
catest_LIBS = ca Com
include $(TOP)/configure/RULES
5 Make
5.1 Make vs gnumake
EPICS提供了一个make规则的扩展集合。这些规则只对GNU版本的make,gnumake有效,gnumake是由自由软件基金会提供的。因而,在大多数Unix系统上,本地make将没有作用。在一些系统上,例如Linux,GNU make可能是默认的。本手册总是在示例中使用gnumake。
5.2 频繁使用的Make命令
注意:通过在命令向目标添加<arch>,为单个目标架构调用以下命令是可能的。
最常用的make命令是:
- gnumake:这重新构建并且安装不是最新的所有东西。注意:不带参数执行gnumake与"gnumake install"相同。
- gnumake help:只能从<top>目录执行这条命令。这条命令打印一个最常使用的make命令的页面。
- gnumake install:这重建和安装不是最新的所有东西。
- gnumake all:这是与"gnumake install"相同的。
- gnumake buildinstall:这与"gnumake install"相同的。
- gnumake <arch>:这首先为host架构重建和安装不是最新的所有东西,并且接着(如果不同,为指定的target架构)。注意:这与"gnumake install.<arch>"相同。
- gnumake clean:这可以用于通过删除gnumake将创建的O.<arch>目录节省磁盘空间,但不从bin, db, dbd等目录移除任何已安装的文件。"gnumake clean.<arch>"可以被调用去清理单个架构。
- gnumake archclean:这条命令将移除当前构建的O.<arch>目录,但不是O.Common目录。
- gnummake realclean:此条命令将移除所有O.<arch>子目录(甚至由gnumake从另一个EPICS_HOST_ARCH被创建的那些子目录)
- gnumake rebuild:z这与"gnumake clean install"相同。如果你不确定在一个应用程序中产生的文件的状态,只要执行"gnumake rebuild"。
- gnumake uninstall:只能从<top>目录执行这条命令。它将移除由gnumake在include, lib, bin, db, dbd等目录中安装的所有东西。
- gnumake realuninstall:只能从<top>目录执行这条命令。它将移除所有安装目录,include, lib, bin, db, dbd等。
- gnumake distclean:只能从<top>目录执行这条命令。它与同时发出realclean和realuninstall命令相同。
- gnumake cvsclean:只能从<top>目录执行这条命令。它移除在make目录树中的cvs.#*文件。
5.3 Make targets
以下是一个targets的概要,能够为gnumake指定它们:
- <action>
- <arch>
- <action>.<arch>
- <dir>
- <dir>.<action>
- <dir>.<ach>
- <dir>.<action>.<arch>
此处:
- <arch>是一个架构,诸如solaris-sparc, vxWorks-68040,win32-x86等。
- <action>是help,clean,realclean, distclean, inc, install, build, rebuild, buildinstall, realuninstall或uninstall
- 注意:只能在<top>才能指定help, uninstall, distclean, cvsclean和realuninstall
- 注意:不能在一个O.<arch>子目录中指定realclean。
- <dir>是子目录名。
注意:你可以在相同目录结构中使用你的OS厂家本地编译器构建并且也使用一个受支持的备用编译器构建,因为可执行文件和库文件将被创建和被安装到分开的目录(例如:bin/solaris-sparc和bin/solaris-sparc-gnu)。你可以通过在构建之间更改你的EPICS_HOST_ARCH环境变量或者在gnumake命令行上设置EPICS_HSOT_ARCH更改做这件事。
在构建交叉编译的目标前,构建系统确认主机架构是最新的,因而Makefine在定义应该为哪个架构构建一个组件中必须是显式的。
5.4 头文件依赖
在源文件定义之一(例如:SRCS,PROD,PROD_SRCS,LIB_SRCS,<prodname>_SRCS)中所有产品,测试产品和库源文件将自动产生它们的头文件依赖并且作为Makefile组成被包含。
6 Makefile定义
以下组件可以在Makefile中被定义
6.1 源文件目录
通常所有产品、测试产品和库源文件位于与Makefile相同目录中。OS特定源文件被允许并且应该位于子目录os/<os_class>或os/posix或os/default。
构建规则也允许源文件位于当前Makefile目录的子目录中(src目录)。对于每个子目录,包含源文件的<dir>添加SRC_DIRS定义。
SRC_DIRS += <dir>
此处<dir>是一个相对路径定义。一个SRC_DIRS的示例是:
SRC_DIRS += ../dir1 ../dir2
对于以上定义的目录搜索顺序是:
.
../os/$(OS_CLASS) ../os/posix ../os/default
../dir1/os/$(OS_CLASS) ../dir1/os/posix ../dir1/os/default
../dir2/os/$(OS_CLASS) ../dir2/os/posix ../dir2/os/default
..
../dir1 ../dir2
此处构建目录O.<arch>是.并且src目录是..。
6.2 Posix C源代码
EPICS base config文件认为posix源代码并且定义POSIX为YES作为默认。各自的Makefiles可以通过设置POSIX为NO重写这个。
6.3 断点表
对于每个断点表dbd文件,bpt<table_name>.dbd,要被从一个已有bpt<table_name>.data文件创建,添加以下定义到Makefile。
DBD += bpt<table_name>.dbd
以下Makefile将使用EPICS base工具程序makeBpt从一个已有的bptTypeJdegC.data文件创建一个bptTypeJdegC.dbd文件并且按照这个新的dbd文件到$(INSTALL_LOCATION)/dbd目录。
TOP=../../..
include $(TOP)/configure/CONFIG
DBD += bptTypeJdegC.dbd
include $(TOP)/configure/RULES
6.4 记录类型定义
对于每种新记录类型,应该添加以下定义到这个makefile:
DBDINC += <rectype>Record
将使用EPICS base工具程序dbToRecordTypeH从一个已有<rectype>Record.dbd创建一个<rectype>Record.h头文件。这个头文件将被安装到$(INSTALL_LOCATION)/include目录并且dbd文件将被安装到$(INSTALL_LOCATION)/dbd目录。
以下Makefile将从一个已有xxxRecord.dbd文件创建xxxRecord.h,安装xxxRecord.h到$(INSTALL_LOCATION)/include,并且安装xxxRecord.dbd到$(INSTALL_LOCATION)/dbd。
TOP=../../..
include $(TOP)/configure/CONFIG
DBDINC += xxxRecord
include $(TOP)/configure/RULES
6.5 菜单
如果一个菜单menu<name>.dbd文件出现,则添加以下定义:
DBD += menu<name>.h
将使用EPICS base工具程序dbToMenuH从已有menu<name>.dbd文件创建头文件menu<name>.h并且被安装到$(INSTALL_LOCATION)/include目录并且菜单dbd文件将被安装到$(INSTALL_LOCATION)/dbd。
以下Makefile将从一个已有menuConvert.dbd文件创建一个menuConvert.h文件并且安装menuConvert.h到$(INSTALL_LOCATION)/include以及menuConvert.dbd到$(INSTALL_LOCATION)/dbd。
TOP=../../..
include $(TOP)/configure/CONFIG
DBDINC = menuConvert.h
include $(TOP)/configure/RULES
6.6 扩展的数据库定义文件
包含其它数据库定义文件的名为<name>Include.dbd数据库定义include文件可以被EPICS base工具程序dbExpand展开成创建的<name>.dbd文件并且这个<name>.dbd文件被安装到$(INSTALL_LOCATION)/dbd。以下变量控制这个过程:
DBD += <name>.dbd
USR_DBDFLAGS += -I <include path>
USR_DBDFLAGS += -S <macro substitutions>
<name>_DBD += <file1>.dbd <file2>.dbd ...
此处:DBD += <name>.dbd
是包含了展开定义的输出dbd文件的名称。通过展开一个已有的创建它,或者构建创建的<name>Include.dbd文件并且接着被复制到$(INSTALL_LOCATION)/dbd。