Compare commits
82 Commits
PSI-7.0.8.
...
PSI-7.0.8.
| Author | SHA1 | Date | |
|---|---|---|---|
| 8accf19239 | |||
| 9b8712e095 | |||
| d13441ebba | |||
| b53505d339 | |||
| 75524e43bc | |||
| 1567da1366 | |||
| 35ba9d65a2 | |||
|
|
8483ff9560 | ||
| 6bb78e0d59 | |||
| 7d73932dc8 | |||
| 4a442bb56c | |||
| 60075df3cf | |||
| 42892f3921 | |||
| b7cc33c3c9 | |||
| 9e7cd241e0 | |||
| faac1df1c6 | |||
|
|
1f8851a5dc | ||
|
|
ac3e8af9fd | ||
|
|
98a30e8029 | ||
|
|
594e5ee9db | ||
|
|
135193c4bd | ||
|
|
9d65da5c61 | ||
|
|
f9d1fbeedb | ||
|
|
2b8a944a7d | ||
|
|
83cbf8a4c7 | ||
|
|
47880fbcf7 | ||
|
|
b0bff556c9 | ||
|
|
932e506df1 | ||
|
|
b7991b6eca | ||
|
|
f6cd43b7cc | ||
|
|
e6a2047bbf | ||
|
|
7923076b1c | ||
|
|
46ad962cd8 | ||
|
|
f47e1d94a3 | ||
|
|
022b8d468b | ||
|
|
152d306ad8 | ||
|
|
012139638d | ||
|
|
78b575f487 | ||
|
|
74713632a6 | ||
|
|
dd5df7363c | ||
|
|
3888e9dec7 | ||
|
|
af206ba7fc | ||
|
|
be4d1604ba | ||
|
|
8e2217dbf7 | ||
|
|
34b3306faa | ||
|
|
8c88d052bb | ||
|
|
ad7575f5a4 | ||
|
|
601ac051db | ||
|
|
c0aeb4c69b | ||
|
|
7cdaaf716a | ||
|
|
615ba73044 | ||
|
|
c285f2a78f | ||
|
|
fcb227ed97 | ||
|
|
4f6aa7ec29 | ||
| 60f6ba7b49 | |||
|
|
8045770751 | ||
| 52b3496084 | |||
| 2296dbc132 | |||
| 4af01ed26a | |||
| d83079999b | |||
| 15a2e22149 | |||
| 2dc71ebd6e | |||
|
|
2e4113b63b | ||
|
|
3b50194837 | ||
| 99f70a1081 | |||
|
|
5d9ffe15da | ||
|
|
3ac8dcc3de | ||
|
|
25e155ee8c | ||
|
|
049cc175a9 | ||
|
|
0d92b74aae | ||
|
|
ecba8a3a5e | ||
|
|
466a9b565e | ||
|
|
c304b7db53 | ||
|
|
0eb31ed70b | ||
|
|
c5f5e4e508 | ||
|
|
9866815dab | ||
|
|
0e66b3edff | ||
|
|
dd154180bf | ||
|
|
574fe116fc | ||
| 7077ece7f9 | |||
| 22aaded26d | |||
| c1b8831205 |
22
.github/codeql/config.yml
vendored
Normal file
22
.github/codeql/config.yml
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
name: "CodeQL Config"
|
||||
|
||||
# Queries and the suites they belong to are documented at
|
||||
# https://codeql.github.com/codeql-query-help/cpp/
|
||||
|
||||
queries:
|
||||
- uses: security-and-quality
|
||||
# Choose the above from 3 query suites:
|
||||
# default
|
||||
# The default set of queries
|
||||
# security-extended
|
||||
# `default` suite plus lower severity and precision queries
|
||||
# security-and-quality
|
||||
# `security-extended`, plus maintainability and reliability queries
|
||||
|
||||
query-filters:
|
||||
-
|
||||
exclude:
|
||||
id: cpp/use-of-goto
|
||||
-
|
||||
exclude:
|
||||
problem.severity: recommendation
|
||||
36
.github/workflows/ci-scripts-build.yml
vendored
36
.github/workflows/ci-scripts-build.yml
vendored
@@ -15,7 +15,6 @@ on:
|
||||
- 'startup/*'
|
||||
- '.appveyor/*'
|
||||
- '.tools/*'
|
||||
- '.lgtm.yml'
|
||||
- '.gitattributes'
|
||||
- '**/*.html'
|
||||
- '**/*.md'
|
||||
@@ -25,7 +24,6 @@ on:
|
||||
- 'startup/*'
|
||||
- '.appveyor/*'
|
||||
- '.tools/*'
|
||||
- '.lgtm.yml'
|
||||
- '.gitattributes'
|
||||
- '**/*.html'
|
||||
- '**/*.md'
|
||||
@@ -79,81 +77,81 @@ jobs:
|
||||
cmp: gcc
|
||||
configuration: default
|
||||
cross: "windows-x64-mingw"
|
||||
name: "Ub-20 gcc-9 + MinGW"
|
||||
name: "Ub-20 gcc + MinGW"
|
||||
|
||||
- os: ubuntu-20.04
|
||||
cmp: gcc
|
||||
configuration: static
|
||||
cross: "windows-x64-mingw"
|
||||
name: "Ub-20 gcc-9 + MinGW, static"
|
||||
name: "Ub-20 gcc + MinGW, static"
|
||||
|
||||
- os: ubuntu-20.04
|
||||
cmp: gcc
|
||||
configuration: static
|
||||
extra: "CMD_CXXFLAGS=-std=c++11"
|
||||
name: "Ub-20 gcc-9 C++11, static"
|
||||
name: "Ub-20 gcc C++11, static"
|
||||
|
||||
- os: ubuntu-20.04
|
||||
cmp: gcc
|
||||
configuration: static
|
||||
extra: "CMD_CFLAGS=-funsigned-char CMD_CXXFLAGS=-funsigned-char"
|
||||
name: "Ub-20 gcc-9 unsigned char"
|
||||
name: "Ub-20 gcc unsigned char"
|
||||
|
||||
- os: ubuntu-20.04
|
||||
cmp: clang
|
||||
configuration: default
|
||||
name: "Ub-20 clang-10"
|
||||
name: "Ub-20 clang"
|
||||
|
||||
- os: ubuntu-20.04
|
||||
cmp: clang
|
||||
configuration: default
|
||||
extra: "CMD_CXXFLAGS=-std=c++11"
|
||||
name: "Ub-20 clang-10 C++11"
|
||||
name: "Ub-20 clang C++11"
|
||||
|
||||
- os: ubuntu-20.04
|
||||
cmp: gcc
|
||||
configuration: default
|
||||
cross: "RTEMS-pc686-qemu@5"
|
||||
name: "Ub-20 gcc-9 + RT-5.1 pc686"
|
||||
name: "Ub-20 gcc + RT-5.1 pc686"
|
||||
|
||||
- os: ubuntu-20.04
|
||||
cmp: gcc
|
||||
configuration: default
|
||||
cross: "RTEMS-beatnik@5"
|
||||
test: NO
|
||||
name: "Ub-20 gcc-9 + RT-5.1 beatnik"
|
||||
name: "Ub-20 gcc + RT-5.1 beatnik"
|
||||
|
||||
- os: ubuntu-20.04
|
||||
cmp: gcc
|
||||
configuration: default
|
||||
cross: "RTEMS-xilinx_zynq_a9_qemu@5"
|
||||
test: NO
|
||||
name: "Ub-20 gcc-9 + RT-5.1 xilinx_zynq_a9_qemu"
|
||||
name: "Ub-20 gcc + RT-5.1 xilinx_zynq_a9_qemu"
|
||||
|
||||
- os: ubuntu-20.04
|
||||
cmp: gcc
|
||||
configuration: default
|
||||
cross: "RTEMS-uC5282@5"
|
||||
test: NO
|
||||
name: "Ub-20 gcc-9 + RT-5.1 uC5282"
|
||||
name: "Ub-20 gcc + RT-5.1 uC5282"
|
||||
|
||||
- os: ubuntu-20.04
|
||||
cmp: gcc
|
||||
configuration: default
|
||||
name: "Ub-20 gcc-9 + RT-4.10"
|
||||
name: "Ub-20 gcc + RT-4.10"
|
||||
cross: "RTEMS-pc386-qemu@4.10"
|
||||
test: NO
|
||||
|
||||
- os: ubuntu-20.04
|
||||
cmp: gcc
|
||||
configuration: default
|
||||
name: "Ub-20 gcc-9 + RT-4.9"
|
||||
name: "Ub-20 gcc + RT-4.9"
|
||||
cross: "RTEMS-pc386-qemu@4.9"
|
||||
|
||||
- os: macos-latest
|
||||
cmp: clang
|
||||
configuration: default
|
||||
name: "MacOS clang-12"
|
||||
name: "MacOS clang"
|
||||
|
||||
- os: windows-2019
|
||||
cmp: vs2019
|
||||
@@ -198,7 +196,7 @@ jobs:
|
||||
cross: linux-arm@arm-linux-gnueabihf
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: true
|
||||
- name: Automatic core dumper analysis
|
||||
@@ -216,7 +214,7 @@ jobs:
|
||||
run: python .ci/cue.py -T 60M test
|
||||
- name: Upload tapfiles Artifact
|
||||
if: ${{ always() }}
|
||||
uses: actions/upload-artifact@v3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: tapfiles ${{ matrix.name }}
|
||||
path: '**/O.*/*.tap'
|
||||
@@ -283,7 +281,7 @@ jobs:
|
||||
# people would rather just break all existing scripts...
|
||||
[ -e /usr/bin/python ] || ln -sf python3 /usr/bin/python
|
||||
python --version
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: true
|
||||
- name: Automatic core dumper analysis
|
||||
@@ -300,7 +298,7 @@ jobs:
|
||||
run: python .ci/cue.py -T 20M test
|
||||
- name: Upload tapfiles Artifact
|
||||
if: ${{ always() }}
|
||||
uses: actions/upload-artifact@v3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: tapfiles ${{ matrix.name }}
|
||||
path: '**/O.*/*.tap'
|
||||
|
||||
64
.github/workflows/codeql.yml
vendored
Normal file
64
.github/workflows/codeql.yml
vendored
Normal file
@@ -0,0 +1,64 @@
|
||||
name: "CodeQL"
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: 7.0
|
||||
tags: 'R7.0.*'
|
||||
pull_request:
|
||||
branches: 7.0
|
||||
paths-ignore:
|
||||
- '.appveyor/*'
|
||||
- '.tools/*'
|
||||
- 'documentation/*'
|
||||
- 'startup/*'
|
||||
- '**/*.md'
|
||||
- '**/*.html'
|
||||
|
||||
jobs:
|
||||
analyze:
|
||||
name: Analyze
|
||||
runs-on:
|
||||
- ubuntu-latest
|
||||
# - windows-latest
|
||||
# Supported by CodeQL which would check the Windows
|
||||
# port, but needs more work here to set it up
|
||||
|
||||
permissions:
|
||||
# Required for all workflows:
|
||||
security-events: write
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
language: [ cpp ]
|
||||
|
||||
steps:
|
||||
- name: Checkout Repositories
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: false
|
||||
|
||||
- name: Install Packages
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install --yes libreadline-dev
|
||||
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v3
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
config-file: ./.github/codeql/config.yml
|
||||
|
||||
- name: Build C/C++
|
||||
run: |
|
||||
echo '*** Building with these versions >>>'
|
||||
g++ --version
|
||||
make --version
|
||||
perl --version
|
||||
echo '<<<'
|
||||
make -sj2 || echo '*** Ignoring build failure for CodeQL ***'
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v3
|
||||
with:
|
||||
category: "/language:${{ matrix.language }}"
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -3,6 +3,7 @@
|
||||
/lib/
|
||||
/db/
|
||||
/dbd/
|
||||
/doc/
|
||||
/html/
|
||||
/include/
|
||||
/templates/
|
||||
|
||||
50
.lgtm.yml
50
.lgtm.yml
@@ -1,50 +0,0 @@
|
||||
# Configuration for lgtm.com
|
||||
#
|
||||
|
||||
path_classifiers:
|
||||
test:
|
||||
- exclude: /
|
||||
- test
|
||||
- "modules/*/test*"
|
||||
library:
|
||||
- modules/libcom/src/yacc
|
||||
- modules/libcom/src/flex
|
||||
template:
|
||||
- src/template
|
||||
- modules/ca/src/template
|
||||
- modules/database/src/template
|
||||
|
||||
extraction:
|
||||
cpp:
|
||||
prepare:
|
||||
packages:
|
||||
- "libreadline-dev"
|
||||
index:
|
||||
build_command:
|
||||
- "g++ --version"
|
||||
- "make --version"
|
||||
- "perl --version"
|
||||
- "make -sj2 || echo '*** Build failed, ignored for lgtm ***'"
|
||||
|
||||
python:
|
||||
index:
|
||||
include:
|
||||
- src/tools
|
||||
|
||||
# Interpreted languages to be excluded
|
||||
javascript:
|
||||
index:
|
||||
exclude:
|
||||
- "*"
|
||||
|
||||
# Compiled languages to be excluded
|
||||
java:
|
||||
index:
|
||||
build_command: "echo No Java code in this project"
|
||||
csharp:
|
||||
index:
|
||||
build_command: "echo No C# code in this project"
|
||||
go:
|
||||
index:
|
||||
build_command: "echo No Go code in this project"
|
||||
|
||||
36
.readthedocs.yaml
Normal file
36
.readthedocs.yaml
Normal file
@@ -0,0 +1,36 @@
|
||||
# .readthedocs.yml
|
||||
# Read the Docs configuration file
|
||||
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
|
||||
|
||||
# Required
|
||||
version: 2
|
||||
|
||||
build:
|
||||
os: ubuntu-22.04
|
||||
tools:
|
||||
python: "3.9"
|
||||
apt_packages:
|
||||
- graphviz
|
||||
- rsync
|
||||
jobs:
|
||||
pre_build:
|
||||
- make inc
|
||||
- make -C documentation rtd
|
||||
|
||||
# Build documentation in the documentation/O.Common directory with Sphinx
|
||||
sphinx:
|
||||
configuration: documentation/O.Common/rtd-src/conf.py
|
||||
|
||||
# Build documentation with MkDocs
|
||||
#mkdocs:
|
||||
# configuration: mkdocs.yml
|
||||
|
||||
# Optionally build your docs in additional formats such as PDF and ePub
|
||||
#formats: []
|
||||
|
||||
submodules:
|
||||
exclude: all
|
||||
|
||||
python:
|
||||
install:
|
||||
- requirements: documentation/requirements.txt
|
||||
@@ -45,10 +45,13 @@ FIND_PM = $(wildcard $(EPICS_BASE)/lib/perl/$(1))
|
||||
#---------------------------------------------------------------
|
||||
# EPICS Base build tools and tool flags
|
||||
|
||||
PODTOMD_pl = $(TOOLS)/podToMD.pl
|
||||
PODTOMD = $(PERL) $(PODTOMD_pl)
|
||||
PODTOHTML_pl = $(TOOLS)/podToHtml.pl
|
||||
PODTOHTML_dep = $(PODTOHTML_pl) $(call FIND_PM,EPICS/PodHtml.pm)
|
||||
PODTOHTML = $(PERL) $(PODTOHTML_pl)
|
||||
CONVERTRELEASE = $(PERL) $(call FIND_TOOL,convertRelease.pl)
|
||||
FILTERMAKEFLAGS = $(PERL) $(call FIND_TOOL,filterMakeflags.pl)
|
||||
FULLPATHNAME = $(PERL) $(TOOLS)/fullPathName.pl
|
||||
GENVERSIONHEADER = $(PERL) $(TOOLS)/genVersionHeader.pl $(QUIET_FLAG) $(QUESTION_FLAG)
|
||||
|
||||
@@ -65,6 +68,24 @@ INSTALL_LIBRARY = $(INSTALL)
|
||||
MKMF = $(PERL) $(TOOLS)/mkmf.pl
|
||||
REPLACEVAR = $(PERL) $(TOOLS)/replaceVAR.pl
|
||||
|
||||
#---------------------------------------------------------------
|
||||
# How to portably check the flags to make
|
||||
# GNUmake versions before 4.0 gave different values
|
||||
makeflags := $(shell $(FILTERMAKEFLAGS) $(MAKEFLAGS))
|
||||
define checkflags
|
||||
make-$1 := $(findstring $1,$(makeflags))
|
||||
endef
|
||||
# This is extensible to most single letter flags:
|
||||
$(foreach flag,s q, $(eval $(call checkflags,$(flag))))
|
||||
|
||||
# Silent builds - suppress messages during 'make -s'
|
||||
NOP = :
|
||||
ECHO = @$(if $(make-s),$(NOP),echo)
|
||||
QUIET_FLAG := $(if $(make-s),-q,)
|
||||
|
||||
# Convert 'make -q' flag into '-i' for genVersionHeader.pl
|
||||
QUESTION_FLAG := $(if $(make-q),-i,)
|
||||
|
||||
#---------------------------------------------------------------
|
||||
# tools for cleaning out unwanted files
|
||||
CVSCLEAN = $(call FIND_TOOL,cvsclean.pl)
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
EPICS_CA_MAJOR_VERSION = 4
|
||||
EPICS_CA_MINOR_VERSION = 14
|
||||
EPICS_CA_MAINTENANCE_VERSION = 5
|
||||
EPICS_CA_MAINTENANCE_VERSION = 4
|
||||
|
||||
# Development flag, set to zero for release versions
|
||||
|
||||
|
||||
@@ -81,23 +81,6 @@ FINAL_LOCATION = $(INSTALL_ABSOLUTE)
|
||||
# IOC's view of install path
|
||||
IOCS_APPL_TOP = $(INSTALL_ABSOLUTE)
|
||||
|
||||
#-------------------------------------------------------
|
||||
# How to portably check the flags to make
|
||||
makeflags := $(firstword $(filter-out -,$(filter-out --%,$(MAKEFLAGS))))
|
||||
define checkflags
|
||||
make-$1 := $(findstring $1,$(makeflags))
|
||||
endef
|
||||
# This is extensible to most single letter flags:
|
||||
$(foreach flag,s q, $(eval $(call checkflags,$(flag))))
|
||||
|
||||
# Silent builds - suppress messages during 'make -s'
|
||||
NOP = :
|
||||
ECHO = @$(if $(make-s),$(NOP),echo)
|
||||
QUIET_FLAG := $(if $(make-s),-q,)
|
||||
|
||||
# Convert 'make -q' flag into '-i' for genVersionHeader.pl
|
||||
QUESTION_FLAG := $(if $(make-q),-i,)
|
||||
|
||||
#-------------------------------------------------------
|
||||
ifdef T_A
|
||||
|
||||
@@ -486,4 +469,9 @@ COMMON_INC += $(filter $(COMMON_DIR)/%, \
|
||||
$(foreach dir, $(ALL_SRC_DIRS), \
|
||||
$(addsuffix /$(file), $(dir)))) $(COMMON_DIR)/$(file))))
|
||||
|
||||
COMMON_DOCS += $(filter $(COMMON_DIR)/%, \
|
||||
$(foreach file, $(DOCS), \
|
||||
$(firstword $(wildcard $(file) \
|
||||
$(foreach dir, $(ALL_SRC_DIRS), \
|
||||
$(addsuffix /$(file), $(dir)))) $(COMMON_DIR)/$(file))))
|
||||
endif
|
||||
|
||||
@@ -12,6 +12,7 @@ DBDTORECTYPEH_pl = $(EPICS_BASE_HOST_BIN)/dbdToRecordtypeH.pl
|
||||
DBDTORECTYPEH_dep = $(DBDTORECTYPEH_pl) $(call FIND_PM,DBD/Rec*.pm)
|
||||
DBDTOMENUH_pl = $(EPICS_BASE_HOST_BIN)/dbdToMenuH.pl
|
||||
DBDTOMENUH_dep = $(DBDTOMENUH_pl) $(call FIND_PM,DBD/Menu.pm)
|
||||
DBDTOMD_pl = $(EPICS_BASE_HOST_BIN)/dbdToMD.pl
|
||||
DBDTOHTML_pl = $(EPICS_BASE_HOST_BIN)/dbdToHtml.pl
|
||||
DBDTOHTML_dep = $(DBDTOHTML_pl) $(call FIND_PM,EPICS/Pod*Html.pm)
|
||||
REGRECDEVDRV_pl = $(EPICS_BASE_HOST_BIN)/registerRecordDeviceDriver.pl
|
||||
@@ -21,6 +22,7 @@ REGRECDEVDRV_dep = $(REGRECDEVDRV_pl)
|
||||
DBEXPAND = $(PERL) $(DBDEXPAND_pl)
|
||||
DBTORECORDTYPEH = $(PERL) $(DBDTORECTYPEH_pl)
|
||||
DBTOMENUH = $(PERL) $(DBDTOMENUH_pl)
|
||||
DBDTOMD = $(PERL) $(DBDTOMD_pl)
|
||||
DBDTOHTML = $(PERL) $(DBDTOHTML_pl)
|
||||
REGISTERRECORDDEVICEDRIVER = $(PERL) $(REGRECDEVDRV_pl)
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
EPICS_DATABASE_MAJOR_VERSION = 3
|
||||
EPICS_DATABASE_MINOR_VERSION = 23
|
||||
EPICS_DATABASE_MAINTENANCE_VERSION = 2
|
||||
EPICS_DATABASE_MAINTENANCE_VERSION = 1
|
||||
|
||||
# Development flag, set to zero for release versions
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
EPICS_LIBCOM_MAJOR_VERSION = 3
|
||||
EPICS_LIBCOM_MINOR_VERSION = 23
|
||||
EPICS_LIBCOM_MAINTENANCE_VERSION = 2
|
||||
EPICS_LIBCOM_MAINTENANCE_VERSION = 1
|
||||
|
||||
# Development flag, set to zero for release versions
|
||||
|
||||
|
||||
@@ -197,7 +197,7 @@ endif
|
||||
# build dependancies, clean rule
|
||||
|
||||
inc: $(COMMON_INC) $(INSTALL_INC) $(COMMON_DBDS) $(COMMON_DBDCATS) \
|
||||
$(INSTALL_DBDS) $(INSTALL_DBD_INSTALLS)
|
||||
$(INSTALL_DBDS) $(INSTALL_DBD_INSTALLS) $(COMMON_DOCS)
|
||||
|
||||
build: $(COMMON_DBS) $(INSTALL_DBS) \
|
||||
$(DBDDEPENDS_FILES) $(TARGETS) \
|
||||
@@ -427,6 +427,26 @@ $(foreach file, $(DBD_INSTALLS), $(eval $(call DBD_INSTALLS_template, $(file))))
|
||||
|
||||
.PRECIOUS: $(COMMON_DBDS) $(COMMON_DIR)/%.dbd
|
||||
|
||||
#---------------------------------------------------------------
|
||||
# Markdown files
|
||||
|
||||
$(COMMON_DIR)/%.md: %.dbd.pod $(DBDTOMD_pl)
|
||||
@$(RM) $(notdir $@)
|
||||
$(DBDTOMD) $(DBDFLAGS) -o $(notdir $@) $<
|
||||
@$(MV) $(notdir $@) $@
|
||||
|
||||
$(COMMON_DIR)/%.md: %.pod $(PODTOMD_pl)
|
||||
@$(RM) $(notdir $@)
|
||||
$(PODTOMD) -o $(notdir $@) $<
|
||||
@$(MV) $(notdir $@) $@
|
||||
|
||||
$(COMMON_DIR)/%.md: ../%.pl $(PODTOMD_pl)
|
||||
@$(RM) $(notdir $@)
|
||||
$(PODTOMD) -o $(notdir $@) $<
|
||||
@$(MV) $(notdir $@) $@
|
||||
|
||||
.PRECIOUS: $(COMMON_DIR)/%.md
|
||||
|
||||
#---------------------------------------------------------------
|
||||
# HTML files
|
||||
|
||||
|
||||
@@ -22,7 +22,8 @@ vpath %.cpp $(USR_VPATH) $(ALL_SRC_DIRS)
|
||||
vpath %.rc $(USR_VPATH) $(ALL_SRC_DIRS)
|
||||
vpath %.h $(USR_VPATH) $(ALL_SRC_DIRS)
|
||||
vpath %.hpp $(USR_VPATH) $(ALL_SRC_DIRS)
|
||||
vpath %.html $(USR_VPATH) $(ALL_SRC_DIRS)
|
||||
vpath %.html $(USR_VPATH) $(ALL_SRC_DIRS) $(COMMON_DIR)
|
||||
vpath %.md $(USR_VPATH) $(ALL_SRC_DIRS) $(COMMON_DIR)
|
||||
vpath %.skel.static $(USR_VPATH) $(ALL_SRC_DIRS)
|
||||
vpath %.y $(USR_VPATH) $(ALL_SRC_DIRS)
|
||||
vpath %.l $(USR_VPATH) $(ALL_SRC_DIRS)
|
||||
@@ -128,7 +129,7 @@ endif
|
||||
#---------------------------------------------------------------
|
||||
# Read dependency files
|
||||
|
||||
ifneq (inc,$(strip $(MAKECMDGOALS)))
|
||||
ifneq ($(filter-out inc,$(strip $(MAKECMDGOALS))),)
|
||||
ifneq (,$(strip $(HDEPENDS_FILES)))
|
||||
$(filter-out $(wildcard *$(DEP)), $(HDEPENDS_FILES)): | $(COMMON_INC)
|
||||
-include $(HDEPENDS_FILES)
|
||||
@@ -182,12 +183,12 @@ build: $(OBJSNAME) $(LIBTARGETS) $(PRODTARGETS) $(TESTPRODTARGETS) \
|
||||
$(TARGETS) $(TESTSCRIPTS) $(INSTALL_LIB_INSTALLS)
|
||||
|
||||
inc: $(COMMON_INC) $(INSTALL_INC) $(INSTALL_CONFIGS) $(INSTALLS_CFG) \
|
||||
$(INSTALL_HTMLS) $(INSTALLS_PERL_MODULES) $(INSTALL_SCRIPTS)
|
||||
$(INSTALL_HTMLS) $(INSTALLS_PERL_MODULES) $(INSTALL_SCRIPTS) \
|
||||
$(INSTALL_DOCS)
|
||||
|
||||
buildInstall: \
|
||||
$(INSTALL_PROD) $(INSTALL_MUNCHS) \
|
||||
$(INSTALL_TCLLIBS) $(INSTALL_TCLINDEX) \
|
||||
$(INSTALL_DOCS) \
|
||||
$(INSTALL_OBJS) \
|
||||
$(INSTALL_TEMPLATE) \
|
||||
$(INSTALL_BIN_INSTALLS)
|
||||
@@ -575,6 +576,10 @@ $(INSTALL_INCLUDE)/compiler/$(CMPLR_CLASS)/%: %
|
||||
$(ECHO) "Installing compiler dependent include file $@"
|
||||
@$(INSTALL) -d -m $(INSTALL_PERMISSIONS) $< $(@D)
|
||||
|
||||
$(INSTALL_DOC)/%: $(COMMON_DIR)/%
|
||||
$(ECHO) "Installing generated doc $@"
|
||||
@$(INSTALL) -d -m $(INSTALL_PERMISSIONS) $< $(@D)
|
||||
|
||||
$(INSTALL_DOC)/%: %
|
||||
$(ECHO) "Installing doc $@"
|
||||
@$(INSTALL) -d -m $(INSTALL_PERMISSIONS) $< $(INSTALL_DOC)
|
||||
|
||||
@@ -65,7 +65,7 @@ CXXFLAGS = $($(BUILD_CLASS)_CXXFLAGS) $(POSIX_CXXFLAGS) $(OPT_CXXFLAGS)\
|
||||
$(USR_CXXFLAGS) $(CMD_CXXFLAGS) $(ARCH_DEP_CXXFLAGS) $(CODE_CXXFLAGS)\
|
||||
$(STATIC_CXXFLAGS) $(OP_SYS_CXXFLAGS) $(LIBRARY_SRC_CFLAGS)
|
||||
|
||||
LDFLAGS = $(OPT_LDFLAGS) $(TARGET_LDFLAGS) $(USR_LDFLAGS) $(CMD_LDFLAGS)\
|
||||
LDFLAGS += $(OPT_LDFLAGS) $(TARGET_LDFLAGS) $(USR_LDFLAGS) $(CMD_LDFLAGS)\
|
||||
$(POSIX_LDFLAGS) $(ARCH_DEP_LDFLAGS) $(DEBUG_LDFLAGS) $(OP_SYS_LDFLAGS)\
|
||||
$($(BUILD_CLASS)_LDFLAGS) $(RUNTIME_LDFLAGS) $(CODE_LDFLAGS)
|
||||
|
||||
@@ -102,15 +102,47 @@ OS_CLASS = RTEMS
|
||||
# Operating system compile & link flags
|
||||
OP_SYS_CFLAGS += -D__LINUX_ERRNO_EXTENSIONS__
|
||||
|
||||
OP_SYS_CFLAGS_NET_yes = -DRTEMS_LEGACY_STACK
|
||||
OP_SYS_CFLAGS += $(OP_SYS_CFLAGS_NET_$(RTEMS_HAS_NETWORKING))
|
||||
|
||||
ifeq ($(RTEMS_HAS_POSIX_API),yes)
|
||||
POSIX_CPPFLAGS = -D_GNU_SOURCE -D_DEFAULT_SOURCE
|
||||
# Has RTEMS been built with the internal legacy stack?
|
||||
ifeq ($(RTEMS_LEGACY_NETWORKING_INTERNAL),yes)
|
||||
RTEMS_HAS_NETWORKING = yes
|
||||
RTEMS_NETWORKING = legacy_internal
|
||||
endif
|
||||
|
||||
OP_SYS_LDLIBS_posix_NET_yes = -ltftpfs -lnfs -lz -ltelnetd
|
||||
OP_SYS_LDLIBS_posix_NET_no = -ltftpfs -lbsd -lz
|
||||
# Has RTEMS been built with the legacy stack as a separate package?
|
||||
ifeq ($(RTEMS_LEGACY_NETWORKING),yes)
|
||||
RTEMS_HAS_NETWORKING = yes
|
||||
RTEMS_NETWORKING = legacy
|
||||
endif
|
||||
|
||||
# Has RTEMS been built with the libbsd stack as a separate package?
|
||||
ifeq ($(RTEMS_BSD_NETWORKING),yes)
|
||||
RTEMS_HAS_NETWORKING = yes
|
||||
RTEMS_NETWORKING = bsd
|
||||
endif
|
||||
|
||||
RTEMS_LEGACY_NET_LIB_no=
|
||||
|
||||
# Legacy network with RTEMS 5 and earlier
|
||||
RTEMS_NET_LIB_legacy_internal=-lnfs
|
||||
OP_SYS_CFLAGS_NET_legacy_internal = -DRTEMS_LEGACY_STACK
|
||||
|
||||
# Legacy network with RTEMS 6 is a separate package and library
|
||||
RTEMS_NET_LIB_legacy=-lnfs -lnetworking -lnfs
|
||||
OP_SYS_CFLAGS_NET_legacy = -DRTEMS_LEGACY_STACK
|
||||
|
||||
# LibBSD network with RTEMS 5 and 6 is a separate package and library
|
||||
RTEMS_NET_LIB_bsd=-lbsd
|
||||
OP_SYS_CFLAGS_NET_bsd = -DRTEMS_LIBBSD_STACK
|
||||
|
||||
# Set the networking flags
|
||||
OP_SYS_CFLAGS += $(OP_SYS_CFLAGS_NET_$(RTEMS_NETWORKING))
|
||||
|
||||
POSIX_CPPFLAGS_posix = -D_GNU_SOURCE -D_DEFAULT_SOURCE
|
||||
POSIX_CPPFLAGS = $(POSIX_CPPFLAGS_$(OS_API))
|
||||
|
||||
OP_SYS_LDLIBS_posix_NET_yes = -ltftpfs -lz -ltelnetd
|
||||
OP_SYS_LDLIBS_posix_NET_yes += $(RTEMS_NET_LIB_$(RTEMS_NETWORKING))
|
||||
OP_SYS_LDLIBS_posix_NET_no = -ltftpfs -lz
|
||||
OP_SYS_LDLIBS_score_NET_yes = -lnfs
|
||||
OP_SYS_LDLIBS_score_NET_no = -lnfs
|
||||
OP_SYS_LDLIBS += -lrtemsCom -lCom
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
#
|
||||
# Author: Matt Rippa
|
||||
#
|
||||
RTEMS_BSP = mvme2307
|
||||
RTEMS_TARGET_CPU = powerpc
|
||||
ARCH_DEP_CFLAGS += -DMY_DO_BOOTP=NULL
|
||||
ARCH_DEP_CFLAGS += -DHAVE_PPCBUG
|
||||
@@ -23,3 +22,9 @@ define MUNCH_CMD
|
||||
endef
|
||||
|
||||
include $(CONFIG)/os/CONFIG.Common.RTEMS
|
||||
|
||||
ifeq ($(shell test $(RTEMS_VERSION) -ge 5; echo $$?),0)
|
||||
RTEMS_BSP = mvme2700
|
||||
else
|
||||
RTEMS_BSP = mvme2307
|
||||
endif
|
||||
|
||||
@@ -25,7 +25,7 @@ include $(CONFIG)/os/CONFIG.Common.RTEMS
|
||||
OP_SYS_LDFLAGS += -Wl,-Ttext,0x100000
|
||||
|
||||
# This check must appear after the above include
|
||||
ifeq ($(RTEMS_VERSION),5)
|
||||
ifeq ($(shell test $(RTEMS_VERSION) -ge 5; echo $$?),0)
|
||||
$(info *** This target is not compatible with the configured RTEMS version.)
|
||||
$(info *** Build the RTEMS-pc686 (-qemu) target for RTEMS 5.x)
|
||||
$(error Can't continue)
|
||||
|
||||
@@ -32,7 +32,7 @@ OP_SYS_LDFLAGS += -Wl,-Ttext,0x100000
|
||||
|
||||
|
||||
# This check must appear after the above include
|
||||
ifneq ($(firstword $(subst ., ,$(RTEMS_VERSION))),5)
|
||||
ifeq ($(shell test $(RTEMS_VERSION) -lt 5; echo $$?),0)
|
||||
$(info *** This target is not compatible with the configured RTEMS version.)
|
||||
$(info *** Build the RTEMS-pc386 (-qemu) target for RTEMS 4.x)
|
||||
$(error Can't continue)
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
#-------------------------------------------------------
|
||||
|
||||
# Unix valid build types
|
||||
VALID_BUILDS = Host Ioc Command
|
||||
VALID_BUILDS = $(if $(filter HOST,$(BUILD_CLASS)),Host) Ioc Command
|
||||
|
||||
#-------------------------------------------------------
|
||||
# Unix prefix and suffix definitions
|
||||
|
||||
@@ -1,11 +1,16 @@
|
||||
# Cross Debian 10 with gcc 8.3
|
||||
# Debian 10
|
||||
|
||||
# Include definitions common to all Linux targets
|
||||
include $(CONFIG)/os/CONFIG.Common.linuxCommon
|
||||
include $(CONFIG)/os/CONFIG.Common.linux-x86_64
|
||||
|
||||
ARCH_CLASS = x86_64
|
||||
|
||||
GNU_DIR = /opt/xgcc/gcc-8.3.0-deb10
|
||||
GNU_TARGET = x86_64-deb10-linux-gnu
|
||||
BUILD_CLASS = HOST
|
||||
|
||||
STD_CXXFLAGS = -std=c++17
|
||||
|
||||
ifneq ($(EPICS_HOST_ARCH),$(T_A))
|
||||
# Cross compile
|
||||
GNU_DIR = /opt/xgcc/gcc-8.3.0-deb10
|
||||
GNU_TARGET = x86_64-deb10-linux-gnu
|
||||
SYSROOT = $(GNU_DIR)/$(GNU_TARGET)/sys-root
|
||||
CMPLR_PREFIX = $(GNU_TARGET)-
|
||||
endif
|
||||
|
||||
17
configure/os/CONFIG.Common.deb12-x86_64
Normal file
17
configure/os/CONFIG.Common.deb12-x86_64
Normal file
@@ -0,0 +1,17 @@
|
||||
# Debian 12
|
||||
|
||||
# Include definitions common to all Linux targets
|
||||
include $(CONFIG)/os/CONFIG.Common.linux-x86_64
|
||||
|
||||
BUILD_CLASS = HOST
|
||||
|
||||
STD_CXXFLAGS = -std=c++17
|
||||
|
||||
ifneq ($(EPICS_HOST_ARCH),$(T_A))
|
||||
# Cross compile
|
||||
GNU_DIR = /opt/xgcc/gcc-12.2.0-deb12
|
||||
GNU_TARGET = x86_64-deb12-linux-gnu
|
||||
SYSROOT = $(GNU_DIR)/$(GNU_TARGET)/sys-root
|
||||
CMPLR_PREFIX = $(GNU_TARGET)-
|
||||
ARCH_DEP_LDFLAGS+=-Wl,-rpath-link,$(SYSROOT)/lib/x86_64-linux-gnu
|
||||
endif
|
||||
3
configure/os/CONFIG.deb10-x86_64.Common
Normal file
3
configure/os/CONFIG.deb10-x86_64.Common
Normal file
@@ -0,0 +1,3 @@
|
||||
#CONFIG.$(EPICS_HOST_ARCH).Common is required by build system
|
||||
#Include definitions common to linux hosts
|
||||
include $(CONFIG)/os/CONFIG.linux-x86_64.Common
|
||||
3
configure/os/CONFIG.deb10-x86_64.deb10-x86_64
Normal file
3
configure/os/CONFIG.deb10-x86_64.deb10-x86_64
Normal file
@@ -0,0 +1,3 @@
|
||||
# Include common linux definitions
|
||||
include $(CONFIG)/os/CONFIG.linux-x86.linux-x86
|
||||
GNU_DIR=/usr
|
||||
3
configure/os/CONFIG.deb12-x86_64.Common
Normal file
3
configure/os/CONFIG.deb12-x86_64.Common
Normal file
@@ -0,0 +1,3 @@
|
||||
#CONFIG.$(EPICS_HOST_ARCH).Common is required by build system
|
||||
#Include definitions common to linux hosts
|
||||
include $(CONFIG)/os/CONFIG.linux-x86_64.Common
|
||||
3
configure/os/CONFIG.deb12-x86_64.deb12-x86_64
Normal file
3
configure/os/CONFIG.deb12-x86_64.deb12-x86_64
Normal file
@@ -0,0 +1,3 @@
|
||||
# Include common linux definitions
|
||||
include $(CONFIG)/os/CONFIG.linux-x86.linux-x86
|
||||
GNU_DIR=/usr
|
||||
@@ -2,13 +2,23 @@
|
||||
# Definitions for freebsd-x86_64 host - freebsd-x86_64 target builds
|
||||
# Sites may override these definitions in CONFIG_SITE.freebsd-x86_64.freebsd-x86_64
|
||||
#-------------------------------------------------------
|
||||
GNU_DIR=/usr/local
|
||||
GNU_DIR=/usr
|
||||
|
||||
# Include common gnu compiler definitions
|
||||
include $(CONFIG)/CONFIG.gnuCommon
|
||||
|
||||
GNU_BIN = $(GNU_DIR)/bin
|
||||
GNU_LIB = $(GNU_DIR)/lib
|
||||
|
||||
CMPLR_CLASS = clang
|
||||
|
||||
CC = $(GNU_BIN)/$(CMPLR_PREFIX)cc$(CMPLR_SUFFIX)
|
||||
CCC = $(GNU_BIN)/$(CMPLR_PREFIX)c++$(CMPLR_SUFFIX)
|
||||
CPP = $(CC) -x c -E
|
||||
|
||||
GNU_LDLIBS_YES =
|
||||
|
||||
STATIC_LDFLAGS_YES= -Wl,-Bstatic
|
||||
STATIC_LDFLAGS_NO=
|
||||
STATIC_LDLIBS_YES= -Wl,-Bdynamic
|
||||
STATIC_LDLIBS_NO=
|
||||
|
||||
|
||||
2
configure/os/CONFIG_SITE.Common.deb12-x86_64
Normal file
2
configure/os/CONFIG_SITE.Common.deb12-x86_64
Normal file
@@ -0,0 +1,2 @@
|
||||
# Debian 10
|
||||
COMMANDLINE_LIBRARY=READLINE
|
||||
@@ -18,6 +18,8 @@ GNU_DIR = $(SYSROOT)$(TOOLSET_DIR)
|
||||
TARGET_CPPFLAGS += $(SYSROOT:%=--sysroot=%)
|
||||
TARGET_LDFLAGS += $(SYSROOT:%=--sysroot=%)
|
||||
|
||||
ifeq ($(filter SL% RHEL%,$(T_A)),)
|
||||
VALID_BUILDS = Ioc Command
|
||||
endif
|
||||
# backward compatibility: Keep unversioned libs
|
||||
# in order to prevent dynamic linking problems
|
||||
# when minor changes increment *_MAINTENANCE_VERSION
|
||||
SHRLIB_SUFFIX = $(SHRLIB_SUFFIX_BASE)
|
||||
LOADABLE_SHRLIB_SUFFIX = $(SHRLIB_SUFFIX_BASE)
|
||||
|
||||
@@ -21,8 +21,9 @@ CROSS_COMPILER_TARGET_ARCHS += windows-x64
|
||||
#CROSS_COMPILER_TARGET_ARCHS += yocto21-aarch64
|
||||
CROSS_COMPILER_TARGET_ARCHS += yocto40-aarch64
|
||||
|
||||
# Debian 10
|
||||
# Debian
|
||||
CROSS_COMPILER_TARGET_ARCHS += deb10-x86_64
|
||||
CROSS_COMPILER_TARGET_ARCHS += deb12-x86_64
|
||||
|
||||
# Newer DeltaTau PowerPMAC
|
||||
CROSS_COMPILER_TARGET_ARCHS += gcc8-ppc4xxFP
|
||||
|
||||
@@ -30,9 +30,26 @@ MSVC_VER = _MSC_VER
|
||||
#ifdef __rtems__
|
||||
#include <rtems/score/cpuopts.h>
|
||||
# if __RTEMS_MAJOR__>=5
|
||||
OS_API = posix
|
||||
OS_API = posix
|
||||
# else
|
||||
OS_API = score
|
||||
OS_API = score
|
||||
# endif
|
||||
# if defined(RTEMS_NETWORKING)
|
||||
/* legacy stack circa RTEMS <= 5 and networking internal to RTEMS */
|
||||
RTEMS_LEGACY_NETWORKING_INTERNAL = yes
|
||||
# else
|
||||
# if !defined(__has_include)
|
||||
/* assume old GCC implies RTEMS < 5 with mis-configured BSP */
|
||||
# error rebuild BSP with --enable-network
|
||||
# elif __has_include(<machine/rtems-net-legacy.h>)
|
||||
/* legacy stack circa RTEMS > 5 */
|
||||
RTEMS_LEGACY_NETWORKING = yes
|
||||
# elif __has_include(<machine/rtems-bsd-version.h>)
|
||||
/* libbsd stack */
|
||||
RTEMS_BSD_NETWORKING = yes
|
||||
# else
|
||||
# error Cannot determine RTEMS network configuration
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
@@ -51,4 +68,3 @@ COMMANDLINE_LIBRARY ?= $(strip $(if $(wildcard $(if $(GNU_DIR),$(GNU_DIR)/includ
|
||||
#if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE>2
|
||||
OP_SYS_CPPFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2
|
||||
#endif
|
||||
|
||||
|
||||
3
documentation/.gitignore
vendored
3
documentation/.gitignore
vendored
@@ -1,3 +0,0 @@
|
||||
*.db
|
||||
epics-base.tag
|
||||
html/
|
||||
@@ -759,10 +759,10 @@ WARN_LOGFILE =
|
||||
# spaces.
|
||||
# Note: If this tag is empty the current directory is searched.
|
||||
|
||||
INPUT = ../mainpage.dox \
|
||||
../RELEASE_NOTES.md \
|
||||
INPUT = ../RELEASE_NOTES.md \
|
||||
../README.md \
|
||||
@TOP@/include
|
||||
@TOP@/include \
|
||||
@TOP@/doc
|
||||
|
||||
# This tag can be used to specify the character encoding of the source files
|
||||
# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
|
||||
@@ -1833,7 +1833,7 @@ MAN_LINKS = NO
|
||||
# captures the structure of the code including all documentation.
|
||||
# The default value is: NO.
|
||||
|
||||
GENERATE_XML = NO
|
||||
GENERATE_XML = YES
|
||||
|
||||
# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
|
||||
# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
|
||||
@@ -1841,7 +1841,7 @@ GENERATE_XML = NO
|
||||
# The default directory is: xml.
|
||||
# This tag requires that the tag GENERATE_XML is set to YES.
|
||||
|
||||
XML_OUTPUT = xml
|
||||
XML_OUTPUT = @RTD_SRC@/xml
|
||||
|
||||
# If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program
|
||||
# listings (including syntax highlighting and cross-referencing information) to
|
||||
@@ -1946,7 +1946,7 @@ ENABLE_PREPROCESSING = YES
|
||||
# The default value is: NO.
|
||||
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
|
||||
|
||||
MACRO_EXPANSION = NO
|
||||
MACRO_EXPANSION = YES
|
||||
|
||||
# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
|
||||
# the macro expansion is limited to the macros specified with the PREDEFINED and
|
||||
@@ -1986,7 +1986,17 @@ INCLUDE_FILE_PATTERNS =
|
||||
# recursively expanded use the := operator instead of the = operator.
|
||||
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
|
||||
|
||||
PREDEFINED = __cplusplus
|
||||
PREDEFINED = __cplusplus \
|
||||
LIBCOM_API \
|
||||
DBCORE_API \
|
||||
LIBCA_API \
|
||||
DBRECSTD_API \
|
||||
EPICS_ALWAYS_INLINE \
|
||||
epicsShareExtern \
|
||||
epicsShareClass \
|
||||
epicsShareFunc \
|
||||
epicsShareAPI \
|
||||
epicsStdCall
|
||||
|
||||
# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
|
||||
# tag can be used to specify a list of macro names that should be expanded. The
|
||||
|
||||
4
documentation/HEADER_h.md
Normal file
4
documentation/HEADER_h.md
Normal file
@@ -0,0 +1,4 @@
|
||||
# @HEADER@.h
|
||||
|
||||
```{doxygenfile} @HEADER@.h
|
||||
```
|
||||
@@ -1,34 +0,0 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
||||
<title>Known Problems in EPICS 7.0.3.1</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1 style="text-align: center">EPICS 7.0.3.1: Known Problems</h1>
|
||||
|
||||
<p>Any patch files linked below should be applied at the root of the
|
||||
base-7.0.3.1 tree. Download them, then use the GNU Patch program as
|
||||
follows:</p>
|
||||
|
||||
<blockquote><pre>% <b>cd <i>/path/to/</i>base-7.0.3.1</b>
|
||||
% <b>patch -p1 < <i>/path/to/</i>file.patch</b></pre></blockquote>
|
||||
|
||||
<p>The following problems were known by the developers at the time of this
|
||||
release:</p>
|
||||
|
||||
<ul>
|
||||
|
||||
<!-- Items added after release should be formatted thusly:
|
||||
<li>YYYY-MM-DD: Description of problem.
|
||||
<a href="fix.patch">This patch</a> fixes the problem.
|
||||
...</li>
|
||||
-->
|
||||
|
||||
</ul>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -7,25 +7,168 @@ EXPAND_ME += EPICS_REVISION
|
||||
EXPAND_ME += EPICS_MODIFICATION
|
||||
EXPAND_ME += EPICS_PATCH_LEVEL
|
||||
EXPAND_ME += OS_CLASS CMPLR_CLASS
|
||||
EXPAND_ME += RTD_SRC
|
||||
|
||||
HTMLS += ComponentReference.html
|
||||
DOXYGEN ?= doxygen
|
||||
|
||||
TARGETS += doxygen
|
||||
libcom_HEADERS += adjustment
|
||||
libcom_HEADERS += alarm
|
||||
libcom_HEADERS += alarmString
|
||||
libcom_HEADERS += asTrapWrite
|
||||
libcom_HEADERS += bucketLib
|
||||
libcom_HEADERS += cantProceed
|
||||
libcom_HEADERS += compilerDependencies
|
||||
libcom_HEADERS += cvtFast
|
||||
libcom_HEADERS += dbmf
|
||||
libcom_HEADERS += devLibVME
|
||||
libcom_HEADERS += devLibVMEImpl
|
||||
libcom_HEADERS += ellLib
|
||||
libcom_HEADERS += envDefs
|
||||
libcom_HEADERS += epicsAlgorithm
|
||||
libcom_HEADERS += epicsAssert
|
||||
libcom_HEADERS += epicsAtomic
|
||||
libcom_HEADERS += epicsEvent
|
||||
libcom_HEADERS += epicsExit
|
||||
libcom_HEADERS += epicsExport
|
||||
libcom_HEADERS += epicsGeneralTime
|
||||
libcom_HEADERS += epicsGuard
|
||||
libcom_HEADERS += epicsMessageQueue
|
||||
libcom_HEADERS += epicsMutex
|
||||
libcom_HEADERS += epicsReadline
|
||||
libcom_HEADERS += epicsRingBytes
|
||||
libcom_HEADERS += epicsRingPointer
|
||||
libcom_HEADERS += epicsSignal
|
||||
libcom_HEADERS += epicsSpin
|
||||
libcom_HEADERS += epicsStackTrace
|
||||
libcom_HEADERS += epicsStdio
|
||||
libcom_HEADERS += epicsStdlib
|
||||
libcom_HEADERS += epicsString
|
||||
libcom_HEADERS += epicsTempFile
|
||||
libcom_HEADERS += epicsThread
|
||||
libcom_HEADERS += epicsTime
|
||||
libcom_HEADERS += epicsTypes
|
||||
libcom_HEADERS += epicsUnitTest
|
||||
libcom_HEADERS += errlog
|
||||
libcom_HEADERS += freeList
|
||||
libcom_HEADERS += iocsh
|
||||
libcom_HEADERS += ipAddrToAsciiAsynchronous
|
||||
libcom_HEADERS += logClient
|
||||
libcom_HEADERS += macLib
|
||||
libcom_HEADERS += osiPoolStatus
|
||||
libcom_HEADERS += osiProcess
|
||||
libcom_HEADERS += osiSock
|
||||
libcom_HEADERS += postfix
|
||||
libcom_HEADERS += shareLib
|
||||
libcom_HEADERS += testMain
|
||||
libcom_HEADERS += yajl_alloc
|
||||
libcom_HEADERS += yajl_common
|
||||
libcom_HEADERS += yajl_gen
|
||||
libcom_HEADERS += yajl_parse
|
||||
|
||||
DOXYGEN = doxygen
|
||||
ME = documentation/O.$(T_A)/html
|
||||
GH_FILES = $(ME)/ $(ME)/.nojekyll $(ME)/*.* $(ME)/*/*.*
|
||||
database_HEADERS += chfPlugin
|
||||
database_HEADERS += dbChannel
|
||||
database_HEADERS += dbCommon
|
||||
database_HEADERS += dbDefs
|
||||
database_HEADERS += dbExtractArray
|
||||
database_HEADERS += dbLink
|
||||
database_HEADERS += dbServer
|
||||
database_HEADERS += dbState
|
||||
database_HEADERS += dbStaticLib
|
||||
database_HEADERS += dbUnitTest
|
||||
database_HEADERS += devLib
|
||||
database_HEADERS += devSup
|
||||
database_HEADERS += drvSup
|
||||
database_HEADERS += initHooks
|
||||
|
||||
record_HEADERS += aaiRecord
|
||||
record_HEADERS += aaoRecord
|
||||
record_HEADERS += aiRecord
|
||||
record_HEADERS += aoRecord
|
||||
record_HEADERS += aSubRecord
|
||||
record_HEADERS += biRecord
|
||||
record_HEADERS += boRecord
|
||||
record_HEADERS += calcRecord
|
||||
record_HEADERS += calcoutRecord
|
||||
record_HEADERS += compressRecord
|
||||
record_HEADERS += dfanoutRecord
|
||||
record_HEADERS += eventRecord
|
||||
record_HEADERS += fanoutRecord
|
||||
record_HEADERS += histogramRecord
|
||||
record_HEADERS += int64inRecord
|
||||
record_HEADERS += int64outRecord
|
||||
record_HEADERS += longinRecord
|
||||
record_HEADERS += longoutRecord
|
||||
record_HEADERS += lsiRecord
|
||||
record_HEADERS += lsoRecord
|
||||
record_HEADERS += mbbiRecord
|
||||
record_HEADERS += mbbiDirectRecord
|
||||
record_HEADERS += mbboRecord
|
||||
record_HEADERS += mbboDirectRecord
|
||||
record_HEADERS += permissiveRecord
|
||||
record_HEADERS += printfRecord
|
||||
record_HEADERS += selRecord
|
||||
record_HEADERS += seqRecord
|
||||
record_HEADERS += stateRecord
|
||||
record_HEADERS += stringinRecord
|
||||
record_HEADERS += stringoutRecord
|
||||
record_HEADERS += subRecord
|
||||
record_HEADERS += subArrayRecord
|
||||
record_HEADERS += waveformRecord
|
||||
|
||||
menu_HEADERS += menuAlarmSevr
|
||||
menu_HEADERS += menuAlarmStat
|
||||
menu_HEADERS += menuConvert
|
||||
menu_HEADERS += menuFtype
|
||||
menu_HEADERS += menuIvoa
|
||||
menu_HEADERS += menuOmsl
|
||||
menu_HEADERS += menuPini
|
||||
menu_HEADERS += menuPost
|
||||
menu_HEADERS += menuPriority
|
||||
menu_HEADERS += menuScan
|
||||
menu_HEADERS += menuSimm
|
||||
menu_HEADERS += menuYesNo
|
||||
|
||||
HEADER_TYPES = libcom database record menu
|
||||
|
||||
HEADER_MD_FILES = $(foreach t, $(HEADER_TYPES), \
|
||||
$(addsuffix _h.md, $($t_HEADERS)))
|
||||
API_RST_FILES = $(addsuffix -api.rst, $(HEADER_TYPES))
|
||||
|
||||
RTD_SRC = $(COMMON_DIR)/rtd-src
|
||||
|
||||
DOCS += README.md
|
||||
DOCS += RELEASE_NOTES.md
|
||||
|
||||
include $(TOP)/configure/RULES
|
||||
|
||||
doxygen: Doxyfile ../mainpage.dox $(INSTALL_HTMLS)
|
||||
$(HEADER_MD_FILES): %_h.md: ../HEADER_h.md
|
||||
$(EXPAND_TOOL) -t $(INSTALL_LOCATION) -DHEADER=$* $< $@
|
||||
|
||||
$(API_RST_FILES): %-api.rst: ../%-API.rst
|
||||
@$(RM) $@
|
||||
@$(ECHO) Creating $@
|
||||
@$(CP) $< $@
|
||||
@$(foreach h, $($*_HEADERS), \
|
||||
echo " $h_h.rst" >> $@;)
|
||||
|
||||
ifndef T_A
|
||||
doxygen rtd sphinx: inc
|
||||
$(MAKE) -C O.$(EPICS_HOST_ARCH) $@
|
||||
else
|
||||
|
||||
doxygen: Doxyfile
|
||||
@$(MKDIR) $(RTD_SRC)
|
||||
$(DOXYGEN)
|
||||
rsync -av $(TOP)/html/ html/
|
||||
|
||||
.PHONY: doxygen
|
||||
rtd: doxygen $(API_RST_FILES) $(HEADER_MD_FILES)
|
||||
rsync -av $(INSTALL_DOC)/ $(RTD_SRC)/
|
||||
rsync -av $(HEADER_MD_FILES) $(RTD_SRC)/
|
||||
rsync -av $(API_RST_FILES) $(RTD_SRC)/
|
||||
rsync -av ../index.rst ../conf.py $(RTD_SRC)/
|
||||
|
||||
commit: doxygen
|
||||
$(TOUCH) html/.nojekyll
|
||||
(cd $(TOP) && $(CURDIR)/../commit-gh.sh $(GH_FILES))
|
||||
sphinx: rtd
|
||||
cd $(COMMON_DIR); $(PYTHON) -m sphinx rtd-src readthedocs
|
||||
rsync -av $(COMMON_DIR)/readthedocs $(INSTALL_HTML)/
|
||||
endif
|
||||
|
||||
.PHONY: commit
|
||||
.PHONY: doxygen rtd sphinx
|
||||
|
||||
@@ -1,27 +1,7 @@
|
||||
# Installation Instructions {#install}
|
||||
# Installation instructions
|
||||
|
||||
## EPICS Base Release 7.0.x
|
||||
|
||||
-----
|
||||
|
||||
### Table of Contents
|
||||
|
||||
- [What is EPICS base?](#what-is-epics-base?)
|
||||
- [What is new in this release?](#what-is-new-in-this-release?)
|
||||
- [Copyright](#copyright)
|
||||
- [Supported platforms](#supported-platforms)
|
||||
- [Supported compilers](#supported-compilers)
|
||||
- [Software requirements](#software-requirements)
|
||||
- [Host system storage requirements](#host-system-storage-requirements)
|
||||
- [Documentation](#documentation)
|
||||
- [Directory Structure](#directory-structure)
|
||||
- [Site-specific build configuration](#site-specific-build-configuration)
|
||||
- [Building EPICS base](#building-epics-base)
|
||||
- [Example application and extension](#example-application-and-extension)
|
||||
- [Multiple host platforms](#multiple-host-platforms)
|
||||
|
||||
-----
|
||||
|
||||
### What is EPICS base?
|
||||
|
||||
The Experimental Physics and Industrial Control Systems (EPICS) is an
|
||||
@@ -36,8 +16,8 @@ interfaces) of various types.
|
||||
|
||||
### What is new in this release?
|
||||
|
||||
Please check the `documentation/RELEASE_NOTES.md` file for
|
||||
description of changes and release migration details.
|
||||
Please check the [release notes](RELEASE_NOTES.md)
|
||||
for description of changes and release migration details.
|
||||
|
||||
### Copyright
|
||||
|
||||
@@ -80,8 +60,7 @@ executable must be found through your normal search path.
|
||||
|
||||
#### Unzip and tar (Winzip on WIN32 systems)
|
||||
|
||||
You must have tools available to unzip and untar the EPICS base
|
||||
distribution file.
|
||||
You may need tools to unzip and untar the EPICS base distribution file.
|
||||
|
||||
#### Target systems
|
||||
|
||||
@@ -91,7 +70,7 @@ running as processes on the host platform.
|
||||
|
||||
#### vxWorks
|
||||
|
||||
You must have vxWorks 6.8 or later installed if any of your target
|
||||
You must have vxWorks 6.8 or 6.9 installed if any of your target
|
||||
systems are vxWorks systems; the C++ compiler from older versions cannot
|
||||
compile recently developed code. The vxWorks installation provides the
|
||||
cross-compiler and header files needed to build for these targets. The
|
||||
@@ -120,16 +99,10 @@ readline is available and will then use it. RTEMS targets may be
|
||||
configured to use `LIBTECLA` if available, and on vxWorks the OS's
|
||||
ledLib line-editing library is normally used.
|
||||
|
||||
### Host system storage requirements
|
||||
|
||||
The compressed tar file is approximately 3 MB in size. The
|
||||
distribution source tree takes up approximately 21 MB. A 64-bit host
|
||||
architecture may need around 610 MB to compile, while cross-compiled
|
||||
targets are somewhat smaller.
|
||||
|
||||
### Documentation
|
||||
|
||||
EPICS documentation is available through the [EPICS website](https://epics.anl.gov/) at Argonne.
|
||||
EPICS documentation is available from the
|
||||
[EPICS Documentation Website](https://docs.epics-controls.org/).
|
||||
|
||||
Release specific documentation can also be found in the
|
||||
`base/documentation` directory of the distribution.
|
||||
@@ -143,8 +116,10 @@ Release specific documentation can also be found in the
|
||||
base/configure Build rules and OS-independent config files
|
||||
base/configure/os OS-dependent build config files
|
||||
base/documentation Distribution documentation
|
||||
base/src Source code in various subdirectories
|
||||
base/src Source code for templates and build tools
|
||||
base/modules Source code for distribution submodules
|
||||
base/startup Scripts for setting up path and environment
|
||||
base/test Unit tests for build tools
|
||||
```
|
||||
|
||||
#### Directories created by the build
|
||||
@@ -158,7 +133,8 @@ configuration variable if that has been set.
|
||||
cfg Installed build configuration files
|
||||
db Installed database files
|
||||
dbd Installed database definition files
|
||||
html Installed html documentation
|
||||
doc Installed Markdown documentation
|
||||
html Installed HTML documentation
|
||||
include Installed header files
|
||||
include/os Installed OS-specific header files in subdirs
|
||||
include/compiler Installed compiler-specific header files
|
||||
@@ -169,12 +145,11 @@ configuration variable if that has been set.
|
||||
|
||||
#### `base/documentation` Directory
|
||||
|
||||
This contains documents on how to setup, build, and install EPICS.
|
||||
This contains EPICS reference documentation.
|
||||
|
||||
```
|
||||
README.md This file
|
||||
RELEASE_NOTES.md Notes on release changes
|
||||
KnownProblems.html List of known problems and workarounds
|
||||
```
|
||||
|
||||
#### `base/startup` Directory
|
||||
@@ -272,8 +247,7 @@ need C and C++ compilers in your search path. When building base you
|
||||
must have `echo` in your search path. For Unix host builds you will
|
||||
also need `cp`, `rm`, `mv`, and `mkdir` in your search path. Some Unix
|
||||
systems may also need `ar` and `ranlib`, and the C/C++ compilers may
|
||||
require `as` and `ld` in your path. On Solaris systems you need
|
||||
`uname` in your path.
|
||||
require `as` and `ld` in your path.
|
||||
|
||||
* **`LD_LIBRARY_PATH`**
|
||||
EPICS shared libraries and executables normally contain the full path
|
||||
@@ -290,7 +264,6 @@ Shared libraries are now built by default on all Unix type hosts.
|
||||
|
||||
To configure EPICS, you may want to modify some values set in the
|
||||
following files:
|
||||
>>>>>>> mirror/3.15
|
||||
|
||||
```
|
||||
configure/CONFIG_SITE Build settings. Specify target archs.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# EPICS 7.0 Release Notes {#releasenotes}
|
||||
# EPICS 7.0 Release Notes
|
||||
|
||||
These release notes describe changes that have been made since the previous
|
||||
release of this series of EPICS Base. **Note that changes which were merged up
|
||||
@@ -22,12 +22,10 @@ should also be read to understand what has changed since earlier releases:
|
||||
|
||||
## Changes made on the 7.0 branch since 7.0.8.1
|
||||
|
||||
### Allow to load the same alias multiple times
|
||||
### DBE_PROPERTY event rate changed
|
||||
|
||||
Aliases can now be defined multiple times as long as they still refer to the
|
||||
same record, unless the shell variable dbRecordsOnceOnly is set.
|
||||
This allows to load database files multiple times, even if they contain
|
||||
alias definitions.
|
||||
Updating property fields now only post DBE_PROPERTY events if the
|
||||
field actually changed.
|
||||
|
||||
### Allow users to delete previously created records from the database
|
||||
|
||||
@@ -45,8 +43,6 @@ For example this will remove the record named "unwanted":
|
||||
record("#", "unwanted") { }
|
||||
```
|
||||
|
||||
-----
|
||||
|
||||
## EPICS Release 7.0.8.1
|
||||
|
||||
### Limit to `_FORTIFY_SOURCE=2`
|
||||
@@ -149,62 +145,6 @@ record("*", "myrec") {} # allowed
|
||||
record(ai, "myrec") {} # error
|
||||
```
|
||||
|
||||
### PROC field changed to ASL0
|
||||
|
||||
The PROC field has been changed from access security level ASL1 to ASL0.
|
||||
This allows users to trigger processing a record without having the rights
|
||||
to reconfigure the records.
|
||||
|
||||
### bi "Raw Soft Channel" use MASK
|
||||
|
||||
If MASK is non-zero, The raw device support will now apply MASK to the
|
||||
value read into RVAL.
|
||||
eg. allows extraction of a bit from an input integer.
|
||||
|
||||
```
|
||||
record(longin, "integer") {
|
||||
field(VAL, "0xff")
|
||||
}
|
||||
record(bi, "bit1") {
|
||||
field(DESC, "extract bit 1")
|
||||
field(DTYP, "Raw Soft Channel")
|
||||
field(INP , "integer")
|
||||
field(MASK, "0x2")
|
||||
field(ZNAM, "Clear")
|
||||
field(ONAM, "Set")
|
||||
}
|
||||
```
|
||||
|
||||
### ANSI escapes in stderr
|
||||
|
||||
ANSI escape charactor sequences may now be printed to the stderr stream.
|
||||
These escapes will appear in logs captured from that stream.
|
||||
Tools which parse and/or render these logs may need to be adjusted to
|
||||
either strip out the escapes, or to translate them into markup.
|
||||
(see [ansi2html](https://pypi.org/project/ansi2html/) for example)
|
||||
|
||||
### Allow explicit append with `dbRecordsOnceOnly!=0`
|
||||
|
||||
Previously setting `dbRecordsOnceOnly!=0` prevented any further changes to a record via a .db file. eg.
|
||||
|
||||
```
|
||||
record(ai, "myrec") {}
|
||||
```
|
||||
|
||||
`dbRecordsOnceOnly!=0` previously disallowed appending fields with either form:
|
||||
|
||||
```
|
||||
record("*", "myrec") {} # error
|
||||
record(ai, "myrec") {} # error
|
||||
```
|
||||
|
||||
Beginning with this release, `dbRecordsOnceOnly!=0` allows appending when explicitly intended (when record type is `"*"`).
|
||||
|
||||
```
|
||||
record("*", "myrec") {} # allowed
|
||||
record(ai, "myrec") {} # error
|
||||
```
|
||||
|
||||
### Add `$EPICS_CLI_TIMEOUT`
|
||||
|
||||
Add support for CA tools timeout from environment variable `$EPICS_CLI_TIMEOUT`
|
||||
@@ -780,33 +720,6 @@ make INSTALL_LOCATION=/tmp/build FINAL_LOCATION=/usr/lib/epics
|
||||
`FINAL_LOCATION` is now correctly used in systemd and sysv init scripts
|
||||
`caRepeater.service`, `S99caRepeater`, and `S99logServer`.
|
||||
|
||||
### epicsEnvShow accepts glob pattern
|
||||
|
||||
The optional argument to epicsEnvShow can now be a glob pattern.
|
||||
|
||||
### New function `epicsStrnGlobMatch()`
|
||||
|
||||
The function `epicsStrnGlobMatch(char* str, size_t len, char* pattern)`
|
||||
works exactly the same as `epicsStrGlobMatch()` but takes an additional
|
||||
length arguments which limits the number of characters of `str` to match.
|
||||
|
||||
### Glob pattern allowed in `var` command
|
||||
|
||||
When used with one argument, the `var` command can be used with a glob pattern
|
||||
for printing matching variables.
|
||||
|
||||
### Fix for input links marked "special"
|
||||
|
||||
The calcout record (and a number of synApps record types) marks its input
|
||||
link fields with the attribute `special(SPC_MOD)` and provides code in
|
||||
the record's `special()` routine to reinitialize the related value field
|
||||
whenever the input link field is set to a numeric constant. Unfortunately the
|
||||
changes to the link handling code broke this behaviour (reported as Launchpad
|
||||
[bug #1824277](https://bugs.launchpad.net/epics-base/+bug/1824277))
|
||||
back in the Base 3.16.1 release. This issue has been fixed in Base, although
|
||||
external record types may require some fixing to ensure they are correctly
|
||||
checking for and initializing the link in their `special()` routine.
|
||||
|
||||
### IOCsh sets `${PWD}`
|
||||
|
||||
IOC shell will now ensure `${PWD}` is set on startup,
|
||||
@@ -896,33 +809,6 @@ that the variables referenced by output pointers are initialized.
|
||||
```
|
||||
|
||||
|
||||
### Timeouts for Unit Test Programs
|
||||
|
||||
The unit test programs that are run by the `make runtests` or `make tapfiles`
|
||||
commands get executed by a `.t` wrapper script which is normally generated by
|
||||
the EPICS `makeTestfile.pl` program. Those generated wrapper scripts now
|
||||
impose a time-limit on the test program they execute, and will kill it if it
|
||||
runs for longer than 500 seconds (8 minutes 20) without exiting. That
|
||||
time-limit can be changed for any such test by modifying the Makefile which
|
||||
creates and runs the `.t` wrapper script.
|
||||
|
||||
Setting the environment variable `EPICS_UNITTEST_TIMEOUT` to the desired
|
||||
number of seconds while the Makefile is generating the test script changes the
|
||||
timeout in that script. For example:
|
||||
|
||||
```
|
||||
TESTSCRIPTS_HOST += hourLongTest.t
|
||||
hourLongTest.t: export EPICS_UNITTEST_TIMEOUT=3600
|
||||
```
|
||||
|
||||
When selecting such a timeout remember that different Continuous Integration
|
||||
systems such as GitHub Actions and Appveyor run on processors with different
|
||||
speeds, so allow enough head-room for slower systems to complete the test.
|
||||
|
||||
Test programs written directly in Perl as a `.plt` script should implement a
|
||||
similar timeout for themselves. The "netget" test in Base does this in a way
|
||||
that works on Windows as well as Unix-like hosts.
|
||||
|
||||
### Timeouts for Unit Test Programs
|
||||
|
||||
The unit test programs that are run by the `make runtests` or `make tapfiles`
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
#!/bin/sh
|
||||
set -e -x
|
||||
# Usage: commit-gh <sub-directory-prefix> <files...>
|
||||
#
|
||||
# Creates a commit containing only the files in the sub-directory provided as an argument
|
||||
#
|
||||
# Does not disturb the working copy or index
|
||||
|
||||
prefix="$1"
|
||||
shift
|
||||
|
||||
# Commit to this branch
|
||||
BRANCH=refs/heads/gh-pages
|
||||
|
||||
# Use the main branch description as the gh-pages commit message
|
||||
MSG=`git describe --tags --always`
|
||||
|
||||
# Scratch space
|
||||
TDIR=`mktemp -d -p $PWD`
|
||||
|
||||
# Automatic cleanup of scratch space
|
||||
trap 'rm -rf $TDIR' INT TERM QUIT EXIT
|
||||
|
||||
export GIT_INDEX_FILE="$TDIR/index"
|
||||
|
||||
# Add listed files to a new (empty) index
|
||||
git update-index --add "$@"
|
||||
|
||||
# Write the index into the repo, get tree hash
|
||||
TREE=`git write-tree --prefix="$prefix"`
|
||||
|
||||
echo "TREE $TREE"
|
||||
git cat-file -p $TREE
|
||||
|
||||
# Create a commit with our new tree
|
||||
# Reference current branch head as parent (if any)
|
||||
CMT=`git commit-tree -m "$MSG" $TREE`
|
||||
|
||||
echo "COMMIT $CMT"
|
||||
git cat-file -p $CMT
|
||||
|
||||
# Update the branch with the new commit tree hash
|
||||
git update-ref $BRANCH $CMT
|
||||
|
||||
echo "Done"
|
||||
130
documentation/conf.py
Normal file
130
documentation/conf.py
Normal file
@@ -0,0 +1,130 @@
|
||||
# Configuration file for the Sphinx documentation builder.
|
||||
#
|
||||
# This file only contains a selection of the most common options. For a full
|
||||
# list see the documentation:
|
||||
# http://www.sphinx-doc.org/en/master/config
|
||||
|
||||
# -- Path setup --------------------------------------------------------------
|
||||
|
||||
# If extensions (or modules to document with autodoc) are in another directory,
|
||||
# add these directories to sys.path here. If the directory is relative to the
|
||||
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
||||
#
|
||||
import os
|
||||
import sys
|
||||
|
||||
sys.path.insert(0, os.path.abspath("."))
|
||||
|
||||
# -- Project information -----------------------------------------------------
|
||||
|
||||
project = "EPICS Base Documentation"
|
||||
copyright = "EPICS Controls"
|
||||
author = "The EPICS Collaboration"
|
||||
|
||||
# -- General configuration ---------------------------------------------------
|
||||
|
||||
# Add any Sphinx extension module names here, as strings. They can be
|
||||
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
||||
# ones.
|
||||
|
||||
extensions = [
|
||||
"hoverxref.extension",
|
||||
"breathe",
|
||||
"sphinx.ext.mathjax",
|
||||
"sphinx.ext.ifconfig",
|
||||
"sphinx.ext.graphviz",
|
||||
"sphinx_copybutton",
|
||||
"sphinx.ext.intersphinx",
|
||||
'myst_parser',
|
||||
]
|
||||
|
||||
# Setup the breathe extension
|
||||
breathe_projects = {"epics-base": "xml"}
|
||||
|
||||
breathe_default_project = "epics-base"
|
||||
|
||||
# Tell sphinx what the primary language being documented is.
|
||||
primary_domain = "cpp"
|
||||
|
||||
# Tell sphinx what the pygments highlight language should be.
|
||||
highlight_language = "cpp"
|
||||
|
||||
# Add any paths that contain templates here, relative to this directory.
|
||||
# templates_path = ()
|
||||
|
||||
# List of patterns, relative to source directory, that match files and
|
||||
# directories to ignore when looking for source files.
|
||||
# This pattern also affects html_static_path and html_extra_path.
|
||||
exclude_patterns = ["_build", "Thumbs.db", ".DS_Store", "O.*", "venv"]
|
||||
|
||||
# Intersphinx links to subprojects
|
||||
intersphinx_mapping = {
|
||||
"epics": ("https://docs.epics-controls.org/en/latest/", None),
|
||||
}
|
||||
intersphinx_disabled_reftypes = ["*"]
|
||||
hoverxref_role_types = {
|
||||
"hoverxref": "tooltip",
|
||||
"ref": "modal",
|
||||
"confval": "tooltip",
|
||||
"mod": "modal",
|
||||
"class": "modal",
|
||||
"obj": "tooltip",
|
||||
}
|
||||
|
||||
hoverxref_intersphinx_types = {
|
||||
"readthedocs": "modal",
|
||||
"sphinx": "tooltip",
|
||||
}
|
||||
|
||||
hoverxref_domains = [
|
||||
"py",
|
||||
]
|
||||
|
||||
# Enabled Markdown extensions.
|
||||
# See here for what they do:
|
||||
# https://myst-parser.readthedocs.io/en/latest/syntax/optional.html
|
||||
myst_enable_extensions = [
|
||||
"amsmath",
|
||||
"colon_fence",
|
||||
"deflist",
|
||||
"dollarmath",
|
||||
"fieldlist",
|
||||
"html_image",
|
||||
"replacements",
|
||||
"smartquotes",
|
||||
"strikethrough",
|
||||
"tasklist",
|
||||
]
|
||||
|
||||
# Allows auto-generated header anchors:
|
||||
# https://myst-parser.readthedocs.io/en/latest/syntax/optional.html#auto-generated-header-anchors
|
||||
myst_heading_anchors = 4
|
||||
|
||||
|
||||
# -- Options for HTML output -------------------------------------------------
|
||||
|
||||
# The theme to use for HTML and HTML Help pages. See the documentation for
|
||||
# a list of builtin themes.
|
||||
#
|
||||
html_theme = "sphinx_rtd_theme"
|
||||
|
||||
|
||||
# Add any paths that contain custom static files (such as style sheets) here,
|
||||
# relative to this directory. They are copied after the builtin static files,
|
||||
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||
# html_static_path = ['_static']
|
||||
|
||||
# html_css_files = [
|
||||
# 'css/custom.css',
|
||||
# ]
|
||||
|
||||
master_doc = "index"
|
||||
|
||||
# html_theme_options = {
|
||||
# 'logo_only': True,
|
||||
# }
|
||||
# html_logo = "images/EPICS_white_logo_v02.png"
|
||||
|
||||
# html_extra_path = ['../html']
|
||||
|
||||
# Breathe directives
|
||||
7
documentation/database-API.rst
Normal file
7
documentation/database-API.rst
Normal file
@@ -0,0 +1,7 @@
|
||||
IOC Database C/C++ APIs
|
||||
=======================
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
:caption: IOC Header Files
|
||||
|
||||
30
documentation/index.rst
Normal file
30
documentation/index.rst
Normal file
@@ -0,0 +1,30 @@
|
||||
EPICS Base Documentation
|
||||
========================
|
||||
|
||||
|
||||
.. toctree::
|
||||
:hidden:
|
||||
|
||||
EPICS Documentation Index <https://docs.epics-controls.org/en/latest/>
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
:caption: General Information
|
||||
|
||||
README
|
||||
RELEASE_NOTES
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
:caption: IOC Component Reference
|
||||
|
||||
ComponentReference
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
:caption: C/C++ Headers
|
||||
|
||||
libcom-api
|
||||
database-api
|
||||
record-api
|
||||
menu-api
|
||||
7
documentation/libcom-API.rst
Normal file
7
documentation/libcom-API.rst
Normal file
@@ -0,0 +1,7 @@
|
||||
Common Library C/C++ APIs
|
||||
=========================
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
:caption: LibCom Header Files
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
/**
|
||||
@mainpage EPICS Base
|
||||
|
||||
Documentation index
|
||||
|
||||
@li @ref releasenotes
|
||||
@li @ref install
|
||||
@li <a href="ComponentReference.html">EPICS Component Reference Manual</a>
|
||||
@li <a href="filters.html">Field Modifiers and Channel Filters</a>
|
||||
@li <a href="links.html">Extensible IOC Database Links</a>
|
||||
@li <a href="CAref.html">Channel Access Reference Manual</a>
|
||||
@li <a href="msi.html">msi: Macro Substitution and Include Tool</a>
|
||||
@li <a href="CA.html">Perl 5 Interface to Channel Access</a>
|
||||
|
||||
*/
|
||||
7
documentation/menu-API.rst
Normal file
7
documentation/menu-API.rst
Normal file
@@ -0,0 +1,7 @@
|
||||
C/C++ Headers from Menus
|
||||
========================
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
:caption: Generated Menu Header Files
|
||||
|
||||
7
documentation/record-API.rst
Normal file
7
documentation/record-API.rst
Normal file
@@ -0,0 +1,7 @@
|
||||
C/C++ Headers from Record Types
|
||||
===============================
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
:caption: Generated Record Header Files
|
||||
|
||||
6
documentation/requirements.txt
Normal file
6
documentation/requirements.txt
Normal file
@@ -0,0 +1,6 @@
|
||||
sphinx==7.2.6
|
||||
myst-parser==2.0.0
|
||||
breathe==4.35.0
|
||||
sphinx_copybutton==0.5.2
|
||||
sphinx-hoverxref==1.3.0
|
||||
sphinx-rtd-theme==2.0.0
|
||||
@@ -5,7 +5,7 @@
|
||||
Name: epics-base-%{EpicsVersion}
|
||||
Summary: EPICS Base %{EpicsVersion}
|
||||
Version: 2
|
||||
Release: 0%{?dist}
|
||||
Release: 3%{?dist}
|
||||
License: EPICS Open License
|
||||
Group: Development/Languages
|
||||
URL: https://git.psi.ch/epics_base/base-7.0
|
||||
@@ -334,19 +334,52 @@ fi
|
||||
###########################################
|
||||
|
||||
%files boot
|
||||
# including files to build on some Linux cross archs
|
||||
# hence some configure/* and lib/perl/* listed twice
|
||||
%defattr(-,root,root,-)
|
||||
%dir %{prog_folder}
|
||||
%dir %{prog_folder}/configure
|
||||
%{prog_folder}/configure/CONFIG_BASE_VERSION
|
||||
%{prog_folder}/configure/RELEASE
|
||||
%{prog_folder}/configure/CONFIG*
|
||||
%{prog_folder}/configure/RULES*
|
||||
%dir %{prog_folder}/configure/os
|
||||
%{prog_folder}/configure/os/CONFIG.Common.UnixCommon
|
||||
%{prog_folder}/configure/os/CONFIG.Common.linuxCommon
|
||||
%{prog_folder}/configure/os/CONFIG.Common.linux-clang
|
||||
%{prog_folder}/configure/os/CONFIG.Common.linux-%{_host_cpu}*
|
||||
%{prog_folder}/configure/os/CONFIG.Common.[a-z]*-*
|
||||
%{prog_folder}/configure/os/CONFIG.UnixCommon.Common
|
||||
%{prog_folder}/configure/os/CONFIG.[a-z]*-*.Common
|
||||
%{prog_folder}/configure/os/CONFIG.[a-z]*-*.[a-z]*-*
|
||||
%{prog_folder}/configure/os/CONFIG.linux-*.Common
|
||||
%{prog_folder}/configure/os/CONFIG.linux-*.linux-*
|
||||
%{prog_folder}/configure/os/CONFIG_SITE.Common.linuxCommon
|
||||
%{prog_folder}/configure/os/CONFIG_SITE.Common.linux-*
|
||||
%{prog_folder}/configure/os/CONFIG_SITE.[a-z]*-*.Common
|
||||
%{prog_folder}/configure/os/CONFIG_SITE.linux-*.Common
|
||||
%{prog_folder}/configure/os/CONFIG_SITE.linux-*.UnixCommon
|
||||
%{prog_folder}/configure/os/CONFIG_SITE.linux-*.linux-*
|
||||
|
||||
%dir %{prog_folder}/include
|
||||
%{prog_folder}/include/*.h
|
||||
%{prog_folder}/include/compiler
|
||||
%dir %{prog_folder}/include/os
|
||||
%{prog_folder}/include/os/Linux/
|
||||
%{prog_folder}/include/pv/
|
||||
%{prog_folder}/include/pva/
|
||||
%{prog_folder}/include/valgrind/
|
||||
%{prog_folder}/include/flex.skel.static
|
||||
|
||||
%dir %{prog_folder}/dbd
|
||||
%{prog_folder}/dbd/softIoc*.dbd
|
||||
%{prog_folder}/db
|
||||
|
||||
%dir %{prog_folder}/lib
|
||||
# avoid pulling in pkgconfig and perl
|
||||
%dir %{prog_folder}/lib/[a-z]*-*
|
||||
%{prog_folder}/lib/[a-z]*-*/*.so*
|
||||
%dir %{prog_folder}/lib/perl
|
||||
%{prog_folder}/lib/perl/EPICS
|
||||
%{prog_folder}/lib/perl/DBD*
|
||||
|
||||
%dir %{prog_folder}/bin
|
||||
# avoid pulling in host files again
|
||||
@@ -354,9 +387,11 @@ fi
|
||||
# including all Windows dlls (hence listed twice: here and in wine)
|
||||
%dir %{prog_folder}/bin/[a-z]*
|
||||
%{prog_folder}/bin/[a-z]*/[Scips]*[^.]??
|
||||
%{prog_folder}/bin/[a-z]*/p2p
|
||||
%{prog_folder}/bin/[a-z]*/msi*
|
||||
%{prog_folder}/bin/[a-z]*/acctst*
|
||||
%{prog_folder}/bin/[a-z]*/*.dll
|
||||
%{prog_folder}/bin/[a-z]*/registerRecordDeviceDriver*
|
||||
|
||||
# vxWorks and RTEMS
|
||||
%dir %{prog_folder}/bin/V*
|
||||
|
||||
@@ -38,7 +38,7 @@ ifeq ($(wildcard $(PERL_h)),)
|
||||
endif
|
||||
endif
|
||||
|
||||
ifneq (inc,$(strip $(MAKECMDGOALS)))
|
||||
ifneq ($(filter-out inc,$(strip $(MAKECMDGOALS))),)
|
||||
ifeq ($(T_A),$(EPICS_HOST_ARCH)) # No cross-builds (wrong Perl!)
|
||||
ifeq ($(strip $(XSUBPP)),)
|
||||
$(warning Perl's xsubpp program was not found.)
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
# SPDX-FileCopyrightText: 2003 Argonne National Laboratory
|
||||
#
|
||||
# SPDX-License-Identifier: EPICS
|
||||
|
||||
TOP=..
|
||||
|
||||
include $(TOP)/configure/CONFIG
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
/* SPDX-FileCopyrightText: 1998 Argonne National Laboratory */
|
||||
|
||||
/* SPDX-License-Identifier: EPICS */
|
||||
|
||||
/*caExample.c*/
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
/* SPDX-FileCopyrightText: 2000 Argonne National Laboratory */
|
||||
|
||||
/* SPDX-License-Identifier: EPICS */
|
||||
|
||||
/*caMonitor.c*/
|
||||
|
||||
/* This example accepts the name of a file containing a list of pvs to monitor.
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
# SPDX-FileCopyrightText: 2018 Argonne National Laboratory
|
||||
#
|
||||
# SPDX-License-Identifier: EPICS
|
||||
|
||||
TOP=..
|
||||
|
||||
include $(TOP)/configure/CONFIG
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
#!/usr/bin/env perl
|
||||
|
||||
# SPDX-FileCopyrightText: 2008 Argonne National Laboratory
|
||||
#
|
||||
# SPDX-License-Identifier: EPICS
|
||||
|
||||
use strict;
|
||||
|
||||
# This construct sets @INC to search lib/perl of all RELEASE entries
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
#!/usr/bin/env perl
|
||||
|
||||
# SPDX-FileCopyrightText: 2008 Argonne National Laboratory
|
||||
#
|
||||
# SPDX-License-Identifier: EPICS
|
||||
|
||||
use strict;
|
||||
|
||||
# This construct sets @INC to search lib/perl of all RELEASE entries
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
#!/usr/bin/env perl
|
||||
|
||||
# SPDX-FileCopyrightText: 2008 Argonne National Laboratory
|
||||
#
|
||||
# SPDX-License-Identifier: EPICS
|
||||
|
||||
use strict;
|
||||
|
||||
# This construct sets @INC to search lib/perl of all RELEASE entries
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
#!/usr/bin/env perl
|
||||
|
||||
# SPDX-FileCopyrightText: 2008 Argonne National Laboratory
|
||||
#
|
||||
# SPDX-License-Identifier: EPICS
|
||||
|
||||
use strict;
|
||||
|
||||
# This construct sets @INC to search lib/perl of all RELEASE entries
|
||||
|
||||
@@ -343,6 +343,7 @@ static int caget (pv *pvs, int nPvs, RequestT request, OutputT format,
|
||||
default :
|
||||
break;
|
||||
}
|
||||
free(pvs[n].value);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -388,7 +389,7 @@ int main (int argc, char *argv[])
|
||||
int digits = 0; /* getopt() no. of float digits */
|
||||
|
||||
int nPvs; /* Number of PVs */
|
||||
pv* pvs; /* Array of PV structures */
|
||||
pv* pvs = NULL; /* Array of PV structures */
|
||||
|
||||
LINE_BUFFER(stdout); /* Configure stdout buffering */
|
||||
|
||||
@@ -556,6 +557,7 @@ int main (int argc, char *argv[])
|
||||
result = caget(pvs, nPvs, request, format, type, count);
|
||||
|
||||
/* Shut down Channel Access */
|
||||
free(pvs);
|
||||
ca_context_destroy();
|
||||
|
||||
return result;
|
||||
|
||||
@@ -16,7 +16,7 @@ USR_CPPFLAGS += -DUSE_TYPED_RSET -DUSE_TYPED_DSET
|
||||
# Shared library ABI version.
|
||||
SHRLIB_VERSION = $(EPICS_DATABASE_MAJOR_VERSION).$(EPICS_DATABASE_MINOR_VERSION).$(EPICS_DATABASE_MAINTENANCE_VERSION)
|
||||
|
||||
API_HEADER = dbCoreAPI.h
|
||||
# dbCoreAPI.h generated earlier during libcom/
|
||||
dbCore_API = dbCore
|
||||
|
||||
LIBRARY_IOC += dbCore
|
||||
|
||||
@@ -20,7 +20,7 @@ BPT_DBD += bptTypeJdegF.dbd
|
||||
BPT_DBD += bptTypeKdegC.dbd
|
||||
BPT_DBD += bptTypeKdegF.dbd
|
||||
|
||||
ifneq (inc,$(strip $(MAKECMDGOALS)))
|
||||
ifneq ($(filter-out inc,$(strip $(MAKECMDGOALS))),)
|
||||
DBD += $(BPT_DBD)
|
||||
endif
|
||||
|
||||
@@ -28,5 +28,5 @@ PROD_HOST += makeBpt
|
||||
|
||||
makeBpt_SRCS = makeBpt
|
||||
|
||||
DOCS += menuConvert.md
|
||||
HTMLS += menuConvert.html
|
||||
|
||||
|
||||
@@ -224,6 +224,8 @@ got_header:
|
||||
fprintf(outFile,"}\n");
|
||||
fclose(inFile);
|
||||
fclose(outFile);
|
||||
free(outFilename);
|
||||
free(pname);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
@@ -62,6 +62,12 @@ DBDINC += menuScan
|
||||
DBDINC += dbCommon
|
||||
|
||||
dbMenusPod = $(notdir $(wildcard ../db/menu*.dbd.pod))
|
||||
|
||||
DOCS += $(patsubst %.dbd.pod,%.md,$(dbMenusPod))
|
||||
DOCS += dbCommonRecord.md
|
||||
DOCS += dbCommonInput.md
|
||||
DOCS += dbCommonOutput.md
|
||||
|
||||
HTMLS += $(patsubst %.dbd.pod,%.html,$(dbMenusPod))
|
||||
HTMLS += dbCommonRecord.html
|
||||
HTMLS += dbCommonInput.html
|
||||
|
||||
@@ -1353,6 +1353,7 @@ long dbPut(DBADDR *paddr, short dbrType,
|
||||
long status = 0;
|
||||
dbFldDes *pfldDes;
|
||||
int isValueField;
|
||||
int propertyUpdate = paddr->pfldDes->prop && precord->mlis.count;
|
||||
|
||||
if (special == SPC_ATTRIBUTE)
|
||||
return S_db_noMod;
|
||||
@@ -1397,12 +1398,31 @@ long dbPut(DBADDR *paddr, short dbrType,
|
||||
if (nRequest < 1) {
|
||||
recGblSetSevr(precord, LINK_ALARM, INVALID_ALARM);
|
||||
} else {
|
||||
status = dbFastPutConvertRoutine[dbrType][field_type](pbuffer,
|
||||
paddr->pfield, paddr);
|
||||
if (propertyUpdate && paddr->field_size <= MAX_STRING_SIZE) {
|
||||
char propBuffer[MAX_STRING_SIZE];
|
||||
status = dbFastPutConvertRoutine[dbrType][field_type](pbuffer,
|
||||
&propBuffer, paddr);
|
||||
if (!status) {
|
||||
if (memcmp(paddr->pfield, &propBuffer, paddr->field_size) != 0) {
|
||||
memcpy(paddr->pfield, &propBuffer, paddr->field_size);
|
||||
} else {
|
||||
/* suppress DBE_PROPERTY event if property did not change */
|
||||
propertyUpdate = 0;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
status = dbFastPutConvertRoutine[dbrType][field_type](pbuffer,
|
||||
paddr->pfield, paddr);
|
||||
}
|
||||
nRequest = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Post property updates before second dbPutSpecial */
|
||||
/* which may post DBE_VALUE and/or DBE_LOG events */
|
||||
if (propertyUpdate && !status)
|
||||
db_post_events(precord, NULL, DBE_PROPERTY);
|
||||
|
||||
/* Always do special processing if needed */
|
||||
if (special) {
|
||||
long status2 = dbPutSpecial(paddr, 1);
|
||||
@@ -1419,12 +1439,6 @@ long dbPut(DBADDR *paddr, short dbrType,
|
||||
if (precord->mlis.count &&
|
||||
!(isValueField && pfldDes->process_passive))
|
||||
db_post_events(precord, pfieldsave, DBE_VALUE | DBE_LOG);
|
||||
/* If this field is a property (metadata) field,
|
||||
* then post a property change event (even if the field
|
||||
* didn't change).
|
||||
*/
|
||||
if (precord->mlis.count && pfldDes->prop)
|
||||
db_post_events(precord, NULL, DBE_PROPERTY);
|
||||
done:
|
||||
paddr->pfield = pfieldsave;
|
||||
return status;
|
||||
|
||||
@@ -14,6 +14,8 @@
|
||||
* 505 665 1831
|
||||
*/
|
||||
|
||||
#define USE_TYPED_DBEVENT
|
||||
|
||||
#include <string>
|
||||
#include <stdexcept>
|
||||
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
* 505 665 1831
|
||||
*/
|
||||
|
||||
#define USE_TYPED_DBEVENT
|
||||
|
||||
#include <limits.h>
|
||||
|
||||
#include "epicsMutex.h"
|
||||
|
||||
@@ -12,6 +12,8 @@
|
||||
* Author Jeff Hill
|
||||
*/
|
||||
|
||||
#define USE_TYPED_DBEVENT
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "epicsMutex.h"
|
||||
|
||||
@@ -232,19 +232,41 @@ static long dbDbGetValue(struct link *plink, short dbrType, void *pbuffer,
|
||||
return status;
|
||||
}
|
||||
|
||||
/* Some records get options (precsision, units, ...) for some fields
|
||||
* from an input link. We need to catch the case that this link
|
||||
* points back to the same field or we will end in an infinite recursion.
|
||||
*/
|
||||
static long dbDbGetOptionLoopSafe(const struct link *plink, short dbrType,
|
||||
void *pbuffer, long option)
|
||||
{
|
||||
/* We need to cast away const to set the flags.
|
||||
That's ok because we know that plink is never actually readonly.
|
||||
And we reset everything to its original state.
|
||||
*/
|
||||
struct link *mutable_plink = (struct link *)plink;
|
||||
long status = S_dbLib_badLink;
|
||||
dbChannel *chan = linkChannel(plink);
|
||||
DBADDR *paddr = &chan->addr;
|
||||
long number_elements = 0;
|
||||
|
||||
dbScanLock(paddr->precord);
|
||||
if (!(mutable_plink->flags & DBLINK_FLAG_VISITED)) {
|
||||
mutable_plink->flags |= DBLINK_FLAG_VISITED;
|
||||
status = dbGet(paddr, dbrType, pbuffer, &option, &number_elements, NULL);
|
||||
mutable_plink->flags &= ~DBLINK_FLAG_VISITED;
|
||||
}
|
||||
dbScanUnlock(paddr->precord);
|
||||
return status;
|
||||
}
|
||||
|
||||
static long dbDbGetControlLimits(const struct link *plink, double *low,
|
||||
double *high)
|
||||
{
|
||||
dbChannel *chan = linkChannel(plink);
|
||||
DBADDR *paddr = &chan->addr;
|
||||
struct buffer {
|
||||
DBRctrlDouble
|
||||
double value;
|
||||
} buffer;
|
||||
long options = DBR_CTRL_DOUBLE;
|
||||
long number_elements = 0;
|
||||
long status = dbGet(paddr, DBR_DOUBLE, &buffer, &options, &number_elements,
|
||||
NULL);
|
||||
long status = dbDbGetOptionLoopSafe(plink, DBR_DOUBLE, &buffer, DBR_CTRL_DOUBLE);
|
||||
|
||||
if (status)
|
||||
return status;
|
||||
@@ -257,16 +279,11 @@ static long dbDbGetControlLimits(const struct link *plink, double *low,
|
||||
static long dbDbGetGraphicLimits(const struct link *plink, double *low,
|
||||
double *high)
|
||||
{
|
||||
dbChannel *chan = linkChannel(plink);
|
||||
DBADDR *paddr = &chan->addr;
|
||||
struct buffer {
|
||||
DBRgrDouble
|
||||
double value;
|
||||
} buffer;
|
||||
long options = DBR_GR_DOUBLE;
|
||||
long number_elements = 0;
|
||||
long status = dbGet(paddr, DBR_DOUBLE, &buffer, &options, &number_elements,
|
||||
NULL);
|
||||
long status = dbDbGetOptionLoopSafe(plink, DBR_DOUBLE, &buffer, DBR_GR_DOUBLE);
|
||||
|
||||
if (status)
|
||||
return status;
|
||||
@@ -279,16 +296,11 @@ static long dbDbGetGraphicLimits(const struct link *plink, double *low,
|
||||
static long dbDbGetAlarmLimits(const struct link *plink, double *lolo,
|
||||
double *low, double *high, double *hihi)
|
||||
{
|
||||
dbChannel *chan = linkChannel(plink);
|
||||
DBADDR *paddr = &chan->addr;
|
||||
struct buffer {
|
||||
DBRalDouble
|
||||
double value;
|
||||
} buffer;
|
||||
long options = DBR_AL_DOUBLE;
|
||||
long number_elements = 0;
|
||||
long status = dbGet(paddr, DBR_DOUBLE, &buffer, &options, &number_elements,
|
||||
0);
|
||||
long status = dbDbGetOptionLoopSafe(plink, DBR_DOUBLE, &buffer, DBR_AL_DOUBLE);
|
||||
|
||||
if (status)
|
||||
return status;
|
||||
@@ -302,16 +314,11 @@ static long dbDbGetAlarmLimits(const struct link *plink, double *lolo,
|
||||
|
||||
static long dbDbGetPrecision(const struct link *plink, short *precision)
|
||||
{
|
||||
dbChannel *chan = linkChannel(plink);
|
||||
DBADDR *paddr = &chan->addr;
|
||||
struct buffer {
|
||||
DBRprecision
|
||||
double value;
|
||||
} buffer;
|
||||
long options = DBR_PRECISION;
|
||||
long number_elements = 0;
|
||||
long status = dbGet(paddr, DBR_DOUBLE, &buffer, &options, &number_elements,
|
||||
0);
|
||||
long status = dbDbGetOptionLoopSafe(plink, DBR_DOUBLE, &buffer, DBR_PRECISION);
|
||||
|
||||
if (status)
|
||||
return status;
|
||||
@@ -322,16 +329,11 @@ static long dbDbGetPrecision(const struct link *plink, short *precision)
|
||||
|
||||
static long dbDbGetUnits(const struct link *plink, char *units, int unitsSize)
|
||||
{
|
||||
dbChannel *chan = linkChannel(plink);
|
||||
DBADDR *paddr = &chan->addr;
|
||||
struct buffer {
|
||||
DBRunits
|
||||
double value;
|
||||
} buffer;
|
||||
long options = DBR_UNITS;
|
||||
long number_elements = 0;
|
||||
long status = dbGet(paddr, DBR_DOUBLE, &buffer, &options, &number_elements,
|
||||
0);
|
||||
long status = dbDbGetOptionLoopSafe(plink, DBR_DOUBLE, &buffer, DBR_UNITS);
|
||||
|
||||
if (status)
|
||||
return status;
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
*/
|
||||
|
||||
#define EPICS_PRIVATE_API
|
||||
#define USE_TYPED_DBEVENT
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
@@ -32,6 +32,15 @@ struct dbChannel;
|
||||
struct db_field_log;
|
||||
struct evSubscrip;
|
||||
|
||||
#ifdef USE_TYPED_DBEVENT
|
||||
struct dbEventContext; // use dbEventCtx
|
||||
typedef struct evSubscrip* dbEventSubscription;
|
||||
typedef struct dbEventContext* dbEventCtx;
|
||||
#else
|
||||
typedef void * dbEventSubscription;
|
||||
typedef void * dbEventCtx;
|
||||
#endif
|
||||
|
||||
DBCORE_API int db_event_list (
|
||||
const char *name, unsigned level);
|
||||
DBCORE_API int dbel (
|
||||
@@ -39,8 +48,6 @@ DBCORE_API int dbel (
|
||||
DBCORE_API int db_post_events (
|
||||
void *pRecord, void *pField, unsigned caEventMask );
|
||||
|
||||
typedef void * dbEventCtx;
|
||||
|
||||
typedef void EXTRALABORFUNC (void *extralabor_arg);
|
||||
DBCORE_API dbEventCtx db_init_events (void);
|
||||
DBCORE_API int db_start_events (
|
||||
@@ -63,7 +70,6 @@ DBCORE_API void db_init_event_freelists (void);
|
||||
typedef void EVENTFUNC (void *user_arg, struct dbChannel *chan,
|
||||
int eventsRemaining, struct db_field_log *pfl);
|
||||
|
||||
typedef void * dbEventSubscription;
|
||||
DBCORE_API dbEventSubscription db_add_event (
|
||||
dbEventCtx ctx, struct dbChannel *chan,
|
||||
EVENTFUNC *user_sub, void *user_arg, unsigned select);
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
* 505 665 1831
|
||||
*/
|
||||
|
||||
#define USE_TYPED_DBEVENT
|
||||
|
||||
#include <string>
|
||||
#include <stdexcept>
|
||||
|
||||
|
||||
@@ -62,8 +62,28 @@ DBCORE_API void post_event(int event);
|
||||
DBCORE_API void scanAdd(struct dbCommon *);
|
||||
DBCORE_API void scanDelete(struct dbCommon *);
|
||||
DBCORE_API double scanPeriod(int scan);
|
||||
DBCORE_API int scanOnce(struct dbCommon *);
|
||||
DBCORE_API int scanOnceCallback(struct dbCommon *, once_complete cb, void *usr);
|
||||
/** Shorthand for scanOnceCallback(prec, NULL, NULL)
|
||||
*/
|
||||
DBCORE_API int scanOnce(struct dbCommon *prec);
|
||||
/** @brief scanOnce Request immediate record processing from another thread.
|
||||
*
|
||||
* Queue a request for record processing from the dedicated "Once" thread.
|
||||
* Request may fail if Once queue overflows. See scanOnceSetQueueSize()
|
||||
*
|
||||
* @param prec Record to process
|
||||
* @param cb Function called after target record dbProcess()
|
||||
* Does not wait for async record completion.
|
||||
* @param usr Argumentfor cb
|
||||
* @return Zero on success. Non-zero if the request could not be queued.
|
||||
*/
|
||||
DBCORE_API int scanOnceCallback(struct dbCommon *prec, once_complete cb, void *usr);
|
||||
/** @brief Set Once queue size
|
||||
*
|
||||
* Must be called prior to iocInit()
|
||||
*
|
||||
* @param size New size. May be smaller
|
||||
* @return Zero on success
|
||||
*/
|
||||
DBCORE_API int scanOnceSetQueueSize(int size);
|
||||
DBCORE_API int scanOnceQueueStatus(const int reset, scanOnceQueueStats *result);
|
||||
DBCORE_API void scanOnceQueueShow(const int reset);
|
||||
@@ -77,9 +97,39 @@ DBCORE_API int scanpel(const char *event_name);
|
||||
/*print io_event list*/
|
||||
DBCORE_API int scanpiol(void);
|
||||
|
||||
/** @brief Initialize "I/O Intr" source
|
||||
* @param ppios Pointer to scan list to be initialized
|
||||
*
|
||||
* Afterwards this IOSCANPVT may be assigned during a get_ioint_info() callback.
|
||||
* See typed_dset::get_ioint_info()
|
||||
*
|
||||
* @note There is currently no way to free this allocation.
|
||||
*/
|
||||
DBCORE_API void scanIoInit(IOSCANPVT *ppios);
|
||||
/** @brief Request processing of all associated records from callback threads
|
||||
* @param pios The scan list
|
||||
* @pre pios must be initialized by scanIoInit()
|
||||
* @return
|
||||
*/
|
||||
DBCORE_API unsigned int scanIoRequest(IOSCANPVT pios);
|
||||
/** @brief Process all records on the scan list for the specificed priority.
|
||||
*
|
||||
* Also executes the callback set by scanIoSetComplete()
|
||||
*
|
||||
* @param pios The scan list
|
||||
* @param prio one of priorityLow through priorityHigh (defined in callback.h).
|
||||
* A value between 0 and NUM_CALLBACK_PRIORITIES-1 .
|
||||
* @return Zero if the scan list was empty or 1<<prio
|
||||
* @since 3.16.0.1
|
||||
*/
|
||||
DBCORE_API unsigned int scanIoImmediate(IOSCANPVT pios, int prio);
|
||||
/** @brief Set scan list completion callback
|
||||
*
|
||||
* Replace the callback which will be invoked after record processing begins.
|
||||
* Asynchronous record processing may be ongoing.
|
||||
*
|
||||
* @since 3.15.0.2
|
||||
*/
|
||||
DBCORE_API void scanIoSetComplete(IOSCANPVT, io_scan_complete, void *usr);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
@@ -14,6 +14,8 @@
|
||||
* 505 665 1831
|
||||
*/
|
||||
|
||||
#define USE_TYPED_DBEVENT
|
||||
|
||||
#include <string>
|
||||
#include <stdexcept>
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
#include <string.h>
|
||||
|
||||
#define EPICS_PRIVATE_API
|
||||
#define USE_TYPED_DBEVENT
|
||||
|
||||
#include "dbmf.h"
|
||||
#include "epicsUnitTest.h"
|
||||
|
||||
@@ -17,7 +17,8 @@ C<MAYBE> or C<NO WAY> would not be accepted as choices for the field.
|
||||
Also, the choices C<yes>, C<No>, and C<Yes> are not valid choices since they
|
||||
don't match the case of C<NO> or C<YES>.
|
||||
The integer values C<0> and C<1> may often be used instead however, they are
|
||||
used as an index into the choices so C<0> becomes C<NO> and C<1> becomes <YES>.
|
||||
used as an index into the choices so C<0> becomes C<NO> and C<1> becomes
|
||||
C<YES>.
|
||||
|
||||
=menu menuYesNo
|
||||
|
||||
|
||||
@@ -190,6 +190,7 @@ unsigned short recGblResetAlarms(void *precord)
|
||||
|
||||
if(strcmp(pdbc->namsg, pdbc->amsg)!=0) {
|
||||
strcpy(pdbc->amsg, pdbc->namsg);
|
||||
pdbc->namsg[0] = '\0';
|
||||
stat_mask = DBE_ALARM;
|
||||
}
|
||||
|
||||
|
||||
@@ -2219,13 +2219,11 @@ long dbInitRecordLinks(dbRecordType *rtyp, struct dbCommon *prec)
|
||||
|
||||
} else if(dbCanSetLink(plink, &link_info, devsup)!=0) {
|
||||
errlogPrintf(ERL_ERROR ": %s.%s: can't initialize link type %s with \"%s\" (type %s)\n",
|
||||
prec->name, pflddes->name, pamaplinkType[plink->type].strvalue,
|
||||
plink->text, pamaplinkType[link_info.ltype].strvalue);
|
||||
prec->name, pflddes->name, pamaplinkType[plink->type].strvalue, plink->text, pamaplinkType[link_info.ltype].strvalue);
|
||||
|
||||
} else if(dbSetLink(plink, &link_info, devsup)) {
|
||||
errlogPrintf(ERL_ERROR ": %s.%s: failed to initialize link type %s with \"%s\" (type %s)\n",
|
||||
prec->name, pflddes->name, pamaplinkType[plink->type].strvalue,
|
||||
plink->text, pamaplinkType[link_info.ltype].strvalue);
|
||||
prec->name, pflddes->name, pamaplinkType[plink->type].strvalue, plink->text, pamaplinkType[link_info.ltype].strvalue);
|
||||
}
|
||||
free(plink->text);
|
||||
plink->text = NULL;
|
||||
|
||||
@@ -72,6 +72,7 @@ DBCORE_API extern const maplinkType pamaplinkType[LINK_NTYPES];
|
||||
/* DBLINK Flag bits */
|
||||
#define DBLINK_FLAG_INITIALIZED 1 /* dbInitLink() called */
|
||||
#define DBLINK_FLAG_TSELisTIME 2 /* Use TSEL to get timeStamp */
|
||||
#define DBLINK_FLAG_VISITED 4 /* Used in loop detection */
|
||||
|
||||
struct macro_link {
|
||||
char *macroStr;
|
||||
|
||||
@@ -14,7 +14,7 @@ SRC_DIRS += $(IOCDIR)/dbtemplate
|
||||
PROD_CMD += msi
|
||||
|
||||
msi_SRCS = msi.cpp
|
||||
HTMLS += msi.html
|
||||
DOCS += msi.md
|
||||
|
||||
INC += dbLoadTemplate.h
|
||||
INC += dbtoolsIocRegister.h
|
||||
|
||||
@@ -1,445 +0,0 @@
|
||||
<!DOCTYPE html public "-//w3c//dtd html 4.0 transitional//en">
|
||||
<html>
|
||||
<head>
|
||||
<title></title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<h1>msi: Macro Substitution and Include Tool</h1>
|
||||
|
||||
<h2>Introduction</h2>
|
||||
|
||||
<p>msi is a general purpose macro substitution/include tool. It accepts as input
|
||||
an ascii template file. It looks for lines containing two reserved command
|
||||
names: <tt>include</tt> and <tt>substitute</tt>. It also looks for and performs
|
||||
substitutions on macros of the form $(var) and ${var}. It uses the macLib
|
||||
routines from EPICS Base to perform the substitutions, so it also accepts the
|
||||
default value and value definition syntax that macLib implements.</p>
|
||||
|
||||
<p>msi also allows substitutions to be specified via a separate substitution
|
||||
file. This substitution file allows the same format as the substitution files
|
||||
accepted by the EPICS IOC's dbLoadTemplate command.</p>
|
||||
|
||||
<h2>Command Syntax:</h2>
|
||||
|
||||
<pre>msi -V -g -D -o<i>outfile</i> -I<i>dir</i> -M<i>subs</i> -S<i>subfile</i> <i>template</i></pre>
|
||||
|
||||
<p>All parameters are optional. The -o, -I, -M, and -S switches may be
|
||||
separated from their associated value string by spaces if desired. Output will
|
||||
be written to stdout unless the -o option is given.</p>
|
||||
|
||||
<p>Switches have the following meanings:</p>
|
||||
|
||||
<dl>
|
||||
<dt><tt>-V</tt></dt>
|
||||
<dd>Verbose warnings; if this parameter is specified then any undefined or
|
||||
recursive macros discovered in the template will be considered an error and
|
||||
will be marked in the output file. An error message will be shown, and when
|
||||
msi terminates it will do so with an exit status of 2.</dd>
|
||||
|
||||
<dt><tt>-g</tt></dt>
|
||||
<dd>When this flag is given all macros defined in a substitution file will
|
||||
have global scope and thus their values will persist until a new value is
|
||||
given for this macro. This flag is provided for backwards compatibility as
|
||||
this was the behavior of previous versions of msi, but it does not follow
|
||||
common scoping rules and is discouraged.</dd>
|
||||
|
||||
<dt><tt>-D</tt></dt>
|
||||
<dd>Output dependency information suitable for including by a Makefile to
|
||||
stdout instead of performing the macro substitutions. The <tt>-o</tt> option
|
||||
must be given to specify the target name for the dependency rules. Other
|
||||
options should be given exactly as will be used in the macro substitution
|
||||
process.</dd>
|
||||
|
||||
<dt><tt>-o</tt> <i>file</i></dt>
|
||||
<dd>Output will be written to the specifed file rather than to the standard
|
||||
output.</dd>
|
||||
|
||||
<dt><tt>-I</tt> <i>dir</i></dt>
|
||||
<dd>This parameter, which may be repeated or contain a colon-separated (or
|
||||
semi-colon separated on Windows) list of directory paths, specifies a search
|
||||
path for include commands. For example:
|
||||
|
||||
<blockquote>
|
||||
<pre>msi -I /home/mrk/examples:. -I.. template</pre>
|
||||
</blockquote>
|
||||
|
||||
specifies that all named files should be searched for in the following
|
||||
locations in the order given:
|
||||
|
||||
<ol>
|
||||
<li><tt>/home/mrk/examples</tt></li>
|
||||
<li><tt>.</tt> (the current directory)</li>
|
||||
<li><tt>..</tt> (the parent of the current directory)</li>
|
||||
</ol>
|
||||
</dd>
|
||||
|
||||
<dt><tt>-M</tt> <i>substitutions</i></dt>
|
||||
<dd>This parameter specifies macro values for the template instance.
|
||||
Multiple macro values can be specified in one substitution parameter, or in
|
||||
multiple <tt>-M</tt> parameters. For example:
|
||||
|
||||
<blockquote>
|
||||
<pre>msi -M "a=aval,b=bval" -Mc=cval template</pre>
|
||||
</blockquote>
|
||||
|
||||
specifies that in the template file each occurrence of:
|
||||
|
||||
<dl>
|
||||
<dd><tt>$(a)</tt> or <tt>${a}</tt> is replaced by <tt>aval</tt></dd>
|
||||
<dd><tt>$(b)</tt> or <tt>${b}</tt> is replaced by <tt>bval</tt></dd>
|
||||
<dd><tt>$(c)</tt> or <tt>${c}</tt> is replaced by <tt>cval</tt></dd>
|
||||
</dl>
|
||||
</dd>
|
||||
|
||||
<dt><tt>-S</tt> <i>subfile</i></dt>
|
||||
<dd>The substitution file. See below for format.</dd>
|
||||
|
||||
<dt><i>template</i></dt>
|
||||
<dd> The input file. If no file is specified then input is taken from
|
||||
stdin, i.e. msi can be used as a filter. See below for a description of
|
||||
commands that can be embedded in the template file.</dd>
|
||||
</dl>
|
||||
|
||||
<p>It is not possible to display usage by just typing <tt>msi</tt> since
|
||||
executing the command with no arguments is a valid command. To show usage
|
||||
specify an illegal switch, e.g.</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>msi -help</pre>
|
||||
</blockquote>
|
||||
|
||||
<h2>Exit Status</h2>
|
||||
|
||||
<dl>
|
||||
<dt>0<dd>Success.
|
||||
<dt>1<dd>Can't open/create file, or other I/O error.
|
||||
<dt>2<dd>Undefined macros encountered with the <tt>-V</tt> option specified.
|
||||
</dl>
|
||||
|
||||
<h2>Template File Format</h2>
|
||||
|
||||
<p>This file contains the text to be read and written to the output after macro
|
||||
substitution is performed. If no file is given then input is read from stdin.
|
||||
Variable instances to be substituted by macro values are expressed in the
|
||||
template using the syntax <tt>$(</tt><i>name</i><tt>)</tt> or
|
||||
<tt>${</tt><i>name</i><tt>}</tt>. The template can also provide default values
|
||||
to be used when a macro has not been given a value, using the syntax
|
||||
<tt>$(</tt><i>name</i><tt>=</tt><i>default</i><tt>)</tt> or
|
||||
<tt>${</tt><i>name</i><tt>=</tt><i>default</i><tt>}</tt>.</p>
|
||||
|
||||
<p>For example, using the command</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>msi -M name=Marty template</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>where the file template contains</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>My name is $(name)
|
||||
My age is $(age=none of your business)</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>results in this output:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>My name is Marty
|
||||
My age is none of your business</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>Macro variables and their default values can be expressed in terms of other
|
||||
macros if necessary, to almost any level of complexity. Recursive definitions
|
||||
will generate warning messages on stderr and result in undefined output.</p>
|
||||
|
||||
<p>The template file is read and processed one line at a time, where the
|
||||
maximum length of a line before and/or after macro expansion is 1023 characters
|
||||
— longer input or output lines will cause msi to fail. Within the context
|
||||
of a single line, macro expansion does not occur when the variable instance
|
||||
appears inside a single-quoted string, or where the dollar sign <tt>$</tt> is
|
||||
preceded by a back-slash character <tt>\</tt>, but as with the standard Unix
|
||||
shells, variables inside double quoted strings are expanded properly.</p>
|
||||
|
||||
<p>However neither back-slash characters nor quotes of either variety are
|
||||
removed when generating the output file, so depending on what is being output
|
||||
the single quote behaviour may not be useful and may even be a hinderance. It
|
||||
cannot be disabled in the current version of msi.</p>
|
||||
|
||||
<h3>Template file commands</h3>
|
||||
|
||||
<p>In addition to the regular text and variable instances described above, the
|
||||
template file may also contain commands which allow the insertion of other
|
||||
template files and the ability to set macro values inside the template file
|
||||
itself. These commands are:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>include "file"
|
||||
substitute "var=value,var=value,..."</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>Lines containing commands must be in one of these forms:</p>
|
||||
|
||||
<ul>
|
||||
<li><tt>include "</tt><i>filename</i><tt>"</tt></li>
|
||||
<li><tt>substitute "</tt><i>name1=value1, name2=value2, ...</i><tt>"</tt></li>
|
||||
</ul>
|
||||
|
||||
<p>White space is allowed before and after the command verb, and after the
|
||||
quoted string. If embedded quotes are needed, the backslash character
|
||||
<tt>\</tt> can be used as an escape character. For example</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>substitute "a=\"val\""</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>specifies that (unless <tt>a</tt> is subsequently redefined) wherever a
|
||||
<tt>$(a)</tt> macro appears in the template below this point, the text
|
||||
<tt>"val"</tt> (including the double quote characters) will appear in the
|
||||
output instead.</p>
|
||||
|
||||
<p>If a line does match either syntax above it is just passed to macLib for
|
||||
processing without any notification. Thus the input line:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>include "myfile" #include file</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>would just be passed to macLib, i.e. it would <em>not</em> be considered an
|
||||
include command.</p>
|
||||
|
||||
<p>As an example of these commands, let the Unix command be:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>msi template</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>and file includeFile contain:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>first name is ${first}
|
||||
family name is ${family}</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>and template is</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>substitute "first=Marty,family=Kraimer"
|
||||
include "includeFile"
|
||||
substitute "first=Irma,family=Kraimer"
|
||||
include "includeFile"</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>then the following is written to the output.</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>first name is Marty
|
||||
family name is Kraimer
|
||||
first name is Irma
|
||||
family name is Kraimer</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>Note that the IOC's <tt>dbLoadTemplate</tt> command does not support the
|
||||
<tt>substitute</tt> syntax in template files, although the <tt>include</tt>
|
||||
syntax is supported.</p>
|
||||
|
||||
<h2>Substitution File Format</h2>
|
||||
|
||||
<p>The optional substitution file has three formats: regular, pattern, and
|
||||
dbTemplate format. We will discuss each separately.</p>
|
||||
|
||||
<h3>Regular format</h3>
|
||||
|
||||
<blockquote>
|
||||
<pre>global {gbl_var1=gbl_val1, gbl_var2=gbl_val2, ...}
|
||||
{var1=set1_val1, var2=set1_val2, ...}
|
||||
{var2=set2_val2, var1=set2_val1, ...}
|
||||
global {gbl_var1=gbl_val3, gbl_var2=gbl_val4, ...}
|
||||
{var1=set3_val1, var2=set3_val2, ...}
|
||||
{var2=set4_val2, var1=set4_val1, ...}</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>The template file is output with macro substitutions performed once for each
|
||||
set of braces containing macro replacement values.</p>
|
||||
|
||||
<h3>Pattern format</h3>
|
||||
|
||||
<blockquote>
|
||||
<pre>global {gbl_var1=gbl_val1, gbl_var2=gbl_val2, ...}
|
||||
pattern {var1, var2, ...}
|
||||
{set1_val1, set1_val2, ...}
|
||||
{set2_val1, set2_val2, ...}
|
||||
pattern {var2, var1, ...}
|
||||
global {gbl_var1=gbl_val3, gbl_var2=gbl_val4, ...}
|
||||
{set3_val2, set3_val1, ...}
|
||||
{set4_val2, set4_val2, ...}</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>This produces the same result as the regular format example above.</p>
|
||||
|
||||
<h3>dbLoadTemplate Format</h3>
|
||||
|
||||
<p>This format is an extension of the format accepted by the EPICS IOC command
|
||||
<tt>dbLoadTemplate</tt>, and allows templates to be expanded on the host rather
|
||||
by using dbLoadTemplate at IOC boot time.</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>global {gbl_var1=gbl_val1, gbl_var2=gbl_val2, ...}
|
||||
file templatefile {
|
||||
<i>pattern format or regular format</i>
|
||||
}
|
||||
file "${WHERE}/template2" {
|
||||
<i>pattern format or regular format</i>
|
||||
}</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>For the dbTemplate format, the template filename does not have to be given
|
||||
on the command line, and is usually specified in the substitutions file
|
||||
instead. If a template filename is given on the command line it will override
|
||||
the filenames listed in the substitutions files.</p>
|
||||
|
||||
<h3>Syntax for all formats</h3>
|
||||
|
||||
<p>A comment line may appear anywhere in a substitution file, and will be
|
||||
ignored. A comment line is any line beginning with the character <tt>#</tt>,
|
||||
which must be the very first character on the line.</p>
|
||||
|
||||
<p>Global definitions may supplement or override the macro values supplied on
|
||||
the command-line using the <tt>-M</tt> switch, and set default values that will
|
||||
survive for the remainder of the file unless another global definition of the
|
||||
same macro changes it.</p>
|
||||
|
||||
<p>For definitions within braces given in any of the file formats, a separator
|
||||
must be given between items. A separator is either a comma, or one or more of
|
||||
the standard white space characters (space, formfeed, newline, carriage return,
|
||||
tab or vertical tab).</p>
|
||||
|
||||
<p>Each item within braces can be an alphanumeric token, or a double-quoted
|
||||
string. A back-slash character <tt>\</tt> can be used to escape a quote
|
||||
character needed inside a quoted string. These three sets of substitutions are
|
||||
all equivalent:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>{a=aa b=bb c="\"cc\""}
|
||||
{b="bb",a=aa,c="\"cc\""}
|
||||
{
|
||||
c="\"cc\""
|
||||
b=bb
|
||||
a="aa"
|
||||
}</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>Within a substitutions file, the file name may appear inside double quotation
|
||||
marks; these are required if the name contains certain characters or environment
|
||||
variable macros of the form ${ENV_VAR} or $(ENV_VAR), which will be expanded
|
||||
before the file is opened.</p>
|
||||
|
||||
<h3>Regular substitution example</h3>
|
||||
|
||||
<p>Let the command be:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>msi -S substitute template</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>The file <tt>template</tt> contains</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>first name is ${first}
|
||||
family name is ${family}</pre>
|
||||
</blockquote>
|
||||
|
||||
<p> and the file <tt>substitute</tt> is</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>global {family=Kraimer}
|
||||
{first=Marty}
|
||||
{first=Irma}</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>The following is the output produced:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>first name is Marty
|
||||
family name is Kraimer
|
||||
first name is Irma
|
||||
family name is Kraimer</pre>
|
||||
</blockquote>
|
||||
|
||||
<h3>Pattern substitution example</h3>
|
||||
|
||||
<p>Let the command be:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>msi -S pattern template</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>The file <tt>pattern</tt> contains</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>pattern {first,last}
|
||||
{Marty,Kraimer}
|
||||
{Irma,Kraimer}</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>and <tt>template</tt> is the same as the previous example:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>first name is ${first}
|
||||
family name is ${family}</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>This is the output:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>first name is Marty
|
||||
family name is Kraimer
|
||||
first name is Irma
|
||||
family name is Kraimer</pre>
|
||||
</blockquote>
|
||||
|
||||
<h3>dbTemplate example</h3>
|
||||
Let the command be
|
||||
|
||||
<blockquote>
|
||||
<pre>msi -S xxx.substitutions</pre>
|
||||
</blockquote>
|
||||
|
||||
<tt>xxx.substitutions</tt> is
|
||||
|
||||
<blockquote>
|
||||
<pre>file template {
|
||||
pattern {first,last}
|
||||
{Marty,Kraimer}
|
||||
{Irma,Kraimer}
|
||||
pattern {last,first}
|
||||
{Smith,Bill}
|
||||
{Smith,Mary}
|
||||
}
|
||||
file template {
|
||||
{first=Marty,last=Kraimer}
|
||||
{first=Irma,last=Kraimer}
|
||||
}</pre>
|
||||
</blockquote>
|
||||
<tt>template</tt> is the same as in the previous example..
|
||||
|
||||
<p>The following is written to the output</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>first name is Marty
|
||||
family name is Kraimer
|
||||
first name is Irma
|
||||
family name is Kraimer
|
||||
first name is Bill
|
||||
last name is Smith
|
||||
first name is Mary
|
||||
last name is Smith
|
||||
first name is Marty
|
||||
family name is Kraimer
|
||||
first name is Irma
|
||||
family name is Kraimer</pre>
|
||||
</blockquote>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
384
modules/database/src/ioc/dbtemplate/msi.md
Normal file
384
modules/database/src/ioc/dbtemplate/msi.md
Normal file
@@ -0,0 +1,384 @@
|
||||
# msi: Macro Substitution and Include Tool
|
||||
|
||||
(msitool)=
|
||||
## Introduction
|
||||
|
||||
msi is a general purpose macro substitution/include tool.
|
||||
It accepts as input an ascii template file. It looks for lines containing two reserved
|
||||
command names: `include` and `substitute`. It also looks for and performs
|
||||
substitutions on macros of the form `$(var)` and `${var}`. It uses the
|
||||
macLib routines from EPICS Base to perform the substitutions, so it also
|
||||
accepts the default value and value definition syntax that macLib
|
||||
implements.
|
||||
|
||||
msi also allows substitutions to be specified via a separate
|
||||
substitution file. This substitution file allows the same format as the
|
||||
substitution files accepted by the EPICS IOC's dbLoadTemplate command.
|
||||
|
||||
|
||||
## Command Syntax
|
||||
|
||||
`msi -V -g -o outfile -I dir -M subs -S subfile template`
|
||||
|
||||
All parameters are optional. The -o, -I, -M, and -S switches may be
|
||||
separated from their associated value string by spaces if desired.
|
||||
Output will be written to stdout unless the -o option is given.
|
||||
|
||||
Switches have the following meanings:
|
||||
|
||||
- **-V**
|
||||
|
||||
Verbose warnings; if this parameter is specified then any undefined
|
||||
macro discovered in the template file which does not have an
|
||||
associated default value is considered an error. An error message is
|
||||
generated, and when msi terminates it will do so with an exit status
|
||||
of 2.
|
||||
- **-g**
|
||||
|
||||
When this flag is given all macros defined in a substitution file
|
||||
will have global scope and thus their values will persist until a
|
||||
new value is given for this macro. This flag is provided for
|
||||
backwards compatibility as this was the behavior of previous
|
||||
versions of msi, but it does not follow common scoping rules and is
|
||||
discouraged.
|
||||
- **-o _file_**
|
||||
|
||||
Output will be written to the specifed file rather than to the
|
||||
standard output.
|
||||
- **-I _dir_**
|
||||
|
||||
This parameter, which may be repeated or contain a colon-separated
|
||||
(or semi-colon separated on Windows) list of directory paths,
|
||||
specifies a search path for include commands. For example:
|
||||
|
||||
msi -I /home/mrk/examples:. -I.. template
|
||||
|
||||
specifies that all named files should be searched for in the following locations,
|
||||
in the order given:
|
||||
|
||||
1. /home/mrk/examples
|
||||
2. . (the current directory)
|
||||
3. .. (the parent of the current directory)
|
||||
|
||||
- **-M _substitutions_**
|
||||
|
||||
This parameter specifies macro values for the template instance.
|
||||
Multiple macro values can be specified in one substitution
|
||||
parameter, or in multiple -M parameters. For example:
|
||||
|
||||
msi -M "a=aval,b=bval" -Mc=cval template
|
||||
|
||||
specifies that in the template file each occurrence of:
|
||||
|
||||
- `$(a)` or `${a}` is replaced by _aval_
|
||||
- `$(b)` or `${b}` is replaced by _bval_
|
||||
- `$(c)` or `${c}` is replaced by _cval_
|
||||
|
||||
- **-S _subfile_**
|
||||
|
||||
The substitution file. See below for format.
|
||||
- **_template_**
|
||||
|
||||
The input file. If no file is specified then input is taken from
|
||||
stdin, i.e. msi can be used as a filter. See below for a description
|
||||
of commands that can be embedded in the template file.
|
||||
|
||||
It is not possible to display usage by just typing msi since executing
|
||||
the command with no arguments is a valid command. To show usage specify
|
||||
an illegal switch, e.g.
|
||||
|
||||
msi -help
|
||||
|
||||
|
||||
## Exit Status
|
||||
|
||||
- **0**
|
||||
Success.
|
||||
- **1**
|
||||
Can't open/create file, or other I/O error.
|
||||
- **2**
|
||||
Undefined macros encountered with the -V option specified.
|
||||
|
||||
|
||||
## Template File Format
|
||||
|
||||
This file contains the text to be read and written to the output after
|
||||
macro substitution is performed. If no file is given then input is read
|
||||
from stdin. Variable instances to be substituted by macro values are
|
||||
expressed in the template using the syntax \$(_name_) or \${_name_}. The
|
||||
template can also provide default values to be used when a macro has not
|
||||
been given a value, using the syntax \$(_name_=_default_) or \${_name_=_default_}.
|
||||
|
||||
For example, using the command
|
||||
|
||||
msi -M name=Marty template
|
||||
|
||||
where the file template contains
|
||||
|
||||
My name is $(name)
|
||||
My age is $(age=none of your business)
|
||||
|
||||
results in this output:
|
||||
|
||||
My name is Marty
|
||||
My age is none of your business
|
||||
|
||||
Macro variables and their default values can be expressed in terms of
|
||||
other macros if necessary, to almost any level of complexity. Recursive
|
||||
definitions will generate warning messages on stderr and result in
|
||||
undefined output.
|
||||
|
||||
The template file is read and processed one line at a time, where the
|
||||
maximum length of a line before and/or after macro expansion is 1023
|
||||
characters; longer input or output lines will cause msi to fail. Within
|
||||
the context of a single line, macro expansion does not occur when the
|
||||
variable instance appears inside a single-quoted string, or where the
|
||||
dollar sign $ is preceded by a back-slash character \, but as with the
|
||||
standard Unix shells, variables inside double quoted strings are
|
||||
expanded properly.
|
||||
|
||||
However neither back-slash characters nor quotes of either variety are
|
||||
removed when generating the output file, so depending on what is being
|
||||
output the single quote behaviour may not be useful and may even be a
|
||||
hinderance. It cannot be disabled in the current version of msi.
|
||||
|
||||
|
||||
### Template file commands
|
||||
|
||||
In addition to the regular text and variable instances described above,
|
||||
the template file may also contain commands which allow the insertion of
|
||||
other template files and the ability to set macro values inside the
|
||||
template file itself. These commands are:
|
||||
|
||||
include "file"
|
||||
substitute "var=value,var=value,..."
|
||||
|
||||
Lines containing commands must be in one of these forms:
|
||||
|
||||
- include "_filename_"
|
||||
|
||||
- substitute "_name1=value1, name2=value2, ..._"
|
||||
|
||||
White space is allowed before and after the command verb, and after the
|
||||
quoted string. If embedded quotes are needed, the backslash character \
|
||||
can be used as an escape character. For example
|
||||
|
||||
substitute "a=\"val\""
|
||||
|
||||
specifies that (unless a is subsequently redefined) wherever a $(a)
|
||||
macro appears in the template below this point, the text
|
||||
"val" (including the double quote characters) will appear in the output
|
||||
instead.
|
||||
|
||||
If a line does match either syntax above it is just passed to macLib for
|
||||
processing without any notification. Thus the input line:
|
||||
|
||||
include "myfile" #include file
|
||||
|
||||
would just be passed to macLib, i.e. it would _not_ be considered an
|
||||
include command.
|
||||
|
||||
As an example of these commands, let the Unix command be:
|
||||
|
||||
msi template
|
||||
|
||||
and file includeFile contain:
|
||||
|
||||
first name is ${first}
|
||||
family name is ${family}
|
||||
|
||||
and template is
|
||||
|
||||
substitute "first=Marty,family=Kraimer"
|
||||
include "includeFile"
|
||||
substitute "first=Irma,family=Kraimer"
|
||||
include "includeFile"
|
||||
|
||||
then the following is written to the output.
|
||||
|
||||
first name is Marty
|
||||
family name is Kraimer
|
||||
first name is Irma
|
||||
family name is Kraimer
|
||||
|
||||
Note that the IOC's dbLoadTemplate command does not support the
|
||||
substitute syntax in template files, although the include syntax is
|
||||
supported.
|
||||
|
||||
|
||||
## Substitution File Format
|
||||
|
||||
The optional substitution file has three formats: regular, pattern, and
|
||||
dbTemplate format. We will discuss each separately.
|
||||
|
||||
|
||||
### Regular format
|
||||
|
||||
global {gbl_var1=gbl_val1, gbl_var2=gbl_val2, ...}
|
||||
{var1=set1_val1, var2=set1_val2, ...}
|
||||
{var2=set2_val2, var1=set2_val1, ...}
|
||||
global {gbl_var1=gbl_val3, gbl_var2=gbl_val4, ...}
|
||||
{var1=set3_val1, var2=set3_val2, ...}
|
||||
{var2=set4_val2, var1=set4_val1, ...}
|
||||
|
||||
The template file is output with macro substitutions performed once for
|
||||
each set of braces containing macro replacement values.
|
||||
|
||||
|
||||
### Pattern format
|
||||
|
||||
global {gbl_var1=gbl_val1, gbl_var2=gbl_val2, ...}
|
||||
pattern {var1, var2, ...}
|
||||
{set1_val1, set1_val2, ...}
|
||||
{set2_val1, set2_val2, ...}
|
||||
pattern {var2, var1, ...}
|
||||
global {gbl_var1=gbl_val3, gbl_var2=gbl_val4, ...}
|
||||
{set3_val2, set3_val1, ...}
|
||||
{set4_val2, set4_val2, ...}
|
||||
|
||||
This produces the same result as the regular format example above.
|
||||
|
||||
|
||||
### dbLoadTemplate Format
|
||||
|
||||
This format is an extension of the format accepted by the EPICS IOC
|
||||
command dbLoadTemplate, and allows templates to be expanded on the host
|
||||
rather by using dbLoadTemplate at IOC boot time.
|
||||
|
||||
global {gbl_var1=gbl_val1, gbl_var2=gbl_val2, ...}
|
||||
file templatefile {
|
||||
/pattern format or regular format/
|
||||
}
|
||||
file "${WHERE}/template2" {
|
||||
/pattern format or regular format/
|
||||
}
|
||||
|
||||
For the dbTemplate format, the template filename does not have to be
|
||||
given on the command line, and is usually specified in the substitutions
|
||||
file instead. If a template filename is given on the command line it
|
||||
will override the filenames listed in the substitutions files.
|
||||
|
||||
|
||||
### Syntax for all formats
|
||||
|
||||
A comment line may appear anywhere in a substitution file, and will be
|
||||
ignored. A comment line is any line beginning with the character #,
|
||||
which must be the very first character on the line.
|
||||
|
||||
Global definitions may supplement or override the macro values supplied
|
||||
on the command-line using the -M switch, and set default values that
|
||||
will survive for the remainder of the file unless another global
|
||||
definition of the same macro changes it.
|
||||
|
||||
For definitions within braces given in any of the file formats, a
|
||||
separator must be given between items. A separator is either a comma, or
|
||||
one or more of the standard white space characters (space, formfeed,
|
||||
newline, carriage return, tab or vertical tab).
|
||||
|
||||
Each item within braces can be an alphanumeric token, or a double-quoted
|
||||
string. A back-slash character \ can be used to escape a quote character
|
||||
needed inside a quoted string. These three sets of substitutions are all
|
||||
equivalent:
|
||||
|
||||
{a=aa b=bb c="\"cc\""}
|
||||
{b="bb",a=aa,c="\"cc\""}
|
||||
{
|
||||
c="\"cc\""
|
||||
b=bb
|
||||
a="aa"
|
||||
}
|
||||
|
||||
Within a substitutions file, the file name may appear inside double
|
||||
quotation marks; these are required if the name contains certain
|
||||
characters or environment variable macros of the form `${ENV_VAR}` or
|
||||
`$(ENV_VAR)`, which will be expanded before the file is opened.
|
||||
|
||||
|
||||
### Regular substitution example
|
||||
|
||||
Let the command be:
|
||||
|
||||
msi -S substitute template
|
||||
|
||||
The file template contains
|
||||
|
||||
first name is ${first}
|
||||
family name is ${family}
|
||||
|
||||
and the file `substitute` is
|
||||
|
||||
global {family=Kraimer}
|
||||
{first=Marty}
|
||||
{first=Irma}
|
||||
|
||||
The following is the output produced:
|
||||
|
||||
first name is Marty
|
||||
family name is Kraimer
|
||||
first name is Irma
|
||||
family name is Kraimer
|
||||
|
||||
|
||||
### Pattern substitution example
|
||||
|
||||
Let the command be:
|
||||
|
||||
msi -S pattern template
|
||||
|
||||
The file pattern contains
|
||||
|
||||
pattern {first,last}
|
||||
{Marty,Kraimer}
|
||||
{Irma,Kraimer}
|
||||
|
||||
and template is the same as the previous example:
|
||||
|
||||
first name is ${first}
|
||||
family name is ${family}
|
||||
|
||||
This is the output:
|
||||
|
||||
first name is Marty
|
||||
family name is Kraimer
|
||||
first name is Irma
|
||||
family name is Kraimer
|
||||
|
||||
|
||||
### dbTemplate example
|
||||
|
||||
Let the command be
|
||||
|
||||
msi -S xxx.substitutions
|
||||
|
||||
`xxx.substitutions` is
|
||||
|
||||
file template {
|
||||
pattern {first,last}
|
||||
{Marty,Kraimer}
|
||||
{Irma,Kraimer}
|
||||
pattern {last,first}
|
||||
{Smith,Bill}
|
||||
{Smith,Mary}
|
||||
}
|
||||
file template {
|
||||
{first=Marty,last=Kraimer}
|
||||
{first=Irma,last=Kraimer}
|
||||
}
|
||||
|
||||
`template` is the same as in the previous example.
|
||||
|
||||
The following is written to the output
|
||||
|
||||
first name is Marty
|
||||
family name is Kraimer
|
||||
first name is Irma
|
||||
family name is Kraimer
|
||||
first name is Bill
|
||||
last name is Smith
|
||||
first name is Mary
|
||||
last name is Smith
|
||||
first name is Marty
|
||||
family name is Kraimer
|
||||
first name is Irma
|
||||
family name is Kraimer
|
||||
|
||||
96
modules/database/src/std/ComponentReference.md
Normal file
96
modules/database/src/std/ComponentReference.md
Normal file
@@ -0,0 +1,96 @@
|
||||
# IOC Component Reference
|
||||
|
||||
This document provides reference information about the record types,
|
||||
menus, link types and channel filters included with EPICS Base.
|
||||
|
||||
## Introduction and IOC Concepts
|
||||
|
||||
- [Introduction to EPICS](https://docs.epics-controls.org/en/latest/getting-started/EPICS_Intro.html)
|
||||
- [Process Database Concepts](https://docs.epics-controls.org/en/latest/process-database/EPICS_Process_Database_Concepts.html)
|
||||
|
||||
## Record Type Definitions
|
||||
|
||||
These sections describe common aspects of the record types:
|
||||
|
||||
```{toctree}
|
||||
:titlesonly:
|
||||
|
||||
dbCommonRecord
|
||||
dbCommonInput
|
||||
dbCommonOutput
|
||||
```
|
||||
|
||||
These are the record types supplied with EPICS Base:
|
||||
|
||||
```{toctree}
|
||||
:titlesonly:
|
||||
|
||||
aaiRecord
|
||||
aaoRecord
|
||||
aiRecord
|
||||
aoRecord
|
||||
aSubRecord
|
||||
biRecord
|
||||
boRecord
|
||||
calcoutRecord
|
||||
calcRecord
|
||||
compressRecord
|
||||
dfanoutRecord
|
||||
eventRecord
|
||||
fanoutRecord
|
||||
histogramRecord
|
||||
int64inRecord
|
||||
int64outRecord
|
||||
longinRecord
|
||||
longoutRecord
|
||||
lsiRecord
|
||||
lsoRecord
|
||||
mbbiDirectRecord
|
||||
mbbiRecord
|
||||
mbboDirectRecord
|
||||
mbboRecord
|
||||
permissiveRecord
|
||||
printfRecord
|
||||
selRecord
|
||||
seqRecord
|
||||
stateRecord
|
||||
stringinRecord
|
||||
stringoutRecord
|
||||
subArrayRecord
|
||||
subRecord
|
||||
waveformRecord
|
||||
```
|
||||
|
||||
## Menu Definitions
|
||||
|
||||
Menu field choices are documented with the record type that defines them, or
|
||||
here for the global menus that are used by multiple record types:
|
||||
|
||||
```{toctree}
|
||||
:titlesonly:
|
||||
|
||||
menuAlarmSevr
|
||||
menuAlarmStat
|
||||
menuConvert
|
||||
menuFtype
|
||||
menuIvoa
|
||||
menuOmsl
|
||||
menuPini
|
||||
menuPost
|
||||
menuPriority
|
||||
menuScan
|
||||
menuSimm
|
||||
menuYesNo
|
||||
```
|
||||
|
||||
## Other Components
|
||||
|
||||
EPICS Base also comes with extensible sets of server Channel Filters and IOC
|
||||
Database Link types, which are documented here:
|
||||
|
||||
```{toctree}
|
||||
:titlesonly:
|
||||
|
||||
filters
|
||||
links
|
||||
```
|
||||
@@ -163,8 +163,8 @@ Database Link types, which are documented here:
|
||||
|
||||
Corrections to these documents can be submitted as patch files to the EPICS
|
||||
core developers, or as GitHub pull requests to the 7.0 branch of Base.
|
||||
These document sources can be found under `modules/database/src` tree, mostly
|
||||
in the `std/rec` and `ioc/db` directories in files with extension `.dbd.pod`.
|
||||
These document sources can be found under C<modules/database/src> tree, mostly
|
||||
in the C<std/rec> and C<ioc/db> directories in files with extension C<.dbd.pod>.
|
||||
The documentation source format is a combination of the EPICS DBD file format
|
||||
with an extended version of Perl's POD (plain old documentation); run `perldoc
|
||||
pod` for details of POD.
|
||||
with an extended version of Perl's POD (plain old documentation); run
|
||||
C<perldoc pod> for details of POD.
|
||||
@@ -30,6 +30,9 @@ include $(STDDIR)/filters/Makefile
|
||||
include $(STDDIR)/link/Makefile
|
||||
include $(STDDIR)/softIoc/Makefile
|
||||
|
||||
DOCS += ComponentReference.md
|
||||
HTMLS += ComponentReference.html
|
||||
|
||||
include $(TOP)/configure/RULES
|
||||
|
||||
include $(STDDIR)/rec/RULES
|
||||
|
||||
@@ -18,5 +18,5 @@ dbRecStd_SRCS += sync.c
|
||||
dbRecStd_SRCS += decimate.c
|
||||
dbRecStd_SRCS += utag.c
|
||||
|
||||
DOCS += filters.md
|
||||
HTMLS += filters.html
|
||||
|
||||
|
||||
@@ -16,4 +16,5 @@ dbRecStd_SRCS += lnkCalc.c
|
||||
dbRecStd_SRCS += lnkState.c
|
||||
dbRecStd_SRCS += lnkDebug.c
|
||||
|
||||
DOCS += links.md
|
||||
HTMLS += links.html
|
||||
|
||||
@@ -54,8 +54,13 @@ stdRecords_DBD = $(patsubst %,%.dbd,$(stdRecords))
|
||||
|
||||
dbRecStd_SRCS += $(patsubst %,%.c,$(stdRecords))
|
||||
|
||||
DOCS += $(patsubst %.dbd.pod,%.md,$(notdir $(wildcard ../rec/*Record.dbd.pod)))
|
||||
HTMLS += $(patsubst %.dbd.pod,%.html,$(notdir $(wildcard ../rec/*Record.dbd.pod)))
|
||||
|
||||
vpath %.png $(SRC_DIRS)
|
||||
|
||||
DOCS += image/compress-1.png
|
||||
DOCS += image/compress-2.png
|
||||
|
||||
HTMLS += image/compress-1.png
|
||||
HTMLS += image/compress-2.png
|
||||
|
||||
@@ -220,12 +220,9 @@ static long special(DBADDR *paddr, int after)
|
||||
return 0;
|
||||
init_common(prec);
|
||||
/* Note: ZRVL..FFVL are also SPC_MOD */
|
||||
if (fieldIndex >= mbbiRecordZRST && fieldIndex <= mbbiRecordFFST) {
|
||||
int event = DBE_PROPERTY;
|
||||
|
||||
if (prec->val == fieldIndex - mbbiRecordZRST)
|
||||
event |= DBE_VALUE | DBE_LOG;
|
||||
db_post_events(prec, &prec->val, event);
|
||||
if (fieldIndex >= mbbiRecordZRST && fieldIndex <= mbbiRecordFFST
|
||||
&& prec->val == fieldIndex - mbbiRecordZRST) {
|
||||
db_post_events(prec, &prec->val, DBE_VALUE | DBE_LOG);
|
||||
}
|
||||
return 0;
|
||||
|
||||
|
||||
@@ -276,6 +276,7 @@ Parameters> for more on the record name (NAME) and description (DESC) fields.
|
||||
pp(TRUE)
|
||||
interest(1)
|
||||
size(26)
|
||||
prop(YES)
|
||||
}
|
||||
field(ONST,DBF_STRING) {
|
||||
prompt("One String")
|
||||
@@ -284,6 +285,7 @@ Parameters> for more on the record name (NAME) and description (DESC) fields.
|
||||
pp(TRUE)
|
||||
interest(1)
|
||||
size(26)
|
||||
prop(YES)
|
||||
}
|
||||
field(TWST,DBF_STRING) {
|
||||
prompt("Two String")
|
||||
@@ -292,6 +294,7 @@ Parameters> for more on the record name (NAME) and description (DESC) fields.
|
||||
pp(TRUE)
|
||||
interest(1)
|
||||
size(26)
|
||||
prop(YES)
|
||||
}
|
||||
field(THST,DBF_STRING) {
|
||||
prompt("Three String")
|
||||
@@ -300,6 +303,7 @@ Parameters> for more on the record name (NAME) and description (DESC) fields.
|
||||
pp(TRUE)
|
||||
interest(1)
|
||||
size(26)
|
||||
prop(YES)
|
||||
}
|
||||
field(FRST,DBF_STRING) {
|
||||
prompt("Four String")
|
||||
@@ -308,6 +312,7 @@ Parameters> for more on the record name (NAME) and description (DESC) fields.
|
||||
pp(TRUE)
|
||||
interest(1)
|
||||
size(26)
|
||||
prop(YES)
|
||||
}
|
||||
field(FVST,DBF_STRING) {
|
||||
prompt("Five String")
|
||||
@@ -316,6 +321,7 @@ Parameters> for more on the record name (NAME) and description (DESC) fields.
|
||||
pp(TRUE)
|
||||
interest(1)
|
||||
size(26)
|
||||
prop(YES)
|
||||
}
|
||||
field(SXST,DBF_STRING) {
|
||||
prompt("Six String")
|
||||
@@ -324,6 +330,7 @@ Parameters> for more on the record name (NAME) and description (DESC) fields.
|
||||
pp(TRUE)
|
||||
interest(1)
|
||||
size(26)
|
||||
prop(YES)
|
||||
}
|
||||
field(SVST,DBF_STRING) {
|
||||
prompt("Seven String")
|
||||
@@ -332,6 +339,7 @@ Parameters> for more on the record name (NAME) and description (DESC) fields.
|
||||
pp(TRUE)
|
||||
interest(1)
|
||||
size(26)
|
||||
prop(YES)
|
||||
}
|
||||
field(EIST,DBF_STRING) {
|
||||
prompt("Eight String")
|
||||
@@ -340,6 +348,7 @@ Parameters> for more on the record name (NAME) and description (DESC) fields.
|
||||
pp(TRUE)
|
||||
interest(1)
|
||||
size(26)
|
||||
prop(YES)
|
||||
}
|
||||
field(NIST,DBF_STRING) {
|
||||
prompt("Nine String")
|
||||
@@ -348,6 +357,7 @@ Parameters> for more on the record name (NAME) and description (DESC) fields.
|
||||
pp(TRUE)
|
||||
interest(1)
|
||||
size(26)
|
||||
prop(YES)
|
||||
}
|
||||
field(TEST,DBF_STRING) {
|
||||
prompt("Ten String")
|
||||
@@ -356,6 +366,7 @@ Parameters> for more on the record name (NAME) and description (DESC) fields.
|
||||
pp(TRUE)
|
||||
interest(1)
|
||||
size(26)
|
||||
prop(YES)
|
||||
}
|
||||
field(ELST,DBF_STRING) {
|
||||
prompt("Eleven String")
|
||||
@@ -364,6 +375,7 @@ Parameters> for more on the record name (NAME) and description (DESC) fields.
|
||||
pp(TRUE)
|
||||
interest(1)
|
||||
size(26)
|
||||
prop(YES)
|
||||
}
|
||||
field(TVST,DBF_STRING) {
|
||||
prompt("Twelve String")
|
||||
@@ -372,6 +384,7 @@ Parameters> for more on the record name (NAME) and description (DESC) fields.
|
||||
pp(TRUE)
|
||||
interest(1)
|
||||
size(26)
|
||||
prop(YES)
|
||||
}
|
||||
field(TTST,DBF_STRING) {
|
||||
prompt("Thirteen String")
|
||||
@@ -380,6 +393,7 @@ Parameters> for more on the record name (NAME) and description (DESC) fields.
|
||||
pp(TRUE)
|
||||
interest(1)
|
||||
size(26)
|
||||
prop(YES)
|
||||
}
|
||||
field(FTST,DBF_STRING) {
|
||||
prompt("Fourteen String")
|
||||
@@ -388,6 +402,7 @@ Parameters> for more on the record name (NAME) and description (DESC) fields.
|
||||
pp(TRUE)
|
||||
interest(1)
|
||||
size(26)
|
||||
prop(YES)
|
||||
}
|
||||
field(FFST,DBF_STRING) {
|
||||
prompt("Fifteen String")
|
||||
@@ -396,6 +411,7 @@ Parameters> for more on the record name (NAME) and description (DESC) fields.
|
||||
pp(TRUE)
|
||||
interest(1)
|
||||
size(26)
|
||||
prop(YES)
|
||||
}
|
||||
|
||||
=head3 Alarm Parameters
|
||||
|
||||
@@ -285,12 +285,9 @@ static long special(DBADDR *paddr, int after)
|
||||
return 0;
|
||||
init_common(prec);
|
||||
/* Note: ZRVL..FFVL are also SPC_MOD */
|
||||
if (fieldIndex >= mbboRecordZRST && fieldIndex <= mbboRecordFFST) {
|
||||
int event = DBE_PROPERTY;
|
||||
|
||||
if (prec->val == fieldIndex - mbboRecordZRST)
|
||||
event |= DBE_VALUE | DBE_LOG;
|
||||
db_post_events(prec, &prec->val, event);
|
||||
if (fieldIndex >= mbboRecordZRST && fieldIndex <= mbboRecordFFST
|
||||
&& prec->val == fieldIndex - mbboRecordZRST) {
|
||||
db_post_events(prec, &prec->val, DBE_VALUE | DBE_LOG);
|
||||
}
|
||||
return 0;
|
||||
|
||||
|
||||
@@ -354,6 +354,7 @@ for more information on simulation mode and its fields.
|
||||
pp(TRUE)
|
||||
interest(1)
|
||||
size(26)
|
||||
prop(YES)
|
||||
}
|
||||
field(ONST,DBF_STRING) {
|
||||
prompt("One String")
|
||||
@@ -362,6 +363,7 @@ for more information on simulation mode and its fields.
|
||||
pp(TRUE)
|
||||
interest(1)
|
||||
size(26)
|
||||
prop(YES)
|
||||
}
|
||||
field(TWST,DBF_STRING) {
|
||||
prompt("Two String")
|
||||
@@ -370,6 +372,7 @@ for more information on simulation mode and its fields.
|
||||
pp(TRUE)
|
||||
interest(1)
|
||||
size(26)
|
||||
prop(YES)
|
||||
}
|
||||
field(THST,DBF_STRING) {
|
||||
prompt("Three String")
|
||||
@@ -378,6 +381,7 @@ for more information on simulation mode and its fields.
|
||||
pp(TRUE)
|
||||
interest(1)
|
||||
size(26)
|
||||
prop(YES)
|
||||
}
|
||||
field(FRST,DBF_STRING) {
|
||||
prompt("Four String")
|
||||
@@ -386,6 +390,7 @@ for more information on simulation mode and its fields.
|
||||
pp(TRUE)
|
||||
interest(1)
|
||||
size(26)
|
||||
prop(YES)
|
||||
}
|
||||
field(FVST,DBF_STRING) {
|
||||
prompt("Five String")
|
||||
@@ -394,6 +399,7 @@ for more information on simulation mode and its fields.
|
||||
pp(TRUE)
|
||||
interest(1)
|
||||
size(26)
|
||||
prop(YES)
|
||||
}
|
||||
field(SXST,DBF_STRING) {
|
||||
prompt("Six String")
|
||||
@@ -402,6 +408,7 @@ for more information on simulation mode and its fields.
|
||||
pp(TRUE)
|
||||
interest(1)
|
||||
size(26)
|
||||
prop(YES)
|
||||
}
|
||||
field(SVST,DBF_STRING) {
|
||||
prompt("Seven String")
|
||||
@@ -410,6 +417,7 @@ for more information on simulation mode and its fields.
|
||||
pp(TRUE)
|
||||
interest(1)
|
||||
size(26)
|
||||
prop(YES)
|
||||
}
|
||||
field(EIST,DBF_STRING) {
|
||||
prompt("Eight String")
|
||||
@@ -418,6 +426,7 @@ for more information on simulation mode and its fields.
|
||||
pp(TRUE)
|
||||
interest(1)
|
||||
size(26)
|
||||
prop(YES)
|
||||
}
|
||||
field(NIST,DBF_STRING) {
|
||||
prompt("Nine String")
|
||||
@@ -426,6 +435,7 @@ for more information on simulation mode and its fields.
|
||||
pp(TRUE)
|
||||
interest(1)
|
||||
size(26)
|
||||
prop(YES)
|
||||
}
|
||||
field(TEST,DBF_STRING) {
|
||||
prompt("Ten String")
|
||||
@@ -434,6 +444,7 @@ for more information on simulation mode and its fields.
|
||||
pp(TRUE)
|
||||
interest(1)
|
||||
size(26)
|
||||
prop(YES)
|
||||
}
|
||||
field(ELST,DBF_STRING) {
|
||||
prompt("Eleven String")
|
||||
@@ -442,6 +453,7 @@ for more information on simulation mode and its fields.
|
||||
pp(TRUE)
|
||||
interest(1)
|
||||
size(26)
|
||||
prop(YES)
|
||||
}
|
||||
field(TVST,DBF_STRING) {
|
||||
prompt("Twelve String")
|
||||
@@ -450,6 +462,7 @@ for more information on simulation mode and its fields.
|
||||
pp(TRUE)
|
||||
interest(1)
|
||||
size(26)
|
||||
prop(YES)
|
||||
}
|
||||
field(TTST,DBF_STRING) {
|
||||
prompt("Thirteen String")
|
||||
@@ -458,6 +471,7 @@ for more information on simulation mode and its fields.
|
||||
pp(TRUE)
|
||||
interest(1)
|
||||
size(26)
|
||||
prop(YES)
|
||||
}
|
||||
field(FTST,DBF_STRING) {
|
||||
prompt("Fourteen String")
|
||||
@@ -466,6 +480,7 @@ for more information on simulation mode and its fields.
|
||||
pp(TRUE)
|
||||
interest(1)
|
||||
size(26)
|
||||
prop(YES)
|
||||
}
|
||||
field(FFST,DBF_STRING) {
|
||||
prompt("Fifteen String")
|
||||
@@ -474,6 +489,7 @@ for more information on simulation mode and its fields.
|
||||
pp(TRUE)
|
||||
interest(1)
|
||||
size(26)
|
||||
prop(YES)
|
||||
}
|
||||
field(ZRSV,DBF_MENU) {
|
||||
prompt("State Zero Severity")
|
||||
|
||||
@@ -282,10 +282,10 @@ static void processCallback(epicsCallback *arg)
|
||||
static long get_units(DBADDR *paddr, char *units)
|
||||
{
|
||||
seqRecord *prec = (seqRecord *) paddr->precord;
|
||||
int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY1);
|
||||
int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY0);
|
||||
|
||||
if (fieldOffset >= 0)
|
||||
switch (fieldOffset & 2) {
|
||||
switch (fieldOffset & 3) {
|
||||
case 0: /* DLYn */
|
||||
strcpy(units, "s");
|
||||
break;
|
||||
@@ -299,11 +299,11 @@ static long get_units(DBADDR *paddr, char *units)
|
||||
static long get_precision(const DBADDR *paddr, long *pprecision)
|
||||
{
|
||||
seqRecord *prec = (seqRecord *) paddr->precord;
|
||||
int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY1);
|
||||
int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY0);
|
||||
short precision;
|
||||
|
||||
if (fieldOffset >= 0)
|
||||
switch (fieldOffset & 2) {
|
||||
switch (fieldOffset & 3) {
|
||||
case 0: /* DLYn */
|
||||
*pprecision = seqDLYprecision;
|
||||
return 0;
|
||||
@@ -321,10 +321,10 @@ static long get_precision(const DBADDR *paddr, long *pprecision)
|
||||
static long get_graphic_double(DBADDR *paddr, struct dbr_grDouble *pgd)
|
||||
{
|
||||
seqRecord *prec = (seqRecord *) paddr->precord;
|
||||
int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY1);
|
||||
int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY0);
|
||||
|
||||
if (fieldOffset >= 0)
|
||||
switch (fieldOffset & 2) {
|
||||
switch (fieldOffset & 3) {
|
||||
case 0: /* DLYn */
|
||||
pgd->lower_disp_limit = 0.0;
|
||||
pgd->lower_disp_limit = 10.0;
|
||||
@@ -341,9 +341,9 @@ static long get_graphic_double(DBADDR *paddr, struct dbr_grDouble *pgd)
|
||||
|
||||
static long get_control_double(DBADDR *paddr, struct dbr_ctrlDouble *pcd)
|
||||
{
|
||||
int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY1);
|
||||
int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY0);
|
||||
|
||||
if (fieldOffset >= 0 && (fieldOffset & 2) == 0) { /* DLYn */
|
||||
if (fieldOffset >= 0 && (fieldOffset & 3) == 0) { /* DLYn */
|
||||
pcd->lower_ctrl_limit = 0.0;
|
||||
pcd->upper_ctrl_limit = seqDLYlimit;
|
||||
}
|
||||
@@ -355,9 +355,9 @@ static long get_control_double(DBADDR *paddr, struct dbr_ctrlDouble *pcd)
|
||||
static long get_alarm_double(DBADDR *paddr, struct dbr_alDouble *pad)
|
||||
{
|
||||
seqRecord *prec = (seqRecord *) paddr->precord;
|
||||
int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY1);
|
||||
int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY0);
|
||||
|
||||
if (fieldOffset >= 0 && (fieldOffset & 2) == 2) /* DOn */
|
||||
if (fieldOffset >= 0 && (fieldOffset & 3) == 2) /* DOn */
|
||||
dbGetAlarmLimits(get_dol(prec, fieldOffset),
|
||||
&pad->lower_alarm_limit, &pad->lower_warning_limit,
|
||||
&pad->upper_warning_limit, &pad->upper_alarm_limit);
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
# SPDX-FileCopyrightText: 1997 Argonne National Laboratory
|
||||
#
|
||||
# SPDX-License-Identifier: EPICS
|
||||
|
||||
# Makefile at top of application tree
|
||||
TOP = .
|
||||
include $(TOP)/configure/CONFIG
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
# SPDX-FileCopyrightText: 1998 Argonne National Laboratory
|
||||
#
|
||||
# SPDX-License-Identifier: EPICS
|
||||
|
||||
TOP=../..
|
||||
include $(TOP)/configure/CONFIG
|
||||
#----------------------------------------
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
# SPDX-FileCopyrightText: 2015 Argonne National Laboratory
|
||||
#
|
||||
# SPDX-License-Identifier: EPICS
|
||||
|
||||
record(lsi, "$(user):_APPNAME_:version") {
|
||||
field(DTYP, "_APPNAME_ version")
|
||||
field(DESC, "Version string")
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
# SPDX-FileCopyrightText: 2017 ITER Organization
|
||||
#
|
||||
# SPDX-License-Identifier: EPICS
|
||||
|
||||
record(ao, "$(user):circle:step") {
|
||||
field(VAL , "1.0")
|
||||
field(DRVL, "0.0")
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
# SPDX-FileCopyrightText: 1998 Argonne National Laboratory
|
||||
#
|
||||
# SPDX-License-Identifier: EPICS
|
||||
|
||||
record(ai, "$(user):aiExample")
|
||||
{
|
||||
field(DESC, "Analog input")
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
# SPDX-FileCopyrightText: 1998 Argonne National Laboratory
|
||||
#
|
||||
# SPDX-License-Identifier: EPICS
|
||||
|
||||
record(calc, "$(user):calcExample$(no)")
|
||||
{
|
||||
alias("$(user):calc$(no)")
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
# SPDX-FileCopyrightText: 2002 Argonne National Laboratory
|
||||
#
|
||||
# SPDX-License-Identifier: EPICS
|
||||
|
||||
record(sub,"$(user):subExample")
|
||||
{
|
||||
field(INAM,"mySubInit")
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
# SPDX-FileCopyrightText: 2006 Argonne National Laboratory
|
||||
#
|
||||
# SPDX-License-Identifier: EPICS
|
||||
|
||||
# Example substitutions file
|
||||
|
||||
file "db/circle.db" {
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
# SPDX-FileCopyrightText: 1997 Argonne National Laboratory
|
||||
#
|
||||
# SPDX-License-Identifier: EPICS
|
||||
|
||||
# Makefile at top of application tree
|
||||
TOP = ..
|
||||
include $(TOP)/configure/CONFIG
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
# SPDX-FileCopyrightText: 1998 Argonne National Laboratory
|
||||
#
|
||||
# SPDX-License-Identifier: EPICS
|
||||
|
||||
TOP=../..
|
||||
|
||||
include $(TOP)/configure/CONFIG
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user