EPICS Base Release 3.15.1

Changes between and 3.15.1

epicsStrnEscapedFromRaw() and epicsStrnRawFromEscaped()

These routines have been rewritten; the previous implementations did not always behave exactly as specified.

Shared Library Versions

On architectures that can support it, the shared library version number for libraries provided with Base has had the third component of the EPICS version number added to it, thus libCom.so.3.15.1 instead of libCom.so.3.15. Windows can only support two components to its internal product version number, and the Darwin bug that external shared libraries were being built using the EPICS version number has been fixed.

Hooking into dbLoadRecords

A function pointer hook has been added to the dbLoadRecords() routine, to allow external modules such as autosave to be notified when new records have been loaded during IOC initialization. The hook is called dbLoadRecordsHook and follows the model of the recGblAlarmHook pointer in that modules that wish to use it must save the current value of the pointer before installing their own function pointer, and must call the original function from their own routine.

The hook is activiated from the dbLoadRecords() routine and gets called only after a database instance file has been read in without error. Note that the dbLoadTemplates() routine directly calls dbLoadRecords() so this hook also provides information about instantiated database templates. It is still possible to load record instances using dbLoadDatabase() though, and doing this will not result in the hook routines being called.

Code to use this hook should look something like this:

#include "dbAccessDefs.h"


