用于向下进入子目录(支持额外的构建目标)
用于向下进入子目录。
用于构建软件
用于iocBoot/ioc目录
a) 它们包含的那些configure/RULES*
b) 那些规则检查来控制它们想做什么的那些变量
TOP = .
include $(TOP)/configure/CONFIG
DIRS = list of subdirectories
aslo set *_DEPEND_DIRS here
include $(TOP)/configure/RULES_TOP
TOP = .. 根据适合调整路径
include $(TOP)/configure/CONFIG
DIR = list of subdirectories
aslo set *_DEPEND_DIR here
include $(TOP)/configure/RULES_DIRS
TOP = ../..
include $(TOP)/configure/CONFIG
ARCH = ioc目标架构
TARGETS = 待构建的其它文件
include $(TOP)/configure/RULES.ioc
TOP = ../.. 视情况而定调整路径
include $(TOP)/configure/CONFIG
在这里设置变量
include $(TOP)/configure/RULES
此处添加额外的规则和依赖
完整列表见应用开发者手册的第四章。
PROD_HOST, TESTPROD_HOST, LIBRARY_HOST, LOADABLE_LIBRARY_HOST, OBJS_HOST, SCRIPTS_HOST
PROD_IOC, TESTPROC_IOC, LIBRARY_IOC, OBJS_IOC, SCRIPT_IOC
LIBRARY_vxWorks = myDev
LIBRARY_RETMES = myDev
1) 如果一个Makefile仅创建一个目标(库,可执行文件等),你可以添加所有源文件的名称到SRCS变量:
SRCS = myDev.c myDrv.c
2) 如果一个Makefile仅创建一个库,你可以添加所有库源文件的名称到LIB_SRCS变量:
LIBRARY = myDev
LIB_SRCS += myDev.c myDrv.c
3) 如果一个Makefile仅创建一个可执行文件(PROD),你可以添加所有它的源文件的名称到PROD_SRCS变量:
PROD = myIOC
PROD_SRCS += myMain.c mySeq.st
4) 但使用
LIBRARY = myLib
myLib_SRCS = parser.c scanner.cpp process.cpp
PROD = myTool
myTool_SRCS += tool.c
1) 你可以在源文件变量名称末尾添加_
2)当设置_
3)示例:
LIBRARY = myDev
LIB_SRCS = myDev.c
LIB_SRCS_vxWorks = devVx.c
LIB_SRCS_RTEMS = devRtems.c
LIB_SRCS_DEFAULT = devPosix.c # Linux, Darwin, Solaris
LIB_SRCS_WIN32 = -nil-
1) 通常源文件出现在与Makefile相同目录中
2)可以告诉make从附近目录搜索源文件
SRC_DIRS +=
此处
3)可以使用代码的多个OS-Specific实现。
4)在一个或多个这些子目录中放置源文件。
5)相同源文件文件名应该用于所有版本。
1)为编译器命令行添加标志的很多方法,例如:
2) 包含文件搜索路径有它们子集的变量
1)由在configure/RELEASE文件中被列出的其它EPICS模块提供的库文件通常将被自动找到
构建系统自动搜索那些lib/
2)如果一个库文件被放置在其它地方,Makefile必须指定在何处
设置变量
例如:
LIBS += usb
usb_DIR = /opt/local/lib
3) 如果它来自一个非EPICS包,使用
不要让用户必须编辑Makefiles来能够构建此代码
1) 使用GNU Makefile条件来调整构建
ifdef SNCSEQ
在这里用于与sequencer一起构建的行
else
在这里用于没有与sequencer一起构建的行
endif
ifeq ($(BUILD_IOCS), YES)
在这里用于构建IOCs的行
else
在这里用于不构建IOCs的行
endif
1) 这个库有两个主要功能
2)base/src/libCom包含了159个C/C++头文件(3.14.12.5)
3)没有时间在这里讨论或甚至提到
4)主要功能在IOC应用程序开发者指南章节中讨论了:
1) 多线程和线程间通信
2)进程通信和字符串转换
3) 数据类型和结构体
epicsTypes, ellLib, gpHash
4) 数学
calc引擎, epicsMath, epicsEndian
5) 共享库
shareLib.h和epicsExport.h
1) epicsThread.h提供了一个通用的线程API
线程创建(名称,优先级,栈大小,函数,参数)
支持的线程操作:
C++包装类
2)线程私有变量
变量操作:创建,销毁,get,set
3)线程onceAPI
确保初始化函数的执行仅一次
被其它线程执行初始化函数的并行尝试将在这个函数在第一个线程中返回前推迟它们。
1) epicsMutex.h
2)3.15 epicsSpin.h:spin-lock信号量,基于epicsMutex C API。
3)epicsEvent.h
1) epicsRingBytes.h
epicsRingPointer.h
1) 固定大小的环形缓存
2)仅支持单指针消息
3)调用者必须根据需要实现锁定
4) C++包装类
5)缓存操作:
6) 状态查询:
epicsMessageQueue.h
1) 固定大小的队列
2)支持变长消息
3)为与多个读取和写入线程而设计
4)C++包装类
5)队列操作:创建,销毁,发送,尝试发送,无超时发送,接收,尝试接收,不超时接收
6)状态查询:pending, show
epicsStdio.h(包含了stdio.h)
1) epicsSnprintf() & epicsVsnprintf()
2)用于重定向stdin, stdout, stderr流的基础设施
3)各种文件和文件名函数:推荐不使用这些老的APIs
epicsStdlib.h(包含stdlib.h)
1) epicsStrtod()
2)epicsScanDouble() epicsScanFloat()
确保sscanf("%f")和sscanf("%lf")支持NaN和Inf字符串。
3)3.15:epicsParse函数系列
epicsString.h
1) 编译有用字符串函数:
2)这些替代了不是在所有操作系统上可用的标准例程
macLib.h
1) 通用宏替换库
2)支持多种变量范围,递归宏,...
3)也处理环境变量
4)操作:创建上下文,启用/禁用警告,删除上下文,获取宏值,设置宏值,push scope,pop scope,解析宏定义,安装被解析的定义,展开字符串,用环境变量展开字符串,报告上下文。
5)高效,可高,经过充分测试
6)更详细见base/src/libCom/macLib中macLibREADME文件。
osiSock.h
1) 提供用于创建和使用网络套接字的统一API:对于Windows,Solaris等不需要特殊的应用程序代码。
2)被Base(CA客户端和服务器,日志客户端和服务器等),Asyn,pvAccess使用。
3)使用特别广泛,可靠。
4)为常见任务提供若干例程
1)errMdef.h errlog.h
提供用于与错误处理和日志相关目的的APIs
2)iocLogServer
3) IOC应用程序开发手册中第10章详细描述。
epicsTypes.h
1)各种大小的EPICS标准类型定义
2)以前的C99,以及我们支持的操作系统的一些
3)定义这些标准类型:epicsInt8, epicsUInt8, epicsInt16,epicsUInt16, epicsInt32, epicsUInt32, epicsFloat32, epicsFloat64 epicsEnum16; 3.15:epicsInt64, epicsUInt64
4)epicsInt8总是'char',因而可能在某些架构上是无符号的。
5) 也定义了:
链表
ellLib.h
1) 双链表管理程序
2)插入式 - 链接对象必须包含一个ELLNODE, 不需要额外内存
3)操作:初始化列表, 对象计数, 第一个对象,末尾对象,下一个对象,前一个对象,添加对象,连接链表,删除对象,提取对象,获取第一个对象,插入对象,获取第n个对象,步进n个对象,在链表中查找对象,释放所有对象,验证链表有效性。
4)链表和节点会被静态地初始化
5)高效,可靠,经过充分测试
6)模仿vxWorks lstLib的API
gpHash.h
1) 用于通过名称快速对象查找的通用哈希表
2)在初始化时固定的buckets数目:2的指数,从256到65536
3)在一个哈希表中可以存储多个对象类型:传入一个类型ID(指针)来区分,在哈希计算中被包含
4)非-obtrusive, 表分配节点对象
5)线程安全的访问,表包含一个互斥锁
6)操作:创建表,添加指定名称的对象,通过名称查找,通过名称删除,释放表,转存内容
1)表达式编译器和计算引擎
2)编译数学表达式为一个私有的后缀字节代码格式:支持大多数标准C操作,在语法中小差别
3)用指定的输入值集合(double)快速执行字节代码
4)被Base中calc,calcout,transform记录,areaDetector插件使用。
5)检查输入值的例程被编译的表达式使用和修改。
6) 操作:编译表达式,执行计算,参数使用,转存字节码
7)高效,可靠,经过充分测试
8)在IOC应用程序开发者手册中详细描述
1) epicsMath.h
2)epicsEndian.h
a)定义4个数值宏
b) 两个_ORDER宏是架构专用,并且应该与前两个做比较来确定CPU的大小端
1) shareLib.h
a) 定义用于标记库符号的若干宏,对windows DLLs必不可少
b) 取决于是否定义了宏epicsExportSharedSymbols以及编译器是否正在构建DLL或一个静态(archive)库,这些定义不同。
2) epicsExport.h
1) 库头文件应该:在这个头文件中包含这些声明所需的shareLib.h以及任何其它头文件,接着使用合适的epicsShare关键字来装饰这个头的声明。
2)库实现应该:
2)实现包含epicsExport.h而不是定义宏epicsExportSharedSymbols。
1) epicsUnitTest.h
2) testMain.h
定义一个宏MAIN(),允许测试在工作站上以程序被构建以及在嵌入操作系统上以函数被构建
3)构建系统变量TESTPROD, TESTSCRIPT(3.15:TESTLIBRARY构建程序而不安装它们;测试程序通常在它们的O.
4)通过运行'make runtests'等添加要被运行的测试程序名到TESTS。