Module build configurations

In the recipe’s build.sh, we invoke make to compile and install the module. Now let’s look at what that makefile contains - the e3 build interface that tells require how to build and install a module. This chapter demonstrates building directly with make (with dependencies from your conda environment) to understand the makefile in isolation, before returning to conda build in the next chapter.

Note

This guide assumes familiarity with makefiles and build systems. If you need a refresher:

require’s build interface

Include driver.makefile from require and declare what to build and install - as well as pass flags to the compiler and/or linker - using make variables. The most commonly used are:

  • SOURCES - Source files to compile into the shared library

  • HEADERS - Header files that should be installed

  • DBDS - Database definition files to include

  • TEMPLATES - Database or template files that should be installed

  • SCRIPTS - Script files that should be installed

Additional variables are documented in the build interface reference.

Tip

Quick reference for common variables is available here: require’s build interface

The variables above handle most module build needs, but require inherits EPICS base’s complete build system. When you need custom compiler flags, linking options, etc. beyond what these variables provide, refer to EPICS base’s build documentation: Application Developer’s Guide: Build Facility.

A very small makefile can be as simple as:

# This row is default, and must be included in all e3 makefiles
include $(E3_REQUIRE_TOOLS)/driver.makefile

# Install database files and a "snippet" (.iocsh file)
# The $(where_am_I) variable is provided by require and will point to the module's root directory
TEMPLATES += $(wildcard $(where_am_I)/template/*.db)
SCRIPTS   += $(where_am_I)/iocsh/example.iocsh

Example: Building iocStats with make

Below is a practical example using upstream iocStats sources, with an e3 makefile that tells require how to build and install the module.

1) Acquire iocStats’ source code

$ git clone https://github.com/epics-modules/iocStats.git
$ cd iocStats

Note

If we wanted to acquire additional files, or perform “pre-build” actions (patching, etc.), we would do so at this stage.

2) Acquire build tools and dependencies

Create a conda environment that contains epics-base, require, and a compiler:

$ conda create -n iocstats-build epics-base require gcc gxx

Caution

Which compiler to use will depend a bit on your platform, but gcc (and gxx) will work for Linux.

Activate the environment:

$ conda activate iocstats-build

3) Set up an e3 makefile

Create a makefile - we will name it e3.makefile since there already is a file named Makefile in iocStats’ repository root.

# e3.makefile
include $(E3_REQUIRE_TOOLS)/driver.makefile

USR_CPPFLAGS += -DUSE_TYPED_RSET

DEVIOCSTATS := devIocStats

HEADERS += $(DEVIOCSTATS)/os/default/devIocStatsOSD.h
HEADERS += $(DEVIOCSTATS)/devIocStats.h

SOURCES += $(DEVIOCSTATS)/devIocStatsAnalog.c
SOURCES += $(DEVIOCSTATS)/devIocStatsString.c
SOURCES += $(DEVIOCSTATS)/devIocStatsWaveform.c
SOURCES += $(DEVIOCSTATS)/devIocStatsSub.c
SOURCES += $(DEVIOCSTATS)/devIocStatsTest.c

SOURCES += $(DEVIOCSTATS)/os/Linux/osdCpuUsage.c
SOURCES += $(DEVIOCSTATS)/os/Linux/osdCpuUtilization.c
SOURCES += $(DEVIOCSTATS)/os/Linux/osdFdUsage.c
SOURCES += $(DEVIOCSTATS)/os/Linux/osdMemUsage.c

SOURCES += $(DEVIOCSTATS)/os/default/osdWorkspaceUsage.c
SOURCES += $(DEVIOCSTATS)/os/default/osdClustInfo.c
SOURCES += $(DEVIOCSTATS)/os/default/osdSuspTasks.c
SOURCES += $(DEVIOCSTATS)/os/default/osdIFErrors.c
SOURCES += $(DEVIOCSTATS)/os/default/osdBootInfo.c

SOURCES += $(DEVIOCSTATS)/os/posix/osdSystemInfo.c
SOURCES += $(DEVIOCSTATS)/os/posix/osdHostInfo.c
SOURCES += $(DEVIOCSTATS)/os/posix/osdPIDInfo.c

DBDS    += $(DEVIOCSTATS)/devIocStats.dbd

TEMPLATES += $(wildcard template/*.db)
TEMPLATES += $(wildcard template/*.template)

USR_DBFLAGS += -I$(where_am_I)/template

SUBS += $(wildcard template/*.substitutions)

4) Build and install

To build, we will need to pass some additional variables to require:

(iocstats-build) $ make -f e3.makefile MODULE=iocstats build
Show build log
MAKING EPICS VERSION 7.0.9.0
mkdir -p O.7.0.9.0_Common
make -f e3.makefile T_A=linux-x86_64 build
make[1]: Entering directory '/home/johndoe/iocStats'
mkdir -p O.7.0.9.0_linux-x86_64
make[2]: Entering directory '/home/johndoe/iocStats/O.7.0.9.0_linux-x86_64'
/home/johndoe/miniconda3/envs/iocstats-build/bin/x86_64-conda-linux-gnu-gcc  -D_GNU_SOURCE -D_DEFAULT_SOURCE        -DUSE_TYPED_RSET          -DUSE_TYPED_RSET  -D_X86_64_ -DUNIX  -Dlinux             -MD -DMODULE_NAME='"iocstats"' -DLIBVERSION='"dev"'    -O3 -g   -Wall -Werror-implicit-function-declaration             -std=gnu17  -mtune=generic     -m64  -fPIC           -I. -I../devIocStats/ -I../devIocStats//os/Linux -I../devIocStats//os/posix -I../devIocStats//os/default -I../devIocStats/os/Linux/ -I../devIocStats/os/default/ -I../devIocStats/os/posix/  -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include/compiler/gcc -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include/os/Linux              -I/home/johndoe/miniconda3/envs/iocstats-build/include           -c  ../devIocStats/os/posix/osdPIDInfo.c
/home/johndoe/miniconda3/envs/iocstats-build/bin/x86_64-conda-linux-gnu-gcc  -D_GNU_SOURCE -D_DEFAULT_SOURCE        -DUSE_TYPED_RSET          -DUSE_TYPED_RSET  -D_X86_64_ -DUNIX  -Dlinux             -MD -DMODULE_NAME='"iocstats"' -DLIBVERSION='"dev"'    -O3 -g   -Wall -Werror-implicit-function-declaration             -std=gnu17  -mtune=generic     -m64  -fPIC           -I. -I../devIocStats/ -I../devIocStats//os/Linux -I../devIocStats//os/posix -I../devIocStats//os/default -I../devIocStats/os/Linux/ -I../devIocStats/os/default/ -I../devIocStats/os/posix/  -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include/compiler/gcc -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include/os/Linux              -I/home/johndoe/miniconda3/envs/iocstats-build/include           -c  ../devIocStats/os/posix/osdHostInfo.c
/home/johndoe/miniconda3/envs/iocstats-build/bin/x86_64-conda-linux-gnu-gcc  -D_GNU_SOURCE -D_DEFAULT_SOURCE        -DUSE_TYPED_RSET          -DUSE_TYPED_RSET  -D_X86_64_ -DUNIX  -Dlinux             -MD -DMODULE_NAME='"iocstats"' -DLIBVERSION='"dev"'    -O3 -g   -Wall -Werror-implicit-function-declaration             -std=gnu17  -mtune=generic     -m64  -fPIC           -I. -I../devIocStats/ -I../devIocStats//os/Linux -I../devIocStats//os/posix -I../devIocStats//os/default -I../devIocStats/os/Linux/ -I../devIocStats/os/default/ -I../devIocStats/os/posix/  -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include/compiler/gcc -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include/os/Linux              -I/home/johndoe/miniconda3/envs/iocstats-build/include           -c  ../devIocStats/os/posix/osdSystemInfo.c
/home/johndoe/miniconda3/envs/iocstats-build/bin/x86_64-conda-linux-gnu-gcc  -D_GNU_SOURCE -D_DEFAULT_SOURCE        -DUSE_TYPED_RSET          -DUSE_TYPED_RSET  -D_X86_64_ -DUNIX  -Dlinux             -MD -DMODULE_NAME='"iocstats"' -DLIBVERSION='"dev"'    -O3 -g   -Wall -Werror-implicit-function-declaration             -std=gnu17  -mtune=generic     -m64  -fPIC           -I. -I../devIocStats/ -I../devIocStats//os/Linux -I../devIocStats//os/posix -I../devIocStats//os/default -I../devIocStats/os/Linux/ -I../devIocStats/os/default/ -I../devIocStats/os/posix/  -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include/compiler/gcc -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include/os/Linux              -I/home/johndoe/miniconda3/envs/iocstats-build/include           -c  ../devIocStats/os/default/osdBootInfo.c
/home/johndoe/miniconda3/envs/iocstats-build/bin/x86_64-conda-linux-gnu-gcc  -D_GNU_SOURCE -D_DEFAULT_SOURCE        -DUSE_TYPED_RSET          -DUSE_TYPED_RSET  -D_X86_64_ -DUNIX  -Dlinux             -MD -DMODULE_NAME='"iocstats"' -DLIBVERSION='"dev"'    -O3 -g   -Wall -Werror-implicit-function-declaration             -std=gnu17  -mtune=generic     -m64  -fPIC           -I. -I../devIocStats/ -I../devIocStats//os/Linux -I../devIocStats//os/posix -I../devIocStats//os/default -I../devIocStats/os/Linux/ -I../devIocStats/os/default/ -I../devIocStats/os/posix/  -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include/compiler/gcc -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include/os/Linux              -I/home/johndoe/miniconda3/envs/iocstats-build/include           -c  ../devIocStats/os/default/osdIFErrors.c
/home/johndoe/miniconda3/envs/iocstats-build/bin/x86_64-conda-linux-gnu-gcc  -D_GNU_SOURCE -D_DEFAULT_SOURCE        -DUSE_TYPED_RSET          -DUSE_TYPED_RSET  -D_X86_64_ -DUNIX  -Dlinux             -MD -DMODULE_NAME='"iocstats"' -DLIBVERSION='"dev"'    -O3 -g   -Wall -Werror-implicit-function-declaration             -std=gnu17  -mtune=generic     -m64  -fPIC           -I. -I../devIocStats/ -I../devIocStats//os/Linux -I../devIocStats//os/posix -I../devIocStats//os/default -I../devIocStats/os/Linux/ -I../devIocStats/os/default/ -I../devIocStats/os/posix/  -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include/compiler/gcc -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include/os/Linux              -I/home/johndoe/miniconda3/envs/iocstats-build/include           -c  ../devIocStats/os/default/osdSuspTasks.c
/home/johndoe/miniconda3/envs/iocstats-build/bin/x86_64-conda-linux-gnu-gcc  -D_GNU_SOURCE -D_DEFAULT_SOURCE        -DUSE_TYPED_RSET          -DUSE_TYPED_RSET  -D_X86_64_ -DUNIX  -Dlinux             -MD -DMODULE_NAME='"iocstats"' -DLIBVERSION='"dev"'    -O3 -g   -Wall -Werror-implicit-function-declaration             -std=gnu17  -mtune=generic     -m64  -fPIC           -I. -I../devIocStats/ -I../devIocStats//os/Linux -I../devIocStats//os/posix -I../devIocStats//os/default -I../devIocStats/os/Linux/ -I../devIocStats/os/default/ -I../devIocStats/os/posix/  -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include/compiler/gcc -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include/os/Linux              -I/home/johndoe/miniconda3/envs/iocstats-build/include           -c  ../devIocStats/os/default/osdClustInfo.c
/home/johndoe/miniconda3/envs/iocstats-build/bin/x86_64-conda-linux-gnu-gcc  -D_GNU_SOURCE -D_DEFAULT_SOURCE        -DUSE_TYPED_RSET          -DUSE_TYPED_RSET  -D_X86_64_ -DUNIX  -Dlinux             -MD -DMODULE_NAME='"iocstats"' -DLIBVERSION='"dev"'    -O3 -g   -Wall -Werror-implicit-function-declaration             -std=gnu17  -mtune=generic     -m64  -fPIC           -I. -I../devIocStats/ -I../devIocStats//os/Linux -I../devIocStats//os/posix -I../devIocStats//os/default -I../devIocStats/os/Linux/ -I../devIocStats/os/default/ -I../devIocStats/os/posix/  -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include/compiler/gcc -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include/os/Linux              -I/home/johndoe/miniconda3/envs/iocstats-build/include           -c  ../devIocStats/os/default/osdWorkspaceUsage.c
/home/johndoe/miniconda3/envs/iocstats-build/bin/x86_64-conda-linux-gnu-gcc  -D_GNU_SOURCE -D_DEFAULT_SOURCE        -DUSE_TYPED_RSET          -DUSE_TYPED_RSET  -D_X86_64_ -DUNIX  -Dlinux             -MD -DMODULE_NAME='"iocstats"' -DLIBVERSION='"dev"'    -O3 -g   -Wall -Werror-implicit-function-declaration             -std=gnu17  -mtune=generic     -m64  -fPIC           -I. -I../devIocStats/ -I../devIocStats//os/Linux -I../devIocStats//os/posix -I../devIocStats//os/default -I../devIocStats/os/Linux/ -I../devIocStats/os/default/ -I../devIocStats/os/posix/  -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include/compiler/gcc -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include/os/Linux              -I/home/johndoe/miniconda3/envs/iocstats-build/include           -c  ../devIocStats/os/Linux/osdMemUsage.c
/home/johndoe/miniconda3/envs/iocstats-build/bin/x86_64-conda-linux-gnu-gcc  -D_GNU_SOURCE -D_DEFAULT_SOURCE        -DUSE_TYPED_RSET          -DUSE_TYPED_RSET  -D_X86_64_ -DUNIX  -Dlinux             -MD -DMODULE_NAME='"iocstats"' -DLIBVERSION='"dev"'    -O3 -g   -Wall -Werror-implicit-function-declaration             -std=gnu17  -mtune=generic     -m64  -fPIC           -I. -I../devIocStats/ -I../devIocStats//os/Linux -I../devIocStats//os/posix -I../devIocStats//os/default -I../devIocStats/os/Linux/ -I../devIocStats/os/default/ -I../devIocStats/os/posix/  -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include/compiler/gcc -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include/os/Linux              -I/home/johndoe/miniconda3/envs/iocstats-build/include           -c  ../devIocStats/os/Linux/osdFdUsage.c
/home/johndoe/miniconda3/envs/iocstats-build/bin/x86_64-conda-linux-gnu-gcc  -D_GNU_SOURCE -D_DEFAULT_SOURCE        -DUSE_TYPED_RSET          -DUSE_TYPED_RSET  -D_X86_64_ -DUNIX  -Dlinux             -MD -DMODULE_NAME='"iocstats"' -DLIBVERSION='"dev"'    -O3 -g   -Wall -Werror-implicit-function-declaration             -std=gnu17  -mtune=generic     -m64  -fPIC           -I. -I../devIocStats/ -I../devIocStats//os/Linux -I../devIocStats//os/posix -I../devIocStats//os/default -I../devIocStats/os/Linux/ -I../devIocStats/os/default/ -I../devIocStats/os/posix/  -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include/compiler/gcc -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include/os/Linux              -I/home/johndoe/miniconda3/envs/iocstats-build/include           -c  ../devIocStats/os/Linux/osdCpuUtilization.c
/home/johndoe/miniconda3/envs/iocstats-build/bin/x86_64-conda-linux-gnu-gcc  -D_GNU_SOURCE -D_DEFAULT_SOURCE        -DUSE_TYPED_RSET          -DUSE_TYPED_RSET  -D_X86_64_ -DUNIX  -Dlinux             -MD -DMODULE_NAME='"iocstats"' -DLIBVERSION='"dev"'    -O3 -g   -Wall -Werror-implicit-function-declaration             -std=gnu17  -mtune=generic     -m64  -fPIC           -I. -I../devIocStats/ -I../devIocStats//os/Linux -I../devIocStats//os/posix -I../devIocStats//os/default -I../devIocStats/os/Linux/ -I../devIocStats/os/default/ -I../devIocStats/os/posix/  -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include/compiler/gcc -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include/os/Linux              -I/home/johndoe/miniconda3/envs/iocstats-build/include           -c  ../devIocStats/os/Linux/osdCpuUsage.c
/home/johndoe/miniconda3/envs/iocstats-build/bin/x86_64-conda-linux-gnu-gcc  -D_GNU_SOURCE -D_DEFAULT_SOURCE        -DUSE_TYPED_RSET          -DUSE_TYPED_RSET  -D_X86_64_ -DUNIX  -Dlinux             -MD -DMODULE_NAME='"iocstats"' -DLIBVERSION='"dev"'    -O3 -g   -Wall -Werror-implicit-function-declaration             -std=gnu17  -mtune=generic     -m64  -fPIC           -I. -I../devIocStats/ -I../devIocStats//os/Linux -I../devIocStats//os/posix -I../devIocStats//os/default -I../devIocStats/os/Linux/ -I../devIocStats/os/default/ -I../devIocStats/os/posix/  -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include/compiler/gcc -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include/os/Linux              -I/home/johndoe/miniconda3/envs/iocstats-build/include           -c  ../devIocStats/devIocStatsTest.c
/home/johndoe/miniconda3/envs/iocstats-build/bin/x86_64-conda-linux-gnu-gcc  -D_GNU_SOURCE -D_DEFAULT_SOURCE        -DUSE_TYPED_RSET          -DUSE_TYPED_RSET  -D_X86_64_ -DUNIX  -Dlinux             -MD -DMODULE_NAME='"iocstats"' -DLIBVERSION='"dev"'    -O3 -g   -Wall -Werror-implicit-function-declaration             -std=gnu17  -mtune=generic     -m64  -fPIC           -I. -I../devIocStats/ -I../devIocStats//os/Linux -I../devIocStats//os/posix -I../devIocStats//os/default -I../devIocStats/os/Linux/ -I../devIocStats/os/default/ -I../devIocStats/os/posix/  -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include/compiler/gcc -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include/os/Linux              -I/home/johndoe/miniconda3/envs/iocstats-build/include           -c  ../devIocStats/devIocStatsSub.c
/home/johndoe/miniconda3/envs/iocstats-build/bin/x86_64-conda-linux-gnu-gcc  -D_GNU_SOURCE -D_DEFAULT_SOURCE        -DUSE_TYPED_RSET          -DUSE_TYPED_RSET  -D_X86_64_ -DUNIX  -Dlinux             -MD -DMODULE_NAME='"iocstats"' -DLIBVERSION='"dev"'    -O3 -g   -Wall -Werror-implicit-function-declaration             -std=gnu17  -mtune=generic     -m64  -fPIC           -I. -I../devIocStats/ -I../devIocStats//os/Linux -I../devIocStats//os/posix -I../devIocStats//os/default -I../devIocStats/os/Linux/ -I../devIocStats/os/default/ -I../devIocStats/os/posix/  -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include/compiler/gcc -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include/os/Linux              -I/home/johndoe/miniconda3/envs/iocstats-build/include           -c  ../devIocStats/devIocStatsWaveform.c
/home/johndoe/miniconda3/envs/iocstats-build/bin/x86_64-conda-linux-gnu-gcc  -D_GNU_SOURCE -D_DEFAULT_SOURCE        -DUSE_TYPED_RSET          -DUSE_TYPED_RSET  -D_X86_64_ -DUNIX  -Dlinux             -MD -DMODULE_NAME='"iocstats"' -DLIBVERSION='"dev"'    -O3 -g   -Wall -Werror-implicit-function-declaration             -std=gnu17  -mtune=generic     -m64  -fPIC           -I. -I../devIocStats/ -I../devIocStats//os/Linux -I../devIocStats//os/posix -I../devIocStats//os/default -I../devIocStats/os/Linux/ -I../devIocStats/os/default/ -I../devIocStats/os/posix/  -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include/compiler/gcc -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include/os/Linux              -I/home/johndoe/miniconda3/envs/iocstats-build/include           -c  ../devIocStats/devIocStatsString.c
/home/johndoe/miniconda3/envs/iocstats-build/bin/x86_64-conda-linux-gnu-gcc  -D_GNU_SOURCE -D_DEFAULT_SOURCE        -DUSE_TYPED_RSET          -DUSE_TYPED_RSET  -D_X86_64_ -DUNIX  -Dlinux             -MD -DMODULE_NAME='"iocstats"' -DLIBVERSION='"dev"'    -O3 -g   -Wall -Werror-implicit-function-declaration             -std=gnu17  -mtune=generic     -m64  -fPIC           -I. -I../devIocStats/ -I../devIocStats//os/Linux -I../devIocStats//os/posix -I../devIocStats//os/default -I../devIocStats/os/Linux/ -I../devIocStats/os/default/ -I../devIocStats/os/posix/  -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include/compiler/gcc -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include/os/Linux              -I/home/johndoe/miniconda3/envs/iocstats-build/include           -c  ../devIocStats/devIocStatsAnalog.c
Expanding iocstats.dbd
perl -CSD /home/johndoe/miniconda3/envs/iocstats-build/epics/bin/linux-x86_64/dbdExpand.pl -A -I ../devIocStats/ -I /home/johndoe/miniconda3/envs/iocstats-build/epics/dbd -o iocstats.dbd ../devIocStats/devIocStats.dbd
Device 'IOC stats' refers to unknown record type 'ai'.
Record type 'ai' declared.
Device 'IOC stats' refers to unknown record type 'ao'.
Record type 'ao' declared.
Device 'IOC stats' refers to unknown record type 'stringin'.
Record type 'stringin' declared.
Device 'IOC stats' refers to unknown record type 'waveform'.
Record type 'waveform' declared.
perl -CSD /home/johndoe/miniconda3/envs/iocstats-build/epics/bin/linux-x86_64/registerRecordDeviceDriver.pl iocstats.dbd iocstats_registerRecordDeviceDriver | grep -v 'iocshRegisterCommon();' > iocstats_registerRecordDeviceDriver.cpp
sed -i'.bak' -E '/^.*= Registration\(\)\;$/d' iocstats_registerRecordDeviceDriver.cpp
echo "#include <init.cpp>" >> iocstats_registerRecordDeviceDriver.cpp
/home/johndoe/miniconda3/envs/iocstats-build/bin/x86_64-conda-linux-gnu-g++  -D_GNU_SOURCE -D_DEFAULT_SOURCE        -DUSE_TYPED_RSET          -DUSE_TYPED_RSET  -D_X86_64_ -DUNIX  -Dlinux             -MD -DMODULE_NAME='"iocstats"' -DLIBVERSION='"dev"'    -O3 -g   -Wall              -mtune=generic              -m64  -fPIC          -I/home/johndoe/miniconda3/envs/iocstats-build/epics-modules/require/ -I. -I../devIocStats/ -I../devIocStats//os/Linux -I../devIocStats//os/posix -I../devIocStats//os/default -I../devIocStats/os/Linux/ -I../devIocStats/os/default/ -I../devIocStats/os/posix/  -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include/compiler/gcc -I/home/johndoe/miniconda3/envs/iocstats-build/epics/include/os/Linux              -I/home/johndoe/miniconda3/envs/iocstats-build/include           -c iocstats_registerRecordDeviceDriver.cpp
/home/johndoe/miniconda3/envs/iocstats-build/bin/x86_64-conda-linux-gnu-g++ -o libiocstats.so  -shared -fPIC -Wl,-hlibiocstats.so -L/home/johndoe/miniconda3/envs/iocstats-build/lib -Wl,-rpath,/home/johndoe/miniconda3/envs/iocstats-build/lib                  -rdynamic -Wl,--disable-new-dtags -Wl,-rpath,/home/johndoe/miniconda3/envs/iocstats-build/lib -Wl,-rpath-link,/home/johndoe/miniconda3/envs/iocstats-build/lib -L/home/johndoe/miniconda3/envs/iocstats-build/lib -Wl,-rpath-link,/home/johndoe/miniconda3/envs/iocstats-build/epics/lib/linux-x86_64 -m64                   iocstats_registerRecordDeviceDriver.o devIocStatsAnalog.o devIocStatsString.o devIocStatsSub.o devIocStatsTest.o devIocStatsWaveform.o osdCpuUsage.o osdCpuUtilization.o osdFdUsage.o osdMemUsage.o osdBootInfo.o osdClustInfo.o osdIFErrors.o osdSuspTasks.o osdWorkspaceUsage.o osdHostInfo.o osdPIDInfo.o osdSystemInfo.o      -lpthread    -lm -lrt -ldl -lgcc
make[2]: Leaving directory '/home/johndoe/iocStats/O.7.0.9.0_linux-x86_64'
make[1]: Leaving directory '/home/johndoe/iocStats'

Note

We have to define MODULE for require to know the name of the module in question.

This compiles the sources against EPICS base in your environment.

To install the module into the e3 layout, run the install command:

(iocstats-build) $ make -f e3.makefile MODULE=iocstats install
Show install log
MAKING EPICS VERSION 7.0.9.0
make -f e3.makefile T_A=linux-x86_64 install
make[1]: Entering directory '/home/johndoe/iocStats'
make[2]: Entering directory '/home/johndoe/iocStats/O.7.0.9.0_linux-x86_64'
Installing generic include file /home/johndoe/miniconda3/envs/iocstats-build/include/devIocStatsOSD.h
Installing generic include file /home/johndoe/miniconda3/envs/iocstats-build/include/devIocStats.h
Installing module dbd file(s) iocstats.dbd to /home/johndoe/miniconda3/envs/iocstats-build/epics-modules/iocstats/dbd
perl -CSD /home/johndoe/miniconda3/envs/iocstats-build/epics/bin/linux-x86_64/installEpics.pl  -d -m444 iocstats.dbd /home/johndoe/miniconda3/envs/iocstats-build/epics-modules/iocstats/dbd
mkdir /home/johndoe/miniconda3/envs/iocstats-build/epics-modules/iocstats
mkdir /home/johndoe/miniconda3/envs/iocstats-build/epics-modules/iocstats/dbd
Installing module library /home/johndoe/miniconda3/envs/iocstats-build/lib/libiocstats.so
perl -CSD /home/johndoe/miniconda3/envs/iocstats-build/epics/bin/linux-x86_64/installEpics.pl  -d -m755 libiocstats.so /home/johndoe/miniconda3/envs/iocstats-build/lib
make[2]: Leaving directory '/home/johndoe/iocStats/O.7.0.9.0_linux-x86_64'
make[1]: Leaving directory '/home/johndoe/iocStats'

Note

We’re already leveraging conda for dependency resolution - when creating the environment, it pulled down more packages than just the three we specified. Packages like epics-base and require also set variables and modify paths that require’s build system uses. The next chapter ties makefiles and recipes together using conda build.

5) Start an IOC and load iocStats

With the module installed, you can start an IOC shell and load the module:

(iocstats-build) $ iocsh -r iocstats
Show IOC log
       ,----.     ,--. ,-----.  ,-----.           ,--.            ,--.,--.
 ,---. '.-.  |    |  |'  .-.  ''  .--./     ,---. |  ,---.  ,---. |  ||  |
| .-. :  .' <     |  ||  | |  ||  |        (  .-' |  .-.  || .-. :|  ||  |
\   --./'-'  |    |  |'  '-'  ''  '--'\    .-'  `)|  | |  |\   --.|  ||  |
 `----'`----'     `--' `-----'  `-----'    `----' `--' `--' `----'`--'`--'

Starting e3 IOC shell version 6.0.0rc2
...
require iocstats
Loading dbd file /home/johndoe/miniconda3/envs/iocstats-build/epics-modules/iocstats/dbd/iocstats.dbd
Loading module info records for iocstats
...
iocRun: All initialization complete
localhost-364538 >

If everything is wired correctly, the module libraries and database definitions are available, and all data files (database files, snippets, etc.) can be loaded.