static void myRoutine(const char* file, const char* subs) {
    if (previousHook)
        previousHook(file, subs);

    /* Do whatever ... */

void myInit(void) {
    static int done = 0;

    if (!done) {
        previousHook = dbLoadRecordsHook;
        dbLoadRecordsHook = myRoutine;
        done = 1;

As with many other parts of the static database access library there is no mutex to protect the function pointer. Initialization is expected to take place in the context of the IOC's main thread, from either a static C++ constructor or an EPICS registrar routine.

Changes between and

New iocshLoad command

A new command iocshLoad has been added to iocsh which executes a named iocsh script and can also set one or more shell macro variables at the same time, the values of which will be forgotten immediately after the named script finishes executing. The following example shows the syntax:

iocshLoad "serial.cmd", "DEV=/dev/ttyS0,PORT=com1,TYPE=RS485"
iocshLoad "radmon.cmd", "PORT=com1,ADDR=0"

Support routines for 64-bit integers

The libCom library now provides support for 64-bit integer types on all supported architectures. The epicsTypes.h header file defines epicsInt64 and epicsUInt64 type definitions for both C and C++ code. The epicsStdlib.h header also declares the following for parsing strings into the relevent sized integer variables: Functions epicsParseLLong(), epicsParseULLong() with related macros epicsScanLLong() and epicsScanULLong(), and the functions epicsParseInt64() and epicsParseUInt64(). Use the first two functions and the macros for long long and unsigned long long integer types, and the last two functions for the epicsInt64 and epicsUInt64 types. Note that the latter can map to the types long and unsigned long on some 64-bit architectures such as linux-x86_64, not to the two long long types.

This version does not provide the ability to define 64-bit record fields, the use of the 64-bit types in the IOC database will come in a later release of EPICS Base.

Full support for loadable support modules

Apparently later versions of Base 3.14 permitted support modules to be loaded from a shared library at runtime without the IOC having been linked against that shared library; the registerRecordDeviceDriver.pl program would accept a partial DBD file containing just the entries needed for the library and generate the appropriate registration code. In 3.15 however the registerRecordDeviceDriver.pl program was replaced by one using the new DBD file parser, and in this a device support entry would only be accepted after first loading the record type that it depended on.

The parser has been modified to accept device entries without having seen the record type first, although a warning is given when that happens. To remove the warning the DBD file can provide a record type declaration instead (no fields can be defined, so the braces must be empty), before the device() entry. The result will generate the correct registration code for the device entry without including anything for any merely declared record types. The generated code can be linked into a shared library and loaded by an IOC at runtime using dlload.

Parallel callback threads

The general purpose callback facility can run multiple parallel callback threads per priority level. This makes better use of SMP architectures (e.g. processors with multiple cores), as callback work - which includes second stage processing of records with asynchronuous device support and I/O scanned processing - can be distributed over the available CPUs.

Note that by using parallel callback threads the order of scan callback requests in the queue is not retained. If a device support needs to be informed when scanIoRequest processing has finished, it should use the new scanIoSetComplete() feature to add a user function that will be called after the scanIoRequest record processing has finished.

Parallel callback threads have to be explicitly configured, by default the IOC keeps the old behavior of running one callback thread per priority.

Merge MMIO API from devLib2

Added calls to handle 8, 16, and 32 bit Memory Mapped I/O reads and writes. The calls added include X_iowriteY() and X_ioreadY() where X is nat (native), be or le, and Y is 16 or 32. Also added are ioread8() and iowrite8().

Added optional dbServer API to database

A server layer that sits on top of the IOC database may now register itself as such by calling dbRegisterServer() and providing optional routines that other components can use. The initial purpose of this API allows the Trace Processing implementation in dbProcess() to identify a client that causes a record to process when TPRO is set.

To support the client idenfication, the server provides a routine that returns that identity string when called by one of its own processing threads.

Concatenated database definition files

A series of database definition (dbd) files can now be concatenated during the build process into a newly-created dbd file with result being installed into $(INSTALL_LOCATION)/dbd without expanding it.

The following lines in an EPICS Makefile will create a file name.dbd in the O.Common build directory containing the contents of file1.dbd followed by file2.dbd then file3.dbd. The new file will then be installed into $(INSTALL_LOCATION)/dbd without expanding any of its include statements.

DBDCAT += name.dbd
name_DBD += file1.dbd file2.dbd file3.dbd

The source files file1.dbd, file2.dbd and file3.dbd may be created by the current Makefile, be located in the parent directory or any other directory in the SRC_DIRS list, be specified by their full pathname, exist in the install dbd directory, or be found in any dbd directory linked from the application's RELEASE files.

Posix: Drop SCHED_FIFO before exec() in child process

If Base is compiled with USE_POSIX_THREAD_PRIORITY_SCHEDULING = YES in configure/CONFIG_SITE or related files, the Posix implementation of the libCom osiSpawnDetachedProcess() routine will switch the child process to use the normal SCHED_OTHER (non real-time) scheduler before executing the named executable program. If it needs to use the real-time scheduler the new program can request that for itself.

Posix: Lock all memory when running with FIFO scheduler

On Posix systems, an IOC application's ability to meet timing deadlines is often dependent on its ability to lock part or all of the process's virtual address space into RAM, preventing that memory from being paged to the swap area. This change will attempt to lock the process's virtual address space into RAM if the process has the ability to run threads with different priorities. If unsuccessful, it prints an message to stderr and continues.

On Linux, one can grant a process the ability to run threads with different priorities by using the command ulimit -r unlimited. To use the FIFO scheduler for an IOC, use a command like this:

chrt -f 1 softIoc -d test.db

On Linux, one can grant a process the ability to lock itself into memory using the command ulimit -l unlimited. These limits can also be configured on a per user/per group basis by changing /etc/security/limits.conf or its equivalent.

A child process created via fork() normally inherits its parent's resource limits, so a child of a real-time soft-IOC will get its parent's real-time priority and memlock limits. The memory locks themselves however are not inherited by child processes.

Implement EPICS_CAS_INTF_ADDR_LIST in rsrv

The IOC server can now bind to a single IP address (and optional port number) read from the standard environment parameter EPICS_CAS_INTF_ADDR_LIST. Additional addresses included in that parameter after the first will be ignored and a warning message displayed at iocInit time.

alarmString.h deprecated again

The string arrays that provide string versions of the alarm status and severity values have been moved into libCom and the header file that used to instanciate them is no longer required, although a copy is still provided for backwards compatibility reasons. Only the alarm.h header needs to be included now to declare the epicsAlarmSeverityStrings and epicsAlarmConditionStrings arrays.

General purpose thread pool

A general purpose threaded work queue API epicsThreadPool is added. Multiple pools can be created with controlable priority and number of worker threads. Lazy worker startup is supported.

Database field setting updates

A database (.db) file loaded by an IOC does not have to repeat the record type of a record that has already been loaded. It may replace the first parameter of the record(type, name) statement with an asterisk character inside double-quotes, "*" instead. Thus the following is a legal database file:

record(ao, "ao1") {}
record("*", "ao1") {
    field(VAL, 10)

Note that database configuration tools will not be expected to have to understand this syntax, which is provided for scripted and hand-coded database and template instantiation only. Setting the IOC's dbRecordsOnceOnly flag also makes this syntax illegal, since its purpose is to prevent multiply-defined records from being collapsed into a single instance.

Added echo command to iocsh

The single argument string may contain escaped characters, which will be translated to their raw form before being printed (enclose the string in quotes to avoid double-translation). A newline is always appended to the output, and output stream redirection is supported.

Added macro EPICS_UNUSED to compilerDependencies.h

To prevent the compiler from warning about a known-unused variable, mark it with the macro EPICS_UNUSED. On gcc and clang this will expand to __attribute__((unused)) to prevent the warning.

User specified db substitution file suffix

Per Dirk Zimoch's suggestion, a user specified db substitution file suffix is now allowed by setting the variable SUBST_SUFFIX in a configuration directory CONFIG_SITE file or in a Makefile before the include $(TOP)/configure/RULES line. The default for SUBST_SUFFIX is .substitutions

NTP Time Provider adjusts to OS tick rate changes

Dirk Zimoch provided code that allows the NTP Time provider (used on VxWorks and RTEMS only) to adapt to changes in the OS clock tick rate after the provider has been initialized. Note that changing the tick rate after iocInit() is not advisable, and that other software might still misbehave if initialized before an OS tick rate change.

Added newEpicsMutex macro

Internal C++ uses of new epicsMutex() have been replaced with a new macro which calls a new constructor, passing it the file name and line number of the mutex creation code. C code that creates mutexes has been using a similar macro for a long time, but there was no equivalent constructor for the C++ wrapper class, so identifying a specific mutex was much harder to do.

Post DBE_PROPERTY events automatically

A new record field attribute "prop(YES)" has been added to identify fields holding meta-data. External changes to these fields will cause a CA monitor event to be sent to all record subscribers who have asked for DBE_PROPERTY updates. Meta-data fields have been marked for all Base record types.

errlogRemoveListener() routine changed

Code that calls errlogRemoveListener(myfunc) must be modified to use the new, safer routine errlogRemoveListeners(myfunc, &pvt) instead. The replacement routine takes a second argument which must be the same private pointer that was passed to errlogAddListener() when adding that listener. It also deletes all matching listeners (hence the new plural name) and returns how many were actually deleted, whereas the previous routine only removed the first listener that matched.

Simplified generation of .dbd files

The Perl script makeIncludeDbd.pl has been removed and the rules that created an intermediate xxxInclude.dbd file from the Makefile variable xxx_DBD have been modified to generate the target xxx.dbd file directly. This should simplify applications that might have had to provide dependency rules for the intermediate files in 3.15. Applications which provide their own xxxInclude.dbd source file will continue to have it expanded as before.

New Undefined Severity field UDFS

A new field has been added to dbCommon which configures the alarm severity associated with the record being undefined (when UDF=TRUE). The default value is INVALID so old databases will not be affected, but now individual records can be configured to have a lower severity or even no alarm when undefined. Be careful when changing this on applications where the IVOA field of output records is used, IVOA still requires an INVALID severity to trigger value replacement.

New build target tapfiles

This new make target runs the same tests as the runtests target, but instead of summarizing or displaying the output for each test script it creates a .tap file inside the architecture build directory which contains the detailed test output. The output file can be parsed by continuous integration packages such as Jenkins to show the test results.

Array field double-buffering

Array data can now be moved, without copying, into and out of the VAL field of the waveform, aai, and aao record types by replacing the pointer in BPTR. The basic rules which device support must follow are:

  1. BPTR, and the memory it is currently pointing to, can only be accessed while the record is locked.
  2. NELM may not be changed; NORD should be updated whenever the number of valid data elements changes.
  3. When BPTR is replaced it must always point to a block of memory large enough to hold the maximum number of elements, as given by the NELM and FTVL fields.

Spin-locks API added

The new header file epicsSpin.h adds a portable spin-locks API which is intended for locking very short sections of code (typically one or two lines of C or C++) to provide a critical section that protects against race conditions. On Posix platforms this uses the pthread_spinlock_t type if it's available and the build is not configured to use Posix thread priorities, but otherwise it falls back to a pthread_mutex_t. On the UP VxWorks and RTEMS platforms the implementations lock out CPU interrupts and disable task preemption while a spin-lock is held. The default implementation (used when no other implementation is provided) uses an epicsMutex. Spin-locks may not be taken recursively, and the code inside the critical section should be short and deterministic.

Improvements to aToIPAddr()

The libCom routine aToIPAddr() and the vxWorks implementation of the associated hostToIPAddr() function have been modified to be able to look up hostnames that begin with one or more digits. The epicsSockResolveTest program was added to check this functionality.

mbboDirect and mbbiDirect records

These record types have undergone some significant rework, and will behave slightly differently than they did in their 3.14 versions. The externally visible changes are as follows:


Redirection of the errlog console stream

A new routine has been added to the errlog facility which allows the console error message stream to be redirected from stderr to some other already open file stream:

int errlogSetConsole(FILE *stream);

The stream argument must be a FILE* pointer as returned by fopen() that is open for output. If NULL is passed in, the errlog thread's stderr output stream will be used instead. Note that messages to the console can be disabled and re-enabled using the eltc routine which is also an iocsh command, but there is no iocsh command currently provided for calling errlogSetConsole.

Add cleanup subroutine to aSub record

An aSub routine may set the CADR field with a function pointer which will be run before a new routine in the event that a change to the SNAM field changes the record's process subroutine.

This can be used to free any resources the routine needs to allocate. It can also be used to determine if this is the first time this routine has been called by this record instance. The CADR field is set to NULL immediately after the routine it points to is called.


void cleanup(aSubRecord* prec) {
    prec->dpvt = NULL;

long myAsubRoutine(aSubRecord* prec) {
    if (!prec->cadr) {
        /* check types of inputs and outputs */
        if (prec->ftva != menuFtypeDOUBLE)
            return 1; /* oops */

        dpvt = malloc(42);
        prec->cadr = &cleanup;

    /* normal processing */

Sequence record enhancements

The sequence record type now has 16 link groups numbered 0 through 9 and A through F, instead of the previous 10 groups numbered 1 through 9 and A. The changes to this record are directly equivalent to those described below for the fanout record. The fields OFFS and SHFT have been added and operate on the SELN value exactly the same way. The result is backwards compatible with the 3.14 version of the sequence record as long as none of the new fields are modified and the application does not rely on the SOFT/INVALID alarm that was generated when the selection number exceeded 10. The record also now posts monitors on the SELN field at the end of the sequence if its value changed when read through the SELL link.

Fanout record enhancements

The fanout record type now has 16 output links LNK0-LNK9 and LNKA-LNKF, plus two additional fields which make the result backwards compatible with 3.14 databases, but also allow the link selection to be shifted without having to process the SELN value through a calc or calcout record first.

Previously there was no LNK0 field, so when SELM is Mask bit 0 of SELN controls whether the LNK1 link field was activated; bit 1 controls LNK2 and so on. When SELM is Specified and SELN is zero no output link would be activated at all; LNK1 gets activated when SELN is 1 and so on. Only 6 links were provided, LNK1 through LNK6. The updated record type maintains the original behavior when the new fields are not configured, except that the SOFT/INVALID alarm is not generated when SELN is 7 through 15.

The update involved adding a LNK0 field, as well as fields LNK7 through LNK9 and LNKA through LNKF. To add flexibility and maintain backwards compatibility, two additional fields have been added:

This field holds a signed offset which is added to SELN to select which link to activate when SELM is Specified. If the resulting value is outside the range 0 .. 15 the record will go into a SOFT/INVALID alarm state. The default value of OFFS is zero, so if it is not explicitly set and SELN is 1 the LNK1 link will be activated.
When SELM is Mask the signed field SHFT is used to shift the SELN value by SHFT bits (positive means right-wards, values outside the range -15 .. 15 will result in a SOFT/INVALID alarm), before using the resulting bit-pattern to control which links to activate. The default value is -1, so if SHFT is not explicitly set bit 0 of SELN will be used to control whether LNK1 gets activated.

The record also now posts monitors on the SELN field if it changes as a result of record processing (i.e. when read through the SELL link).

Deleted Java build rules

Java has its own build systems now, so we've deleted the rules and associated variables from Base, although they might get added to the Extensions build rules for a while in case anyone still needs them.

Changes between 3.14.x and

Application clean rules

The clean Makefile target has changed between a single-colon rule and a double-colon rule more than once in the life of the EPICS build rules, and it just changed back to a single-colon rule, but now we recommend that applications that wish to provide a Makefile that is backwards compatible with the 3.14 build rules use the construct shown below. The 3.15 rules now support a variable called CLEANS to which a Makefile can add a list of files to be deleted when the user does a make clean like this:

CLEANS += <list of files to be cleaned>

ifndef BASE_3_15
	$(RM) $(CLEANS)

The conditional rule provides compatibility for use with the 3.14 build system.

MSI included with Base

An enhanced version of the Macro Substitution and Include program msi has been included with Base. Both this new version of msi and the IOC's dbLoadTemplates command now support setting global macros in substitution files, and dbLoadTemplates can now take a list of global macro settings as the second argument on its command line. The substitution file syntax is documented in the Application Developers Guide.

Cross-builds targeting win32-x86-mingw

Some Linux distributions now package the MinGW cross-compiler which makes it possible to cross-build the win32-x86-mingw target from a linux-x86 host. Build configuration files for this combination are now included; adjust the settings in configure/os/CONFIG_SITE.linux-x86.win32-x86-mingw and add win32-x86-mingw to the CROSS_COMPILER_TARGET_ARCHS variable in configure/CONFIG_SITE or in configure/os/CONFIG_SITE.linux-x86.Common.

Architecture win32-x86-cygwin Removed

The ability to compile non-cygwin binaries using the Cygwin build tools is no longer supported by current versions of Cygwin, so this architecture has been removed. Use the MinWG tools and the win32-x86-mingw architecture instead.

RTEMS and VxWorks Test Harnesses

The original libCom test harness has been renamed libComTestHarness, and two additional test harnesses have been created dbTestHarness and filterTestHarness which are all built for RTEMS and vxWorks targets. The new ones include tests in src/ioc/db/test and src/std/filters/test.

Running the new tests requires additional .db and .dbd files to be loaded at runtime, which can be found in the relevant source directory or its O.Common subdirectory. If the target can access the Base source tree directly it may be simplest to cd to the relevant source directory before running the test. If not, the files needed are listed in the generated 'testspec' file found in the associated build (O.arch) directory.

For RTEMS users the current directory is determined in a BSP specific way. See rtems_init.c and setBootConfigFromNVRAM.c in src/libCom/RTEMS.

New API to hook into thread creation

A hook API has been added allowing user-supplied functions to be called whenever a thread starts. The calls are made from the thread's context, and can be used to control additional thread properties not handled inside EPICS base, e.g. setting the scheduling policy or CPU affinity (on SMP systems).

The API also supports a mapping operation, calling a user-supplied function for every thread that is currently running.

New scan rate units

Scan rates defined in the menuScan.dbd file may now be specified in seconds, minutes, hours or Hertz, and plural time units will also be accepted (seconds are used if no unit is mentioned in the choice string). At iocInit each scan rate is compared with the OS's clock tick and a warning printed if the rate is too fast or likely to be more than 10% different to the requested rate. For example the rates given below are all valid, although non-standard (the default menuScan choices that come with Base have not been changed):

menu(menuScan) {
    choice(menuScanPassive,     "Passive")
    choice(menuScanEvent,       "Event")
    choice(menuScanI_O_Intr,    "I/O Intr")
    choice(menuScan1_hour,      "1 hour")
    choice(menuScan0_5_hours, "0.5 hours")
    choice(menuScan15_minutes, "15 minutes")
    choice(menuScan5_minutes,   "5 minutes")
    choice(menuScan1_minute,    "1 minute")
    choice(menuScan10_seconds, "10 seconds")
    choice(menuScan5_seconds,   "5 seconds")
    choice(menuScan2_seconds,   "2 seconds")
    choice(menuScan1_second,    "1 second")
    choice(menuScan2_Hertz,     "2 Hertz")
    choice(menuScan5_Hertz,     "5 Hertz")
    choice(menuScan10_Hertz,   "10 Hz")

Alarm filtering added to input record types

The record types ai, calc, longin and mbbi have a new alarm filter added to them. This provides a low-pass filter that can be used to delay the reporting of alarms caused by the input level passing the HIGH, HIHI, LOW or LOLO values. The filter is controlled with a new AFTC field that sets the filter's time constant. The default value for this field is zero, which keeps the record's original alarm behaviour.

The record must be scanned often enough for the filtering action to work effectively and the alarm severity can only change when the record is processed, but that processing does not have to be regular; the filter uses the time since the record last processed in its calculation. Setting AFTC to a positive number of seconds will delay the record going into or out of a minor alarm severity or from minor to major severity until the input signal has been in that range for that number of seconds.

Post events on Waveform record's NORD field

When the record type or device support modify the NORD field of a waveform record, the record support code now posts DBE_VALUE and DBE_LOG events for that field, signalling the array length change to any client monitoring the NORD field.

Attributes of Non-VAL Fields

Non-VAL fields now report meaningful information for precision, units, graphic limits, control limits, and alarm limits instead of simply using PREC, EGU, HOPR, LOPR, DRVL, DRVH, HIHI, HIGH, LOW, and LOLO. All delay fields have a default precision of 2 digits, units "s" and control limits of 0 to 100,000 seconds (these precision and limit values can be changed for each record type as a whole at runtime by updating a registered global variable). Input fields like A-L of the calc record read their metadata from the corresponding INPn link if possible.

epicsStdioRedirect.h merged into epicsStdio.h

The definitions from the header file epicsStdioRedirect.h have been moved into epicsStdio.h so all calls to printf(), puts() and putchar() in files that include that OSI header will now be subject to stdout redirection. In past releases (3.14.7 and later) it was necessary to request the redirection support by including the epicsStdioRedirect.h header file. The header file is still provided, but now it just includes epicsStdio.h.

Named Soft Events

Soft events can now be given meaningful names instead of just using the numbers 1-255. The EVNT field is now a DBF_STRING. The post_event() API is now deprecated but still works. It should be replaced by code that in advance looks up the EVNTPVT event handle associated with the named event by calling eventNameToHandle(char *), and when that event occurs passes that handle to the new postEvent(EVNTPVT) routine (which may be called from interrupt level). A new iocsh command postEvent name will trigger a named event from the command-line or a startup script (on vxWorks the expression postEvent(eventNameToHandle("name")) must be used instead though).

Parallel Builds

As EPICS sites get computers with more CPUs they report additional bugs in our parallel build rules. Various issues have been fixed by separating out the build rules that generate dependency (.d) files, ensuring that they are constructed at the appropriate time in the build.

These rule changes can cause additional warning messages to appear when building support modules. Where an application provides its own Makefile rules it may now have to add rules to construct an associated dependency file. In many cases though the change needed is just to replace a dependency for a target$(OBJ) with the target$(DEP) so this

    myLib$(OBJ): myLib_lex.c


    myLib$(DEP): myLib_lex.c

To debug build issues assocated with dependency files, use the command make --debug=m which tells GNUmake to display information about what it is doing during the first pass when it updates its makefiles.

Removed tsDefs.h

The deprecated tsDefs API was provided for 3.13 compatibility only, and has now been removed. Convert any remaining code that used it to call the epicsTime API instead.

Changes to epicsVersion.h

The two macros EPICS_UPDATE_LEVEL and EPICS_CVS_SNAPSHOT have been deleted from the epicsVersion.h file; they were deprecated in R3.14 and can be replaced with EPICS_PATCH_LEVEL and EPICS_DEV_SNAPSHOT respectively.

A new pair of macros has been added to make version number comparisons easier. Code that will not work with a version of Base before 3.15.0 can now be written like this to prevent it from compiling:

#  error EPICS Base R3.15.0 or later is required

Added support for iocLogPrefix

Added a iocLogPrefix command to iocsh. This adds a prefix to all messages from this IOC (or other log client) as they get sent to the iocLogServer. This lets sites use the "fac=<facility>" syntax for displaying the facility, process name etc. in log viewers like the cmlogviewer.

Reworked the epicsEvent C & C++ APIs

Enabled histogram record type

The histogram record was not included in the base.dbd file in any 3.14 release, but has now been added along with its associated soft device support. The build system now generates the list of all the record.dbd files in base automatically in src/std/rec/Makefile.

Reorganization of src/

Reorganization of subdirectories of src/ to better represent the relation between different parts as described in the following table.

This change also allows the number of libraries built to be reduced to: libCap5.so, libca.so, libdbCore.so, libdbStaticHost.so, libCom.so, libcas.so, libdbRecStd.so, and libgdd.so

Component Dependency Library name Description
src/tools Build system scripts
src/libCom src/tools Com Utility routines and OS-independant API
src/template src/tools User application templates (e.g. makeBaseApp)
src/ca/client src/libCom ca Channel Access client
src/ca/legacy/gdd src/ca/client gdd Generic data layer for PCAS
src/ca/legacy/pcas src/ca/legacy/gdd cas Portable Channel Access Server
src/ioc src/ca dbCore Core database processing functions
src/std src/ioc dbRecStd Standard records, soft device support and the softIoc

In order to better reflect these relations the following directories and files were moved as described:

src/RTEMS src/libCom/RTEMS
src/toolsComm/flex src/libCom/flex
src/toolsComm/antelope src/libCom/yacc
IOC Core Components
src/bpt src/ioc/bpt
src/db src/ioc/db
src/dbStatic src/ioc/dbStatic
src/dbtools src/ioc/dbtemplate
src/misc src/ioc/misc
src/registry src/ioc/registry
src/rsrv src/ioc/rsrv 1
Standard Record Definitions
src/dev/softDev src/std/dev
src/rec src/std/rec
src/softIoc src/std/softIoc
Channel Access
src/ca src/ca/client
src/catools src/ca/client/tools
src/cap5 src/ca/client/perl
src/gdd src/ca/legacy/gdd
src/cas src/ca/legacy/pcas
src/excas src/ca/legacy/pcas/ex
User Templates
src/makeBaseApp src/template/base
src/makeBaseExt src/template/ext
src/util 2 src/ca/client
src/as 3 src/libCom/as

1 RSRV is built as part of dbCore due to its tight (bidirectional) coupling with the other database code.

2 The contents for src/util/ moved to three locations. The caRepeater init script was moved to src/ca/client/. ca_test is now in src/ca/client/test/. The iocLogServer was moved into the same directory (src/libCom/log) as the log client code.

3 The Access Security code has been divided, with the parts not related to the database (lexer/parser and trap registration) becoming part of libCom. The remaining components are included in the dbCore library

Moved src/RTEMS/base directory

These files are now found under src/RTEMS.

Removed 3.13 compatibility

Removed the 3.13 <top>/config directory and build compatibility rules and variables, and various conversion documents.