From 0c6f13cab5f1d2fb55a6f22808637ed212c70089 Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Fri, 28 Oct 2022 19:44:09 +0100 Subject: [PATCH 01/54] Partially working on Windows. --- archApp/bplreport.py | 4 +- configure/CONFIG_PY | 12 +- configure/CONFIG_SITE | 2 +- configure/RELEASE | 1 + configure/RULES_PY | 58 ++- devsupApp/__init__.py | 0 devsupApp/_devsup.vcxproj | 486 ++++++++++++++++++++++++++ devsupApp/_devsup.vcxproj.filters | 55 +++ devsupApp/src/Makefile | 1 + devsupApp/src/__init__.py | 0 devsupApp/src/dbdset.c | 3 +- devsupApp/src/devsup/__init__.py | 8 +- devsupApp/src/devsup/disect.py | 1 + iocBoot/iocapplmon/st.cmd | 2 +- iocBoot/iocarchivemon/st.cmd | 2 +- iocBoot/iocweatherbnl/st.bat | 4 + iocBoot/iocweatherbnl/st.cmd | 2 +- makehelper.py | 12 +- pyDevSup.sln | 381 ++++++++++++++++++++ pyIocApp/pyDevSup310.vcxproj | 451 ++++++++++++++++++++++++ pyIocApp/pyDevSup310.vcxproj.filters | 36 ++ pyIocApp/setup.c | 6 +- pyIocApp/softIocPy310.vcxproj | 479 +++++++++++++++++++++++++ pyIocApp/softIocPy310.vcxproj.filters | 21 ++ pyIocApp/softIocPy310.vcxproj.user | 43 +++ setup.py | 11 + weatherApp/weather.py | 15 +- 27 files changed, 2065 insertions(+), 31 deletions(-) create mode 100644 devsupApp/__init__.py create mode 100644 devsupApp/_devsup.vcxproj create mode 100644 devsupApp/_devsup.vcxproj.filters create mode 100644 devsupApp/src/__init__.py create mode 100644 iocBoot/iocweatherbnl/st.bat create mode 100644 pyDevSup.sln create mode 100644 pyIocApp/pyDevSup310.vcxproj create mode 100644 pyIocApp/pyDevSup310.vcxproj.filters create mode 100644 pyIocApp/softIocPy310.vcxproj create mode 100644 pyIocApp/softIocPy310.vcxproj.filters create mode 100644 pyIocApp/softIocPy310.vcxproj.user create mode 100644 setup.py diff --git a/archApp/bplreport.py b/archApp/bplreport.py index ac0d86e..1ac92a9 100644 --- a/archApp/bplreport.py +++ b/archApp/bplreport.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -import time, sched, urllib2, json +import time, sched, urllib, json from devsup.db import IOScanListBlock from devsup.hooks import initHook from devsup.util import StoppableThread @@ -20,7 +20,7 @@ def fail(self): def process(self): self.result = None - R = urllib2.urlopen(self.url, timeout=3) + R = urllib.urlopen(self.url, timeout=3) try: if R.getcode()!=200: print 'Fail',R.getcode(), self.url diff --git a/configure/CONFIG_PY b/configure/CONFIG_PY index f2edef8..686b9ee 100644 --- a/configure/CONFIG_PY +++ b/configure/CONFIG_PY @@ -21,7 +21,16 @@ endif SHRLIB_DEPLIB_DIRS += $(PY_LIBDIRS) PROD_DEPLIB_DIRS += $(PY_LIBDIRS) -INCLUDES += $(PY_INCDIRS:%=-I%) +$(info $$PY_INCDIRS is ${PY_INCDIRS}) + +ifeq (windows-x64, $(findstring windows-x64, $(T_A))) + INCLUDES += -IC:/Python310/lib/site-packages/numpy/core/include + INCLUDES += -IC:/Python310/include +else + INCLUDES += $(PY_INCDIRS:%=-I%) +endif + +$(info $$INCLUDES is ${INCLUDES}) ifeq ($(HAVE_NUMPY),YES) TARGET_CPPFLAGS += -DHAVE_NUMPY @@ -33,6 +42,7 @@ endif #PROD_SYS_LIBS += python$(PY_LD_VER) PY_INSTALL_DIR = $(INSTALL_LOCATION)/python$(PY_LD_VER)/$(T_A) +$(info $$PY_INSTALL_DIR is ${PY_INSTALL_DIR}) ifneq ($(PYMODULE),NO) diff --git a/configure/CONFIG_SITE b/configure/CONFIG_SITE index 49c12e8..543015f 100644 --- a/configure/CONFIG_SITE +++ b/configure/CONFIG_SITE @@ -33,7 +33,7 @@ CHECK_RELEASE = YES #IOCS_APPL_TOP = # Default python version. -PY_VER=2.7 +PY_VER=3.10 # Module will be build against this version of the # Python interpreter diff --git a/configure/RELEASE b/configure/RELEASE index ba1fc22..1aa54c9 100644 --- a/configure/RELEASE +++ b/configure/RELEASE @@ -37,6 +37,7 @@ TEMPLATE_TOP=$(EPICS_BASE)/templates/makeBaseApp/top # EPICS_BASE usually appears last so other apps can override stuff: #EPICS_BASE=/usr/lib/epics +EPICS_BASE=\epics/base -include $(TOP)/configure/RELEASE.local -include $(TOP)/../RELEASE.local diff --git a/configure/RULES_PY b/configure/RULES_PY index c635d51..49dffa0 100644 --- a/configure/RULES_PY +++ b/configure/RULES_PY @@ -1,16 +1,54 @@ -ifneq ($(T_A),) +# extensions/configure/RULES_PYTHON -ifndef PY_VER -$(error Must include CONFIG_PY) -endif +ifdef T_A +ifeq ($(findstring Host,$(VALID_BUILDS)),Host) + +SWIG ?= swig + +vpath %.py $(USR_VPATH) $(ALL_SRC_DIRS) + +# The optional PYTHON_INSTALL_LOCATION environment variable +# should be set to /site-packages +PYTHON_INSTALL_LOCATION ?= $(INSTALL_LOCATION)/lang/python + +INSTALL_PYTHON = $(PYTHON_INSTALL_LOCATION)/$(PYTHON_PACKAGE) + +PYTHON_PACKAGE_PTH = $(addsuffix .pth,$(PYTHON_PACKAGE)) +INSTALL_PYTHON_PACKAGE_PTH = $(addprefix $(PYTHON_INSTALL_LOCATION)/,$(PYTHON_PACKAGE_PTH)) + +PYTHON_SCRIPTS = $(filter-out $(LOADABLE_LIBRARY),$(PYTHON_MODULES)) +PYTHON_LIBRARY = $(filter $(LOADABLE_LIBRARY),$(PYTHON_MODULES)) +PYTHON_SHRLIBNAME = $(PYTHON_LIBRARY:%=$(LOADABLE_SHRLIB_PREFIX)%$(LOADABLE_SHRLIB_SUFFIX)) -PY_FILES += $(PY:%=$(PY_INSTALL_DIR)/%) +INSTALL_PYTHONS = $(addprefix $(INSTALL_PYTHON)/,$(PYTHON_SCRIPTS)) +INSTALL_PYTHONS += $(addprefix $(INSTALL_PYTHON)/,$(PYTHON_SHRLIBNAME)) -$(PY_FILES) : $(PY_INSTALL_DIR)/%: ../% - @[ -d $(dir $@) ] || install -d $(dir $@) - @echo "Install PY $@" - install -m 644 $< $@ +buildInstall: $(INSTALL_PYTHONS) $(INSTALL_PYTHON_PACKAGE_PTH) -build: $(PY_FILES) +$(INSTALL_PYTHON)/%: % + @echo "Installing python modules $@" + @$(INSTALL) -d -m 644 $< $(INSTALL_PYTHON) +$(INSTALL_PYTHON)/%: ../% + @echo "Installing python modules $@" + @$(INSTALL) -d -m 644 $< $(INSTALL_PYTHON) + +$(PYTHON_INSTALL_LOCATION)/%: % + @echo "Installing python pth file $@" + @$(INSTALL) -d -m 644 $< $(PYTHON_INSTALL_LOCATION) + +$(PYTHON_PACKAGE_PTH): + @echo $(PYTHON_PACKAGE) > $@ + +%_wrap.c: ../%.i + $(SWIG) -python -o $@ $< + +ifdef BASE_3_15 +clean: +else +clean:: +endif + @$(RM) *.py *.so *.pth + +endif endif diff --git a/devsupApp/__init__.py b/devsupApp/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/devsupApp/_devsup.vcxproj b/devsupApp/_devsup.vcxproj new file mode 100644 index 0000000..1e86232 --- /dev/null +++ b/devsupApp/_devsup.vcxproj @@ -0,0 +1,486 @@ + + + + false + + + + Debug_DLL + Win32 + + + Debug_DLL + x64 + + + Debug_LIB + Win32 + + + Debug_LIB + x64 + + + Release_DLL + Win32 + + + Release_DLL + x64 + + + Release_LIB + Win32 + + + Release_LIB + x64 + + + + + + + + + + + + + + + + + + + + + {422a8c73-836c-48cb-86c8-0591e69c0ca1} + + + {9cf8d9ab-e47d-4923-a251-80e40b4e7144} + + + {e9d99fc7-e592-472b-b2e2-c3b0d81d8169} + + + + {BAE6CE99-140A-4018-8BCB-9D63F54D6F07} + Win32Proj + WithAsyn + Svn + Svn + SubversionScc + Svn + _dbapi + 10.0.17763.0 + + + + DynamicLibrary + true + v141 + false + + + DynamicLibrary + true + v141 + false + + + DynamicLibrary + true + v141 + false + + + DynamicLibrary + true + v141 + false + + + DynamicLibrary + false + true + v141 + false + + + DynamicLibrary + false + true + v141 + false + + + DynamicLibrary + false + true + v141 + false + + + DynamicLibrary + false + true + v141 + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + .pyd + + + true + + + true + + + true + + + false + .pyd + + + false + + + false + + + false + + + + + + Level3 + Disabled + XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";_DEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include + 4251 + + + Console + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib + C:\Python310\libs + + + + + xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd +copy $(OutDir)\_dbapi.pyd src\devsup\_dbapi.pyd + + + + if not exist O.Common md O.Common +if not exist $(SolutionDir)DBD md $(SolutionDir)DBD +SET PERL5LIB=$(SolutionDir)lib\perl +perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd +perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) + + + + + + + + Level3 + Disabled + XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";_DEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include + 4251 + + + Console + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib + C:\Python310\libs + + + + + xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd +copy $(OutDir)\_dbapi.dll src\devsup\_dbapi.pyd + + + + if not exist O.Common md O.Common +if not exist $(SolutionDir)DBD md $(SolutionDir)DBD +SET PERL5LIB=$(SolutionDir)lib\perl +perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd +perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) + + + + + + + + Level3 + Disabled + XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";_DEBUG;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include + MultiThreadedDebug + + + Console + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib + C:\Python310\libs + + + + + xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd +copy $(OutDir)\_dbapi.pyd src\devsup\_dbapi.pyd + + + + if not exist O.Common md O.Common +if not exist $(SolutionDir)DBD md $(SolutionDir)DBD +SET PERL5LIB=$(SolutionDir)lib\perl +perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd +perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) + + + + + + + + Level3 + Disabled + XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";_DEBUG;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include + MultiThreadedDebug + + + Console + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib + C:\Python310\libs + + + + + xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd +copy $(OutDir)\_dbapi.dll src\devsup\_dbapi.pyd + + + + if not exist O.Common md O.Common +if not exist $(SolutionDir)DBD md $(SolutionDir)DBD +SET PERL5LIB=$(SolutionDir)lib\perl +perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd +perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) + + + + + + Level3 + + + MaxSpeed + true + true + XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";NDEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include + 4251 + + + Console + true + true + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib + C:\Python310\libs + + + + + xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd +copy $(OutDir)\_dbapi.pyd src\devsup\_dbapi.pyd + + + + if not exist O.Common md O.Common +if not exist $(SolutionDir)DBD md $(SolutionDir)DBD +SET PERL5LIB=$(SolutionDir)lib\perl +perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd +perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) + + + + + + Level3 + + + MaxSpeed + true + true + XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";NDEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include + 4251 + + + Console + true + true + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib + C:\Python310\libs + + + + + xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd +copy $(OutDir)\_dbapi.dll src\devsup\_dbapi.pyd + + + + if not exist O.Common md O.Common +if not exist $(SolutionDir)DBD md $(SolutionDir)DBD +SET PERL5LIB=$(SolutionDir)lib\perl +perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd +perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) + + + + + + Level3 + + + MaxSpeed + true + true + XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";NDEBUG;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include + MultiThreaded + + + Console + true + true + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib + C:\Python310\libs + + + + + xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd +copy $(OutDir)\_dbapi.pyd src\devsup\_dbapi.pyd + + + + if not exist O.Common md O.Common +if not exist $(SolutionDir)DBD md $(SolutionDir)DBD +SET PERL5LIB=$(SolutionDir)lib\perl +perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd +perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) + + + + + + Level3 + + + MaxSpeed + true + true + XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";NDEBUG;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include + MultiThreaded + + + Console + true + true + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib + C:\Python310\libs + + + + + xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd +copy $(OutDir)\_dbapi.dll src\devsup\_dbapi.pyd + + + + if not exist O.Common md O.Common +if not exist $(SolutionDir)DBD md $(SolutionDir)DBD +SET PERL5LIB=$(SolutionDir)lib\perl +perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd +perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) + + + + + + WIN32;NDEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc + + + if not exist O.Common md O.Common +if not exist $(SolutionDir)DBD md $(SolutionDir)DBD +SET PERL5LIB=$(SolutionDir)lib\perl +perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\LeyboldTurbo_registerRecordDeviceDriver.cpp src\LeyboldTurboInclude.dbd LeyboldTurbo_registerRecordDeviceDriver $(SolutionDir) + + + + + + WIN32;_DEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc + + + if not exist O.Common md O.Common +if not exist $(SolutionDir)DBD md $(SolutionDir)DBD +SET PERL5LIB=$(SolutionDir)lib\perl +perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\LeyboldTurbo_registerRecordDeviceDriver.cpp src\LeyboldTurboInclude.dbd LeyboldTurbo_registerRecordDeviceDriver $(SolutionDir) + + + + + + + \ No newline at end of file diff --git a/devsupApp/_devsup.vcxproj.filters b/devsupApp/_devsup.vcxproj.filters new file mode 100644 index 0000000..0793efa --- /dev/null +++ b/devsupApp/_devsup.vcxproj.filters @@ -0,0 +1,55 @@ + + + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {fef0bd38-19ac-4984-803b-3bf69909b6aa} + + + {9d42cf23-b80c-4588-adf4-92e1b0892282} + + + + + src + + + src + + + src + + + src + + + src + + + O.Common + + + + + src + + + Db + + + O.Common + + + + + src + + + \ No newline at end of file diff --git a/devsupApp/src/Makefile b/devsupApp/src/Makefile index 3a26547..698feaa 100644 --- a/devsupApp/src/Makefile +++ b/devsupApp/src/Makefile @@ -29,6 +29,7 @@ _dbapi_SRCS += utest.c _dbapi_SRCS += pyDevSupCommon_registerRecordDeviceDriver.cpp _dbapi_LIBS += $(EPICS_BASE_IOC_LIBS) +_dbapi_SYS_LIBS_WIN32 += ws2_32 Advapi32 Dbghelp PY += devsup/__init__.py PY += devsup/db.py diff --git a/devsupApp/src/__init__.py b/devsupApp/src/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/devsupApp/src/dbdset.c b/devsupApp/src/dbdset.c index 68d76e4..845d1b2 100644 --- a/devsupApp/src/dbdset.c +++ b/devsupApp/src/dbdset.c @@ -22,6 +22,7 @@ #include #include #include +#include #include "pydevsup.h" @@ -449,7 +450,7 @@ static long python_asub(aSubRecord* prec) } /* uglyness to detect aSubRecord */ -extern rset* pvar_rset_aSubRSET; +epicsShareExtern rset* pvar_rset_aSubRSET; int isPyRecord(dbCommon *prec) { diff --git a/devsupApp/src/devsup/__init__.py b/devsupApp/src/devsup/__init__.py index dd8da5a..e57da9b 100644 --- a/devsupApp/src/devsup/__init__.py +++ b/devsupApp/src/devsup/__init__.py @@ -45,14 +45,16 @@ __all__ = [] + def _init(iocMain=False): + print ("iocMain", iocMain) if not iocMain: # we haven't read/register base.dbd _dbapi.dbReadDatabase(os.path.join(XEPICS_BASE, "dbd", "base.dbd"), path=os.path.join(XEPICS_BASE, "dbd")) _dbapi._dbd_rrd_base() - with tempfile.NamedTemporaryFile() as F: + with tempfile.NamedTemporaryFile(delete=False) as F: F.write(""" device(longin, INST_IO, pydevsupComIn, "Python Device") device(longout, INST_IO, pydevsupComOut, "Python Device") @@ -76,10 +78,12 @@ def _init(iocMain=False): device(aai, INST_IO, pydevsupComIn, "Python Device") device(aao, INST_IO, pydevsupComOut, "Python Device") """.encode('ascii')) - F.flush() + F.close() _dbapi.dbReadDatabase(F.name) + os.unlink(F.name) _dbapi._dbd_setup() + def _fini(iocMain=False): if iocMain: _dbapi.initHookAnnounce(9999) # our magic/fake AtExit hook diff --git a/devsupApp/src/devsup/disect.py b/devsupApp/src/devsup/disect.py index d166f74..b826361 100644 --- a/devsupApp/src/devsup/disect.py +++ b/devsupApp/src/devsup/disect.py @@ -4,6 +4,7 @@ import sys, gc, inspect, time try: + InstanceType = None from types import InstanceType except ImportError: pass # py3 diff --git a/iocBoot/iocapplmon/st.cmd b/iocBoot/iocapplmon/st.cmd index c931fb9..aa5f9d7 100755 --- a/iocBoot/iocapplmon/st.cmd +++ b/iocBoot/iocapplmon/st.cmd @@ -1,4 +1,4 @@ -#!../../bin/linux-x86/softIocPy2.7 +#!../../bin/linux-x86_64/softIocPy3.10 < envPaths diff --git a/iocBoot/iocarchivemon/st.cmd b/iocBoot/iocarchivemon/st.cmd index 20fef52..df1e3ff 100755 --- a/iocBoot/iocarchivemon/st.cmd +++ b/iocBoot/iocarchivemon/st.cmd @@ -1,4 +1,4 @@ -#!../../bin/linux-x86/softIocPy2.7 +#!../../bin/linux-x86_64/softIocPy3.10 < envPaths diff --git a/iocBoot/iocweatherbnl/st.bat b/iocBoot/iocweatherbnl/st.bat new file mode 100644 index 0000000..425e5ae --- /dev/null +++ b/iocBoot/iocweatherbnl/st.bat @@ -0,0 +1,4 @@ +set HOSTNAME=localhost +set IOCNAME=weatherbnl +set TOP=../../ +..\..\bin\windows-x64-static\softIocPy310.exe st.cmd diff --git a/iocBoot/iocweatherbnl/st.cmd b/iocBoot/iocweatherbnl/st.cmd index 0e52d50..a6426a6 100755 --- a/iocBoot/iocweatherbnl/st.cmd +++ b/iocBoot/iocweatherbnl/st.cmd @@ -1,4 +1,4 @@ -#!../../bin/linux-x86/softIocPy2.6 +#!../../bin/linux-x86_64/softIocPy3.10 < envPaths diff --git a/makehelper.py b/makehelper.py index 6ce8b8a..212834b 100644 --- a/makehelper.py +++ b/makehelper.py @@ -23,7 +23,7 @@ from distutils.sysconfig import get_config_var, get_python_inc incdirs = [get_python_inc()] -libdirs = [get_config_var('LIBDIR')] +libdirs = ['C:\\python310\\libs'] have_np='NO' try: @@ -33,8 +33,10 @@ except ImportError: pass -print('TARGET_CFLAGS +=',get_config_var('BASECFLAGS'), file=out) -print('TARGET_CXXFLAGS +=',get_config_var('BASECFLAGS'), file=out) +basecflags=get_config_var('BASECFLAGS') +if basecflags is not None: + print('TARGET_CFLAGS +=',basecflags, file=out) + print('TARGET_CXXFLAGS +=',basecflags, file=out) print('PY_VER :=',get_config_var('VERSION'), file=out) ldver = get_config_var('LDVERSION') @@ -43,8 +45,8 @@ if get_config_var('Py_DEBUG'): ldver = ldver+'_d' print('PY_LD_VER :=',ldver, file=out) -print('PY_INCDIRS :=',' '.join(incdirs), file=out) -print('PY_LIBDIRS :=',' '.join(libdirs), file=out) +print('PY_INCDIRS := ',incdirs, file=out) +print('PY_LIBDIRS := ',libdirs, file=out) print('HAVE_NUMPY :=',have_np, file=out) try: diff --git a/pyDevSup.sln b/pyDevSup.sln new file mode 100644 index 0000000..d62621c --- /dev/null +++ b/pyDevSup.sln @@ -0,0 +1,381 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28307.136 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Com", "..\..\base-7.0.6.1\modules\libcom\src\Com.vcxproj", "{E9D99FC7-E592-472B-B2E2-C3B0D81D8169}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ca", "..\..\base-7.0.6.1\modules\ca\src\client\ca.vcxproj", "{361BCEBD-8B02-4B15-B28B-863F0602CB99}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "e_flex", "..\..\base-7.0.6.1\modules\libcom\src\flex\e_flex.vcxproj", "{280222D8-1C6B-430D-8F32-C8A47397525B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "antelope", "..\..\base-7.0.6.1\modules\libcom\src\yacc\antelope.vcxproj", "{B06AFD40-69E3-4D78-B401-75A27C869381}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "base-7.0.6.1", "base-7.0.6.1", "{D772CB17-6D38-48F4-958E-6A721026C056}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{AF70446C-3E93-42DF-9943-18DDCFA4991A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "flex", "flex", "{CD897BA0-128B-4B9D-9BD0-1829E3EB91C6}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "yacc", "yacc", "{D915C7BF-E16C-446D-BB8F-26414F1C8F5B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tools", "tools", "{72F51F37-2669-43E0-A166-04E8FD34B294}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tools", "..\..\base-7.0.6.1\src\tools\tools.vcxproj", "{5CCE1C6A-2BD5-48BF-99E2-D29B58F91991}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ioc", "ioc", "{5499ACCB-903F-4F89-AAFA-C82E7AF7F132}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dbCore", "..\..\base-7.0.6.1\modules\database\src\ioc\dbCore.vcxproj", "{422A8C73-836C-48CB-86C8-0591E69C0CA1}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dbRecStd", "..\..\base-7.0.6.1\modules\database\src\std\dbRecStd.vcxproj", "{9CF8D9AB-E47D-4923-A251-80E40B4E7144}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "softIoc", "softIoc", "{BA5F5A20-2C40-4066-AE19-9853DFF82EEE}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "softIoc", "..\..\base-7.0.6.1\modules\database\src\std\softIoc\softIoc.vcxproj", "{CE14B4D8-C63F-4EA6-9DE4-CACE48EA092C}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "bpt", "bpt", "{3BE95765-EB5A-44D6-9369-A8759A2FAFDE}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "makeBpt", "..\..\base-7.0.6.1\modules\database\src\ioc\bpt\makeBpt.vcxproj", "{A17BA797-3CA6-47F9-B47E-673118EABA1A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "pyDevSup", "pyDevSup", "{D04ACFD8-B76B-4D6C-BF02-F280CF75ABAA}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "devsupApp", "devsupApp", "{C2A4C477-2BE6-494C-89F3-B51BA1376EBD}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "configure", "configure", "{18C9AB30-1CAF-4A41-95A2-0CA2D3E19854}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "iocBoot", "iocBoot", "{73322DE2-4EF3-41A8-86BE-BB9C2EEFDE68}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "modules", "modules", "{7605EED0-5C32-4994-A46F-CB2C7F6626B7}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ca", "ca", "{E66A6FB1-9A3A-4BD0-BED5-B3C841AD193A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "client", "client", "{2CAA5CD1-B135-4215-B9DE-8B15EB19F8FB}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "database", "database", "{1BAAD656-1CBB-4D3E-A983-0D14F518877A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{0FEE2476-268F-4683-B3AA-8CA5932333C6}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "libcom", "libcom", "{7D7B9019-333C-40E3-AC42-F21B6D638C09}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{2A16E720-4EE8-47A8-AF11-97DFE4B79C6D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "std", "std", "{B81B8DF0-D48C-4D5C-B1EB-FC8C2ACCA29F}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tools", "tools", "{76FAEC6F-2322-43DF-B96E-D2D0EDF57845}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dbtools", "..\..\base-7.0.6.1\modules\database\src\tools\dbtools.vcxproj", "{421A512B-4C74-4461-9956-DC5864275D18}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{154531C9-D836-409A-9B2D-E7E893510855}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "softIocPy310", "pyIocApp\softIocPy310.vcxproj", "{D3311F39-9AE8-4F16-BE04-1D1D31135BA9}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "iocapplmon", "iocapplmon", "{D05A6C72-E20D-4B21-A544-E76A419329F8}" + ProjectSection(SolutionItems) = preProject + iocBoot\iocapplmon\Makefile = iocBoot\iocapplmon\Makefile + iocBoot\iocapplmon\st.bat = iocBoot\iocapplmon\st.bat + iocBoot\iocapplmon\st.cmd = iocBoot\iocapplmon\st.cmd + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "iocarchivemon", "iocarchivemon", "{CDA2E23F-F2E4-4D36-85AE-43398D800DC4}" + ProjectSection(SolutionItems) = preProject + iocBoot\iocarchivemon\Makefile = iocBoot\iocarchivemon\Makefile + iocBoot\iocarchivemon\st.cmd = iocBoot\iocarchivemon\st.cmd + iocBoot\iocarchivemon\st.cmd.main = iocBoot\iocarchivemon\st.cmd.main + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ioccaputlog", "ioccaputlog", "{54B14EFD-5FF5-443C-B40D-F6B4B964309D}" + ProjectSection(SolutionItems) = preProject + iocBoot\ioccaputlog\Makefile = iocBoot\ioccaputlog\Makefile + iocBoot\ioccaputlog\st.cmd = iocBoot\ioccaputlog\st.cmd + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "iocFPM", "iocFPM", "{A784112A-84CF-4226-8C80-307F53413D1F}" + ProjectSection(SolutionItems) = preProject + iocBoot\iocFPM\fpm.db = iocBoot\iocFPM\fpm.db + iocBoot\iocFPM\fpm.py = iocBoot\iocFPM\fpm.py + iocBoot\iocFPM\loadnp.py = iocBoot\iocFPM\loadnp.py + iocBoot\iocFPM\Makefile = iocBoot\iocFPM\Makefile + iocBoot\iocFPM\st.cmd = iocBoot\iocFPM\st.cmd + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "iocweatherbnl", "iocweatherbnl", "{3674D600-79C9-4BCE-A19E-4A7FC6332426}" + ProjectSection(SolutionItems) = preProject + iocBoot\iocweatherbnl\Makefile = iocBoot\iocweatherbnl\Makefile + iocBoot\iocweatherbnl\st.bat = iocBoot\iocweatherbnl\st.bat + iocBoot\iocweatherbnl\st.cmd = iocBoot\iocweatherbnl\st.cmd + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_dbapi", "devsupApp\_devsup.vcxproj", "{BAE6CE99-140A-4018-8BCB-9D63F54D6F07}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "pyIocApp", "pyIocApp", "{C10F6E3C-C515-4707-991E-4D5F193D5D86}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pyDevSup310", "pyIocApp\pyDevSup310.vcxproj", "{E0621B43-15E2-4080-B777-16C02E5B4611}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug_DLL|Win32 = Debug_DLL|Win32 + Debug_DLL|x64 = Debug_DLL|x64 + Debug_LIB|Win32 = Debug_LIB|Win32 + Debug_LIB|x64 = Debug_LIB|x64 + Release_DLL|Win32 = Release_DLL|Win32 + Release_DLL|x64 = Release_DLL|x64 + Release_LIB|Win32 = Release_LIB|Win32 + Release_LIB|x64 = Release_LIB|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E9D99FC7-E592-472B-B2E2-C3B0D81D8169}.Debug_DLL|Win32.ActiveCfg = Debug_DLL|Win32 + {E9D99FC7-E592-472B-B2E2-C3B0D81D8169}.Debug_DLL|Win32.Build.0 = Debug_DLL|Win32 + {E9D99FC7-E592-472B-B2E2-C3B0D81D8169}.Debug_DLL|x64.ActiveCfg = Debug_DLL|x64 + {E9D99FC7-E592-472B-B2E2-C3B0D81D8169}.Debug_DLL|x64.Build.0 = Debug_DLL|x64 + {E9D99FC7-E592-472B-B2E2-C3B0D81D8169}.Debug_LIB|Win32.ActiveCfg = Debug_LIB|Win32 + {E9D99FC7-E592-472B-B2E2-C3B0D81D8169}.Debug_LIB|Win32.Build.0 = Debug_LIB|Win32 + {E9D99FC7-E592-472B-B2E2-C3B0D81D8169}.Debug_LIB|x64.ActiveCfg = Debug_LIB|x64 + {E9D99FC7-E592-472B-B2E2-C3B0D81D8169}.Debug_LIB|x64.Build.0 = Debug_LIB|x64 + {E9D99FC7-E592-472B-B2E2-C3B0D81D8169}.Release_DLL|Win32.ActiveCfg = Release_DLL|Win32 + {E9D99FC7-E592-472B-B2E2-C3B0D81D8169}.Release_DLL|Win32.Build.0 = Release_DLL|Win32 + {E9D99FC7-E592-472B-B2E2-C3B0D81D8169}.Release_DLL|x64.ActiveCfg = Release_DLL|x64 + {E9D99FC7-E592-472B-B2E2-C3B0D81D8169}.Release_DLL|x64.Build.0 = Release_DLL|x64 + {E9D99FC7-E592-472B-B2E2-C3B0D81D8169}.Release_LIB|Win32.ActiveCfg = Release_LIB|Win32 + {E9D99FC7-E592-472B-B2E2-C3B0D81D8169}.Release_LIB|Win32.Build.0 = Release_LIB|Win32 + {E9D99FC7-E592-472B-B2E2-C3B0D81D8169}.Release_LIB|x64.ActiveCfg = Release_LIB|x64 + {E9D99FC7-E592-472B-B2E2-C3B0D81D8169}.Release_LIB|x64.Build.0 = Release_LIB|x64 + {361BCEBD-8B02-4B15-B28B-863F0602CB99}.Debug_DLL|Win32.ActiveCfg = Debug_DLL|Win32 + {361BCEBD-8B02-4B15-B28B-863F0602CB99}.Debug_DLL|Win32.Build.0 = Debug_DLL|Win32 + {361BCEBD-8B02-4B15-B28B-863F0602CB99}.Debug_DLL|x64.ActiveCfg = Debug_DLL|x64 + {361BCEBD-8B02-4B15-B28B-863F0602CB99}.Debug_DLL|x64.Build.0 = Debug_DLL|x64 + {361BCEBD-8B02-4B15-B28B-863F0602CB99}.Debug_LIB|Win32.ActiveCfg = Debug_LIB|Win32 + {361BCEBD-8B02-4B15-B28B-863F0602CB99}.Debug_LIB|Win32.Build.0 = Debug_LIB|Win32 + {361BCEBD-8B02-4B15-B28B-863F0602CB99}.Debug_LIB|x64.ActiveCfg = Debug_LIB|x64 + {361BCEBD-8B02-4B15-B28B-863F0602CB99}.Debug_LIB|x64.Build.0 = Debug_LIB|x64 + {361BCEBD-8B02-4B15-B28B-863F0602CB99}.Release_DLL|Win32.ActiveCfg = Release_DLL|Win32 + {361BCEBD-8B02-4B15-B28B-863F0602CB99}.Release_DLL|Win32.Build.0 = Release_DLL|Win32 + {361BCEBD-8B02-4B15-B28B-863F0602CB99}.Release_DLL|x64.ActiveCfg = Release_DLL|x64 + {361BCEBD-8B02-4B15-B28B-863F0602CB99}.Release_DLL|x64.Build.0 = Release_DLL|x64 + {361BCEBD-8B02-4B15-B28B-863F0602CB99}.Release_LIB|Win32.ActiveCfg = Release_LIB|Win32 + {361BCEBD-8B02-4B15-B28B-863F0602CB99}.Release_LIB|Win32.Build.0 = Release_LIB|Win32 + {361BCEBD-8B02-4B15-B28B-863F0602CB99}.Release_LIB|x64.ActiveCfg = Release_LIB|x64 + {361BCEBD-8B02-4B15-B28B-863F0602CB99}.Release_LIB|x64.Build.0 = Release_LIB|x64 + {280222D8-1C6B-430D-8F32-C8A47397525B}.Debug_DLL|Win32.ActiveCfg = Debug_DLL|Win32 + {280222D8-1C6B-430D-8F32-C8A47397525B}.Debug_DLL|Win32.Build.0 = Debug_DLL|Win32 + {280222D8-1C6B-430D-8F32-C8A47397525B}.Debug_DLL|x64.ActiveCfg = Debug_DLL|x64 + {280222D8-1C6B-430D-8F32-C8A47397525B}.Debug_DLL|x64.Build.0 = Debug_DLL|x64 + {280222D8-1C6B-430D-8F32-C8A47397525B}.Debug_LIB|Win32.ActiveCfg = Debug_LIB|Win32 + {280222D8-1C6B-430D-8F32-C8A47397525B}.Debug_LIB|Win32.Build.0 = Debug_LIB|Win32 + {280222D8-1C6B-430D-8F32-C8A47397525B}.Debug_LIB|x64.ActiveCfg = Debug_LIB|x64 + {280222D8-1C6B-430D-8F32-C8A47397525B}.Debug_LIB|x64.Build.0 = Debug_LIB|x64 + {280222D8-1C6B-430D-8F32-C8A47397525B}.Release_DLL|Win32.ActiveCfg = Release_DLL|Win32 + {280222D8-1C6B-430D-8F32-C8A47397525B}.Release_DLL|Win32.Build.0 = Release_DLL|Win32 + {280222D8-1C6B-430D-8F32-C8A47397525B}.Release_DLL|x64.ActiveCfg = Release_DLL|x64 + {280222D8-1C6B-430D-8F32-C8A47397525B}.Release_DLL|x64.Build.0 = Release_DLL|x64 + {280222D8-1C6B-430D-8F32-C8A47397525B}.Release_LIB|Win32.ActiveCfg = Release_LIB|Win32 + {280222D8-1C6B-430D-8F32-C8A47397525B}.Release_LIB|Win32.Build.0 = Release_LIB|Win32 + {280222D8-1C6B-430D-8F32-C8A47397525B}.Release_LIB|x64.ActiveCfg = Release_LIB|x64 + {280222D8-1C6B-430D-8F32-C8A47397525B}.Release_LIB|x64.Build.0 = Release_LIB|x64 + {B06AFD40-69E3-4D78-B401-75A27C869381}.Debug_DLL|Win32.ActiveCfg = Debug_DLL|Win32 + {B06AFD40-69E3-4D78-B401-75A27C869381}.Debug_DLL|Win32.Build.0 = Debug_DLL|Win32 + {B06AFD40-69E3-4D78-B401-75A27C869381}.Debug_DLL|x64.ActiveCfg = Debug_DLL|x64 + {B06AFD40-69E3-4D78-B401-75A27C869381}.Debug_DLL|x64.Build.0 = Debug_DLL|x64 + {B06AFD40-69E3-4D78-B401-75A27C869381}.Debug_LIB|Win32.ActiveCfg = Debug_LIB|Win32 + {B06AFD40-69E3-4D78-B401-75A27C869381}.Debug_LIB|Win32.Build.0 = Debug_LIB|Win32 + {B06AFD40-69E3-4D78-B401-75A27C869381}.Debug_LIB|x64.ActiveCfg = Debug_LIB|x64 + {B06AFD40-69E3-4D78-B401-75A27C869381}.Debug_LIB|x64.Build.0 = Debug_LIB|x64 + {B06AFD40-69E3-4D78-B401-75A27C869381}.Release_DLL|Win32.ActiveCfg = Release_DLL|Win32 + {B06AFD40-69E3-4D78-B401-75A27C869381}.Release_DLL|Win32.Build.0 = Release_DLL|Win32 + {B06AFD40-69E3-4D78-B401-75A27C869381}.Release_DLL|x64.ActiveCfg = Release_DLL|x64 + {B06AFD40-69E3-4D78-B401-75A27C869381}.Release_DLL|x64.Build.0 = Release_DLL|x64 + {B06AFD40-69E3-4D78-B401-75A27C869381}.Release_LIB|Win32.ActiveCfg = Release_LIB|Win32 + {B06AFD40-69E3-4D78-B401-75A27C869381}.Release_LIB|Win32.Build.0 = Release_LIB|Win32 + {B06AFD40-69E3-4D78-B401-75A27C869381}.Release_LIB|x64.ActiveCfg = Release_LIB|x64 + {B06AFD40-69E3-4D78-B401-75A27C869381}.Release_LIB|x64.Build.0 = Release_LIB|x64 + {5CCE1C6A-2BD5-48BF-99E2-D29B58F91991}.Debug_DLL|Win32.ActiveCfg = Debug_DLL|Win32 + {5CCE1C6A-2BD5-48BF-99E2-D29B58F91991}.Debug_DLL|Win32.Build.0 = Debug_DLL|Win32 + {5CCE1C6A-2BD5-48BF-99E2-D29B58F91991}.Debug_DLL|x64.ActiveCfg = Debug_DLL|x64 + {5CCE1C6A-2BD5-48BF-99E2-D29B58F91991}.Debug_DLL|x64.Build.0 = Debug_DLL|x64 + {5CCE1C6A-2BD5-48BF-99E2-D29B58F91991}.Debug_LIB|Win32.ActiveCfg = Debug_LIB|Win32 + {5CCE1C6A-2BD5-48BF-99E2-D29B58F91991}.Debug_LIB|Win32.Build.0 = Debug_LIB|Win32 + {5CCE1C6A-2BD5-48BF-99E2-D29B58F91991}.Debug_LIB|x64.ActiveCfg = Debug_LIB|x64 + {5CCE1C6A-2BD5-48BF-99E2-D29B58F91991}.Debug_LIB|x64.Build.0 = Debug_LIB|x64 + {5CCE1C6A-2BD5-48BF-99E2-D29B58F91991}.Release_DLL|Win32.ActiveCfg = Release_DLL|Win32 + {5CCE1C6A-2BD5-48BF-99E2-D29B58F91991}.Release_DLL|Win32.Build.0 = Release_DLL|Win32 + {5CCE1C6A-2BD5-48BF-99E2-D29B58F91991}.Release_DLL|x64.ActiveCfg = Release_DLL|x64 + {5CCE1C6A-2BD5-48BF-99E2-D29B58F91991}.Release_DLL|x64.Build.0 = Release_DLL|x64 + {5CCE1C6A-2BD5-48BF-99E2-D29B58F91991}.Release_LIB|Win32.ActiveCfg = Release_LIB|Win32 + {5CCE1C6A-2BD5-48BF-99E2-D29B58F91991}.Release_LIB|Win32.Build.0 = Release_LIB|Win32 + {5CCE1C6A-2BD5-48BF-99E2-D29B58F91991}.Release_LIB|x64.ActiveCfg = Release_LIB|x64 + {5CCE1C6A-2BD5-48BF-99E2-D29B58F91991}.Release_LIB|x64.Build.0 = Release_LIB|x64 + {422A8C73-836C-48CB-86C8-0591E69C0CA1}.Debug_DLL|Win32.ActiveCfg = Debug_DLL|Win32 + {422A8C73-836C-48CB-86C8-0591E69C0CA1}.Debug_DLL|Win32.Build.0 = Debug_DLL|Win32 + {422A8C73-836C-48CB-86C8-0591E69C0CA1}.Debug_DLL|x64.ActiveCfg = Debug_DLL|x64 + {422A8C73-836C-48CB-86C8-0591E69C0CA1}.Debug_DLL|x64.Build.0 = Debug_DLL|x64 + {422A8C73-836C-48CB-86C8-0591E69C0CA1}.Debug_LIB|Win32.ActiveCfg = Debug_LIB|Win32 + {422A8C73-836C-48CB-86C8-0591E69C0CA1}.Debug_LIB|Win32.Build.0 = Debug_LIB|Win32 + {422A8C73-836C-48CB-86C8-0591E69C0CA1}.Debug_LIB|x64.ActiveCfg = Debug_LIB|x64 + {422A8C73-836C-48CB-86C8-0591E69C0CA1}.Debug_LIB|x64.Build.0 = Debug_LIB|x64 + {422A8C73-836C-48CB-86C8-0591E69C0CA1}.Release_DLL|Win32.ActiveCfg = Release_DLL|Win32 + {422A8C73-836C-48CB-86C8-0591E69C0CA1}.Release_DLL|Win32.Build.0 = Release_DLL|Win32 + {422A8C73-836C-48CB-86C8-0591E69C0CA1}.Release_DLL|x64.ActiveCfg = Release_DLL|x64 + {422A8C73-836C-48CB-86C8-0591E69C0CA1}.Release_DLL|x64.Build.0 = Release_DLL|x64 + {422A8C73-836C-48CB-86C8-0591E69C0CA1}.Release_LIB|Win32.ActiveCfg = Release_LIB|Win32 + {422A8C73-836C-48CB-86C8-0591E69C0CA1}.Release_LIB|Win32.Build.0 = Release_LIB|Win32 + {422A8C73-836C-48CB-86C8-0591E69C0CA1}.Release_LIB|x64.ActiveCfg = Release_LIB|x64 + {422A8C73-836C-48CB-86C8-0591E69C0CA1}.Release_LIB|x64.Build.0 = Release_LIB|x64 + {9CF8D9AB-E47D-4923-A251-80E40B4E7144}.Debug_DLL|Win32.ActiveCfg = Debug_DLL|Win32 + {9CF8D9AB-E47D-4923-A251-80E40B4E7144}.Debug_DLL|Win32.Build.0 = Debug_DLL|Win32 + {9CF8D9AB-E47D-4923-A251-80E40B4E7144}.Debug_DLL|x64.ActiveCfg = Debug_DLL|x64 + {9CF8D9AB-E47D-4923-A251-80E40B4E7144}.Debug_DLL|x64.Build.0 = Debug_DLL|x64 + {9CF8D9AB-E47D-4923-A251-80E40B4E7144}.Debug_LIB|Win32.ActiveCfg = Debug_LIB|Win32 + {9CF8D9AB-E47D-4923-A251-80E40B4E7144}.Debug_LIB|Win32.Build.0 = Debug_LIB|Win32 + {9CF8D9AB-E47D-4923-A251-80E40B4E7144}.Debug_LIB|x64.ActiveCfg = Debug_LIB|x64 + {9CF8D9AB-E47D-4923-A251-80E40B4E7144}.Debug_LIB|x64.Build.0 = Debug_LIB|x64 + {9CF8D9AB-E47D-4923-A251-80E40B4E7144}.Release_DLL|Win32.ActiveCfg = Release_DLL|Win32 + {9CF8D9AB-E47D-4923-A251-80E40B4E7144}.Release_DLL|Win32.Build.0 = Release_DLL|Win32 + {9CF8D9AB-E47D-4923-A251-80E40B4E7144}.Release_DLL|x64.ActiveCfg = Release_DLL|x64 + {9CF8D9AB-E47D-4923-A251-80E40B4E7144}.Release_DLL|x64.Build.0 = Release_DLL|x64 + {9CF8D9AB-E47D-4923-A251-80E40B4E7144}.Release_LIB|Win32.ActiveCfg = Release_LIB|Win32 + {9CF8D9AB-E47D-4923-A251-80E40B4E7144}.Release_LIB|Win32.Build.0 = Release_LIB|Win32 + {9CF8D9AB-E47D-4923-A251-80E40B4E7144}.Release_LIB|x64.ActiveCfg = Release_LIB|x64 + {9CF8D9AB-E47D-4923-A251-80E40B4E7144}.Release_LIB|x64.Build.0 = Release_LIB|x64 + {CE14B4D8-C63F-4EA6-9DE4-CACE48EA092C}.Debug_DLL|Win32.ActiveCfg = Debug_DLL|Win32 + {CE14B4D8-C63F-4EA6-9DE4-CACE48EA092C}.Debug_DLL|Win32.Build.0 = Debug_DLL|Win32 + {CE14B4D8-C63F-4EA6-9DE4-CACE48EA092C}.Debug_DLL|x64.ActiveCfg = Debug_DLL|x64 + {CE14B4D8-C63F-4EA6-9DE4-CACE48EA092C}.Debug_DLL|x64.Build.0 = Debug_DLL|x64 + {CE14B4D8-C63F-4EA6-9DE4-CACE48EA092C}.Debug_LIB|Win32.ActiveCfg = Debug_LIB|Win32 + {CE14B4D8-C63F-4EA6-9DE4-CACE48EA092C}.Debug_LIB|Win32.Build.0 = Debug_LIB|Win32 + {CE14B4D8-C63F-4EA6-9DE4-CACE48EA092C}.Debug_LIB|x64.ActiveCfg = Debug_LIB|x64 + {CE14B4D8-C63F-4EA6-9DE4-CACE48EA092C}.Debug_LIB|x64.Build.0 = Debug_LIB|x64 + {CE14B4D8-C63F-4EA6-9DE4-CACE48EA092C}.Release_DLL|Win32.ActiveCfg = Release_DLL|Win32 + {CE14B4D8-C63F-4EA6-9DE4-CACE48EA092C}.Release_DLL|Win32.Build.0 = Release_DLL|Win32 + {CE14B4D8-C63F-4EA6-9DE4-CACE48EA092C}.Release_DLL|x64.ActiveCfg = Release_DLL|x64 + {CE14B4D8-C63F-4EA6-9DE4-CACE48EA092C}.Release_DLL|x64.Build.0 = Release_DLL|x64 + {CE14B4D8-C63F-4EA6-9DE4-CACE48EA092C}.Release_LIB|Win32.ActiveCfg = Release_LIB|Win32 + {CE14B4D8-C63F-4EA6-9DE4-CACE48EA092C}.Release_LIB|Win32.Build.0 = Release_LIB|Win32 + {CE14B4D8-C63F-4EA6-9DE4-CACE48EA092C}.Release_LIB|x64.ActiveCfg = Release_LIB|x64 + {CE14B4D8-C63F-4EA6-9DE4-CACE48EA092C}.Release_LIB|x64.Build.0 = Release_LIB|x64 + {A17BA797-3CA6-47F9-B47E-673118EABA1A}.Debug_DLL|Win32.ActiveCfg = Debug_DLL|Win32 + {A17BA797-3CA6-47F9-B47E-673118EABA1A}.Debug_DLL|Win32.Build.0 = Debug_DLL|Win32 + {A17BA797-3CA6-47F9-B47E-673118EABA1A}.Debug_DLL|x64.ActiveCfg = Debug_DLL|x64 + {A17BA797-3CA6-47F9-B47E-673118EABA1A}.Debug_DLL|x64.Build.0 = Debug_DLL|x64 + {A17BA797-3CA6-47F9-B47E-673118EABA1A}.Debug_LIB|Win32.ActiveCfg = Debug_LIB|Win32 + {A17BA797-3CA6-47F9-B47E-673118EABA1A}.Debug_LIB|Win32.Build.0 = Debug_LIB|Win32 + {A17BA797-3CA6-47F9-B47E-673118EABA1A}.Debug_LIB|x64.ActiveCfg = Debug_LIB|x64 + {A17BA797-3CA6-47F9-B47E-673118EABA1A}.Debug_LIB|x64.Build.0 = Debug_LIB|x64 + {A17BA797-3CA6-47F9-B47E-673118EABA1A}.Release_DLL|Win32.ActiveCfg = Release_DLL|Win32 + {A17BA797-3CA6-47F9-B47E-673118EABA1A}.Release_DLL|Win32.Build.0 = Release_DLL|Win32 + {A17BA797-3CA6-47F9-B47E-673118EABA1A}.Release_DLL|x64.ActiveCfg = Release_DLL|x64 + {A17BA797-3CA6-47F9-B47E-673118EABA1A}.Release_DLL|x64.Build.0 = Release_DLL|x64 + {A17BA797-3CA6-47F9-B47E-673118EABA1A}.Release_LIB|Win32.ActiveCfg = Release_LIB|Win32 + {A17BA797-3CA6-47F9-B47E-673118EABA1A}.Release_LIB|Win32.Build.0 = Release_LIB|Win32 + {A17BA797-3CA6-47F9-B47E-673118EABA1A}.Release_LIB|x64.ActiveCfg = Release_LIB|x64 + {A17BA797-3CA6-47F9-B47E-673118EABA1A}.Release_LIB|x64.Build.0 = Release_LIB|x64 + {421A512B-4C74-4461-9956-DC5864275D18}.Debug_DLL|Win32.ActiveCfg = Debug_DLL|Win32 + {421A512B-4C74-4461-9956-DC5864275D18}.Debug_DLL|Win32.Build.0 = Debug_DLL|Win32 + {421A512B-4C74-4461-9956-DC5864275D18}.Debug_DLL|x64.ActiveCfg = Debug_DLL|x64 + {421A512B-4C74-4461-9956-DC5864275D18}.Debug_DLL|x64.Build.0 = Debug_DLL|x64 + {421A512B-4C74-4461-9956-DC5864275D18}.Debug_LIB|Win32.ActiveCfg = Debug_LIB|Win32 + {421A512B-4C74-4461-9956-DC5864275D18}.Debug_LIB|Win32.Build.0 = Debug_LIB|Win32 + {421A512B-4C74-4461-9956-DC5864275D18}.Debug_LIB|x64.ActiveCfg = Debug_LIB|x64 + {421A512B-4C74-4461-9956-DC5864275D18}.Debug_LIB|x64.Build.0 = Debug_LIB|x64 + {421A512B-4C74-4461-9956-DC5864275D18}.Release_DLL|Win32.ActiveCfg = Release_DLL|Win32 + {421A512B-4C74-4461-9956-DC5864275D18}.Release_DLL|Win32.Build.0 = Release_DLL|Win32 + {421A512B-4C74-4461-9956-DC5864275D18}.Release_DLL|x64.ActiveCfg = Release_DLL|x64 + {421A512B-4C74-4461-9956-DC5864275D18}.Release_DLL|x64.Build.0 = Release_DLL|x64 + {421A512B-4C74-4461-9956-DC5864275D18}.Release_LIB|Win32.ActiveCfg = Release_LIB|Win32 + {421A512B-4C74-4461-9956-DC5864275D18}.Release_LIB|Win32.Build.0 = Release_LIB|Win32 + {421A512B-4C74-4461-9956-DC5864275D18}.Release_LIB|x64.ActiveCfg = Release_LIB|x64 + {421A512B-4C74-4461-9956-DC5864275D18}.Release_LIB|x64.Build.0 = Release_LIB|x64 + {D3311F39-9AE8-4F16-BE04-1D1D31135BA9}.Debug_DLL|Win32.ActiveCfg = Debug_DLL|Win32 + {D3311F39-9AE8-4F16-BE04-1D1D31135BA9}.Debug_DLL|Win32.Build.0 = Debug_DLL|Win32 + {D3311F39-9AE8-4F16-BE04-1D1D31135BA9}.Debug_DLL|x64.ActiveCfg = Debug_DLL|x64 + {D3311F39-9AE8-4F16-BE04-1D1D31135BA9}.Debug_DLL|x64.Build.0 = Debug_DLL|x64 + {D3311F39-9AE8-4F16-BE04-1D1D31135BA9}.Debug_LIB|Win32.ActiveCfg = Debug_LIB|Win32 + {D3311F39-9AE8-4F16-BE04-1D1D31135BA9}.Debug_LIB|Win32.Build.0 = Debug_LIB|Win32 + {D3311F39-9AE8-4F16-BE04-1D1D31135BA9}.Debug_LIB|x64.ActiveCfg = Debug_LIB|x64 + {D3311F39-9AE8-4F16-BE04-1D1D31135BA9}.Debug_LIB|x64.Build.0 = Debug_LIB|x64 + {D3311F39-9AE8-4F16-BE04-1D1D31135BA9}.Release_DLL|Win32.ActiveCfg = Release_DLL|Win32 + {D3311F39-9AE8-4F16-BE04-1D1D31135BA9}.Release_DLL|Win32.Build.0 = Release_DLL|Win32 + {D3311F39-9AE8-4F16-BE04-1D1D31135BA9}.Release_DLL|x64.ActiveCfg = Release_DLL|x64 + {D3311F39-9AE8-4F16-BE04-1D1D31135BA9}.Release_DLL|x64.Build.0 = Release_DLL|x64 + {D3311F39-9AE8-4F16-BE04-1D1D31135BA9}.Release_LIB|Win32.ActiveCfg = Release_LIB|Win32 + {D3311F39-9AE8-4F16-BE04-1D1D31135BA9}.Release_LIB|Win32.Build.0 = Release_LIB|Win32 + {D3311F39-9AE8-4F16-BE04-1D1D31135BA9}.Release_LIB|x64.ActiveCfg = Release_LIB|x64 + {D3311F39-9AE8-4F16-BE04-1D1D31135BA9}.Release_LIB|x64.Build.0 = Release_LIB|x64 + {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Debug_DLL|Win32.ActiveCfg = Debug_DLL|Win32 + {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Debug_DLL|Win32.Build.0 = Debug_DLL|Win32 + {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Debug_DLL|x64.ActiveCfg = Debug_DLL|x64 + {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Debug_DLL|x64.Build.0 = Debug_DLL|x64 + {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Debug_LIB|Win32.ActiveCfg = Debug_LIB|Win32 + {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Debug_LIB|Win32.Build.0 = Debug_LIB|Win32 + {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Debug_LIB|x64.ActiveCfg = Debug_LIB|x64 + {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Debug_LIB|x64.Build.0 = Debug_LIB|x64 + {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Release_DLL|Win32.ActiveCfg = Release_DLL|Win32 + {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Release_DLL|Win32.Build.0 = Release_DLL|Win32 + {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Release_DLL|x64.ActiveCfg = Release_DLL|x64 + {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Release_DLL|x64.Build.0 = Release_DLL|x64 + {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Release_LIB|Win32.ActiveCfg = Release_LIB|Win32 + {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Release_LIB|Win32.Build.0 = Release_LIB|Win32 + {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Release_LIB|x64.ActiveCfg = Release_LIB|x64 + {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Release_LIB|x64.Build.0 = Release_LIB|x64 + {E0621B43-15E2-4080-B777-16C02E5B4611}.Debug_DLL|Win32.ActiveCfg = Debug_DLL|Win32 + {E0621B43-15E2-4080-B777-16C02E5B4611}.Debug_DLL|Win32.Build.0 = Debug_DLL|Win32 + {E0621B43-15E2-4080-B777-16C02E5B4611}.Debug_DLL|x64.ActiveCfg = Debug_DLL|x64 + {E0621B43-15E2-4080-B777-16C02E5B4611}.Debug_DLL|x64.Build.0 = Debug_DLL|x64 + {E0621B43-15E2-4080-B777-16C02E5B4611}.Debug_LIB|Win32.ActiveCfg = Debug_LIB|Win32 + {E0621B43-15E2-4080-B777-16C02E5B4611}.Debug_LIB|Win32.Build.0 = Debug_LIB|Win32 + {E0621B43-15E2-4080-B777-16C02E5B4611}.Debug_LIB|x64.ActiveCfg = Debug_LIB|x64 + {E0621B43-15E2-4080-B777-16C02E5B4611}.Debug_LIB|x64.Build.0 = Debug_LIB|x64 + {E0621B43-15E2-4080-B777-16C02E5B4611}.Release_DLL|Win32.ActiveCfg = Release_DLL|Win32 + {E0621B43-15E2-4080-B777-16C02E5B4611}.Release_DLL|Win32.Build.0 = Release_DLL|Win32 + {E0621B43-15E2-4080-B777-16C02E5B4611}.Release_DLL|x64.ActiveCfg = Release_DLL|x64 + {E0621B43-15E2-4080-B777-16C02E5B4611}.Release_DLL|x64.Build.0 = Release_DLL|x64 + {E0621B43-15E2-4080-B777-16C02E5B4611}.Release_LIB|Win32.ActiveCfg = Release_LIB|Win32 + {E0621B43-15E2-4080-B777-16C02E5B4611}.Release_LIB|Win32.Build.0 = Release_LIB|Win32 + {E0621B43-15E2-4080-B777-16C02E5B4611}.Release_LIB|x64.ActiveCfg = Release_LIB|x64 + {E0621B43-15E2-4080-B777-16C02E5B4611}.Release_LIB|x64.Build.0 = Release_LIB|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {E9D99FC7-E592-472B-B2E2-C3B0D81D8169} = {2A16E720-4EE8-47A8-AF11-97DFE4B79C6D} + {361BCEBD-8B02-4B15-B28B-863F0602CB99} = {2CAA5CD1-B135-4215-B9DE-8B15EB19F8FB} + {280222D8-1C6B-430D-8F32-C8A47397525B} = {CD897BA0-128B-4B9D-9BD0-1829E3EB91C6} + {B06AFD40-69E3-4D78-B401-75A27C869381} = {D915C7BF-E16C-446D-BB8F-26414F1C8F5B} + {AF70446C-3E93-42DF-9943-18DDCFA4991A} = {D772CB17-6D38-48F4-958E-6A721026C056} + {CD897BA0-128B-4B9D-9BD0-1829E3EB91C6} = {2A16E720-4EE8-47A8-AF11-97DFE4B79C6D} + {D915C7BF-E16C-446D-BB8F-26414F1C8F5B} = {2A16E720-4EE8-47A8-AF11-97DFE4B79C6D} + {72F51F37-2669-43E0-A166-04E8FD34B294} = {AF70446C-3E93-42DF-9943-18DDCFA4991A} + {5CCE1C6A-2BD5-48BF-99E2-D29B58F91991} = {72F51F37-2669-43E0-A166-04E8FD34B294} + {5499ACCB-903F-4F89-AAFA-C82E7AF7F132} = {0FEE2476-268F-4683-B3AA-8CA5932333C6} + {422A8C73-836C-48CB-86C8-0591E69C0CA1} = {5499ACCB-903F-4F89-AAFA-C82E7AF7F132} + {9CF8D9AB-E47D-4923-A251-80E40B4E7144} = {B81B8DF0-D48C-4D5C-B1EB-FC8C2ACCA29F} + {BA5F5A20-2C40-4066-AE19-9853DFF82EEE} = {B81B8DF0-D48C-4D5C-B1EB-FC8C2ACCA29F} + {CE14B4D8-C63F-4EA6-9DE4-CACE48EA092C} = {BA5F5A20-2C40-4066-AE19-9853DFF82EEE} + {3BE95765-EB5A-44D6-9369-A8759A2FAFDE} = {5499ACCB-903F-4F89-AAFA-C82E7AF7F132} + {A17BA797-3CA6-47F9-B47E-673118EABA1A} = {3BE95765-EB5A-44D6-9369-A8759A2FAFDE} + {C2A4C477-2BE6-494C-89F3-B51BA1376EBD} = {D04ACFD8-B76B-4D6C-BF02-F280CF75ABAA} + {18C9AB30-1CAF-4A41-95A2-0CA2D3E19854} = {D04ACFD8-B76B-4D6C-BF02-F280CF75ABAA} + {73322DE2-4EF3-41A8-86BE-BB9C2EEFDE68} = {D04ACFD8-B76B-4D6C-BF02-F280CF75ABAA} + {7605EED0-5C32-4994-A46F-CB2C7F6626B7} = {D772CB17-6D38-48F4-958E-6A721026C056} + {E66A6FB1-9A3A-4BD0-BED5-B3C841AD193A} = {7605EED0-5C32-4994-A46F-CB2C7F6626B7} + {2CAA5CD1-B135-4215-B9DE-8B15EB19F8FB} = {154531C9-D836-409A-9B2D-E7E893510855} + {1BAAD656-1CBB-4D3E-A983-0D14F518877A} = {7605EED0-5C32-4994-A46F-CB2C7F6626B7} + {0FEE2476-268F-4683-B3AA-8CA5932333C6} = {1BAAD656-1CBB-4D3E-A983-0D14F518877A} + {7D7B9019-333C-40E3-AC42-F21B6D638C09} = {7605EED0-5C32-4994-A46F-CB2C7F6626B7} + {2A16E720-4EE8-47A8-AF11-97DFE4B79C6D} = {7D7B9019-333C-40E3-AC42-F21B6D638C09} + {B81B8DF0-D48C-4D5C-B1EB-FC8C2ACCA29F} = {0FEE2476-268F-4683-B3AA-8CA5932333C6} + {76FAEC6F-2322-43DF-B96E-D2D0EDF57845} = {0FEE2476-268F-4683-B3AA-8CA5932333C6} + {421A512B-4C74-4461-9956-DC5864275D18} = {76FAEC6F-2322-43DF-B96E-D2D0EDF57845} + {154531C9-D836-409A-9B2D-E7E893510855} = {E66A6FB1-9A3A-4BD0-BED5-B3C841AD193A} + {D3311F39-9AE8-4F16-BE04-1D1D31135BA9} = {C10F6E3C-C515-4707-991E-4D5F193D5D86} + {D05A6C72-E20D-4B21-A544-E76A419329F8} = {73322DE2-4EF3-41A8-86BE-BB9C2EEFDE68} + {CDA2E23F-F2E4-4D36-85AE-43398D800DC4} = {73322DE2-4EF3-41A8-86BE-BB9C2EEFDE68} + {54B14EFD-5FF5-443C-B40D-F6B4B964309D} = {73322DE2-4EF3-41A8-86BE-BB9C2EEFDE68} + {A784112A-84CF-4226-8C80-307F53413D1F} = {73322DE2-4EF3-41A8-86BE-BB9C2EEFDE68} + {3674D600-79C9-4BCE-A19E-4A7FC6332426} = {73322DE2-4EF3-41A8-86BE-BB9C2EEFDE68} + {BAE6CE99-140A-4018-8BCB-9D63F54D6F07} = {C2A4C477-2BE6-494C-89F3-B51BA1376EBD} + {C10F6E3C-C515-4707-991E-4D5F193D5D86} = {D04ACFD8-B76B-4D6C-BF02-F280CF75ABAA} + {E0621B43-15E2-4080-B777-16C02E5B4611} = {C10F6E3C-C515-4707-991E-4D5F193D5D86} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {33A71C13-4DAD-484B-96AE-30E3B9F75D2C} + EndGlobalSection +EndGlobal diff --git a/pyIocApp/pyDevSup310.vcxproj b/pyIocApp/pyDevSup310.vcxproj new file mode 100644 index 0000000..787bbc5 --- /dev/null +++ b/pyIocApp/pyDevSup310.vcxproj @@ -0,0 +1,451 @@ + + + + false + + + + Debug_DLL + Win32 + + + Debug_DLL + x64 + + + Debug_LIB + Win32 + + + Debug_LIB + x64 + + + Release_DLL + Win32 + + + Release_DLL + x64 + + + Release_LIB + Win32 + + + Release_LIB + x64 + + + + + {422a8c73-836c-48cb-86c8-0591e69c0ca1} + + + {9cf8d9ab-e47d-4923-a251-80e40b4e7144} + + + {e9d99fc7-e592-472b-b2e2-c3b0d81d8169} + + + + + + + + + + + + {E0621B43-15E2-4080-B777-16C02E5B4611} + Win32Proj + Svn + Svn + SubversionScc + Svn + pyDevSup310 + 10.0.17763.0 + + + + DynamicLibrary + true + v141 + false + + + DynamicLibrary + true + v141 + false + + + StaticLibrary + true + v141 + false + + + StaticLibrary + true + v141 + false + + + DynamicLibrary + false + true + v141 + false + + + DynamicLibrary + false + true + v141 + false + + + StaticLibrary + false + true + v141 + false + + + StaticLibrary + false + true + v141 + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + .pyd + + + true + .pyd + + + true + + + true + + + false + .pyd + + + false + .pyd + + + false + + + false + + + + + + Level3 + Disabled + XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python310";XEPICS_ARCH="$(Configuration)";_DEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include + 4251 + + + Console + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib + C:\Python310\libs + + + if not exist O.Common md O.Common +if not exist $(SolutionDir)DBD md $(SolutionDir)DBD +SET PERL5LIB=$(SolutionDir)lib\perl +perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd +perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) + + + + + xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd + + + + + + + Level3 + Disabled + XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python310";XEPICS_ARCH="$(Configuration)";_DEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include + 4251 + + + Console + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib + C:\Python310\libs + + + if not exist O.Common md O.Common +if not exist $(SolutionDir)DBD md $(SolutionDir)DBD +SET PERL5LIB=$(SolutionDir)lib\perl +perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd +perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) + + + + + xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd + + + + + + + Level3 + Disabled + XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python310";XEPICS_ARCH="$(Configuration)";_DEBUG;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include + MultiThreadedDebug + + + Console + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib + + + if not exist O.Common md O.Common +if not exist $(SolutionDir)DBD md $(SolutionDir)DBD +SET PERL5LIB=$(SolutionDir)lib\perl +perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd +perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) + + + + + xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd + + + + + + + Level3 + Disabled + XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python310";XEPICS_ARCH="$(Configuration)";_DEBUG;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include + MultiThreadedDebug + + + Console + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib + + + if not exist O.Common md O.Common +if not exist $(SolutionDir)DBD md $(SolutionDir)DBD +SET PERL5LIB=$(SolutionDir)lib\perl +perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd +perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) + + + + + xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd + + + + + Level3 + + + MaxSpeed + true + true + XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python310";XEPICS_ARCH="$(Configuration)";NDEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include + 4251 + + + Console + true + true + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib + C:\Python310\libs + + + if not exist O.Common md O.Common +if not exist $(SolutionDir)DBD md $(SolutionDir)DBD +SET PERL5LIB=$(SolutionDir)lib\perl +perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd +perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) + + + + + xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd + + + + + Level3 + + + MaxSpeed + true + true + XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python310";XEPICS_ARCH="$(Configuration)";NDEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include + 4251 + + + Console + true + true + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib + C:\Python310\libs + + + if not exist O.Common md O.Common +if not exist $(SolutionDir)DBD md $(SolutionDir)DBD +SET PERL5LIB=$(SolutionDir)lib\perl +perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd +perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) + + + + + xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd + + + + + Level3 + + + MaxSpeed + true + true + XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python310";XEPICS_ARCH="$(Configuration)";NDEBUG;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include + MultiThreaded + + + Console + true + true + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib + + + if not exist O.Common md O.Common +if not exist $(SolutionDir)DBD md $(SolutionDir)DBD +SET PERL5LIB=$(SolutionDir)lib\perl +perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd +perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) + + + + + xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd + + + + + Level3 + + + MaxSpeed + true + true + XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python310";XEPICS_ARCH="$(Configuration)";NDEBUG;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include + MultiThreaded + + + Console + true + true + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib + + + if not exist O.Common md O.Common +if not exist $(SolutionDir)DBD md $(SolutionDir)DBD +SET PERL5LIB=$(SolutionDir)lib\perl +perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd +perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) + + + + + xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd + + + + + WIN32;NDEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc + + + if not exist O.Common md O.Common +if not exist $(SolutionDir)DBD md $(SolutionDir)DBD +SET PERL5LIB=$(SolutionDir)lib\perl +perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\LeyboldTurbo_registerRecordDeviceDriver.cpp src\LeyboldTurboInclude.dbd LeyboldTurbo_registerRecordDeviceDriver $(SolutionDir) + + + + + + WIN32;_DEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc + + + if not exist O.Common md O.Common +if not exist $(SolutionDir)DBD md $(SolutionDir)DBD +SET PERL5LIB=$(SolutionDir)lib\perl +perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\LeyboldTurbo_registerRecordDeviceDriver.cpp src\LeyboldTurboInclude.dbd LeyboldTurbo_registerRecordDeviceDriver $(SolutionDir) + + + + + + + \ No newline at end of file diff --git a/pyIocApp/pyDevSup310.vcxproj.filters b/pyIocApp/pyDevSup310.vcxproj.filters new file mode 100644 index 0000000..62f64f3 --- /dev/null +++ b/pyIocApp/pyDevSup310.vcxproj.filters @@ -0,0 +1,36 @@ + + + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {f19b6948-4535-47d5-a8c3-1f537ec15532} + False + + + {fef0bd38-19ac-4984-803b-3bf69909b6aa} + + + + + O.Common + + + src + + + + + Db + + + O.Common + + + \ No newline at end of file diff --git a/pyIocApp/setup.c b/pyIocApp/setup.c index 61c3861..4c880c0 100644 --- a/pyIocApp/setup.c +++ b/pyIocApp/setup.c @@ -23,6 +23,10 @@ #include #include "pydevsup.h" +#ifdef _WIN32 +#define PATH_MAX _MAX_PATH +#include +#endif static void cleanupPy(void *junk) { @@ -135,7 +139,7 @@ static void pySetupReg(void) setupPyPath(); if(PyRun_SimpleString("import devsup\n" - "devsup._init(iocMain=True)\n" + "devsup._init(iocMain=False)\n" )) { PyErr_Print(); PyErr_Clear(); diff --git a/pyIocApp/softIocPy310.vcxproj b/pyIocApp/softIocPy310.vcxproj new file mode 100644 index 0000000..03dded0 --- /dev/null +++ b/pyIocApp/softIocPy310.vcxproj @@ -0,0 +1,479 @@ + + + + false + + + + Debug_DLL + Win32 + + + Debug_DLL + x64 + + + Debug_LIB + Win32 + + + Debug_LIB + x64 + + + Release_DLL + Win32 + + + Release_DLL + x64 + + + Release_LIB + Win32 + + + Release_LIB + x64 + + + + + {361bcebd-8b02-4b15-b28b-863f0602cb99} + + + {422a8c73-836c-48cb-86c8-0591e69c0ca1} + + + {9cf8d9ab-e47d-4923-a251-80e40b4e7144} + + + {e9d99fc7-e592-472b-b2e2-c3b0d81d8169} + + + {e0621b43-15e2-4080-b777-16c02e5b4611} + + + + + + + + + + + + + {D3311F39-9AE8-4F16-BE04-1D1D31135BA9} + Win32Proj + WithAsyn + Svn + Svn + SubversionScc + Svn + softIocPy310 + 10.0.17763.0 + + + + Application + true + v141 + false + + + Application + true + v141 + false + + + Application + true + v141 + false + + + Application + true + v141 + false + + + Application + false + true + v141 + false + + + Application + false + true + v141 + false + + + Application + false + true + v141 + false + + + Application + false + true + v141 + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + true + + + true + + + true + + + false + + + false + + + false + + + false + + + + + + Level3 + Disabled + WIN32;XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";_DEBUG;EPICS_CALL_DLL;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;..\devsupApp\src + + + Console + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib + C:\Python310\libs + + + + + xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd + + + + if not exist O.Common md O.Common +if not exist $(SolutionDir)DBD md $(SolutionDir)DBD +SET PERL5LIB=$(SolutionDir)lib\perl +echo OutDir is $(OutDir) +perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common/softIocPy.dbd base.dbd pyDevSup.dbd system.dbd +perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common/softIocPy_registerRecordDeviceDriver.cpp O.Common/softIocPy.dbd softIocPy_registerRecordDeviceDriver "$(SolutionDir.Replace('\', '/'))" + + + + + + + + Level3 + Disabled + WIN32;XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";_DEBUG;EPICS_CALL_DLL;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;..\devsupApp\src + + + Console + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib + C:\Python310\libs + + + + + xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd + + + + if not exist O.Common md O.Common +if not exist $(SolutionDir)DBD md $(SolutionDir)DBD +SET PERL5LIB=$(SolutionDir)lib\perl +echo OutDir is $(OutDir) +perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common/softIocPy.dbd base.dbd pyDevSup.dbd system.dbd +perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common/softIocPy_registerRecordDeviceDriver.cpp O.Common/softIocPy.dbd softIocPy_registerRecordDeviceDriver "$(SolutionDir.Replace('\', '/'))" + + + + + + + + Level3 + Disabled + WIN32;XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";_DEBUG;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;..\devsupApp\src + MultiThreadedDebug + + + Console + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib + C:\Python310\libs + + + + + xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd + + + + if not exist O.Common md O.Common +if not exist $(SolutionDir)DBD md $(SolutionDir)DBD +SET PERL5LIB=$(SolutionDir)lib\perl +echo OutDir is $(OutDir) +perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common/softIocPy.dbd base.dbd pyDevSup.dbd system.dbd +perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common/softIocPy_registerRecordDeviceDriver.cpp O.Common/softIocPy.dbd softIocPy_registerRecordDeviceDriver "$(SolutionDir.Replace('\', '/'))" + + + + + + + + Level3 + Disabled + WIN32;XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";_DEBUG;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;..\devsupApp\src + MultiThreadedDebug + + + Console + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib + C:\Python310\libs + + + + + xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd + + + + if not exist O.Common md O.Common +if not exist $(SolutionDir)DBD md $(SolutionDir)DBD +SET PERL5LIB=$(SolutionDir)lib\perl +echo OutDir is $(OutDir) +perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common/softIocPy.dbd base.dbd pyDevSup.dbd system.dbd +perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common/softIocPy_registerRecordDeviceDriver.cpp O.Common/softIocPy.dbd softIocPy_registerRecordDeviceDriver "$(SolutionDir.Replace('\', '/'))" + + + + + + Level3 + + + MaxSpeed + true + true + WIN32;XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";NDEBUG;EPICS_CALL_DLL;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;..\devsupApp\src + + + Console + true + true + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib + C:\Python310\libs + + + + + xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd + + + + if not exist O.Common md O.Common +if not exist $(SolutionDir)DBD md $(SolutionDir)DBD +SET PERL5LIB=$(SolutionDir)lib\perl +echo OutDir is $(OutDir) +perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common/softIocPy.dbd base.dbd pyDevSup.dbd system.dbd +perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common/softIocPy_registerRecordDeviceDriver.cpp O.Common/softIocPy.dbd softIocPy_registerRecordDeviceDriver "$(SolutionDir.Replace('\', '/'))" + + + + + + Level3 + + + MaxSpeed + true + true + WIN32;XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";NDEBUG;EPICS_CALL_DLL;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;..\devsupApp\src + + + Console + true + true + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib + C:\Python310\libs + + + + + xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd + + + + if not exist O.Common md O.Common +if not exist $(SolutionDir)DBD md $(SolutionDir)DBD +SET PERL5LIB=$(SolutionDir)lib\perl +echo OutDir is $(OutDir) +perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common/softIocPy.dbd base.dbd pyDevSup.dbd system.dbd +perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common/softIocPy_registerRecordDeviceDriver.cpp O.Common/softIocPy.dbd softIocPy_registerRecordDeviceDriver "$(SolutionDir.Replace('\', '/'))" + + + + + + Level3 + + + MaxSpeed + true + true + WIN32;XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";NDEBUG;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;..\devsupApp\src + MultiThreaded + + + Console + true + true + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib + C:\Python310\libs + + + + + xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd + + + + if not exist O.Common md O.Common +if not exist $(SolutionDir)DBD md $(SolutionDir)DBD +SET PERL5LIB=$(SolutionDir)lib\perl +echo OutDir is $(OutDir) +perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common/softIocPy.dbd base.dbd pyDevSup.dbd system.dbd +perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common/softIocPy_registerRecordDeviceDriver.cpp O.Common/softIocPy.dbd softIocPy_registerRecordDeviceDriver "$(SolutionDir.Replace('\', '/'))" + + + + + + Level3 + + + MaxSpeed + true + true + WIN32;XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";NDEBUG;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;..\devsupApp\src + MultiThreaded + + + Console + true + true + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib + C:\Python310\libs + + + + + xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd + + + + if not exist O.Common md O.Common +if not exist $(SolutionDir)DBD md $(SolutionDir)DBD +SET PERL5LIB=$(SolutionDir)lib\perl +echo OutDir is $(OutDir) +perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common/softIocPy.dbd base.dbd pyDevSup.dbd system.dbd +perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common/softIocPy_registerRecordDeviceDriver.cpp O.Common/softIocPy.dbd softIocPy_registerRecordDeviceDriver "$(SolutionDir.Replace('\', '/'))" + + + + + + WIN32;NDEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc + + + if not exist O.Common md O.Common +if not exist $(SolutionDir)DBD md $(SolutionDir)DBD +SET PERL5LIB=$(SolutionDir)lib\perl +perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\LeyboldTurbo_registerRecordDeviceDriver.cpp src\LeyboldTurboInclude.dbd LeyboldTurbo_registerRecordDeviceDriver $(SolutionDir) + + + + + + WIN32;_DEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc + + + if not exist O.Common md O.Common +if not exist $(SolutionDir)DBD md $(SolutionDir)DBD +SET PERL5LIB=$(SolutionDir)lib\perl +perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\LeyboldTurbo_registerRecordDeviceDriver.cpp src\LeyboldTurboInclude.dbd LeyboldTurbo_registerRecordDeviceDriver $(SolutionDir) + + + + + + + \ No newline at end of file diff --git a/pyIocApp/softIocPy310.vcxproj.filters b/pyIocApp/softIocPy310.vcxproj.filters new file mode 100644 index 0000000..8053e45 --- /dev/null +++ b/pyIocApp/softIocPy310.vcxproj.filters @@ -0,0 +1,21 @@ + + + + + {04aeea59-1c62-4a91-8d52-15e8e9b8515e} + + + + + O.Common + + + + + + + O.Common + + + + \ No newline at end of file diff --git a/pyIocApp/softIocPy310.vcxproj.user b/pyIocApp/softIocPy310.vcxproj.user new file mode 100644 index 0000000..1546891 --- /dev/null +++ b/pyIocApp/softIocPy310.vcxproj.user @@ -0,0 +1,43 @@ + + + + PATH=%PATH%;C:\Python310 +PYTHONPATH=$(SolutionDir)devsupApp\src + WindowsLocalDebugger + + + PATH=%PATH%;C:\Python310 +PYTHONPATH=$(SolutionDir)devsupApp\src + WindowsLocalDebugger + + + PATH=%PATH%;C:\Python310 +PYTHONPATH=$(SolutionDir)devsupApp\src + WindowsLocalDebugger + + + PATH=%PATH%;C:\Python310 +PYTHONPATH=$(SolutionDir)devsupApp\src + WindowsLocalDebugger + + + PATH=%PATH%;C:\Python310 +PYTHONPATH=$(SolutionDir)devsupApp\src + WindowsLocalDebugger + + + PATH=%PATH%;C:\Python310 +PYTHONPATH=$(SolutionDir)devsupApp\src + WindowsLocalDebugger + + + PATH=%PATH%;C:\Python310 +PYTHONPATH=$(SolutionDir)devsupApp\src + WindowsLocalDebugger + + + PATH=%PATH%;C:\Python310 +PYTHONPATH=$(SolutionDir)devsupApp\src + WindowsLocalDebugger + + \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..2b21fea --- /dev/null +++ b/setup.py @@ -0,0 +1,11 @@ +from setuptools import setup, find_packages + +setup(name='devsup', + version='1.3', + description='EPICS Device support in Python', + author='Michael Davidsaver', + author_email='mdavidsaver@gmail.com', + license='GNU GPLublic v2.0', + url='https://github.com/mdavidsaver/pyDevSup/', + packages=find_packages(), + ) \ No newline at end of file diff --git a/weatherApp/weather.py b/weatherApp/weather.py index 14bca61..08d3df6 100644 --- a/weatherApp/weather.py +++ b/weatherApp/weather.py @@ -1,13 +1,13 @@ # -*- coding: utf-8 -*- from __future__ import print_function -import socket, time, urllib2 +import time from weakref import WeakValueDictionary -from devsup.hooks import addHook -from devsup.util import StoppableThread -from devsup.db import IOScanListBlock +from devsupApp.src.devsup.hooks import addHook +from devsupApp.src.devsup.util import StoppableThread +from devsupApp.src.devsup.db import IOScanListBlock try: import pymetar @@ -114,7 +114,7 @@ def __init__(self, station): self.scan = IOScanListBlock() # I/O Intr scan for report data self.intscan = IOScanListBlock() # scan for internal info - super(ReportScanner,self).__init__() + super(ReportScanner, self).__init__() addHook('AfterIocRunning', self.start) addHook('AtIocExit', self.join) @@ -157,3 +157,8 @@ def run(self): self.sleep(self.updatePeriod) print('Done') + + +if __name__ == '__main__': + Scanner = ReportScanner("EGTK") # Oxford airport station + Scanner.start() From 3c9a62fb81359a6f37c0a8c96482583eb9b5695b Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Tue, 1 Nov 2022 16:39:44 +0000 Subject: [PATCH 02/54] Re-tested on Windows and Linux. --- configure/CONFIG_PY | 12 +----------- devsupApp/src/dbapi.c | 2 +- devsupApp/src/devsup/__init__.py | 1 - iocBoot/iocFPM/Makefile | 2 +- iocBoot/iocapplmon/Makefile | 2 +- iocBoot/iocarchivemon/Makefile | 2 +- iocBoot/ioccaputlog/Makefile | 2 +- iocBoot/iocweatherbnl/Makefile | 2 +- iocBoot/iocweatherbnl/st.bat | 2 ++ makehelper.py | 8 ++++---- pyIocApp/softIocPy310.vcxproj | 3 +++ pyIocApp/softIocPy310.vcxproj.user | 13 ++++++++++--- weatherApp/weather.py | 2 +- 13 files changed, 27 insertions(+), 26 deletions(-) diff --git a/configure/CONFIG_PY b/configure/CONFIG_PY index 686b9ee..f2edef8 100644 --- a/configure/CONFIG_PY +++ b/configure/CONFIG_PY @@ -21,16 +21,7 @@ endif SHRLIB_DEPLIB_DIRS += $(PY_LIBDIRS) PROD_DEPLIB_DIRS += $(PY_LIBDIRS) -$(info $$PY_INCDIRS is ${PY_INCDIRS}) - -ifeq (windows-x64, $(findstring windows-x64, $(T_A))) - INCLUDES += -IC:/Python310/lib/site-packages/numpy/core/include - INCLUDES += -IC:/Python310/include -else - INCLUDES += $(PY_INCDIRS:%=-I%) -endif - -$(info $$INCLUDES is ${INCLUDES}) +INCLUDES += $(PY_INCDIRS:%=-I%) ifeq ($(HAVE_NUMPY),YES) TARGET_CPPFLAGS += -DHAVE_NUMPY @@ -42,7 +33,6 @@ endif #PROD_SYS_LIBS += python$(PY_LD_VER) PY_INSTALL_DIR = $(INSTALL_LOCATION)/python$(PY_LD_VER)/$(T_A) -$(info $$PY_INSTALL_DIR is ${PY_INSTALL_DIR}) ifneq ($(PYMODULE),NO) diff --git a/devsupApp/src/dbapi.c b/devsupApp/src/dbapi.c index 2dab153..f859cd6 100644 --- a/devsupApp/src/dbapi.c +++ b/devsupApp/src/dbapi.c @@ -278,7 +278,7 @@ static struct PyMethodDef dbapimethod[] = { "Execute IOC shell script or command"}, {"dbReadDatabase", (PyCFunction)py_dbReadDatabase, METH_VARARGS|METH_KEYWORDS, "Load EPICS database file"}, - {"iocInit", (PyCFunction)py_iocInit, METH_NOARGS, + {"iocInit", (PyCFunction)py_iocInit, METH_VARARGS|METH_KEYWORDS, "Initialize IOC"}, {"_dbd_setup", (PyCFunction)pyDBD_setup, METH_NOARGS, ""}, {"_dbd_rrd_base", (PyCFunction)py_pyDevSupCommon, METH_NOARGS, ""}, diff --git a/devsupApp/src/devsup/__init__.py b/devsupApp/src/devsup/__init__.py index e57da9b..d1ff048 100644 --- a/devsupApp/src/devsup/__init__.py +++ b/devsupApp/src/devsup/__init__.py @@ -47,7 +47,6 @@ def _init(iocMain=False): - print ("iocMain", iocMain) if not iocMain: # we haven't read/register base.dbd _dbapi.dbReadDatabase(os.path.join(XEPICS_BASE, "dbd", "base.dbd"), diff --git a/iocBoot/iocFPM/Makefile b/iocBoot/iocFPM/Makefile index 79c4ce6..e1b9aa4 100644 --- a/iocBoot/iocFPM/Makefile +++ b/iocBoot/iocFPM/Makefile @@ -1,5 +1,5 @@ TOP = ../.. include $(TOP)/configure/CONFIG -ARCH = linux-x86_64 +ARCH = $(EPICS_HOST_ARCH) TARGETS = envPaths include $(TOP)/configure/RULES.ioc diff --git a/iocBoot/iocapplmon/Makefile b/iocBoot/iocapplmon/Makefile index 79c4ce6..e1b9aa4 100644 --- a/iocBoot/iocapplmon/Makefile +++ b/iocBoot/iocapplmon/Makefile @@ -1,5 +1,5 @@ TOP = ../.. include $(TOP)/configure/CONFIG -ARCH = linux-x86_64 +ARCH = $(EPICS_HOST_ARCH) TARGETS = envPaths include $(TOP)/configure/RULES.ioc diff --git a/iocBoot/iocarchivemon/Makefile b/iocBoot/iocarchivemon/Makefile index 79c4ce6..e1b9aa4 100644 --- a/iocBoot/iocarchivemon/Makefile +++ b/iocBoot/iocarchivemon/Makefile @@ -1,5 +1,5 @@ TOP = ../.. include $(TOP)/configure/CONFIG -ARCH = linux-x86_64 +ARCH = $(EPICS_HOST_ARCH) TARGETS = envPaths include $(TOP)/configure/RULES.ioc diff --git a/iocBoot/ioccaputlog/Makefile b/iocBoot/ioccaputlog/Makefile index 79c4ce6..e1b9aa4 100644 --- a/iocBoot/ioccaputlog/Makefile +++ b/iocBoot/ioccaputlog/Makefile @@ -1,5 +1,5 @@ TOP = ../.. include $(TOP)/configure/CONFIG -ARCH = linux-x86_64 +ARCH = $(EPICS_HOST_ARCH) TARGETS = envPaths include $(TOP)/configure/RULES.ioc diff --git a/iocBoot/iocweatherbnl/Makefile b/iocBoot/iocweatherbnl/Makefile index 79c4ce6..e1b9aa4 100644 --- a/iocBoot/iocweatherbnl/Makefile +++ b/iocBoot/iocweatherbnl/Makefile @@ -1,5 +1,5 @@ TOP = ../.. include $(TOP)/configure/CONFIG -ARCH = linux-x86_64 +ARCH = $(EPICS_HOST_ARCH) TARGETS = envPaths include $(TOP)/configure/RULES.ioc diff --git a/iocBoot/iocweatherbnl/st.bat b/iocBoot/iocweatherbnl/st.bat index 425e5ae..ac5b01d 100644 --- a/iocBoot/iocweatherbnl/st.bat +++ b/iocBoot/iocweatherbnl/st.bat @@ -1,4 +1,6 @@ set HOSTNAME=localhost set IOCNAME=weatherbnl set TOP=../../ +set PATH=C:\Python310;C:\Windows +set PYTHONPATH=%TOP%devsupApp\src ..\..\bin\windows-x64-static\softIocPy310.exe st.cmd diff --git a/makehelper.py b/makehelper.py index 212834b..869023f 100644 --- a/makehelper.py +++ b/makehelper.py @@ -20,10 +20,10 @@ else: out = open(sys.argv[1], 'w') -from distutils.sysconfig import get_config_var, get_python_inc +from distutils.sysconfig import get_config_var, get_python_inc, get_python_lib incdirs = [get_python_inc()] -libdirs = ['C:\\python310\\libs'] +libdirs = [get_python_lib()] have_np='NO' try: @@ -45,8 +45,8 @@ if get_config_var('Py_DEBUG'): ldver = ldver+'_d' print('PY_LD_VER :=',ldver, file=out) -print('PY_INCDIRS := ',incdirs, file=out) -print('PY_LIBDIRS := ',libdirs, file=out) +print('PY_INCDIRS :=',' '.join(incdirs), file=out) +print('PY_LIBDIRS :=',' '.join(libdirs), file=out) print('HAVE_NUMPY :=',have_np, file=out) try: diff --git a/pyIocApp/softIocPy310.vcxproj b/pyIocApp/softIocPy310.vcxproj index 03dded0..a22ce40 100644 --- a/pyIocApp/softIocPy310.vcxproj +++ b/pyIocApp/softIocPy310.vcxproj @@ -50,6 +50,9 @@ {e9d99fc7-e592-472b-b2e2-c3b0d81d8169} + + {bae6ce99-140a-4018-8bcb-9d63f54d6f07} + {e0621b43-15e2-4080-b777-16c02e5b4611} diff --git a/pyIocApp/softIocPy310.vcxproj.user b/pyIocApp/softIocPy310.vcxproj.user index 1546891..da99072 100644 --- a/pyIocApp/softIocPy310.vcxproj.user +++ b/pyIocApp/softIocPy310.vcxproj.user @@ -26,9 +26,16 @@ PYTHONPATH=$(SolutionDir)devsupApp\src WindowsLocalDebugger - PATH=%PATH%;C:\Python310 -PYTHONPATH=$(SolutionDir)devsupApp\src - WindowsLocalDebugger + HOSTNAME=localhost +set +IOCNAME=weatherbnl +TOP=../../ +PATH=C:\Python310;C:\Windows +PYTHONPATH=$(SolutionDir)devsupApp\src +ARCH="$(Configuration)" + WindowsLocalDebugger + st.cmd + ..\iocBoot\iocweatherbnl PATH=%PATH%;C:\Python310 diff --git a/weatherApp/weather.py b/weatherApp/weather.py index 08d3df6..15351ac 100644 --- a/weatherApp/weather.py +++ b/weatherApp/weather.py @@ -161,4 +161,4 @@ def run(self): if __name__ == '__main__': Scanner = ReportScanner("EGTK") # Oxford airport station - Scanner.start() + Scanner.run() From 1cbc7ad6426a28c85e061e9bc0250128c262c9d5 Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Wed, 2 Nov 2022 10:23:39 +0000 Subject: [PATCH 03/54] Corrected _dbapi VS project name. --- devsupApp/{_devsup.vcxproj => _dbapi.vcxproj} | 0 ...vcxproj.filters => _dbapi.vcxproj.filters} | 0 pyDevSup.sln | 38 +++++++++---------- pyIocApp/softIocPy310.vcxproj | 3 -- 4 files changed, 19 insertions(+), 22 deletions(-) rename devsupApp/{_devsup.vcxproj => _dbapi.vcxproj} (100%) rename devsupApp/{_devsup.vcxproj.filters => _dbapi.vcxproj.filters} (100%) diff --git a/devsupApp/_devsup.vcxproj b/devsupApp/_dbapi.vcxproj similarity index 100% rename from devsupApp/_devsup.vcxproj rename to devsupApp/_dbapi.vcxproj diff --git a/devsupApp/_devsup.vcxproj.filters b/devsupApp/_dbapi.vcxproj.filters similarity index 100% rename from devsupApp/_devsup.vcxproj.filters rename to devsupApp/_dbapi.vcxproj.filters diff --git a/pyDevSup.sln b/pyDevSup.sln index d62621c..984f63b 100644 --- a/pyDevSup.sln +++ b/pyDevSup.sln @@ -104,12 +104,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "iocweatherbnl", "iocweather iocBoot\iocweatherbnl\st.cmd = iocBoot\iocweatherbnl\st.cmd EndProjectSection EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_dbapi", "devsupApp\_devsup.vcxproj", "{BAE6CE99-140A-4018-8BCB-9D63F54D6F07}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "pyIocApp", "pyIocApp", "{C10F6E3C-C515-4707-991E-4D5F193D5D86}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pyDevSup310", "pyIocApp\pyDevSup310.vcxproj", "{E0621B43-15E2-4080-B777-16C02E5B4611}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_dbapi", "devsupApp\_dbapi.vcxproj", "{BAE6CE99-140A-4018-8BCB-9D63F54D6F07}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug_DLL|Win32 = Debug_DLL|Win32 @@ -298,22 +298,6 @@ Global {D3311F39-9AE8-4F16-BE04-1D1D31135BA9}.Release_LIB|Win32.Build.0 = Release_LIB|Win32 {D3311F39-9AE8-4F16-BE04-1D1D31135BA9}.Release_LIB|x64.ActiveCfg = Release_LIB|x64 {D3311F39-9AE8-4F16-BE04-1D1D31135BA9}.Release_LIB|x64.Build.0 = Release_LIB|x64 - {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Debug_DLL|Win32.ActiveCfg = Debug_DLL|Win32 - {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Debug_DLL|Win32.Build.0 = Debug_DLL|Win32 - {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Debug_DLL|x64.ActiveCfg = Debug_DLL|x64 - {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Debug_DLL|x64.Build.0 = Debug_DLL|x64 - {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Debug_LIB|Win32.ActiveCfg = Debug_LIB|Win32 - {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Debug_LIB|Win32.Build.0 = Debug_LIB|Win32 - {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Debug_LIB|x64.ActiveCfg = Debug_LIB|x64 - {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Debug_LIB|x64.Build.0 = Debug_LIB|x64 - {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Release_DLL|Win32.ActiveCfg = Release_DLL|Win32 - {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Release_DLL|Win32.Build.0 = Release_DLL|Win32 - {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Release_DLL|x64.ActiveCfg = Release_DLL|x64 - {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Release_DLL|x64.Build.0 = Release_DLL|x64 - {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Release_LIB|Win32.ActiveCfg = Release_LIB|Win32 - {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Release_LIB|Win32.Build.0 = Release_LIB|Win32 - {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Release_LIB|x64.ActiveCfg = Release_LIB|x64 - {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Release_LIB|x64.Build.0 = Release_LIB|x64 {E0621B43-15E2-4080-B777-16C02E5B4611}.Debug_DLL|Win32.ActiveCfg = Debug_DLL|Win32 {E0621B43-15E2-4080-B777-16C02E5B4611}.Debug_DLL|Win32.Build.0 = Debug_DLL|Win32 {E0621B43-15E2-4080-B777-16C02E5B4611}.Debug_DLL|x64.ActiveCfg = Debug_DLL|x64 @@ -330,6 +314,22 @@ Global {E0621B43-15E2-4080-B777-16C02E5B4611}.Release_LIB|Win32.Build.0 = Release_LIB|Win32 {E0621B43-15E2-4080-B777-16C02E5B4611}.Release_LIB|x64.ActiveCfg = Release_LIB|x64 {E0621B43-15E2-4080-B777-16C02E5B4611}.Release_LIB|x64.Build.0 = Release_LIB|x64 + {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Debug_DLL|Win32.ActiveCfg = Debug_DLL|Win32 + {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Debug_DLL|Win32.Build.0 = Debug_DLL|Win32 + {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Debug_DLL|x64.ActiveCfg = Debug_DLL|x64 + {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Debug_DLL|x64.Build.0 = Debug_DLL|x64 + {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Debug_LIB|Win32.ActiveCfg = Debug_LIB|Win32 + {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Debug_LIB|Win32.Build.0 = Debug_LIB|Win32 + {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Debug_LIB|x64.ActiveCfg = Debug_LIB|x64 + {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Debug_LIB|x64.Build.0 = Debug_LIB|x64 + {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Release_DLL|Win32.ActiveCfg = Release_DLL|Win32 + {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Release_DLL|Win32.Build.0 = Release_DLL|Win32 + {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Release_DLL|x64.ActiveCfg = Release_DLL|x64 + {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Release_DLL|x64.Build.0 = Release_DLL|x64 + {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Release_LIB|Win32.ActiveCfg = Release_LIB|Win32 + {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Release_LIB|Win32.Build.0 = Release_LIB|Win32 + {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Release_LIB|x64.ActiveCfg = Release_LIB|x64 + {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Release_LIB|x64.Build.0 = Release_LIB|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -371,9 +371,9 @@ Global {54B14EFD-5FF5-443C-B40D-F6B4B964309D} = {73322DE2-4EF3-41A8-86BE-BB9C2EEFDE68} {A784112A-84CF-4226-8C80-307F53413D1F} = {73322DE2-4EF3-41A8-86BE-BB9C2EEFDE68} {3674D600-79C9-4BCE-A19E-4A7FC6332426} = {73322DE2-4EF3-41A8-86BE-BB9C2EEFDE68} - {BAE6CE99-140A-4018-8BCB-9D63F54D6F07} = {C2A4C477-2BE6-494C-89F3-B51BA1376EBD} {C10F6E3C-C515-4707-991E-4D5F193D5D86} = {D04ACFD8-B76B-4D6C-BF02-F280CF75ABAA} {E0621B43-15E2-4080-B777-16C02E5B4611} = {C10F6E3C-C515-4707-991E-4D5F193D5D86} + {BAE6CE99-140A-4018-8BCB-9D63F54D6F07} = {C2A4C477-2BE6-494C-89F3-B51BA1376EBD} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {33A71C13-4DAD-484B-96AE-30E3B9F75D2C} diff --git a/pyIocApp/softIocPy310.vcxproj b/pyIocApp/softIocPy310.vcxproj index a22ce40..03dded0 100644 --- a/pyIocApp/softIocPy310.vcxproj +++ b/pyIocApp/softIocPy310.vcxproj @@ -50,9 +50,6 @@ {e9d99fc7-e592-472b-b2e2-c3b0d81d8169} - - {bae6ce99-140a-4018-8bcb-9d63f54d6f07} - {e0621b43-15e2-4080-b777-16c02e5b4611} From 102eecf0b2e950670e41c383afdcafd6a0cfbe41 Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Mon, 9 Jan 2023 20:23:22 +0000 Subject: [PATCH 04/54] Added report pyDevSup.docx --- documentation/report on pyDevSup.docx | Bin 0 -> 17123 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 documentation/report on pyDevSup.docx diff --git a/documentation/report on pyDevSup.docx b/documentation/report on pyDevSup.docx new file mode 100644 index 0000000000000000000000000000000000000000..e7e7d116b626a14e95b2d85bbc3d3ee5105f569b GIT binary patch literal 17123 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 literal 0 HcmV?d00001 From 704c4831bd00cfa98046188f4b1955dc473ac8d1 Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Wed, 1 Feb 2023 13:11:54 +0000 Subject: [PATCH 05/54] Follows document review by kwoods. --- documentation/report on pyDevSup.docx | Bin 17123 -> 232860 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/documentation/report on pyDevSup.docx b/documentation/report on pyDevSup.docx index e7e7d116b626a14e95b2d85bbc3d3ee5105f569b..b4e56b5a76640b974aa3bdd23d2d3e9e1753d9f7 100644 GIT binary patch literal 232860 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

Vs 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

kP)KPZHc{Sf?LqUi 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

Vs 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

kP)KPZHc{Sf?LqUi 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≈<F@OK9~$&%P3&0ShA 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 Wfc)oc)WE+g;1T)r8{pLr;C}$&iu-K< From 2cdd8e3ccd9e9ed95b4d52892a4337863e515158 Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Tue, 4 Apr 2023 14:27:43 +0100 Subject: [PATCH 09/54] Was able to run from makefiles in cmd. --- devsupApp/Makefile | 6 ++---- iocBoot/iocweatherbnl/Makefile | 2 +- iocBoot/iocweatherbnl/st.bat | 5 +++-- iocBoot/iocweatherbnl/st.cmd | 2 +- pyIocApp/softIocPy310.vcxproj.user | 2 -- 5 files changed, 7 insertions(+), 10 deletions(-) diff --git a/devsupApp/Makefile b/devsupApp/Makefile index 10e0126..9e92fe8 100644 --- a/devsupApp/Makefile +++ b/devsupApp/Makefile @@ -1,8 +1,6 @@ TOP = .. include $(TOP)/configure/CONFIG -DIRS := $(DIRS) $(filter-out $(DIRS), $(wildcard *src*)) -DIRS := $(DIRS) $(filter-out $(DIRS), $(wildcard *Src*)) -DIRS := $(DIRS) $(filter-out $(DIRS), $(wildcard *db*)) -DIRS := $(DIRS) $(filter-out $(DIRS), $(wildcard *Db*)) +DIRS += src +DIRS += Db include $(TOP)/configure/RULES_DIRS diff --git a/iocBoot/iocweatherbnl/Makefile b/iocBoot/iocweatherbnl/Makefile index e1b9aa4..25b7be6 100644 --- a/iocBoot/iocweatherbnl/Makefile +++ b/iocBoot/iocweatherbnl/Makefile @@ -1,5 +1,5 @@ TOP = ../.. include $(TOP)/configure/CONFIG ARCH = $(EPICS_HOST_ARCH) -TARGETS = envPaths +TARGETS = envPaths dllPath.bat include $(TOP)/configure/RULES.ioc diff --git a/iocBoot/iocweatherbnl/st.bat b/iocBoot/iocweatherbnl/st.bat index ac5b01d..0c0ae02 100644 --- a/iocBoot/iocweatherbnl/st.bat +++ b/iocBoot/iocweatherbnl/st.bat @@ -2,5 +2,6 @@ set HOSTNAME=localhost set IOCNAME=weatherbnl set TOP=../../ set PATH=C:\Python310;C:\Windows -set PYTHONPATH=%TOP%devsupApp\src -..\..\bin\windows-x64-static\softIocPy310.exe st.cmd +set PYTHONPATH=%TOP%devsupApp\src;%TOP%weatherApp +call dllPath.bat +..\..\bin\windows-x64\softIocPy310.exe st.cmd diff --git a/iocBoot/iocweatherbnl/st.cmd b/iocBoot/iocweatherbnl/st.cmd index 7fd6710..e5835aa 100755 --- a/iocBoot/iocweatherbnl/st.cmd +++ b/iocBoot/iocweatherbnl/st.cmd @@ -15,7 +15,7 @@ dbLoadRecords("db/weather.db","P=CF:Ext{UNNT},LOC=UNNT") iocInit() dbl > weather.dbl -system "cp weather.dbl /cf-update/${HOSTNAME}.${IOCNAME}.dbl" +#system "cp weather.dbl /cf-update/${HOSTNAME}.${IOCNAME}.dbl" # Start Reference tracker #py "from devsup import disect; disect.periodic(10)" diff --git a/pyIocApp/softIocPy310.vcxproj.user b/pyIocApp/softIocPy310.vcxproj.user index 2124ba9..02fd142 100644 --- a/pyIocApp/softIocPy310.vcxproj.user +++ b/pyIocApp/softIocPy310.vcxproj.user @@ -22,7 +22,6 @@ PYTHONPATH=$(SolutionDir)devsupApp\src HOSTNAME=localhost -set IOCNAME=weatherbnl TOP=../../ PATH=C:\Python310;C:\Windows @@ -34,7 +33,6 @@ ARCH="$(Configuration)" HOSTNAME=localhost -set IOCNAME=weatherbnl TOP=../../ PATH=C:\Python310;C:\Windows From e2ab3edd380950c641c37e6769b4c58faf9a8275 Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Tue, 4 Apr 2023 16:47:57 +0100 Subject: [PATCH 10/54] Built & ran hidenrga project. --- pyIocApp/pyDevSup310.vcxproj | 25 +++++++++++++++++-------- pyIocApp/pyDevSup310.vcxproj.filters | 6 ++++++ pyIocApp/softIocPy310.vcxproj | 2 -- pyIocApp/softIocPy310.vcxproj.filters | 2 -- 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/pyIocApp/pyDevSup310.vcxproj b/pyIocApp/pyDevSup310.vcxproj index a7c5d3a..2b45b44 100644 --- a/pyIocApp/pyDevSup310.vcxproj +++ b/pyIocApp/pyDevSup310.vcxproj @@ -55,6 +55,7 @@ + {E0621B43-15E2-4080-B777-16C02E5B4611} @@ -193,7 +194,8 @@ if not exist O.Common md O.Common -if not exist $(SolutionDir)DBD md $(SolutionDir)DBD +if not exist $(SolutionDir)dbd md $(SolutionDir)dbd +xcopy /Y /Q /D /R *.dbd $(SolutionDir)dbd > NUL SET PERL5LIB=$(SolutionDir)lib\perl perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) @@ -222,7 +224,8 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com if not exist O.Common md O.Common -if not exist $(SolutionDir)DBD md $(SolutionDir)DBD +if not exist $(SolutionDir)dbd md $(SolutionDir)dbd +xcopy /Y /Q /D /R *.dbd $(SolutionDir)dbd > NUL SET PERL5LIB=$(SolutionDir)lib\perl perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) @@ -250,7 +253,8 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com if not exist O.Common md O.Common -if not exist $(SolutionDir)DBD md $(SolutionDir)DBD +if not exist $(SolutionDir)dbd md $(SolutionDir)dbd +xcopy /Y /Q /D /R *.dbd $(SolutionDir)dbd > NUL SET PERL5LIB=$(SolutionDir)lib\perl perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) @@ -278,7 +282,8 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com if not exist O.Common md O.Common -if not exist $(SolutionDir)DBD md $(SolutionDir)DBD +if not exist $(SolutionDir)dbd md $(SolutionDir)dbd +xcopy /Y /Q /D /R *.dbd $(SolutionDir)dbd > NUL SET PERL5LIB=$(SolutionDir)lib\perl perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) @@ -311,7 +316,8 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com if not exist O.Common md O.Common -if not exist $(SolutionDir)DBD md $(SolutionDir)DBD +if not exist $(SolutionDir)dbd md $(SolutionDir)dbd +xcopy /Y /Q /D /R *.dbd $(SolutionDir)dbd > NUL SET PERL5LIB=$(SolutionDir)lib\perl perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) @@ -344,7 +350,8 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com if not exist O.Common md O.Common -if not exist $(SolutionDir)DBD md $(SolutionDir)DBD +if not exist $(SolutionDir)dbd md $(SolutionDir)dbd +xcopy /Y /Q /D /R *.dbd $(SolutionDir)dbd > NUL SET PERL5LIB=$(SolutionDir)lib\perl perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) @@ -376,7 +383,8 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com if not exist O.Common md O.Common -if not exist $(SolutionDir)DBD md $(SolutionDir)DBD +if not exist $(SolutionDir)dbd md $(SolutionDir)dbd +xcopy /Y /Q /D /R *.dbd $(SolutionDir)dbd > NUL SET PERL5LIB=$(SolutionDir)lib\perl perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) @@ -408,7 +416,8 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com if not exist O.Common md O.Common -if not exist $(SolutionDir)DBD md $(SolutionDir)DBD +if not exist $(SolutionDir)dbd md $(SolutionDir)dbd +xcopy /Y /Q /D /R *.dbd $(SolutionDir)dbd > NUL SET PERL5LIB=$(SolutionDir)lib\perl perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) diff --git a/pyIocApp/pyDevSup310.vcxproj.filters b/pyIocApp/pyDevSup310.vcxproj.filters index 62f64f3..d85eb46 100644 --- a/pyIocApp/pyDevSup310.vcxproj.filters +++ b/pyIocApp/pyDevSup310.vcxproj.filters @@ -16,6 +16,9 @@ {fef0bd38-19ac-4984-803b-3bf69909b6aa} + + {69213f5f-2f8f-4dc1-a5ce-5d07e4a3055f} + @@ -32,5 +35,8 @@ O.Common + + pyIocApp + \ No newline at end of file diff --git a/pyIocApp/softIocPy310.vcxproj b/pyIocApp/softIocPy310.vcxproj index f0e6eec..9334ec7 100644 --- a/pyIocApp/softIocPy310.vcxproj +++ b/pyIocApp/softIocPy310.vcxproj @@ -55,9 +55,7 @@ - - diff --git a/pyIocApp/softIocPy310.vcxproj.filters b/pyIocApp/softIocPy310.vcxproj.filters index 8053e45..f6e3101 100644 --- a/pyIocApp/softIocPy310.vcxproj.filters +++ b/pyIocApp/softIocPy310.vcxproj.filters @@ -9,8 +9,6 @@ O.Common - - From d78e91335baf03b21c39a8067314b109d63b64f6 Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Tue, 25 Jul 2023 12:29:32 +0100 Subject: [PATCH 11/54] Makefile build and test on Windows. --- configure/CONFIG_SITE | 3 +- configure/RELEASE | 4 +-- configure/RELEASE.windows-x64.common | 42 ++++++++++++++++++++++++++++ devsupApp/src/dbapi.c | 4 +-- devsupApp/src/dbdset.c | 4 +-- devsupApp/src/dbfield.c | 4 +-- devsupApp/src/dbrec.c | 4 +-- devsupApp/src/devsup/ptable.py | 13 +++++++++ devsupApp/src/pydevsup.h | 4 +-- devsupApp/src/utest.c | 4 +-- pyIocApp/setup.c | 4 +-- 11 files changed, 73 insertions(+), 17 deletions(-) create mode 100644 configure/RELEASE.windows-x64.common diff --git a/configure/CONFIG_SITE b/configure/CONFIG_SITE index 543015f..c646a95 100644 --- a/configure/CONFIG_SITE +++ b/configure/CONFIG_SITE @@ -33,7 +33,8 @@ CHECK_RELEASE = YES #IOCS_APPL_TOP = # Default python version. -PY_VER=3.10 +#PY_VER=3.10 +PY_VER=3.6 # Module will be build against this version of the # Python interpreter diff --git a/configure/RELEASE b/configure/RELEASE index 1aa54c9..c93ef7d 100644 --- a/configure/RELEASE +++ b/configure/RELEASE @@ -36,8 +36,8 @@ TEMPLATE_TOP=$(EPICS_BASE)/templates/makeBaseApp/top ## Required Modules ## # EPICS_BASE usually appears last so other apps can override stuff: -#EPICS_BASE=/usr/lib/epics -EPICS_BASE=\epics/base +EPICS_BASE=/opt/codac/epics +#EPICS_BASE=\epics/base -include $(TOP)/configure/RELEASE.local -include $(TOP)/../RELEASE.local diff --git a/configure/RELEASE.windows-x64.common b/configure/RELEASE.windows-x64.common new file mode 100644 index 0000000..2f37303 --- /dev/null +++ b/configure/RELEASE.windows-x64.common @@ -0,0 +1,42 @@ +# RELEASE - Location of external support modules +# +# IF YOU MAKE ANY CHANGES to this file you must subsequently +# do a "gnumake rebuild" in this application's top level +# directory. +# +# The build process does not check dependencies against files +# that are outside this application, thus you should do a +# "gnumake rebuild" in the top level directory after EPICS_BASE +# or any other external module pointed to below is rebuilt. +# +# Host- or target-specific settings can be given in files named +# RELEASE.$(EPICS_HOST_ARCH).Common +# RELEASE.Common.$(T_A) +# RELEASE.$(EPICS_HOST_ARCH).$(T_A) +# +# This file should ONLY define paths to other support modules, +# or include statements that pull in similar RELEASE files. +# Build settings that are NOT module paths should appear in a +# CONFIG_SITE file. + +TEMPLATE_TOP=$(EPICS_BASE)/templates/makeBaseApp/top + +## Optional Modules ## +# Comment out if not present + +# IOC statistics (cpu and mem usage, ...) +#DEVIOCSTATS=$(EPICS_BASE) + +# automatic save with restore on boot +#AUTOSAVE=$(EPICS_BASE) + +# logging of remote settings changes +#CAPUTLOG=$(EPICS_BASE) + +## Required Modules ## + +# EPICS_BASE usually appears last so other apps can override stuff: +EPICS_BASE=\epics/base + +-include $(TOP)/configure/RELEASE.local +-include $(TOP)/../RELEASE.local diff --git a/devsupApp/src/dbapi.c b/devsupApp/src/dbapi.c index eb57538..56ee169 100644 --- a/devsupApp/src/dbapi.c +++ b/devsupApp/src/dbapi.c @@ -4,11 +4,11 @@ #ifdef _DEBUG #undef _DEBUG -#include +#include #include #define _DEBUG #else -#include +#include #include #endif #ifdef HAVE_NUMPY diff --git a/devsupApp/src/dbdset.c b/devsupApp/src/dbdset.c index dc129f5..d20f990 100644 --- a/devsupApp/src/dbdset.c +++ b/devsupApp/src/dbdset.c @@ -5,10 +5,10 @@ #ifdef _DEBUG #undef _DEBUG -#include +#include #define _DEBUG #else -#include +#include #endif #include diff --git a/devsupApp/src/dbfield.c b/devsupApp/src/dbfield.c index 91ce75a..8b45608 100644 --- a/devsupApp/src/dbfield.c +++ b/devsupApp/src/dbfield.c @@ -5,11 +5,11 @@ #ifdef _DEBUG #undef _DEBUG -#include +#include #include #define _DEBUG #else -#include +#include #include #endif diff --git a/devsupApp/src/dbrec.c b/devsupApp/src/dbrec.c index 8eb2d4d..f63d03c 100644 --- a/devsupApp/src/dbrec.c +++ b/devsupApp/src/dbrec.c @@ -5,10 +5,10 @@ #ifdef _DEBUG #undef _DEBUG -#include +#include #define _DEBUG #else -#include +#include #endif #include #include diff --git a/devsupApp/src/devsup/ptable.py b/devsupApp/src/devsup/ptable.py index 365cb91..27d523b 100644 --- a/devsupApp/src/devsup/ptable.py +++ b/devsupApp/src/devsup/ptable.py @@ -162,6 +162,7 @@ def __init__(self, table, name, scan): self.table, self.scan, self._value = table, scan, None self.alarm, self.actions = 0, [] self._groups = set() + self._sevr = None def _get_value(self): return self._value def _set_value(self, val): @@ -260,6 +261,7 @@ def process(self, rec, reason=None): else: # sync record to table self.inst.table.log.debug('%s <- %s (%s)', self.inst.name, rec.NAME, rec.VAL) + self.inst._sevr = rec.field('SEVR') if self.vdata is None: nval = self.vfld.getval() else: @@ -273,6 +275,17 @@ def process(self, rec, reason=None): self.inst._exec(oval) for G in self.inst._groups: G._exec() + for param in G._params: + if self.inst != param and param._sevr is not None: + oldsevr = param._sevr.getval() + if oldsevr != param.alarm: + print('other alrm ' + param.name + " was " + str(oldsevr) + " now " + str(param.alarm)) + param._sevr.putval(param.alarm) + #proc.putval(1) + oldsevr = self.inst._sevr.getval() + if oldsevr != self.inst.alarm: + print('this alrm ' + rec.name() + " was " + str(oldsevr) + " now " + str(self.inst.alarm)) + rec.setSevr(self.inst.alarm) class TableBase(object): """Base class for all parameter tables. diff --git a/devsupApp/src/pydevsup.h b/devsupApp/src/pydevsup.h index 4625082..2bbea62 100644 --- a/devsupApp/src/pydevsup.h +++ b/devsupApp/src/pydevsup.h @@ -7,10 +7,10 @@ #ifdef _DEBUG #undef _DEBUG -#include +#include #define _DEBUG #else -#include +#include #endif #ifndef VERSION_INT diff --git a/devsupApp/src/utest.c b/devsupApp/src/utest.c index cadb708..fad22b0 100644 --- a/devsupApp/src/utest.c +++ b/devsupApp/src/utest.c @@ -5,10 +5,10 @@ #ifdef _DEBUG #undef _DEBUG -#include +#include #define _DEBUG #else -#include +#include #endif #include diff --git a/pyIocApp/setup.c b/pyIocApp/setup.c index 0e556ba..008b021 100644 --- a/pyIocApp/setup.c +++ b/pyIocApp/setup.c @@ -7,11 +7,11 @@ #ifdef _DEBUG #undef _DEBUG -#include +#include #include #define _DEBUG #else -#include +#include #include #endif From b65a54bf638e3fd3902043243a4253805d8ed067 Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Mon, 7 Aug 2023 14:56:15 +0100 Subject: [PATCH 12/54] * The construct @[ -d $(dir $@) ] and install command fail on Windows, resulting in build errors Replaced with use of xcopy for windows - a better approach could be found, I think. A DLL imported as a Python module needs to have the extension .pyd - overrode SHRLIB_SUFFIX_BASE to create _dbapi.pyd. Also added Windows library dependencies. --- configure/RELEASE.windows-x64.common | 2 +- configure/RULES_PY | 61 ++++++---------------------- devsupApp/src/Makefile | 3 ++ devsupApp/src/devsup/ptable.py | 10 ++++- 4 files changed, 25 insertions(+), 51 deletions(-) diff --git a/configure/RELEASE.windows-x64.common b/configure/RELEASE.windows-x64.common index 2f37303..f3e08d1 100644 --- a/configure/RELEASE.windows-x64.common +++ b/configure/RELEASE.windows-x64.common @@ -36,7 +36,7 @@ TEMPLATE_TOP=$(EPICS_BASE)/templates/makeBaseApp/top ## Required Modules ## # EPICS_BASE usually appears last so other apps can override stuff: -EPICS_BASE=\epics/base +EPICS_BASE=C:/epics/base -include $(TOP)/configure/RELEASE.local -include $(TOP)/../RELEASE.local diff --git a/configure/RULES_PY b/configure/RULES_PY index 49dffa0..9887ebe 100644 --- a/configure/RULES_PY +++ b/configure/RULES_PY @@ -1,54 +1,19 @@ -# extensions/configure/RULES_PYTHON - -ifdef T_A -ifeq ($(findstring Host,$(VALID_BUILDS)),Host) - -SWIG ?= swig - -vpath %.py $(USR_VPATH) $(ALL_SRC_DIRS) - -# The optional PYTHON_INSTALL_LOCATION environment variable -# should be set to /site-packages -PYTHON_INSTALL_LOCATION ?= $(INSTALL_LOCATION)/lang/python - -INSTALL_PYTHON = $(PYTHON_INSTALL_LOCATION)/$(PYTHON_PACKAGE) - -PYTHON_PACKAGE_PTH = $(addsuffix .pth,$(PYTHON_PACKAGE)) -INSTALL_PYTHON_PACKAGE_PTH = $(addprefix $(PYTHON_INSTALL_LOCATION)/,$(PYTHON_PACKAGE_PTH)) - -PYTHON_SCRIPTS = $(filter-out $(LOADABLE_LIBRARY),$(PYTHON_MODULES)) -PYTHON_LIBRARY = $(filter $(LOADABLE_LIBRARY),$(PYTHON_MODULES)) -PYTHON_SHRLIBNAME = $(PYTHON_LIBRARY:%=$(LOADABLE_SHRLIB_PREFIX)%$(LOADABLE_SHRLIB_SUFFIX)) - -INSTALL_PYTHONS = $(addprefix $(INSTALL_PYTHON)/,$(PYTHON_SCRIPTS)) -INSTALL_PYTHONS += $(addprefix $(INSTALL_PYTHON)/,$(PYTHON_SHRLIBNAME)) - -buildInstall: $(INSTALL_PYTHONS) $(INSTALL_PYTHON_PACKAGE_PTH) - -$(INSTALL_PYTHON)/%: % - @echo "Installing python modules $@" - @$(INSTALL) -d -m 644 $< $(INSTALL_PYTHON) - -$(INSTALL_PYTHON)/%: ../% - @echo "Installing python modules $@" - @$(INSTALL) -d -m 644 $< $(INSTALL_PYTHON) - -$(PYTHON_INSTALL_LOCATION)/%: % - @echo "Installing python pth file $@" - @$(INSTALL) -d -m 644 $< $(PYTHON_INSTALL_LOCATION) - -$(PYTHON_PACKAGE_PTH): - @echo $(PYTHON_PACKAGE) > $@ +ifneq ($(T_A),) +ifndef PY_VER +$(error Must include CONFIG_PY) +endif -%_wrap.c: ../%.i - $(SWIG) -python -o $@ $< +PY_FILES += $(PY:%=$(PY_INSTALL_DIR)/%) -ifdef BASE_3_15 -clean: +$(PY_FILES) : $(PY_INSTALL_DIR)/%: ../% +ifneq ($(OS),Windows_NT) + @[ -d $(dir $@) ] || install -d $(dir $@) + @echo "Install PY $@" + install -m 644 $< $@ else -clean:: + xcopy /S /Q /Y /F $(subst /,\,$<) $(subst /,\,$@)* endif - @$(RM) *.py *.so *.pth -endif +build: $(PY_FILES) + endif diff --git a/devsupApp/src/Makefile b/devsupApp/src/Makefile index 698feaa..c40434b 100644 --- a/devsupApp/src/Makefile +++ b/devsupApp/src/Makefile @@ -9,6 +9,9 @@ include $(TOP)/configure/CONFIG_PY INSTALL_SHRLIB = $(PY_INSTALL_DIR)/devsup LOADABLE_LIBRARY_HOST += _dbapi +ifeq ($(OS),Windows_NT) + SHRLIB_SUFFIX_BASE = .pyd +endif TARGETS += $(COMMON_DIR)/pyDevSupCommon.dbd DBDDEPENDS_FILES += pyDevSupCommon.dbd$(DEP) diff --git a/devsupApp/src/devsup/ptable.py b/devsupApp/src/devsup/ptable.py index 27d523b..a3279fd 100644 --- a/devsupApp/src/devsup/ptable.py +++ b/devsupApp/src/devsup/ptable.py @@ -163,6 +163,7 @@ def __init__(self, table, name, scan): self.alarm, self.actions = 0, [] self._groups = set() self._sevr = None + self._stat = None def _get_value(self): return self._value def _set_value(self, val): @@ -262,6 +263,7 @@ def process(self, rec, reason=None): # sync record to table self.inst.table.log.debug('%s <- %s (%s)', self.inst.name, rec.NAME, rec.VAL) self.inst._sevr = rec.field('SEVR') + self.inst._stat = rec.field('STAT') if self.vdata is None: nval = self.vfld.getval() else: @@ -278,8 +280,12 @@ def process(self, rec, reason=None): for param in G._params: if self.inst != param and param._sevr is not None: oldsevr = param._sevr.getval() - if oldsevr != param.alarm: - print('other alrm ' + param.name + " was " + str(oldsevr) + " now " + str(param.alarm)) + oldstat = param._stat.getval() + newstat = oldstat + if param.alarm == 0: + newstat = 0 + if oldsevr != param.alarm or oldstat != newstat: + print('other alrm ' + param.name + " was " + str(oldsevr) + ", " +str(oldstat) + " now " + str(param.alarm)) param._sevr.putval(param.alarm) #proc.putval(1) oldsevr = self.inst._sevr.getval() From 66f3affe9744c2bfa574fb5d56525eb20c9bee4c Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Mon, 7 Aug 2023 17:59:40 +0100 Subject: [PATCH 13/54] Compared and merged with later changes made by mdavidsaver. --- .github/workflows/ci-scripts-build.yml | 86 +++++++++++++++++++------- archApp/bplreport.py | 4 +- configure/CONFIG_SITE | 8 +-- configure/Makefile | 1 - configure/RELEASE | 1 - devsupApp/src/Makefile | 3 +- devsupApp/src/dbapi.c | 15 +---- devsupApp/src/dbdset.c | 5 +- devsupApp/src/dbfield.c | 2 + devsupApp/src/devsup/__init__.py | 4 +- iocBoot/iocweatherbnl/st.cmd | 10 +-- makehelper.py | 19 ++++-- pyIocApp/setup.c | 2 + requirements-deb10.txt | 3 +- requirements-deb7.txt | 3 +- requirements-deb8.txt | 3 +- requirements-deb9.txt | 3 +- weatherApp/weather.py | 9 +-- 18 files changed, 114 insertions(+), 67 deletions(-) diff --git a/.github/workflows/ci-scripts-build.yml b/.github/workflows/ci-scripts-build.yml index aea55ab..c400628 100644 --- a/.github/workflows/ci-scripts-build.yml +++ b/.github/workflows/ci-scripts-build.yml @@ -15,79 +15,123 @@ jobs: runs-on: ${{ matrix.os }} # Set environment variables from matrix parameters env: + CMP: ${{ matrix.cmp }} + BCFG: ${{ matrix.configuration }} BASE: ${{ matrix.base }} PROF: ${{ matrix.profile }} EXTRA: ${{ matrix.extra }} TEST: ${{ matrix.test }} + VV: "1" strategy: fail-fast: false matrix: include: - - os: ubuntu-20.04 + - os: ubuntu-latest + cmp: gcc + configuration: default base: "7.0" python: "2.7" profile: deb8 test: yes - - os: ubuntu-20.04 + - os: ubuntu-latest + cmp: gcc + configuration: default base: "7.0" python: "2.7" profile: deb8 test: yes - - os: ubuntu-20.04 + - os: ubuntu-latest + cmp: gcc + configuration: default base: "7.0" - python: "3.5" - profile: deb9 + python: "3.7" + profile: deb10 test: yes - - os: ubuntu-20.04 + - os: ubuntu-latest + cmp: gcc + configuration: default base: "7.0" - python: "3.6" - profile: deb9 + python: "3.8" + profile: latest test: yes - - os: ubuntu-20.04 + - os: ubuntu-latest + cmp: gcc + configuration: default base: "7.0" - python: "3.7" - profile: deb10 + python: "3.9" + profile: latest + test: yes + + - os: ubuntu-latest + cmp: gcc + configuration: default + base: "7.0" + python: "3.10" + profile: latest test: yes - - os: ubuntu-16.04 + - os: macos-latest + cmp: gcc + configuration: default + base: "7.0" + python: "3.10" + profile: latest + test: yes + + - os: windows-latest + cmp: vs2019 + configuration: debug + base: "7.0" + python: "3.10" + profile: latest + test: yes + + - os: ubuntu-latest + cmp: gcc + configuration: default base: "3.15" python: "2.7" profile: deb8 test: yes - - os: ubuntu-16.04 + - os: ubuntu-latest + cmp: gcc + configuration: default base: "3.14" python: "2.7" profile: deb8 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: submodules: true - - name: Cache EPICS Dependencies - uses: actions/cache@v2 - with: - path: ~/.cache - key: ${{ matrix.base }}/${{ matrix.os }}//${{ matrix.extra }} - name: Set up Python ${{ matrix.python }} - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 with: python-version: ${{ matrix.python }} - name: More Setup Python + shell: bash run: | python --version python -m pip --version - python -m pip install -r requirements-${PROF}.txt + python -m pip install --only-binary :all: -r requirements-${PROF}.txt cat < configure/CONFIG_SITE.local PYTHON=$(which python) EOF echo === configure/CONFIG_SITE.local === cat configure/CONFIG_SITE.local + - name: makehelper.py + run: python makehelper.py + - name: DSOs + shell: bash + run: find ${Python_ROOT_DIR} -name '*.dll' -o -name '*.so' -o -name '*.dylib' + - name: get_config_vars + run: python -c 'from sysconfig import get_config_vars; from pprint import pprint; pprint(get_config_vars())' - name: Prepare and compile dependencies run: python .ci/cue.py prepare - name: Build main module diff --git a/archApp/bplreport.py b/archApp/bplreport.py index 1ac92a9..ac0d86e 100644 --- a/archApp/bplreport.py +++ b/archApp/bplreport.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -import time, sched, urllib, json +import time, sched, urllib2, json from devsup.db import IOScanListBlock from devsup.hooks import initHook from devsup.util import StoppableThread @@ -20,7 +20,7 @@ def fail(self): def process(self): self.result = None - R = urllib.urlopen(self.url, timeout=3) + R = urllib2.urlopen(self.url, timeout=3) try: if R.getcode()!=200: print 'Fail',R.getcode(), self.url diff --git a/configure/CONFIG_SITE b/configure/CONFIG_SITE index c646a95..973cab0 100644 --- a/configure/CONFIG_SITE +++ b/configure/CONFIG_SITE @@ -32,14 +32,14 @@ CHECK_RELEASE = YES # take effect. #IOCS_APPL_TOP = -# Default python version. -#PY_VER=3.10 -PY_VER=3.6 - # Module will be build against this version of the # Python interpreter PYTHON ?= python$(PY_VER) +# Default python version. +# Legacy setting. Prefer PYTHON +PY_VER ?= 3.9 + USR_CPPFLAGS += -DUSE_TYPED_RSET -include $(TOP)/configure/CONFIG_SITE.local diff --git a/configure/Makefile b/configure/Makefile index deec5c9..d35c388 100644 --- a/configure/Makefile +++ b/configure/Makefile @@ -15,7 +15,6 @@ CONFIGS += $(subst ../,,$(wildcard $(CONFIG_INSTALLS))) include $(TOP)/configure/RULES os/CONFIG_PY.Common.$(T_A): $(TOP)/makehelper.py - [ -d $(dir $@) ] || $(MKDIR) $(dir $@) $(PYTHON) $< $@ ifdef BASE_3_15 diff --git a/configure/RELEASE b/configure/RELEASE index c93ef7d..8dc9f9c 100644 --- a/configure/RELEASE +++ b/configure/RELEASE @@ -37,7 +37,6 @@ TEMPLATE_TOP=$(EPICS_BASE)/templates/makeBaseApp/top # EPICS_BASE usually appears last so other apps can override stuff: EPICS_BASE=/opt/codac/epics -#EPICS_BASE=\epics/base -include $(TOP)/configure/RELEASE.local -include $(TOP)/../RELEASE.local diff --git a/devsupApp/src/Makefile b/devsupApp/src/Makefile index c40434b..75b9e3a 100644 --- a/devsupApp/src/Makefile +++ b/devsupApp/src/Makefile @@ -32,6 +32,7 @@ _dbapi_SRCS += utest.c _dbapi_SRCS += pyDevSupCommon_registerRecordDeviceDriver.cpp _dbapi_LIBS += $(EPICS_BASE_IOC_LIBS) +_dbapi_SYS_LIBS_WIN32 += python$(PY_LD_VER) _dbapi_SYS_LIBS_WIN32 += ws2_32 Advapi32 Dbghelp PY += devsup/__init__.py @@ -65,7 +66,7 @@ pyconfig: ifneq (,$(T_A)) nose: - PYTHONPATH="${PYTHONPATH}:$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH)" $(PYTHON) -m nose -P devsup $(NOSEFLAGS) + PYTHONPATH="${PYTHONPATH}:$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH)" $(PYTHON) -m nose2 -v devsup $(NOSEFLAGS) # bounce back down to the sphinx generated Makefile # aren't Makefiles fun... diff --git a/devsupApp/src/dbapi.c b/devsupApp/src/dbapi.c index 56ee169..b0c30fb 100644 --- a/devsupApp/src/dbapi.c +++ b/devsupApp/src/dbapi.c @@ -5,7 +5,9 @@ #ifdef _DEBUG #undef _DEBUG #include +#ifdef HAVE_NUMPY #include +#endif #define _DEBUG #else #include @@ -32,19 +34,6 @@ #include "pydevsup.h" -#ifdef INCdbAccessDefsh -#pragma message("INCdbAccessDefsh") -#endif - -#ifdef INCLdb_access_routinesh -#pragma message("INCLdb_access_routinesh") -#error -#endif - -#ifdef INCLdb_converth -#pragma message("INCLdb_converth") -#error -#endif diff --git a/devsupApp/src/dbdset.c b/devsupApp/src/dbdset.c index d20f990..5bb05cd 100644 --- a/devsupApp/src/dbdset.c +++ b/devsupApp/src/dbdset.c @@ -28,9 +28,9 @@ #include #include #include -#include #include "pydevsup.h" +#include static int inshutdown; @@ -456,7 +456,8 @@ static long python_asub(aSubRecord* prec) } /* uglyness to detect aSubRecord */ -epicsShareExtern rset* pvar_rset_aSubRSET; +epicsShareExtern +rset* pvar_rset_aSubRSET; int isPyRecord(dbCommon *prec) { diff --git a/devsupApp/src/dbfield.c b/devsupApp/src/dbfield.c index 8b45608..4f0c6f6 100644 --- a/devsupApp/src/dbfield.c +++ b/devsupApp/src/dbfield.c @@ -6,7 +6,9 @@ #ifdef _DEBUG #undef _DEBUG #include +#ifdef HAVE_NUMPY #include +#endif #define _DEBUG #else #include diff --git a/devsupApp/src/devsup/__init__.py b/devsupApp/src/devsup/__init__.py index 72f5031..d1ff048 100644 --- a/devsupApp/src/devsup/__init__.py +++ b/devsupApp/src/devsup/__init__.py @@ -2,9 +2,9 @@ import atexit import tempfile -import devsup._dbapi +from . import _dbapi -from devsup._dbapi import (EPICS_VERSION_STRING, +from ._dbapi import (EPICS_VERSION_STRING, EPICS_DEV_SNAPSHOT, EPICS_SITE_VERSION, EPICS_VERSION, diff --git a/iocBoot/iocweatherbnl/st.cmd b/iocBoot/iocweatherbnl/st.cmd index e5835aa..a95b288 100755 --- a/iocBoot/iocweatherbnl/st.cmd +++ b/iocBoot/iocweatherbnl/st.cmd @@ -1,4 +1,4 @@ -#!../../bin/linux-x86_64/softIocPy3.10 +#!../../bin/linux-x86_64/softIocPy3.9 < envPaths @@ -6,15 +6,15 @@ cd("$(TOP)") #epicsEnvSet("http_proxy", "http://proxy:8888/") -epicsEnvSet("PYTHONPATH", "${TOP}/python/$(ARCH)") +#epicsEnvSet("PYTHONPATH", "${TOP}/python/$(ARCH)") dbLoadRecords("db/weather.db","P=CF:Ext{KISP},LOC=KISP") -dbLoadRecords("db/weather.db","P=CF:Ext{KHWV},LOC=KHWV") -dbLoadRecords("db/weather.db","P=CF:Ext{UNNT},LOC=UNNT") +#dbLoadRecords("db/weather.db","P=CF:Ext{KHWV},LOC=KHWV") +dbLoadRecords("db/weather.db","P=CF:Ext{EGTK},LOC=EGTK") iocInit() -dbl > weather.dbl +#dbl > weather.dbl #system "cp weather.dbl /cf-update/${HOSTNAME}.${IOCNAME}.dbl" # Start Reference tracker diff --git a/makehelper.py b/makehelper.py index 869023f..af5f8d6 100644 --- a/makehelper.py +++ b/makehelper.py @@ -14,13 +14,23 @@ from __future__ import print_function import sys +import os if len(sys.argv)<2: out = sys.stdout else: + try: + os.makedirs(os.path.dirname(sys.argv[1])) + except OSError: + pass out = open(sys.argv[1], 'w') -from distutils.sysconfig import get_config_var, get_python_inc, get_python_lib +from sysconfig import get_config_var +try: + from distutils.sysconfig import get_python_inc, get_python_lib +except ImportError: + def get_python_inc(): + return get_config_var('INCLUDEPY') or '' incdirs = [get_python_inc()] libdirs = [get_python_lib()] @@ -33,10 +43,8 @@ except ImportError: pass -basecflags=get_config_var('BASECFLAGS') -if basecflags is not None: - print('TARGET_CFLAGS +=',basecflags, file=out) - print('TARGET_CXXFLAGS +=',basecflags, file=out) +print('TARGET_CFLAGS +=',get_config_var('BASECFLAGS') or '', file=out) +print('TARGET_CXXFLAGS +=',get_config_var('BASECFLAGS') or '', file=out) print('PY_VER :=',get_config_var('VERSION'), file=out) ldver = get_config_var('LDVERSION') @@ -47,6 +55,7 @@ print('PY_LD_VER :=',ldver, file=out) print('PY_INCDIRS :=',' '.join(incdirs), file=out) print('PY_LIBDIRS :=',' '.join(libdirs), file=out) +print('PY_LDLIBS :=', get_config_var('BLDLIBRARY') or '', file=out) print('HAVE_NUMPY :=',have_np, file=out) try: diff --git a/pyIocApp/setup.c b/pyIocApp/setup.c index 008b021..2aeab7d 100644 --- a/pyIocApp/setup.c +++ b/pyIocApp/setup.c @@ -8,7 +8,9 @@ #ifdef _DEBUG #undef _DEBUG #include +#ifdef HAVE_NUMPY #include +#endif #define _DEBUG #else #include diff --git a/requirements-deb10.txt b/requirements-deb10.txt index 382bf56..91aeff2 100644 --- a/requirements-deb10.txt +++ b/requirements-deb10.txt @@ -1,2 +1,3 @@ numpy==1.16.2 -nose==1.3.7 +#nose==1.3.7 +nose2 diff --git a/requirements-deb7.txt b/requirements-deb7.txt index 84d50dc..b143719 100644 --- a/requirements-deb7.txt +++ b/requirements-deb7.txt @@ -1,2 +1,3 @@ numpy==1.6.2 -nose==1.1.2 +#nose==1.1.2 +nose2 diff --git a/requirements-deb8.txt b/requirements-deb8.txt index 135f812..46ac10a 100644 --- a/requirements-deb8.txt +++ b/requirements-deb8.txt @@ -1,2 +1,3 @@ numpy==1.8.2 -nose==1.3.4 +#nose==1.3.4 +nose2 diff --git a/requirements-deb9.txt b/requirements-deb9.txt index d3e0a04..90d1c74 100644 --- a/requirements-deb9.txt +++ b/requirements-deb9.txt @@ -1,2 +1,3 @@ numpy==1.12.1 -nose==1.3.7 +#nose==1.3.7 +nose2 diff --git a/weatherApp/weather.py b/weatherApp/weather.py index 7835f5b..2f1b6cc 100644 --- a/weatherApp/weather.py +++ b/weatherApp/weather.py @@ -114,7 +114,7 @@ def __init__(self, station): self.scan = IOScanListBlock() # I/O Intr scan for report data self.intscan = IOScanListBlock() # scan for internal info - super(ReportScanner, self).__init__() + super(ReportScanner,self).__init__() addHook('AfterIocRunning', self.start) addHook('AtIocExit', self.join) @@ -150,6 +150,8 @@ def run(self): except Exception as e: print("download error for",self.station,":",e) self.updatePeriod = self.initPeriod + from traceback import print_exc + print_exc() self.intscan.interrupt() @@ -157,8 +159,3 @@ def run(self): self.sleep(self.updatePeriod) print('Done') - - -if __name__ == '__main__': - Scanner = ReportScanner("EGTK") # Oxford airport station - Scanner.run() From 9b435c5b1b98f281a19cf8ccc189c766c288dede Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Thu, 31 Aug 2023 10:22:34 +0100 Subject: [PATCH 14/54] Moved tempoary database file in to permanent file _dbapi.dbd. --- devsupApp/_dbapi.vcxproj | 45 +++++++++++++++++++++++++------- devsupApp/_dbapi.vcxproj.filters | 5 ++++ devsupApp/src/Makefile | 1 + devsupApp/src/devsup/__init__.py | 33 ++++------------------- devsupApp/src/devsup/_dbapi.dbd | 27 +++++++++++++++++++ 5 files changed, 73 insertions(+), 38 deletions(-) create mode 100644 devsupApp/src/devsup/_dbapi.dbd diff --git a/devsupApp/_dbapi.vcxproj b/devsupApp/_dbapi.vcxproj index da8949a..e6c2dee 100644 --- a/devsupApp/_dbapi.vcxproj +++ b/devsupApp/_dbapi.vcxproj @@ -48,6 +48,25 @@ + + Document + copy %filename% $(SolutionDir)python310\windows-x64 + $(SolutionDir)python310/windows-x64/%filename% + copy %filename% $(SolutionDir)python310\windows-x64 + $(SolutionDir)python310/windows-x64/%filename% + copy %filename% $(SolutionDir)python310\windows-x64 + $(SolutionDir)python310/windows-x64/%filename% + copy %filename% $(SolutionDir)python310\windows-x64 + $(SolutionDir)python310/windows-x64/%filename% + copy %filename% $(SolutionDir)python310\windows-x64 + $(SolutionDir)python310/windows-x64/%filename% + copy %filename% $(SolutionDir)python310\windows-x64 + $(SolutionDir)python310/windows-x64/%filename% + copy %filename% $(SolutionDir)python310\windows-x64 + $(SolutionDir)python310/windows-x64/%filename% + copy %filename% $(SolutionDir)python310\windows-x64 + $(SolutionDir)python310/windows-x64/%filename% + @@ -162,12 +181,15 @@ true + .pyd true + .pyd true + .pyd false @@ -175,12 +197,15 @@ false + .pyd false + .pyd false + .pyd @@ -194,7 +219,6 @@ Console - true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib C:\Python310\libs @@ -202,7 +226,8 @@ xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd -copy $(OutDir)\_dbapi.pyd src\devsup\_dbapi.pyd +copy $(OutDir)_dbapi.pyd $(SolutionDir)devsupApp\src\devsup\_dbapi.pyd +copy $(OutDir)_dbapi.pdb $(SolutionDir)devsupApp\src\devsup\_dbapi.pdb @@ -226,7 +251,6 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com Console - true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib C:\Python310\libs @@ -234,7 +258,8 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd -copy $(OutDir)\_dbapi.dll src\devsup\_dbapi.pyd +copy $(OutDir)_dbapi.pyd $(ProjectDir)src\devsup\_dbapi.pyd +copy $(OutDir)_dbapi.pdb $(ProjectDir)src\devsup\_dbapi.pdb @@ -266,7 +291,7 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd -copy $(OutDir)\_dbapi.pyd src\devsup\_dbapi.pyd +copy $(OutDir)\_dbapi.pyd $(SolutionDir)python310\windows-x64\_dbapi.pyd @@ -298,7 +323,7 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd -copy $(OutDir)\_dbapi.dll src\devsup\_dbapi.pyd +copy $(OutDir)\_dbapi.pyd $(SolutionDir)python310\windows-x64\_dbapi.pyd @@ -334,7 +359,7 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd -copy $(OutDir)\_dbapi.pyd src\devsup\_dbapi.pyd +copy $(OutDir)\_dbapi.pyd $(SolutionDir)python310\windows-x64\_dbapi.pyd @@ -370,7 +395,7 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd -copy $(OutDir)\_dbapi.dll src\devsup\_dbapi.pyd +copy $(OutDir)\_dbapi.pyd $(SolutionDir)python310\windows-x64\_dbapi.pyd @@ -406,7 +431,7 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd -copy $(OutDir)\_dbapi.pyd src\devsup\_dbapi.pyd +copy $(OutDir)\_dbapi.pyd $(SolutionDir)python310\windows-x64\_dbapi.pyd @@ -442,7 +467,7 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd -copy $(OutDir)\_dbapi.dll src\devsup\_dbapi.pyd +copy $(OutDir)\_dbapi.pyd $(SolutionDir)python310\windows-x64\_dbapi.pyd diff --git a/devsupApp/_dbapi.vcxproj.filters b/devsupApp/_dbapi.vcxproj.filters index 0793efa..413ef7d 100644 --- a/devsupApp/_dbapi.vcxproj.filters +++ b/devsupApp/_dbapi.vcxproj.filters @@ -52,4 +52,9 @@ src + + + src + + \ No newline at end of file diff --git a/devsupApp/src/Makefile b/devsupApp/src/Makefile index 75b9e3a..69bd361 100644 --- a/devsupApp/src/Makefile +++ b/devsupApp/src/Makefile @@ -36,6 +36,7 @@ _dbapi_SYS_LIBS_WIN32 += python$(PY_LD_VER) _dbapi_SYS_LIBS_WIN32 += ws2_32 Advapi32 Dbghelp PY += devsup/__init__.py +PY += devsup/_dbapi.dbd PY += devsup/db.py PY += devsup/dset.py PY += devsup/hooks.py diff --git a/devsupApp/src/devsup/__init__.py b/devsupApp/src/devsup/__init__.py index d1ff048..8bbebc2 100644 --- a/devsupApp/src/devsup/__init__.py +++ b/devsupApp/src/devsup/__init__.py @@ -52,34 +52,11 @@ def _init(iocMain=False): _dbapi.dbReadDatabase(os.path.join(XEPICS_BASE, "dbd", "base.dbd"), path=os.path.join(XEPICS_BASE, "dbd")) _dbapi._dbd_rrd_base() - - with tempfile.NamedTemporaryFile(delete=False) as F: - F.write(""" -device(longin, INST_IO, pydevsupComIn, "Python Device") -device(longout, INST_IO, pydevsupComOut, "Python Device") - -device(ai, INST_IO, pydevsupComIn, "Python Device") -device(ao, INST_IO, pydevsupComOut, "Python Device") - -device(stringin, INST_IO, pydevsupComIn, "Python Device") -device(stringout, INST_IO, pydevsupComOut, "Python Device") - -device(bi, INST_IO, pydevsupComIn, "Python Device") -device(bo, INST_IO, pydevsupComOut, "Python Device") - -device(mbbi, INST_IO, pydevsupComIn, "Python Device") -device(mbbo, INST_IO, pydevsupComOut, "Python Device") - -device(mbbiDirect, INST_IO, pydevsupComIn, "Python Device") -device(mbboDirect, INST_IO, pydevsupComOut, "Python Device") - -device(waveform, INST_IO, pydevsupComIn, "Python Device") -device(aai, INST_IO, pydevsupComIn, "Python Device") -device(aao, INST_IO, pydevsupComOut, "Python Device") -""".encode('ascii')) - F.close() - _dbapi.dbReadDatabase(F.name) - os.unlink(F.name) + + dirname = os.path.dirname(__file__) + dbd_name = dirname + "/_dbapi.dbd" + print("opening database " + dbd_name) + _dbapi.dbReadDatabase(dbd_name) _dbapi._dbd_setup() diff --git a/devsupApp/src/devsup/_dbapi.dbd b/devsupApp/src/devsup/_dbapi.dbd new file mode 100644 index 0000000..0cd81cd --- /dev/null +++ b/devsupApp/src/devsup/_dbapi.dbd @@ -0,0 +1,27 @@ + +device(longin, INST_IO, pydevsupComIn, "Python Device") +device(longout, INST_IO, pydevsupComOut, "Python Device") + +device(ai, INST_IO, pydevsupComIn, "Python Device") +device(ao, INST_IO, pydevsupComOut, "Python Device") + +device(stringin, INST_IO, pydevsupComIn, "Python Device") +device(stringout, INST_IO, pydevsupComOut, "Python Device") + +device(bi, INST_IO, pydevsupComIn, "Python Device") +device(bo, INST_IO, pydevsupComOut, "Python Device") + +device(mbbi, INST_IO, pydevsupComIn, "Python Device") +device(mbbo, INST_IO, pydevsupComOut, "Python Device") + +device(mbbiDirect, INST_IO, pydevsupComIn, "Python Device") +device(mbboDirect, INST_IO, pydevsupComOut, "Python Device") + +device(waveform, INST_IO, pydevsupComIn, "Python Device") +device(aai, INST_IO, pydevsupComIn, "Python Device") +device(aao, INST_IO, pydevsupComOut, "Python Device") + +device(int64in, INST_IO, pydevsupComIn, "Python Device") +device(int64out, INST_IO, pydevsupComOut, "Python Device") +device(lsi, INST_IO, pydevsupComIn, "Python Device") +device(lso, INST_IO, pydevsupComOut, "Python Device") \ No newline at end of file From 7107958cdd67361fe0c202dac3fd4809869c4315 Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Thu, 31 Aug 2023 16:28:30 +0100 Subject: [PATCH 15/54] Separated int64 and lsi/lso from the main _dbapi.dbd file in order to make them conditional on epics version number. --- devsupApp/src/Makefile | 2 ++ devsupApp/src/dbfield.c | 7 +++++-- devsupApp/src/devsup/__init__.py | 11 +++++++++++ devsupApp/src/devsup/_dbapi.dbd | 5 ----- devsupApp/src/devsup/_int64.dbd | 2 ++ devsupApp/src/devsup/_lsilso.dbd | 2 ++ 6 files changed, 22 insertions(+), 7 deletions(-) create mode 100644 devsupApp/src/devsup/_int64.dbd create mode 100644 devsupApp/src/devsup/_lsilso.dbd diff --git a/devsupApp/src/Makefile b/devsupApp/src/Makefile index 69bd361..1932da8 100644 --- a/devsupApp/src/Makefile +++ b/devsupApp/src/Makefile @@ -37,6 +37,8 @@ _dbapi_SYS_LIBS_WIN32 += ws2_32 Advapi32 Dbghelp PY += devsup/__init__.py PY += devsup/_dbapi.dbd +PY += devsup/_int64.dbd +PY += devsup/_lsilso.dbd PY += devsup/db.py PY += devsup/dset.py PY += devsup/hooks.py diff --git a/devsupApp/src/dbfield.c b/devsupApp/src/dbfield.c index 4f0c6f6..697812d 100644 --- a/devsupApp/src/dbfield.c +++ b/devsupApp/src/dbfield.c @@ -321,11 +321,14 @@ static PyObject* pyField_putval(pyField *self, PyObject* args) fld = PyString_AsString(val); #endif if(fld) { - strncpy(dest, fld, MAX_STRING_SIZE); - dest[MAX_STRING_SIZE-1]='\0'; + strncpy(dest, fld, self->addr.field_size); + dest[self->addr.field_size-1]='\0'; } else { dest[0] = '\0'; } + if ((self->addr.special == SPC_MOD) || (self->addr.special == SPC_NOMOD)) + if (prset = dbGetRset(&self->addr)) + prset->special(self->addr, 1); #if PY_MAJOR_VERSION >= 3 Py_DECREF(data); #endif diff --git a/devsupApp/src/devsup/__init__.py b/devsupApp/src/devsup/__init__.py index 8bbebc2..1168a22 100644 --- a/devsupApp/src/devsup/__init__.py +++ b/devsupApp/src/devsup/__init__.py @@ -57,6 +57,17 @@ def _init(iocMain=False): dbd_name = dirname + "/_dbapi.dbd" print("opening database " + dbd_name) _dbapi.dbReadDatabase(dbd_name) + # e.g. 3.15.0.2 -> 30000 + 1500 + 0 + 2 = 31502 + epics_version_int = EPICS_VERSION * 10000 + EPICS_REVISION * 100 + EPICS_MODIFICATION * 10 + EPICS_PATCH_LEVEL + print("epics_version_int = " + str(epics_version_int)) + if epics_version_int >= 31502: + dbd_name = dirname + "/_lsilso.dbd" + print("opening database " + dbd_name) + _dbapi.dbReadDatabase(dbd_name) + if epics_version_int >= 31610: + dbd_name = dirname + "/_int64.dbd" + print("opening database " + dbd_name) + _dbapi.dbReadDatabase(dbd_name) _dbapi._dbd_setup() diff --git a/devsupApp/src/devsup/_dbapi.dbd b/devsupApp/src/devsup/_dbapi.dbd index 0cd81cd..0d791aa 100644 --- a/devsupApp/src/devsup/_dbapi.dbd +++ b/devsupApp/src/devsup/_dbapi.dbd @@ -20,8 +20,3 @@ device(mbboDirect, INST_IO, pydevsupComOut, "Python Device") device(waveform, INST_IO, pydevsupComIn, "Python Device") device(aai, INST_IO, pydevsupComIn, "Python Device") device(aao, INST_IO, pydevsupComOut, "Python Device") - -device(int64in, INST_IO, pydevsupComIn, "Python Device") -device(int64out, INST_IO, pydevsupComOut, "Python Device") -device(lsi, INST_IO, pydevsupComIn, "Python Device") -device(lso, INST_IO, pydevsupComOut, "Python Device") \ No newline at end of file diff --git a/devsupApp/src/devsup/_int64.dbd b/devsupApp/src/devsup/_int64.dbd new file mode 100644 index 0000000..120fb64 --- /dev/null +++ b/devsupApp/src/devsup/_int64.dbd @@ -0,0 +1,2 @@ +device(int64in, INST_IO, pydevsupComIn, "Python Device") +device(int64out, INST_IO, pydevsupComOut, "Python Device") diff --git a/devsupApp/src/devsup/_lsilso.dbd b/devsupApp/src/devsup/_lsilso.dbd new file mode 100644 index 0000000..761ef5b --- /dev/null +++ b/devsupApp/src/devsup/_lsilso.dbd @@ -0,0 +1,2 @@ +device(lsi, INST_IO, pydevsupComIn, "Python Device") +device(lso, INST_IO, pydevsupComOut, "Python Device") \ No newline at end of file From bc40ea6b7ebd051531db5603bfe9f7a9de5c245d Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Thu, 31 Aug 2023 18:21:21 +0100 Subject: [PATCH 16/54] Removed unnecessary debug print statements. --- devsupApp/src/devsup/__init__.py | 4 ---- devsupApp/src/devsup/ptable.py | 3 --- 2 files changed, 7 deletions(-) diff --git a/devsupApp/src/devsup/__init__.py b/devsupApp/src/devsup/__init__.py index 1168a22..b5eae8f 100644 --- a/devsupApp/src/devsup/__init__.py +++ b/devsupApp/src/devsup/__init__.py @@ -55,18 +55,14 @@ def _init(iocMain=False): dirname = os.path.dirname(__file__) dbd_name = dirname + "/_dbapi.dbd" - print("opening database " + dbd_name) _dbapi.dbReadDatabase(dbd_name) # e.g. 3.15.0.2 -> 30000 + 1500 + 0 + 2 = 31502 epics_version_int = EPICS_VERSION * 10000 + EPICS_REVISION * 100 + EPICS_MODIFICATION * 10 + EPICS_PATCH_LEVEL - print("epics_version_int = " + str(epics_version_int)) if epics_version_int >= 31502: dbd_name = dirname + "/_lsilso.dbd" - print("opening database " + dbd_name) _dbapi.dbReadDatabase(dbd_name) if epics_version_int >= 31610: dbd_name = dirname + "/_int64.dbd" - print("opening database " + dbd_name) _dbapi.dbReadDatabase(dbd_name) _dbapi._dbd_setup() diff --git a/devsupApp/src/devsup/ptable.py b/devsupApp/src/devsup/ptable.py index a3279fd..6f87b70 100644 --- a/devsupApp/src/devsup/ptable.py +++ b/devsupApp/src/devsup/ptable.py @@ -285,12 +285,9 @@ def process(self, rec, reason=None): if param.alarm == 0: newstat = 0 if oldsevr != param.alarm or oldstat != newstat: - print('other alrm ' + param.name + " was " + str(oldsevr) + ", " +str(oldstat) + " now " + str(param.alarm)) param._sevr.putval(param.alarm) - #proc.putval(1) oldsevr = self.inst._sevr.getval() if oldsevr != self.inst.alarm: - print('this alrm ' + rec.name() + " was " + str(oldsevr) + " now " + str(self.inst.alarm)) rec.setSevr(self.inst.alarm) class TableBase(object): From 2aa44cc045e8f4796f361b38f2c5245bdffdfe45 Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Tue, 5 Sep 2023 09:36:44 +0100 Subject: [PATCH 17/54] Corrected address operator mistake. --- devsupApp/src/dbfield.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devsupApp/src/dbfield.c b/devsupApp/src/dbfield.c index 697812d..3114d0d 100644 --- a/devsupApp/src/dbfield.c +++ b/devsupApp/src/dbfield.c @@ -328,7 +328,7 @@ static PyObject* pyField_putval(pyField *self, PyObject* args) } if ((self->addr.special == SPC_MOD) || (self->addr.special == SPC_NOMOD)) if (prset = dbGetRset(&self->addr)) - prset->special(self->addr, 1); + prset->special(&self->addr, 1); #if PY_MAJOR_VERSION >= 3 Py_DECREF(data); #endif From 713b2eaf9da57802312a09a826600010596f9a66 Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Tue, 5 Sep 2023 11:41:59 +0100 Subject: [PATCH 18/54] For the purpose of making a pull request, discarded changes that I want to keep in main branch. --- devsupApp/Makefile | 6 +- devsupApp/__init__.py | 0 devsupApp/_dbapi.vcxproj | 511 -------------------------- devsupApp/_dbapi.vcxproj.filters | 60 --- devsupApp/src/__init__.py | 0 devsupApp/src/dbapi.c | 12 - devsupApp/src/dbdset.c | 6 - devsupApp/src/dbfield.c | 7 - devsupApp/src/dbrec.c | 7 +- devsupApp/src/pydevsup.h | 6 - devsupApp/src/utest.c | 6 - pyIocApp/pyDevSup310.vcxproj | 460 ----------------------- pyIocApp/pyDevSup310.vcxproj.filters | 42 --- pyIocApp/setup.c | 7 - pyIocApp/softIocPy310.vcxproj | 477 ------------------------ pyIocApp/softIocPy310.vcxproj.filters | 19 - pyIocApp/softIocPy310.vcxproj.user | 55 --- requirements-latest.txt | 2 + setup.py | 11 - 19 files changed, 7 insertions(+), 1687 deletions(-) delete mode 100644 devsupApp/__init__.py delete mode 100644 devsupApp/_dbapi.vcxproj delete mode 100644 devsupApp/_dbapi.vcxproj.filters delete mode 100644 devsupApp/src/__init__.py delete mode 100644 pyIocApp/pyDevSup310.vcxproj delete mode 100644 pyIocApp/pyDevSup310.vcxproj.filters delete mode 100644 pyIocApp/softIocPy310.vcxproj delete mode 100644 pyIocApp/softIocPy310.vcxproj.filters delete mode 100644 pyIocApp/softIocPy310.vcxproj.user create mode 100644 requirements-latest.txt delete mode 100644 setup.py diff --git a/devsupApp/Makefile b/devsupApp/Makefile index 9e92fe8..10e0126 100644 --- a/devsupApp/Makefile +++ b/devsupApp/Makefile @@ -1,6 +1,8 @@ TOP = .. include $(TOP)/configure/CONFIG -DIRS += src -DIRS += Db +DIRS := $(DIRS) $(filter-out $(DIRS), $(wildcard *src*)) +DIRS := $(DIRS) $(filter-out $(DIRS), $(wildcard *Src*)) +DIRS := $(DIRS) $(filter-out $(DIRS), $(wildcard *db*)) +DIRS := $(DIRS) $(filter-out $(DIRS), $(wildcard *Db*)) include $(TOP)/configure/RULES_DIRS diff --git a/devsupApp/__init__.py b/devsupApp/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/devsupApp/_dbapi.vcxproj b/devsupApp/_dbapi.vcxproj deleted file mode 100644 index e6c2dee..0000000 --- a/devsupApp/_dbapi.vcxproj +++ /dev/null @@ -1,511 +0,0 @@ - - - - false - - - - Debug_DLL - Win32 - - - Debug_DLL - x64 - - - Debug_LIB - Win32 - - - Debug_LIB - x64 - - - Release_DLL - Win32 - - - Release_DLL - x64 - - - Release_LIB - Win32 - - - Release_LIB - x64 - - - - - - - - - - - - - - - Document - copy %filename% $(SolutionDir)python310\windows-x64 - $(SolutionDir)python310/windows-x64/%filename% - copy %filename% $(SolutionDir)python310\windows-x64 - $(SolutionDir)python310/windows-x64/%filename% - copy %filename% $(SolutionDir)python310\windows-x64 - $(SolutionDir)python310/windows-x64/%filename% - copy %filename% $(SolutionDir)python310\windows-x64 - $(SolutionDir)python310/windows-x64/%filename% - copy %filename% $(SolutionDir)python310\windows-x64 - $(SolutionDir)python310/windows-x64/%filename% - copy %filename% $(SolutionDir)python310\windows-x64 - $(SolutionDir)python310/windows-x64/%filename% - copy %filename% $(SolutionDir)python310\windows-x64 - $(SolutionDir)python310/windows-x64/%filename% - copy %filename% $(SolutionDir)python310\windows-x64 - $(SolutionDir)python310/windows-x64/%filename% - - - - - - - - - {422a8c73-836c-48cb-86c8-0591e69c0ca1} - - - {9cf8d9ab-e47d-4923-a251-80e40b4e7144} - - - {e9d99fc7-e592-472b-b2e2-c3b0d81d8169} - - - - {BAE6CE99-140A-4018-8BCB-9D63F54D6F07} - Win32Proj - WithAsyn - Svn - Svn - SubversionScc - Svn - _dbapi - 10.0 - - - - DynamicLibrary - true - v143 - false - - - DynamicLibrary - true - v143 - false - - - DynamicLibrary - true - v143 - false - - - DynamicLibrary - true - v143 - false - - - DynamicLibrary - false - true - v143 - false - - - DynamicLibrary - false - true - v143 - false - - - DynamicLibrary - false - true - v143 - false - - - DynamicLibrary - false - true - v143 - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - .pyd - - - true - .pyd - - - true - .pyd - - - true - .pyd - - - false - .pyd - - - false - .pyd - - - false - .pyd - - - false - .pyd - - - - - - Level3 - Disabled - XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";_DEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include - 4251 - - - Console - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python310\libs - - - - - xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd -copy $(OutDir)_dbapi.pyd $(SolutionDir)devsupApp\src\devsup\_dbapi.pyd -copy $(OutDir)_dbapi.pdb $(SolutionDir)devsupApp\src\devsup\_dbapi.pdb - - - - if not exist O.Common md O.Common -if not exist $(SolutionDir)DBD md $(SolutionDir)DBD -SET PERL5LIB=$(SolutionDir)lib\perl -perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd -perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) - - - - - - - - Level3 - Disabled - XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";_DEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include - 4251 - - - Console - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python310\libs - - - - - xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd -copy $(OutDir)_dbapi.pyd $(ProjectDir)src\devsup\_dbapi.pyd -copy $(OutDir)_dbapi.pdb $(ProjectDir)src\devsup\_dbapi.pdb - - - - if not exist O.Common md O.Common -if not exist $(SolutionDir)DBD md $(SolutionDir)DBD -SET PERL5LIB=$(SolutionDir)lib\perl -perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd -perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) - - - - - - - - Level3 - Disabled - XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";_DEBUG;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include - MultiThreadedDebug - - - Console - true - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python310\libs - - - - - xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd -copy $(OutDir)\_dbapi.pyd $(SolutionDir)python310\windows-x64\_dbapi.pyd - - - - if not exist O.Common md O.Common -if not exist $(SolutionDir)DBD md $(SolutionDir)DBD -SET PERL5LIB=$(SolutionDir)lib\perl -perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd -perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) - - - - - - - - Level3 - Disabled - XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";_DEBUG;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include - MultiThreadedDebug - - - Console - true - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python310\libs - - - - - xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd -copy $(OutDir)\_dbapi.pyd $(SolutionDir)python310\windows-x64\_dbapi.pyd - - - - if not exist O.Common md O.Common -if not exist $(SolutionDir)DBD md $(SolutionDir)DBD -SET PERL5LIB=$(SolutionDir)lib\perl -perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd -perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) - - - - - - Level3 - - - MaxSpeed - true - true - XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";NDEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include - 4251 - - - Console - true - true - true - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python310\libs - - - - - xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd -copy $(OutDir)\_dbapi.pyd $(SolutionDir)python310\windows-x64\_dbapi.pyd - - - - if not exist O.Common md O.Common -if not exist $(SolutionDir)DBD md $(SolutionDir)DBD -SET PERL5LIB=$(SolutionDir)lib\perl -perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd -perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) - - - - - - Level3 - - - MaxSpeed - true - true - XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";NDEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include - 4251 - - - Console - true - true - true - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python310\libs - - - - - xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd -copy $(OutDir)\_dbapi.pyd $(SolutionDir)python310\windows-x64\_dbapi.pyd - - - - if not exist O.Common md O.Common -if not exist $(SolutionDir)DBD md $(SolutionDir)DBD -SET PERL5LIB=$(SolutionDir)lib\perl -perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd -perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) - - - - - - Level3 - - - MaxSpeed - true - true - XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";NDEBUG;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include - MultiThreaded - - - Console - true - true - true - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python310\libs - - - - - xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd -copy $(OutDir)\_dbapi.pyd $(SolutionDir)python310\windows-x64\_dbapi.pyd - - - - if not exist O.Common md O.Common -if not exist $(SolutionDir)DBD md $(SolutionDir)DBD -SET PERL5LIB=$(SolutionDir)lib\perl -perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd -perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) - - - - - - Level3 - - - MaxSpeed - true - true - XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";NDEBUG;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include - MultiThreaded - - - Console - true - true - true - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python310\libs - - - - - xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd -copy $(OutDir)\_dbapi.pyd $(SolutionDir)python310\windows-x64\_dbapi.pyd - - - - if not exist O.Common md O.Common -if not exist $(SolutionDir)DBD md $(SolutionDir)DBD -SET PERL5LIB=$(SolutionDir)lib\perl -perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd -perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) - - - - - - WIN32;NDEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc - - - if not exist O.Common md O.Common -if not exist $(SolutionDir)DBD md $(SolutionDir)DBD -SET PERL5LIB=$(SolutionDir)lib\perl -perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\LeyboldTurbo_registerRecordDeviceDriver.cpp src\LeyboldTurboInclude.dbd LeyboldTurbo_registerRecordDeviceDriver $(SolutionDir) - - - - - - WIN32;_DEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc - - - if not exist O.Common md O.Common -if not exist $(SolutionDir)DBD md $(SolutionDir)DBD -SET PERL5LIB=$(SolutionDir)lib\perl -perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\LeyboldTurbo_registerRecordDeviceDriver.cpp src\LeyboldTurboInclude.dbd LeyboldTurbo_registerRecordDeviceDriver $(SolutionDir) - - - - - - - \ No newline at end of file diff --git a/devsupApp/_dbapi.vcxproj.filters b/devsupApp/_dbapi.vcxproj.filters deleted file mode 100644 index 413ef7d..0000000 --- a/devsupApp/_dbapi.vcxproj.filters +++ /dev/null @@ -1,60 +0,0 @@ - - - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {fef0bd38-19ac-4984-803b-3bf69909b6aa} - - - {9d42cf23-b80c-4588-adf4-92e1b0892282} - - - - - src - - - src - - - src - - - src - - - src - - - O.Common - - - - - src - - - Db - - - O.Common - - - - - src - - - - - src - - - \ No newline at end of file diff --git a/devsupApp/src/__init__.py b/devsupApp/src/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/devsupApp/src/dbapi.c b/devsupApp/src/dbapi.c index b0c30fb..f859cd6 100644 --- a/devsupApp/src/dbapi.c +++ b/devsupApp/src/dbapi.c @@ -2,19 +2,10 @@ #undef _POSIX_C_SOURCE #undef _XOPEN_SOURCE -#ifdef _DEBUG -#undef _DEBUG #include #ifdef HAVE_NUMPY #include #endif -#define _DEBUG -#else -#include -#include -#endif -#ifdef HAVE_NUMPY -#endif #include @@ -34,9 +25,6 @@ #include "pydevsup.h" - - - initHookState pyInitLastState; extern int pyDevSupCommon_registerRecordDeviceDriver(DBBASE *pbase); diff --git a/devsupApp/src/dbdset.c b/devsupApp/src/dbdset.c index 5bb05cd..954d0c5 100644 --- a/devsupApp/src/dbdset.c +++ b/devsupApp/src/dbdset.c @@ -3,13 +3,7 @@ #undef _POSIX_C_SOURCE #undef _XOPEN_SOURCE -#ifdef _DEBUG -#undef _DEBUG #include -#define _DEBUG -#else -#include -#endif #include #include diff --git a/devsupApp/src/dbfield.c b/devsupApp/src/dbfield.c index 3114d0d..7b748ba 100644 --- a/devsupApp/src/dbfield.c +++ b/devsupApp/src/dbfield.c @@ -3,17 +3,10 @@ #undef _POSIX_C_SOURCE #undef _XOPEN_SOURCE -#ifdef _DEBUG -#undef _DEBUG #include #ifdef HAVE_NUMPY #include #endif -#define _DEBUG -#else -#include -#include -#endif #include #include diff --git a/devsupApp/src/dbrec.c b/devsupApp/src/dbrec.c index f63d03c..7802fe5 100644 --- a/devsupApp/src/dbrec.c +++ b/devsupApp/src/dbrec.c @@ -3,13 +3,8 @@ #undef _POSIX_C_SOURCE #undef _XOPEN_SOURCE -#ifdef _DEBUG -#undef _DEBUG #include -#define _DEBUG -#else -#include -#endif + #include #include #include diff --git a/devsupApp/src/pydevsup.h b/devsupApp/src/pydevsup.h index 2bbea62..21cce23 100644 --- a/devsupApp/src/pydevsup.h +++ b/devsupApp/src/pydevsup.h @@ -5,13 +5,7 @@ #include #include -#ifdef _DEBUG -#undef _DEBUG #include -#define _DEBUG -#else -#include -#endif #ifndef VERSION_INT # define VERSION_INT(V,R,M,P) ( ((V)<<24) | ((R)<<16) | ((M)<<8) | (P)) diff --git a/devsupApp/src/utest.c b/devsupApp/src/utest.c index fad22b0..95eeb1d 100644 --- a/devsupApp/src/utest.c +++ b/devsupApp/src/utest.c @@ -3,13 +3,7 @@ #undef _POSIX_C_SOURCE #undef _XOPEN_SOURCE -#ifdef _DEBUG -#undef _DEBUG #include -#define _DEBUG -#else -#include -#endif #include #include diff --git a/pyIocApp/pyDevSup310.vcxproj b/pyIocApp/pyDevSup310.vcxproj deleted file mode 100644 index 2b45b44..0000000 --- a/pyIocApp/pyDevSup310.vcxproj +++ /dev/null @@ -1,460 +0,0 @@ - - - - false - - - - Debug_DLL - Win32 - - - Debug_DLL - x64 - - - Debug_LIB - Win32 - - - Debug_LIB - x64 - - - Release_DLL - Win32 - - - Release_DLL - x64 - - - Release_LIB - Win32 - - - Release_LIB - x64 - - - - - {422a8c73-836c-48cb-86c8-0591e69c0ca1} - - - {9cf8d9ab-e47d-4923-a251-80e40b4e7144} - - - {e9d99fc7-e592-472b-b2e2-c3b0d81d8169} - - - - - - - - - - - - - {E0621B43-15E2-4080-B777-16C02E5B4611} - Win32Proj - Svn - Svn - SubversionScc - Svn - pyDevSup310 - 10.0 - - - - DynamicLibrary - true - v143 - false - - - DynamicLibrary - true - v143 - false - - - StaticLibrary - true - v143 - false - - - StaticLibrary - true - v143 - false - - - DynamicLibrary - false - true - v143 - false - - - DynamicLibrary - false - true - v143 - false - - - StaticLibrary - false - true - v143 - false - - - StaticLibrary - false - true - v143 - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - .pyd - - - true - .pyd - - - true - - - true - - - false - .pyd - - - false - .pyd - - - false - - - false - - - - - - Level3 - Disabled - XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python310";XEPICS_ARCH="$(Configuration)";_DEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include - 4251 - - - Console - true - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib - C:\Python310\libs - - - if not exist O.Common md O.Common -if not exist $(SolutionDir)dbd md $(SolutionDir)dbd -xcopy /Y /Q /D /R *.dbd $(SolutionDir)dbd > NUL -SET PERL5LIB=$(SolutionDir)lib\perl -perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd -perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) - - - - - xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd - - - - - - - Level3 - Disabled - XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python310";XEPICS_ARCH="$(Configuration)";_DEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include - 4251 - - - Console - true - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib - C:\Python310\libs - - - if not exist O.Common md O.Common -if not exist $(SolutionDir)dbd md $(SolutionDir)dbd -xcopy /Y /Q /D /R *.dbd $(SolutionDir)dbd > NUL -SET PERL5LIB=$(SolutionDir)lib\perl -perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd -perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) - - - - - xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd - - - - - - - Level3 - Disabled - XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python310";XEPICS_ARCH="$(Configuration)";_DEBUG;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include - MultiThreadedDebug - - - Console - true - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib - - - if not exist O.Common md O.Common -if not exist $(SolutionDir)dbd md $(SolutionDir)dbd -xcopy /Y /Q /D /R *.dbd $(SolutionDir)dbd > NUL -SET PERL5LIB=$(SolutionDir)lib\perl -perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd -perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) - - - - - xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd - - - - - - - Level3 - Disabled - XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python310";XEPICS_ARCH="$(Configuration)";_DEBUG;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include - MultiThreadedDebug - - - Console - true - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib - - - if not exist O.Common md O.Common -if not exist $(SolutionDir)dbd md $(SolutionDir)dbd -xcopy /Y /Q /D /R *.dbd $(SolutionDir)dbd > NUL -SET PERL5LIB=$(SolutionDir)lib\perl -perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd -perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) - - - - - xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd - - - - - Level3 - - - MaxSpeed - true - true - XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python310";XEPICS_ARCH="$(Configuration)";NDEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include - 4251 - - - Console - true - true - true - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib - C:\Python310\libs - - - if not exist O.Common md O.Common -if not exist $(SolutionDir)dbd md $(SolutionDir)dbd -xcopy /Y /Q /D /R *.dbd $(SolutionDir)dbd > NUL -SET PERL5LIB=$(SolutionDir)lib\perl -perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd -perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) - - - - - xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd - - - - - Level3 - - - MaxSpeed - true - true - XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python310";XEPICS_ARCH="$(Configuration)";NDEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include - 4251 - - - Console - true - true - true - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib - C:\Python310\libs - - - if not exist O.Common md O.Common -if not exist $(SolutionDir)dbd md $(SolutionDir)dbd -xcopy /Y /Q /D /R *.dbd $(SolutionDir)dbd > NUL -SET PERL5LIB=$(SolutionDir)lib\perl -perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd -perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) - - - - - xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd - - - - - Level3 - - - MaxSpeed - true - true - XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python310";XEPICS_ARCH="$(Configuration)";NDEBUG;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include - MultiThreaded - - - Console - true - true - true - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib - - - if not exist O.Common md O.Common -if not exist $(SolutionDir)dbd md $(SolutionDir)dbd -xcopy /Y /Q /D /R *.dbd $(SolutionDir)dbd > NUL -SET PERL5LIB=$(SolutionDir)lib\perl -perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd -perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) - - - - - xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd - - - - - Level3 - - - MaxSpeed - true - true - XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python310";XEPICS_ARCH="$(Configuration)";NDEBUG;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include - MultiThreaded - - - Console - true - true - true - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib - - - if not exist O.Common md O.Common -if not exist $(SolutionDir)dbd md $(SolutionDir)dbd -xcopy /Y /Q /D /R *.dbd $(SolutionDir)dbd > NUL -SET PERL5LIB=$(SolutionDir)lib\perl -perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon.dbd base.dbd -perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\pyDevSupCommon_registerRecordDeviceDriver.cpp O.Common\pyDevSupCommon.dbd pyDevSupCommon_registerRecordDeviceDriver $(SolutionDir) - - - - - xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd - - - - - WIN32;NDEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc - - - if not exist O.Common md O.Common -if not exist $(SolutionDir)DBD md $(SolutionDir)DBD -SET PERL5LIB=$(SolutionDir)lib\perl -perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\LeyboldTurbo_registerRecordDeviceDriver.cpp src\LeyboldTurboInclude.dbd LeyboldTurbo_registerRecordDeviceDriver $(SolutionDir) - - - - - - WIN32;_DEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc - - - if not exist O.Common md O.Common -if not exist $(SolutionDir)DBD md $(SolutionDir)DBD -SET PERL5LIB=$(SolutionDir)lib\perl -perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\LeyboldTurbo_registerRecordDeviceDriver.cpp src\LeyboldTurboInclude.dbd LeyboldTurbo_registerRecordDeviceDriver $(SolutionDir) - - - - - - - \ No newline at end of file diff --git a/pyIocApp/pyDevSup310.vcxproj.filters b/pyIocApp/pyDevSup310.vcxproj.filters deleted file mode 100644 index d85eb46..0000000 --- a/pyIocApp/pyDevSup310.vcxproj.filters +++ /dev/null @@ -1,42 +0,0 @@ - - - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {f19b6948-4535-47d5-a8c3-1f537ec15532} - False - - - {fef0bd38-19ac-4984-803b-3bf69909b6aa} - - - {69213f5f-2f8f-4dc1-a5ce-5d07e4a3055f} - - - - - O.Common - - - src - - - - - Db - - - O.Common - - - pyIocApp - - - \ No newline at end of file diff --git a/pyIocApp/setup.c b/pyIocApp/setup.c index 2aeab7d..4c880c0 100644 --- a/pyIocApp/setup.c +++ b/pyIocApp/setup.c @@ -5,17 +5,10 @@ #undef _POSIX_C_SOURCE #undef _XOPEN_SOURCE -#ifdef _DEBUG -#undef _DEBUG #include #ifdef HAVE_NUMPY #include #endif -#define _DEBUG -#else -#include -#include -#endif #include diff --git a/pyIocApp/softIocPy310.vcxproj b/pyIocApp/softIocPy310.vcxproj deleted file mode 100644 index 9334ec7..0000000 --- a/pyIocApp/softIocPy310.vcxproj +++ /dev/null @@ -1,477 +0,0 @@ - - - - false - - - - Debug_DLL - Win32 - - - Debug_DLL - x64 - - - Debug_LIB - Win32 - - - Debug_LIB - x64 - - - Release_DLL - Win32 - - - Release_DLL - x64 - - - Release_LIB - Win32 - - - Release_LIB - x64 - - - - - {361bcebd-8b02-4b15-b28b-863f0602cb99} - - - {422a8c73-836c-48cb-86c8-0591e69c0ca1} - - - {9cf8d9ab-e47d-4923-a251-80e40b4e7144} - - - {e9d99fc7-e592-472b-b2e2-c3b0d81d8169} - - - {e0621b43-15e2-4080-b777-16c02e5b4611} - - - - - - - - - - - {D3310F39-9AE8-4F16-BE04-1D1D31035BA9} - Win32Proj - WithAsyn - Svn - Svn - SubversionScc - Svn - softIocPy310 - 10.0 - - - - Application - true - v143 - false - - - Application - true - v143 - false - - - Application - true - v143 - false - - - Application - true - v143 - false - - - Application - false - true - v143 - false - - - Application - false - true - v143 - false - - - Application - false - true - v143 - false - - - Application - false - true - v143 - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - true - - - true - - - true - - - false - - - false - - - false - - - false - - - - - - Level3 - Disabled - WIN32;XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";_DEBUG;EPICS_CALL_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;..\devsupApp\src - - - Console - true - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python310\libs - - - - - xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd - - - - if not exist O.Common md O.Common -if not exist $(SolutionDir)DBD md $(SolutionDir)DBD -SET PERL5LIB=$(SolutionDir)lib\perl -echo OutDir is $(OutDir) -perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common/softIocPy.dbd base.dbd pyDevSup.dbd system.dbd -perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common/softIocPy_registerRecordDeviceDriver.cpp O.Common/softIocPy.dbd softIocPy_registerRecordDeviceDriver "$(SolutionDir.Replace('\', '/'))" - - - - - - - - Level3 - Disabled - WIN32;XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";_DEBUG;EPICS_CALL_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;..\devsupApp\src - - - Console - true - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python310\libs - - - - - xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd - - - - if not exist O.Common md O.Common -if not exist $(SolutionDir)DBD md $(SolutionDir)DBD -SET PERL5LIB=$(SolutionDir)lib\perl -echo OutDir is $(OutDir) -perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common/softIocPy.dbd base.dbd pyDevSup.dbd system.dbd -perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common/softIocPy_registerRecordDeviceDriver.cpp O.Common/softIocPy.dbd softIocPy_registerRecordDeviceDriver "$(SolutionDir.Replace('\', '/'))" - - - - - - - - Level3 - Disabled - WIN32;XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";_DEBUG;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;..\devsupApp\src - MultiThreadedDebug - - - Console - true - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python310\libs - - - - - xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd - - - - if not exist O.Common md O.Common -if not exist $(SolutionDir)DBD md $(SolutionDir)DBD -SET PERL5LIB=$(SolutionDir)lib\perl -echo OutDir is $(OutDir) -perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common/softIocPy.dbd base.dbd pyDevSup.dbd system.dbd -perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common/softIocPy_registerRecordDeviceDriver.cpp O.Common/softIocPy.dbd softIocPy_registerRecordDeviceDriver "$(SolutionDir.Replace('\', '/'))" - - - - - - - - Level3 - Disabled - WIN32;XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";_DEBUG;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;..\devsupApp\src - MultiThreadedDebug - - - Console - true - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python310\libs - - - - - xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd - - - - if not exist O.Common md O.Common -if not exist $(SolutionDir)DBD md $(SolutionDir)DBD -SET PERL5LIB=$(SolutionDir)lib\perl -echo OutDir is $(OutDir) -perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common/softIocPy.dbd base.dbd pyDevSup.dbd system.dbd -perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common/softIocPy_registerRecordDeviceDriver.cpp O.Common/softIocPy.dbd softIocPy_registerRecordDeviceDriver "$(SolutionDir.Replace('\', '/'))" - - - - - - Level3 - - - MaxSpeed - true - true - WIN32;XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";NDEBUG;EPICS_CALL_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;..\devsupApp\src - - - Console - true - true - true - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python310\libs - - - - - xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd - - - - if not exist O.Common md O.Common -if not exist $(SolutionDir)DBD md $(SolutionDir)DBD -SET PERL5LIB=$(SolutionDir)lib\perl -echo OutDir is $(OutDir) -perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common/softIocPy.dbd base.dbd pyDevSup.dbd system.dbd -perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common/softIocPy_registerRecordDeviceDriver.cpp O.Common/softIocPy.dbd softIocPy_registerRecordDeviceDriver "$(SolutionDir.Replace('\', '/'))" - - - - - - Level3 - - - MaxSpeed - true - true - WIN32;XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";NDEBUG;EPICS_CALL_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;..\devsupApp\src - - - Console - true - true - true - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python310\libs - - - - - xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd - - - - if not exist O.Common md O.Common -if not exist $(SolutionDir)DBD md $(SolutionDir)DBD -SET PERL5LIB=$(SolutionDir)lib\perl -echo OutDir is $(OutDir) -perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common/softIocPy.dbd base.dbd pyDevSup.dbd system.dbd -perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common/softIocPy_registerRecordDeviceDriver.cpp O.Common/softIocPy.dbd softIocPy_registerRecordDeviceDriver "$(SolutionDir.Replace('\', '/'))" - - - - - - Level3 - - - MaxSpeed - true - true - WIN32;XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";NDEBUG;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;..\devsupApp\src - MultiThreaded - - - Console - true - true - true - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python310\libs - - - - - xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd - - - - if not exist O.Common md O.Common -if not exist $(SolutionDir)DBD md $(SolutionDir)DBD -SET PERL5LIB=$(SolutionDir)lib\perl -echo OutDir is $(OutDir) -perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common/softIocPy.dbd base.dbd pyDevSup.dbd system.dbd -perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common/softIocPy_registerRecordDeviceDriver.cpp O.Common/softIocPy.dbd softIocPy_registerRecordDeviceDriver "$(SolutionDir.Replace('\', '/'))" - - - - - - Level3 - - - MaxSpeed - true - true - WIN32;XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";NDEBUG;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;..\devsupApp\src - MultiThreaded - - - Console - true - true - true - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python310\libs - - - - - xcopy /Y /Q /D O.Common\*.dbd $(SolutionDir)dbd - - - - if not exist O.Common md O.Common -if not exist $(SolutionDir)DBD md $(SolutionDir)DBD -SET PERL5LIB=$(SolutionDir)lib\perl -echo OutDir is $(OutDir) -perl -CSD $(OutDir)dbdExpand.pl -I$(SolutionDir)dbd -o O.Common/softIocPy.dbd base.dbd pyDevSup.dbd system.dbd -perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common/softIocPy_registerRecordDeviceDriver.cpp O.Common/softIocPy.dbd softIocPy_registerRecordDeviceDriver "$(SolutionDir.Replace('\', '/'))" - - - - - - WIN32;NDEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc - - - if not exist O.Common md O.Common -if not exist $(SolutionDir)DBD md $(SolutionDir)DBD -SET PERL5LIB=$(SolutionDir)lib\perl -perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\LeyboldTurbo_registerRecordDeviceDriver.cpp src\LeyboldTurboInclude.dbd LeyboldTurbo_registerRecordDeviceDriver $(SolutionDir) - - - - - - WIN32;_DEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc - - - if not exist O.Common md O.Common -if not exist $(SolutionDir)DBD md $(SolutionDir)DBD -SET PERL5LIB=$(SolutionDir)lib\perl -perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Common\LeyboldTurbo_registerRecordDeviceDriver.cpp src\LeyboldTurboInclude.dbd LeyboldTurbo_registerRecordDeviceDriver $(SolutionDir) - - - - - - - \ No newline at end of file diff --git a/pyIocApp/softIocPy310.vcxproj.filters b/pyIocApp/softIocPy310.vcxproj.filters deleted file mode 100644 index f6e3101..0000000 --- a/pyIocApp/softIocPy310.vcxproj.filters +++ /dev/null @@ -1,19 +0,0 @@ - - - - - {04aeea59-1c62-4a91-8d52-15e8e9b8515e} - - - - - O.Common - - - - - O.Common - - - - \ No newline at end of file diff --git a/pyIocApp/softIocPy310.vcxproj.user b/pyIocApp/softIocPy310.vcxproj.user deleted file mode 100644 index 02fd142..0000000 --- a/pyIocApp/softIocPy310.vcxproj.user +++ /dev/null @@ -1,55 +0,0 @@ - - - - PATH=%PATH%;C:\Python310 -PYTHONPATH=$(SolutionDir)devsupApp\src - WindowsLocalDebugger - - - PATH=%PATH%;C:\Python310 -PYTHONPATH=$(SolutionDir)devsupApp\src - WindowsLocalDebugger - - - PATH=%PATH%;C:\Python310 -PYTHONPATH=$(SolutionDir)devsupApp\src - WindowsLocalDebugger - - - PATH=%PATH%;C:\Python310 -PYTHONPATH=$(SolutionDir)devsupApp\src - WindowsLocalDebugger - - - HOSTNAME=localhost -IOCNAME=weatherbnl -TOP=../../ -PATH=C:\Python310;C:\Windows -PYTHONPATH=$(SolutionDir)devsupApp\src;$(SolutionDir)weatherApp -ARCH="$(Configuration)" - WindowsLocalDebugger - ..\iocBoot\iocweatherbnl - st.cmd - - - HOSTNAME=localhost -IOCNAME=weatherbnl -TOP=../../ -PATH=C:\Python310;C:\Windows -PYTHONPATH=$(SolutionDir)devsupApp\src -ARCH="$(Configuration)" - WindowsLocalDebugger - st.cmd - ..\iocBoot\iocweatherbnl - - - PATH=%PATH%;C:\Python310 -PYTHONPATH=$(SolutionDir)devsupApp\src - WindowsLocalDebugger - - - PATH=%PATH%;C:\Python310 -PYTHONPATH=$(SolutionDir)devsupApp\src - WindowsLocalDebugger - - \ No newline at end of file diff --git a/requirements-latest.txt b/requirements-latest.txt new file mode 100644 index 0000000..99ce0ab --- /dev/null +++ b/requirements-latest.txt @@ -0,0 +1,2 @@ +numpy +nose2 diff --git a/setup.py b/setup.py deleted file mode 100644 index 2b21fea..0000000 --- a/setup.py +++ /dev/null @@ -1,11 +0,0 @@ -from setuptools import setup, find_packages - -setup(name='devsup', - version='1.3', - description='EPICS Device support in Python', - author='Michael Davidsaver', - author_email='mdavidsaver@gmail.com', - license='GNU GPLublic v2.0', - url='https://github.com/mdavidsaver/pyDevSup/', - packages=find_packages(), - ) \ No newline at end of file From 44df05aaae129718d4d707dea0ce9b324cf2adab Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Tue, 5 Sep 2023 14:57:43 +0100 Subject: [PATCH 19/54] Updated following review comments by @mdavidsaver. --- configure/CONFIG_PY | 4 + configure/RELEASE | 2 +- configure/RELEASE.windows-x64.common | 42 --- devsupApp/src/Makefile | 3 - devsupApp/src/devsup/__init__.py | 7 +- makehelper.py | 4 + pyDevSup.sln | 381 --------------------------- pyIocApp/setup.c | 2 +- requirements-deb10.txt | 1 - 9 files changed, 13 insertions(+), 433 deletions(-) delete mode 100644 configure/RELEASE.windows-x64.common delete mode 100644 pyDevSup.sln diff --git a/configure/CONFIG_PY b/configure/CONFIG_PY index f2edef8..0eeb5f3 100644 --- a/configure/CONFIG_PY +++ b/configure/CONFIG_PY @@ -48,6 +48,10 @@ LOADABLE_SHRLIB_LDFLAGS = -bundle -flat_namespace -undefined dynamic_lookup LOADABLE_SHRLIB_SUFFIX = .so endif +ifeq ($(OS_CLASS),WIN32) +SHRLIB_SUFFIX_BASE = .pyd +endif + endif endif diff --git a/configure/RELEASE b/configure/RELEASE index 8dc9f9c..ba1fc22 100644 --- a/configure/RELEASE +++ b/configure/RELEASE @@ -36,7 +36,7 @@ TEMPLATE_TOP=$(EPICS_BASE)/templates/makeBaseApp/top ## Required Modules ## # EPICS_BASE usually appears last so other apps can override stuff: -EPICS_BASE=/opt/codac/epics +#EPICS_BASE=/usr/lib/epics -include $(TOP)/configure/RELEASE.local -include $(TOP)/../RELEASE.local diff --git a/configure/RELEASE.windows-x64.common b/configure/RELEASE.windows-x64.common deleted file mode 100644 index f3e08d1..0000000 --- a/configure/RELEASE.windows-x64.common +++ /dev/null @@ -1,42 +0,0 @@ -# RELEASE - Location of external support modules -# -# IF YOU MAKE ANY CHANGES to this file you must subsequently -# do a "gnumake rebuild" in this application's top level -# directory. -# -# The build process does not check dependencies against files -# that are outside this application, thus you should do a -# "gnumake rebuild" in the top level directory after EPICS_BASE -# or any other external module pointed to below is rebuilt. -# -# Host- or target-specific settings can be given in files named -# RELEASE.$(EPICS_HOST_ARCH).Common -# RELEASE.Common.$(T_A) -# RELEASE.$(EPICS_HOST_ARCH).$(T_A) -# -# This file should ONLY define paths to other support modules, -# or include statements that pull in similar RELEASE files. -# Build settings that are NOT module paths should appear in a -# CONFIG_SITE file. - -TEMPLATE_TOP=$(EPICS_BASE)/templates/makeBaseApp/top - -## Optional Modules ## -# Comment out if not present - -# IOC statistics (cpu and mem usage, ...) -#DEVIOCSTATS=$(EPICS_BASE) - -# automatic save with restore on boot -#AUTOSAVE=$(EPICS_BASE) - -# logging of remote settings changes -#CAPUTLOG=$(EPICS_BASE) - -## Required Modules ## - -# EPICS_BASE usually appears last so other apps can override stuff: -EPICS_BASE=C:/epics/base - --include $(TOP)/configure/RELEASE.local --include $(TOP)/../RELEASE.local diff --git a/devsupApp/src/Makefile b/devsupApp/src/Makefile index 1932da8..93434c6 100644 --- a/devsupApp/src/Makefile +++ b/devsupApp/src/Makefile @@ -9,9 +9,6 @@ include $(TOP)/configure/CONFIG_PY INSTALL_SHRLIB = $(PY_INSTALL_DIR)/devsup LOADABLE_LIBRARY_HOST += _dbapi -ifeq ($(OS),Windows_NT) - SHRLIB_SUFFIX_BASE = .pyd -endif TARGETS += $(COMMON_DIR)/pyDevSupCommon.dbd DBDDEPENDS_FILES += pyDevSupCommon.dbd$(DEP) diff --git a/devsupApp/src/devsup/__init__.py b/devsupApp/src/devsup/__init__.py index b5eae8f..b309af3 100644 --- a/devsupApp/src/devsup/__init__.py +++ b/devsupApp/src/devsup/__init__.py @@ -56,12 +56,11 @@ def _init(iocMain=False): dirname = os.path.dirname(__file__) dbd_name = dirname + "/_dbapi.dbd" _dbapi.dbReadDatabase(dbd_name) - # e.g. 3.15.0.2 -> 30000 + 1500 + 0 + 2 = 31502 - epics_version_int = EPICS_VERSION * 10000 + EPICS_REVISION * 100 + EPICS_MODIFICATION * 10 + EPICS_PATCH_LEVEL - if epics_version_int >= 31502: + epics_version_int = (EPICS_VERSION, EPICS_REVISION, EPICS_MODIFICATION, EPICS_PATCH_LEVEL) + if epics_version_int >= (3, 15, 0, 2): dbd_name = dirname + "/_lsilso.dbd" _dbapi.dbReadDatabase(dbd_name) - if epics_version_int >= 31610: + if epics_version_int >= (3, 16, 1, 0): dbd_name = dirname + "/_int64.dbd" _dbapi.dbReadDatabase(dbd_name) _dbapi._dbd_setup() diff --git a/makehelper.py b/makehelper.py index af5f8d6..c55c7d1 100644 --- a/makehelper.py +++ b/makehelper.py @@ -31,6 +31,10 @@ except ImportError: def get_python_inc(): return get_config_var('INCLUDEPY') or '' + def get_python_lib(): + return get_config_var('LIBDIR') or get_config_var('LIBDEST') or '', \ + get_config_var('BINDIR') or '', + incdirs = [get_python_inc()] libdirs = [get_python_lib()] diff --git a/pyDevSup.sln b/pyDevSup.sln deleted file mode 100644 index 5fd39bd..0000000 --- a/pyDevSup.sln +++ /dev/null @@ -1,381 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.28307.136 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Com", "..\..\base-7.0.7\modules\libcom\src\Com.vcxproj", "{E9D99FC7-E592-472B-B2E2-C3B0D81D8169}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ca", "..\..\base-7.0.7\modules\ca\src\client\ca.vcxproj", "{361BCEBD-8B02-4B15-B28B-863F0602CB99}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "e_flex", "..\..\base-7.0.7\modules\libcom\src\flex\e_flex.vcxproj", "{280222D8-1C6B-430D-8F32-C8A47397525B}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "antelope", "..\..\base-7.0.7\modules\libcom\src\yacc\antelope.vcxproj", "{B06AFD40-69E3-4D78-B401-75A27C869381}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "base-7.0.7", "base-7.0.7", "{D772CB17-6D38-48F4-958E-6A721026C056}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{AF70446C-3E93-42DF-9943-18DDCFA4991A}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "flex", "flex", "{CD897BA0-128B-4B9D-9BD0-1829E3EB91C6}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "yacc", "yacc", "{D915C7BF-E16C-446D-BB8F-26414F1C8F5B}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tools", "tools", "{72F51F37-2669-43E0-A166-04E8FD34B294}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tools", "..\..\base-7.0.7\src\tools\tools.vcxproj", "{5CCE1C6A-2BD5-48BF-99E2-D29B58F91991}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ioc", "ioc", "{5499ACCB-903F-4F89-AAFA-C82E7AF7F132}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dbCore", "..\..\base-7.0.7\modules\database\src\ioc\dbCore.vcxproj", "{422A8C73-836C-48CB-86C8-0591E69C0CA1}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dbRecStd", "..\..\base-7.0.7\modules\database\src\std\dbRecStd.vcxproj", "{9CF8D9AB-E47D-4923-A251-80E40B4E7144}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "softIoc", "softIoc", "{BA5F5A20-2C40-4066-AE19-9853DFF82EEE}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "softIoc", "..\..\base-7.0.7\modules\database\src\std\softIoc\softIoc.vcxproj", "{CE14B4D8-C63F-4EA6-9DE4-CACE48EA092C}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "bpt", "bpt", "{3BE95765-EB5A-44D6-9369-A8759A2FAFDE}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "makeBpt", "..\..\base-7.0.7\modules\database\src\ioc\bpt\makeBpt.vcxproj", "{A17BA797-3CA6-47F9-B47E-673118EABA1A}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "pyDevSup", "pyDevSup", "{D04ACFD8-B76B-4D6C-BF02-F280CF75ABAA}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "devsupApp", "devsupApp", "{C2A4C477-2BE6-494C-89F3-B51BA1376EBD}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "configure", "configure", "{18C9AB30-1CAF-4A41-95A2-0CA2D3E19854}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "iocBoot", "iocBoot", "{73322DE2-4EF3-41A8-86BE-BB9C2EEFDE68}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "modules", "modules", "{7605EED0-5C32-4994-A46F-CB2C7F6626B7}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ca", "ca", "{E66A6FB1-9A3A-4BD0-BED5-B3C841AD193A}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "client", "client", "{2CAA5CD1-B135-4215-B9DE-8B15EB19F8FB}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "database", "database", "{1BAAD656-1CBB-4D3E-A983-0D14F518877A}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{0FEE2476-268F-4683-B3AA-8CA5932333C6}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "libcom", "libcom", "{7D7B9019-333C-40E3-AC42-F21B6D638C09}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{2A16E720-4EE8-47A8-AF11-97DFE4B79C6D}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "std", "std", "{B81B8DF0-D48C-4D5C-B1EB-FC8C2ACCA29F}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tools", "tools", "{76FAEC6F-2322-43DF-B96E-D2D0EDF57845}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dbtools", "..\..\base-7.0.7\modules\database\src\tools\dbtools.vcxproj", "{421A512B-4C74-4461-9956-DC5864275D18}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{154531C9-D836-409A-9B2D-E7E893510855}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "softIocPy310", "pyIocApp\softIocPy310.vcxproj", "{D3311F39-9AE8-4F16-BE04-1D1D31135BA9}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "iocapplmon", "iocapplmon", "{D05A6C72-E20D-4B21-A544-E76A419329F8}" - ProjectSection(SolutionItems) = preProject - iocBoot\iocapplmon\Makefile = iocBoot\iocapplmon\Makefile - iocBoot\iocapplmon\st.bat = iocBoot\iocapplmon\st.bat - iocBoot\iocapplmon\st.cmd = iocBoot\iocapplmon\st.cmd - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "iocarchivemon", "iocarchivemon", "{CDA2E23F-F2E4-4D36-85AE-43398D800DC4}" - ProjectSection(SolutionItems) = preProject - iocBoot\iocarchivemon\Makefile = iocBoot\iocarchivemon\Makefile - iocBoot\iocarchivemon\st.cmd = iocBoot\iocarchivemon\st.cmd - iocBoot\iocarchivemon\st.cmd.main = iocBoot\iocarchivemon\st.cmd.main - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ioccaputlog", "ioccaputlog", "{54B14EFD-5FF5-443C-B40D-F6B4B964309D}" - ProjectSection(SolutionItems) = preProject - iocBoot\ioccaputlog\Makefile = iocBoot\ioccaputlog\Makefile - iocBoot\ioccaputlog\st.cmd = iocBoot\ioccaputlog\st.cmd - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "iocFPM", "iocFPM", "{A784112A-84CF-4226-8C80-307F53413D1F}" - ProjectSection(SolutionItems) = preProject - iocBoot\iocFPM\fpm.db = iocBoot\iocFPM\fpm.db - iocBoot\iocFPM\fpm.py = iocBoot\iocFPM\fpm.py - iocBoot\iocFPM\loadnp.py = iocBoot\iocFPM\loadnp.py - iocBoot\iocFPM\Makefile = iocBoot\iocFPM\Makefile - iocBoot\iocFPM\st.cmd = iocBoot\iocFPM\st.cmd - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "iocweatherbnl", "iocweatherbnl", "{3674D600-79C9-4BCE-A19E-4A7FC6332426}" - ProjectSection(SolutionItems) = preProject - iocBoot\iocweatherbnl\Makefile = iocBoot\iocweatherbnl\Makefile - iocBoot\iocweatherbnl\st.bat = iocBoot\iocweatherbnl\st.bat - iocBoot\iocweatherbnl\st.cmd = iocBoot\iocweatherbnl\st.cmd - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "pyIocApp", "pyIocApp", "{C10F6E3C-C515-4707-991E-4D5F193D5D86}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pyDevSup310", "pyIocApp\pyDevSup310.vcxproj", "{E0621B43-15E2-4080-B777-16C02E5B4611}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_dbapi", "devsupApp\_dbapi.vcxproj", "{BAE6CE99-140A-4018-8BCB-9D63F54D6F07}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug_DLL|Win32 = Debug_DLL|Win32 - Debug_DLL|x64 = Debug_DLL|x64 - Debug_LIB|Win32 = Debug_LIB|Win32 - Debug_LIB|x64 = Debug_LIB|x64 - Release_DLL|Win32 = Release_DLL|Win32 - Release_DLL|x64 = Release_DLL|x64 - Release_LIB|Win32 = Release_LIB|Win32 - Release_LIB|x64 = Release_LIB|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {E9D99FC7-E592-472B-B2E2-C3B0D81D8169}.Debug_DLL|Win32.ActiveCfg = Debug_DLL|Win32 - {E9D99FC7-E592-472B-B2E2-C3B0D81D8169}.Debug_DLL|Win32.Build.0 = Debug_DLL|Win32 - {E9D99FC7-E592-472B-B2E2-C3B0D81D8169}.Debug_DLL|x64.ActiveCfg = Debug_DLL|x64 - {E9D99FC7-E592-472B-B2E2-C3B0D81D8169}.Debug_DLL|x64.Build.0 = Debug_DLL|x64 - {E9D99FC7-E592-472B-B2E2-C3B0D81D8169}.Debug_LIB|Win32.ActiveCfg = Debug_LIB|Win32 - {E9D99FC7-E592-472B-B2E2-C3B0D81D8169}.Debug_LIB|Win32.Build.0 = Debug_LIB|Win32 - {E9D99FC7-E592-472B-B2E2-C3B0D81D8169}.Debug_LIB|x64.ActiveCfg = Debug_LIB|x64 - {E9D99FC7-E592-472B-B2E2-C3B0D81D8169}.Debug_LIB|x64.Build.0 = Debug_LIB|x64 - {E9D99FC7-E592-472B-B2E2-C3B0D81D8169}.Release_DLL|Win32.ActiveCfg = Release_DLL|Win32 - {E9D99FC7-E592-472B-B2E2-C3B0D81D8169}.Release_DLL|Win32.Build.0 = Release_DLL|Win32 - {E9D99FC7-E592-472B-B2E2-C3B0D81D8169}.Release_DLL|x64.ActiveCfg = Release_DLL|x64 - {E9D99FC7-E592-472B-B2E2-C3B0D81D8169}.Release_DLL|x64.Build.0 = Release_DLL|x64 - {E9D99FC7-E592-472B-B2E2-C3B0D81D8169}.Release_LIB|Win32.ActiveCfg = Release_LIB|Win32 - {E9D99FC7-E592-472B-B2E2-C3B0D81D8169}.Release_LIB|Win32.Build.0 = Release_LIB|Win32 - {E9D99FC7-E592-472B-B2E2-C3B0D81D8169}.Release_LIB|x64.ActiveCfg = Release_LIB|x64 - {E9D99FC7-E592-472B-B2E2-C3B0D81D8169}.Release_LIB|x64.Build.0 = Release_LIB|x64 - {361BCEBD-8B02-4B15-B28B-863F0602CB99}.Debug_DLL|Win32.ActiveCfg = Debug_DLL|Win32 - {361BCEBD-8B02-4B15-B28B-863F0602CB99}.Debug_DLL|Win32.Build.0 = Debug_DLL|Win32 - {361BCEBD-8B02-4B15-B28B-863F0602CB99}.Debug_DLL|x64.ActiveCfg = Debug_DLL|x64 - {361BCEBD-8B02-4B15-B28B-863F0602CB99}.Debug_DLL|x64.Build.0 = Debug_DLL|x64 - {361BCEBD-8B02-4B15-B28B-863F0602CB99}.Debug_LIB|Win32.ActiveCfg = Debug_LIB|Win32 - {361BCEBD-8B02-4B15-B28B-863F0602CB99}.Debug_LIB|Win32.Build.0 = Debug_LIB|Win32 - {361BCEBD-8B02-4B15-B28B-863F0602CB99}.Debug_LIB|x64.ActiveCfg = Debug_LIB|x64 - {361BCEBD-8B02-4B15-B28B-863F0602CB99}.Debug_LIB|x64.Build.0 = Debug_LIB|x64 - {361BCEBD-8B02-4B15-B28B-863F0602CB99}.Release_DLL|Win32.ActiveCfg = Release_DLL|Win32 - {361BCEBD-8B02-4B15-B28B-863F0602CB99}.Release_DLL|Win32.Build.0 = Release_DLL|Win32 - {361BCEBD-8B02-4B15-B28B-863F0602CB99}.Release_DLL|x64.ActiveCfg = Release_DLL|x64 - {361BCEBD-8B02-4B15-B28B-863F0602CB99}.Release_DLL|x64.Build.0 = Release_DLL|x64 - {361BCEBD-8B02-4B15-B28B-863F0602CB99}.Release_LIB|Win32.ActiveCfg = Release_LIB|Win32 - {361BCEBD-8B02-4B15-B28B-863F0602CB99}.Release_LIB|Win32.Build.0 = Release_LIB|Win32 - {361BCEBD-8B02-4B15-B28B-863F0602CB99}.Release_LIB|x64.ActiveCfg = Release_LIB|x64 - {361BCEBD-8B02-4B15-B28B-863F0602CB99}.Release_LIB|x64.Build.0 = Release_LIB|x64 - {280222D8-1C6B-430D-8F32-C8A47397525B}.Debug_DLL|Win32.ActiveCfg = Debug_DLL|Win32 - {280222D8-1C6B-430D-8F32-C8A47397525B}.Debug_DLL|Win32.Build.0 = Debug_DLL|Win32 - {280222D8-1C6B-430D-8F32-C8A47397525B}.Debug_DLL|x64.ActiveCfg = Debug_DLL|x64 - {280222D8-1C6B-430D-8F32-C8A47397525B}.Debug_DLL|x64.Build.0 = Debug_DLL|x64 - {280222D8-1C6B-430D-8F32-C8A47397525B}.Debug_LIB|Win32.ActiveCfg = Debug_LIB|Win32 - {280222D8-1C6B-430D-8F32-C8A47397525B}.Debug_LIB|Win32.Build.0 = Debug_LIB|Win32 - {280222D8-1C6B-430D-8F32-C8A47397525B}.Debug_LIB|x64.ActiveCfg = Debug_LIB|x64 - {280222D8-1C6B-430D-8F32-C8A47397525B}.Debug_LIB|x64.Build.0 = Debug_LIB|x64 - {280222D8-1C6B-430D-8F32-C8A47397525B}.Release_DLL|Win32.ActiveCfg = Release_DLL|Win32 - {280222D8-1C6B-430D-8F32-C8A47397525B}.Release_DLL|Win32.Build.0 = Release_DLL|Win32 - {280222D8-1C6B-430D-8F32-C8A47397525B}.Release_DLL|x64.ActiveCfg = Release_DLL|x64 - {280222D8-1C6B-430D-8F32-C8A47397525B}.Release_DLL|x64.Build.0 = Release_DLL|x64 - {280222D8-1C6B-430D-8F32-C8A47397525B}.Release_LIB|Win32.ActiveCfg = Release_LIB|Win32 - {280222D8-1C6B-430D-8F32-C8A47397525B}.Release_LIB|Win32.Build.0 = Release_LIB|Win32 - {280222D8-1C6B-430D-8F32-C8A47397525B}.Release_LIB|x64.ActiveCfg = Release_LIB|x64 - {280222D8-1C6B-430D-8F32-C8A47397525B}.Release_LIB|x64.Build.0 = Release_LIB|x64 - {B06AFD40-69E3-4D78-B401-75A27C869381}.Debug_DLL|Win32.ActiveCfg = Debug_DLL|Win32 - {B06AFD40-69E3-4D78-B401-75A27C869381}.Debug_DLL|Win32.Build.0 = Debug_DLL|Win32 - {B06AFD40-69E3-4D78-B401-75A27C869381}.Debug_DLL|x64.ActiveCfg = Debug_DLL|x64 - {B06AFD40-69E3-4D78-B401-75A27C869381}.Debug_DLL|x64.Build.0 = Debug_DLL|x64 - {B06AFD40-69E3-4D78-B401-75A27C869381}.Debug_LIB|Win32.ActiveCfg = Debug_LIB|Win32 - {B06AFD40-69E3-4D78-B401-75A27C869381}.Debug_LIB|Win32.Build.0 = Debug_LIB|Win32 - {B06AFD40-69E3-4D78-B401-75A27C869381}.Debug_LIB|x64.ActiveCfg = Debug_LIB|x64 - {B06AFD40-69E3-4D78-B401-75A27C869381}.Debug_LIB|x64.Build.0 = Debug_LIB|x64 - {B06AFD40-69E3-4D78-B401-75A27C869381}.Release_DLL|Win32.ActiveCfg = Release_DLL|Win32 - {B06AFD40-69E3-4D78-B401-75A27C869381}.Release_DLL|Win32.Build.0 = Release_DLL|Win32 - {B06AFD40-69E3-4D78-B401-75A27C869381}.Release_DLL|x64.ActiveCfg = Release_DLL|x64 - {B06AFD40-69E3-4D78-B401-75A27C869381}.Release_DLL|x64.Build.0 = Release_DLL|x64 - {B06AFD40-69E3-4D78-B401-75A27C869381}.Release_LIB|Win32.ActiveCfg = Release_LIB|Win32 - {B06AFD40-69E3-4D78-B401-75A27C869381}.Release_LIB|Win32.Build.0 = Release_LIB|Win32 - {B06AFD40-69E3-4D78-B401-75A27C869381}.Release_LIB|x64.ActiveCfg = Release_LIB|x64 - {B06AFD40-69E3-4D78-B401-75A27C869381}.Release_LIB|x64.Build.0 = Release_LIB|x64 - {5CCE1C6A-2BD5-48BF-99E2-D29B58F91991}.Debug_DLL|Win32.ActiveCfg = Debug_DLL|Win32 - {5CCE1C6A-2BD5-48BF-99E2-D29B58F91991}.Debug_DLL|Win32.Build.0 = Debug_DLL|Win32 - {5CCE1C6A-2BD5-48BF-99E2-D29B58F91991}.Debug_DLL|x64.ActiveCfg = Debug_DLL|x64 - {5CCE1C6A-2BD5-48BF-99E2-D29B58F91991}.Debug_DLL|x64.Build.0 = Debug_DLL|x64 - {5CCE1C6A-2BD5-48BF-99E2-D29B58F91991}.Debug_LIB|Win32.ActiveCfg = Debug_LIB|Win32 - {5CCE1C6A-2BD5-48BF-99E2-D29B58F91991}.Debug_LIB|Win32.Build.0 = Debug_LIB|Win32 - {5CCE1C6A-2BD5-48BF-99E2-D29B58F91991}.Debug_LIB|x64.ActiveCfg = Debug_LIB|x64 - {5CCE1C6A-2BD5-48BF-99E2-D29B58F91991}.Debug_LIB|x64.Build.0 = Debug_LIB|x64 - {5CCE1C6A-2BD5-48BF-99E2-D29B58F91991}.Release_DLL|Win32.ActiveCfg = Release_DLL|Win32 - {5CCE1C6A-2BD5-48BF-99E2-D29B58F91991}.Release_DLL|Win32.Build.0 = Release_DLL|Win32 - {5CCE1C6A-2BD5-48BF-99E2-D29B58F91991}.Release_DLL|x64.ActiveCfg = Release_DLL|x64 - {5CCE1C6A-2BD5-48BF-99E2-D29B58F91991}.Release_DLL|x64.Build.0 = Release_DLL|x64 - {5CCE1C6A-2BD5-48BF-99E2-D29B58F91991}.Release_LIB|Win32.ActiveCfg = Release_LIB|Win32 - {5CCE1C6A-2BD5-48BF-99E2-D29B58F91991}.Release_LIB|Win32.Build.0 = Release_LIB|Win32 - {5CCE1C6A-2BD5-48BF-99E2-D29B58F91991}.Release_LIB|x64.ActiveCfg = Release_LIB|x64 - {5CCE1C6A-2BD5-48BF-99E2-D29B58F91991}.Release_LIB|x64.Build.0 = Release_LIB|x64 - {422A8C73-836C-48CB-86C8-0591E69C0CA1}.Debug_DLL|Win32.ActiveCfg = Debug_DLL|Win32 - {422A8C73-836C-48CB-86C8-0591E69C0CA1}.Debug_DLL|Win32.Build.0 = Debug_DLL|Win32 - {422A8C73-836C-48CB-86C8-0591E69C0CA1}.Debug_DLL|x64.ActiveCfg = Debug_DLL|x64 - {422A8C73-836C-48CB-86C8-0591E69C0CA1}.Debug_DLL|x64.Build.0 = Debug_DLL|x64 - {422A8C73-836C-48CB-86C8-0591E69C0CA1}.Debug_LIB|Win32.ActiveCfg = Debug_LIB|Win32 - {422A8C73-836C-48CB-86C8-0591E69C0CA1}.Debug_LIB|Win32.Build.0 = Debug_LIB|Win32 - {422A8C73-836C-48CB-86C8-0591E69C0CA1}.Debug_LIB|x64.ActiveCfg = Debug_LIB|x64 - {422A8C73-836C-48CB-86C8-0591E69C0CA1}.Debug_LIB|x64.Build.0 = Debug_LIB|x64 - {422A8C73-836C-48CB-86C8-0591E69C0CA1}.Release_DLL|Win32.ActiveCfg = Release_DLL|Win32 - {422A8C73-836C-48CB-86C8-0591E69C0CA1}.Release_DLL|Win32.Build.0 = Release_DLL|Win32 - {422A8C73-836C-48CB-86C8-0591E69C0CA1}.Release_DLL|x64.ActiveCfg = Release_DLL|x64 - {422A8C73-836C-48CB-86C8-0591E69C0CA1}.Release_DLL|x64.Build.0 = Release_DLL|x64 - {422A8C73-836C-48CB-86C8-0591E69C0CA1}.Release_LIB|Win32.ActiveCfg = Release_LIB|Win32 - {422A8C73-836C-48CB-86C8-0591E69C0CA1}.Release_LIB|Win32.Build.0 = Release_LIB|Win32 - {422A8C73-836C-48CB-86C8-0591E69C0CA1}.Release_LIB|x64.ActiveCfg = Release_LIB|x64 - {422A8C73-836C-48CB-86C8-0591E69C0CA1}.Release_LIB|x64.Build.0 = Release_LIB|x64 - {9CF8D9AB-E47D-4923-A251-80E40B4E7144}.Debug_DLL|Win32.ActiveCfg = Debug_DLL|Win32 - {9CF8D9AB-E47D-4923-A251-80E40B4E7144}.Debug_DLL|Win32.Build.0 = Debug_DLL|Win32 - {9CF8D9AB-E47D-4923-A251-80E40B4E7144}.Debug_DLL|x64.ActiveCfg = Debug_DLL|x64 - {9CF8D9AB-E47D-4923-A251-80E40B4E7144}.Debug_DLL|x64.Build.0 = Debug_DLL|x64 - {9CF8D9AB-E47D-4923-A251-80E40B4E7144}.Debug_LIB|Win32.ActiveCfg = Debug_LIB|Win32 - {9CF8D9AB-E47D-4923-A251-80E40B4E7144}.Debug_LIB|Win32.Build.0 = Debug_LIB|Win32 - {9CF8D9AB-E47D-4923-A251-80E40B4E7144}.Debug_LIB|x64.ActiveCfg = Debug_LIB|x64 - {9CF8D9AB-E47D-4923-A251-80E40B4E7144}.Debug_LIB|x64.Build.0 = Debug_LIB|x64 - {9CF8D9AB-E47D-4923-A251-80E40B4E7144}.Release_DLL|Win32.ActiveCfg = Release_DLL|Win32 - {9CF8D9AB-E47D-4923-A251-80E40B4E7144}.Release_DLL|Win32.Build.0 = Release_DLL|Win32 - {9CF8D9AB-E47D-4923-A251-80E40B4E7144}.Release_DLL|x64.ActiveCfg = Release_DLL|x64 - {9CF8D9AB-E47D-4923-A251-80E40B4E7144}.Release_DLL|x64.Build.0 = Release_DLL|x64 - {9CF8D9AB-E47D-4923-A251-80E40B4E7144}.Release_LIB|Win32.ActiveCfg = Release_LIB|Win32 - {9CF8D9AB-E47D-4923-A251-80E40B4E7144}.Release_LIB|Win32.Build.0 = Release_LIB|Win32 - {9CF8D9AB-E47D-4923-A251-80E40B4E7144}.Release_LIB|x64.ActiveCfg = Release_LIB|x64 - {9CF8D9AB-E47D-4923-A251-80E40B4E7144}.Release_LIB|x64.Build.0 = Release_LIB|x64 - {CE14B4D8-C63F-4EA6-9DE4-CACE48EA092C}.Debug_DLL|Win32.ActiveCfg = Debug_DLL|Win32 - {CE14B4D8-C63F-4EA6-9DE4-CACE48EA092C}.Debug_DLL|Win32.Build.0 = Debug_DLL|Win32 - {CE14B4D8-C63F-4EA6-9DE4-CACE48EA092C}.Debug_DLL|x64.ActiveCfg = Debug_DLL|x64 - {CE14B4D8-C63F-4EA6-9DE4-CACE48EA092C}.Debug_DLL|x64.Build.0 = Debug_DLL|x64 - {CE14B4D8-C63F-4EA6-9DE4-CACE48EA092C}.Debug_LIB|Win32.ActiveCfg = Debug_LIB|Win32 - {CE14B4D8-C63F-4EA6-9DE4-CACE48EA092C}.Debug_LIB|Win32.Build.0 = Debug_LIB|Win32 - {CE14B4D8-C63F-4EA6-9DE4-CACE48EA092C}.Debug_LIB|x64.ActiveCfg = Debug_LIB|x64 - {CE14B4D8-C63F-4EA6-9DE4-CACE48EA092C}.Debug_LIB|x64.Build.0 = Debug_LIB|x64 - {CE14B4D8-C63F-4EA6-9DE4-CACE48EA092C}.Release_DLL|Win32.ActiveCfg = Release_DLL|Win32 - {CE14B4D8-C63F-4EA6-9DE4-CACE48EA092C}.Release_DLL|Win32.Build.0 = Release_DLL|Win32 - {CE14B4D8-C63F-4EA6-9DE4-CACE48EA092C}.Release_DLL|x64.ActiveCfg = Release_DLL|x64 - {CE14B4D8-C63F-4EA6-9DE4-CACE48EA092C}.Release_DLL|x64.Build.0 = Release_DLL|x64 - {CE14B4D8-C63F-4EA6-9DE4-CACE48EA092C}.Release_LIB|Win32.ActiveCfg = Release_LIB|Win32 - {CE14B4D8-C63F-4EA6-9DE4-CACE48EA092C}.Release_LIB|Win32.Build.0 = Release_LIB|Win32 - {CE14B4D8-C63F-4EA6-9DE4-CACE48EA092C}.Release_LIB|x64.ActiveCfg = Release_LIB|x64 - {CE14B4D8-C63F-4EA6-9DE4-CACE48EA092C}.Release_LIB|x64.Build.0 = Release_LIB|x64 - {A17BA797-3CA6-47F9-B47E-673118EABA1A}.Debug_DLL|Win32.ActiveCfg = Debug_DLL|Win32 - {A17BA797-3CA6-47F9-B47E-673118EABA1A}.Debug_DLL|Win32.Build.0 = Debug_DLL|Win32 - {A17BA797-3CA6-47F9-B47E-673118EABA1A}.Debug_DLL|x64.ActiveCfg = Debug_DLL|x64 - {A17BA797-3CA6-47F9-B47E-673118EABA1A}.Debug_DLL|x64.Build.0 = Debug_DLL|x64 - {A17BA797-3CA6-47F9-B47E-673118EABA1A}.Debug_LIB|Win32.ActiveCfg = Debug_LIB|Win32 - {A17BA797-3CA6-47F9-B47E-673118EABA1A}.Debug_LIB|Win32.Build.0 = Debug_LIB|Win32 - {A17BA797-3CA6-47F9-B47E-673118EABA1A}.Debug_LIB|x64.ActiveCfg = Debug_LIB|x64 - {A17BA797-3CA6-47F9-B47E-673118EABA1A}.Debug_LIB|x64.Build.0 = Debug_LIB|x64 - {A17BA797-3CA6-47F9-B47E-673118EABA1A}.Release_DLL|Win32.ActiveCfg = Release_DLL|Win32 - {A17BA797-3CA6-47F9-B47E-673118EABA1A}.Release_DLL|Win32.Build.0 = Release_DLL|Win32 - {A17BA797-3CA6-47F9-B47E-673118EABA1A}.Release_DLL|x64.ActiveCfg = Release_DLL|x64 - {A17BA797-3CA6-47F9-B47E-673118EABA1A}.Release_DLL|x64.Build.0 = Release_DLL|x64 - {A17BA797-3CA6-47F9-B47E-673118EABA1A}.Release_LIB|Win32.ActiveCfg = Release_LIB|Win32 - {A17BA797-3CA6-47F9-B47E-673118EABA1A}.Release_LIB|Win32.Build.0 = Release_LIB|Win32 - {A17BA797-3CA6-47F9-B47E-673118EABA1A}.Release_LIB|x64.ActiveCfg = Release_LIB|x64 - {A17BA797-3CA6-47F9-B47E-673118EABA1A}.Release_LIB|x64.Build.0 = Release_LIB|x64 - {421A512B-4C74-4461-9956-DC5864275D18}.Debug_DLL|Win32.ActiveCfg = Debug_DLL|Win32 - {421A512B-4C74-4461-9956-DC5864275D18}.Debug_DLL|Win32.Build.0 = Debug_DLL|Win32 - {421A512B-4C74-4461-9956-DC5864275D18}.Debug_DLL|x64.ActiveCfg = Debug_DLL|x64 - {421A512B-4C74-4461-9956-DC5864275D18}.Debug_DLL|x64.Build.0 = Debug_DLL|x64 - {421A512B-4C74-4461-9956-DC5864275D18}.Debug_LIB|Win32.ActiveCfg = Debug_LIB|Win32 - {421A512B-4C74-4461-9956-DC5864275D18}.Debug_LIB|Win32.Build.0 = Debug_LIB|Win32 - {421A512B-4C74-4461-9956-DC5864275D18}.Debug_LIB|x64.ActiveCfg = Debug_LIB|x64 - {421A512B-4C74-4461-9956-DC5864275D18}.Debug_LIB|x64.Build.0 = Debug_LIB|x64 - {421A512B-4C74-4461-9956-DC5864275D18}.Release_DLL|Win32.ActiveCfg = Release_DLL|Win32 - {421A512B-4C74-4461-9956-DC5864275D18}.Release_DLL|Win32.Build.0 = Release_DLL|Win32 - {421A512B-4C74-4461-9956-DC5864275D18}.Release_DLL|x64.ActiveCfg = Release_DLL|x64 - {421A512B-4C74-4461-9956-DC5864275D18}.Release_DLL|x64.Build.0 = Release_DLL|x64 - {421A512B-4C74-4461-9956-DC5864275D18}.Release_LIB|Win32.ActiveCfg = Release_LIB|Win32 - {421A512B-4C74-4461-9956-DC5864275D18}.Release_LIB|Win32.Build.0 = Release_LIB|Win32 - {421A512B-4C74-4461-9956-DC5864275D18}.Release_LIB|x64.ActiveCfg = Release_LIB|x64 - {421A512B-4C74-4461-9956-DC5864275D18}.Release_LIB|x64.Build.0 = Release_LIB|x64 - {D3311F39-9AE8-4F16-BE04-1D1D31135BA9}.Debug_DLL|Win32.ActiveCfg = Debug_DLL|Win32 - {D3311F39-9AE8-4F16-BE04-1D1D31135BA9}.Debug_DLL|Win32.Build.0 = Debug_DLL|Win32 - {D3311F39-9AE8-4F16-BE04-1D1D31135BA9}.Debug_DLL|x64.ActiveCfg = Debug_DLL|x64 - {D3311F39-9AE8-4F16-BE04-1D1D31135BA9}.Debug_DLL|x64.Build.0 = Debug_DLL|x64 - {D3311F39-9AE8-4F16-BE04-1D1D31135BA9}.Debug_LIB|Win32.ActiveCfg = Debug_LIB|Win32 - {D3311F39-9AE8-4F16-BE04-1D1D31135BA9}.Debug_LIB|Win32.Build.0 = Debug_LIB|Win32 - {D3311F39-9AE8-4F16-BE04-1D1D31135BA9}.Debug_LIB|x64.ActiveCfg = Debug_LIB|x64 - {D3311F39-9AE8-4F16-BE04-1D1D31135BA9}.Debug_LIB|x64.Build.0 = Debug_LIB|x64 - {D3311F39-9AE8-4F16-BE04-1D1D31135BA9}.Release_DLL|Win32.ActiveCfg = Release_DLL|Win32 - {D3311F39-9AE8-4F16-BE04-1D1D31135BA9}.Release_DLL|Win32.Build.0 = Release_DLL|Win32 - {D3311F39-9AE8-4F16-BE04-1D1D31135BA9}.Release_DLL|x64.ActiveCfg = Release_DLL|x64 - {D3311F39-9AE8-4F16-BE04-1D1D31135BA9}.Release_DLL|x64.Build.0 = Release_DLL|x64 - {D3311F39-9AE8-4F16-BE04-1D1D31135BA9}.Release_LIB|Win32.ActiveCfg = Release_LIB|Win32 - {D3311F39-9AE8-4F16-BE04-1D1D31135BA9}.Release_LIB|Win32.Build.0 = Release_LIB|Win32 - {D3311F39-9AE8-4F16-BE04-1D1D31135BA9}.Release_LIB|x64.ActiveCfg = Release_LIB|x64 - {D3311F39-9AE8-4F16-BE04-1D1D31135BA9}.Release_LIB|x64.Build.0 = Release_LIB|x64 - {E0621B43-15E2-4080-B777-16C02E5B4611}.Debug_DLL|Win32.ActiveCfg = Debug_DLL|Win32 - {E0621B43-15E2-4080-B777-16C02E5B4611}.Debug_DLL|Win32.Build.0 = Debug_DLL|Win32 - {E0621B43-15E2-4080-B777-16C02E5B4611}.Debug_DLL|x64.ActiveCfg = Debug_DLL|x64 - {E0621B43-15E2-4080-B777-16C02E5B4611}.Debug_DLL|x64.Build.0 = Debug_DLL|x64 - {E0621B43-15E2-4080-B777-16C02E5B4611}.Debug_LIB|Win32.ActiveCfg = Debug_LIB|Win32 - {E0621B43-15E2-4080-B777-16C02E5B4611}.Debug_LIB|Win32.Build.0 = Debug_LIB|Win32 - {E0621B43-15E2-4080-B777-16C02E5B4611}.Debug_LIB|x64.ActiveCfg = Debug_LIB|x64 - {E0621B43-15E2-4080-B777-16C02E5B4611}.Debug_LIB|x64.Build.0 = Debug_LIB|x64 - {E0621B43-15E2-4080-B777-16C02E5B4611}.Release_DLL|Win32.ActiveCfg = Release_DLL|Win32 - {E0621B43-15E2-4080-B777-16C02E5B4611}.Release_DLL|Win32.Build.0 = Release_DLL|Win32 - {E0621B43-15E2-4080-B777-16C02E5B4611}.Release_DLL|x64.ActiveCfg = Release_DLL|x64 - {E0621B43-15E2-4080-B777-16C02E5B4611}.Release_DLL|x64.Build.0 = Release_DLL|x64 - {E0621B43-15E2-4080-B777-16C02E5B4611}.Release_LIB|Win32.ActiveCfg = Release_LIB|Win32 - {E0621B43-15E2-4080-B777-16C02E5B4611}.Release_LIB|Win32.Build.0 = Release_LIB|Win32 - {E0621B43-15E2-4080-B777-16C02E5B4611}.Release_LIB|x64.ActiveCfg = Release_LIB|x64 - {E0621B43-15E2-4080-B777-16C02E5B4611}.Release_LIB|x64.Build.0 = Release_LIB|x64 - {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Debug_DLL|Win32.ActiveCfg = Debug_DLL|Win32 - {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Debug_DLL|Win32.Build.0 = Debug_DLL|Win32 - {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Debug_DLL|x64.ActiveCfg = Debug_DLL|x64 - {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Debug_DLL|x64.Build.0 = Debug_DLL|x64 - {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Debug_LIB|Win32.ActiveCfg = Debug_LIB|Win32 - {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Debug_LIB|Win32.Build.0 = Debug_LIB|Win32 - {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Debug_LIB|x64.ActiveCfg = Debug_LIB|x64 - {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Debug_LIB|x64.Build.0 = Debug_LIB|x64 - {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Release_DLL|Win32.ActiveCfg = Release_DLL|Win32 - {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Release_DLL|Win32.Build.0 = Release_DLL|Win32 - {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Release_DLL|x64.ActiveCfg = Release_DLL|x64 - {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Release_DLL|x64.Build.0 = Release_DLL|x64 - {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Release_LIB|Win32.ActiveCfg = Release_LIB|Win32 - {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Release_LIB|Win32.Build.0 = Release_LIB|Win32 - {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Release_LIB|x64.ActiveCfg = Release_LIB|x64 - {BAE6CE99-140A-4018-8BCB-9D63F54D6F07}.Release_LIB|x64.Build.0 = Release_LIB|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {E9D99FC7-E592-472B-B2E2-C3B0D81D8169} = {2A16E720-4EE8-47A8-AF11-97DFE4B79C6D} - {361BCEBD-8B02-4B15-B28B-863F0602CB99} = {2CAA5CD1-B135-4215-B9DE-8B15EB19F8FB} - {280222D8-1C6B-430D-8F32-C8A47397525B} = {CD897BA0-128B-4B9D-9BD0-1829E3EB91C6} - {B06AFD40-69E3-4D78-B401-75A27C869381} = {D915C7BF-E16C-446D-BB8F-26414F1C8F5B} - {AF70446C-3E93-42DF-9943-18DDCFA4991A} = {D772CB17-6D38-48F4-958E-6A721026C056} - {CD897BA0-128B-4B9D-9BD0-1829E3EB91C6} = {2A16E720-4EE8-47A8-AF11-97DFE4B79C6D} - {D915C7BF-E16C-446D-BB8F-26414F1C8F5B} = {2A16E720-4EE8-47A8-AF11-97DFE4B79C6D} - {72F51F37-2669-43E0-A166-04E8FD34B294} = {AF70446C-3E93-42DF-9943-18DDCFA4991A} - {5CCE1C6A-2BD5-48BF-99E2-D29B58F91991} = {72F51F37-2669-43E0-A166-04E8FD34B294} - {5499ACCB-903F-4F89-AAFA-C82E7AF7F132} = {0FEE2476-268F-4683-B3AA-8CA5932333C6} - {422A8C73-836C-48CB-86C8-0591E69C0CA1} = {5499ACCB-903F-4F89-AAFA-C82E7AF7F132} - {9CF8D9AB-E47D-4923-A251-80E40B4E7144} = {B81B8DF0-D48C-4D5C-B1EB-FC8C2ACCA29F} - {BA5F5A20-2C40-4066-AE19-9853DFF82EEE} = {B81B8DF0-D48C-4D5C-B1EB-FC8C2ACCA29F} - {CE14B4D8-C63F-4EA6-9DE4-CACE48EA092C} = {BA5F5A20-2C40-4066-AE19-9853DFF82EEE} - {3BE95765-EB5A-44D6-9369-A8759A2FAFDE} = {5499ACCB-903F-4F89-AAFA-C82E7AF7F132} - {A17BA797-3CA6-47F9-B47E-673118EABA1A} = {3BE95765-EB5A-44D6-9369-A8759A2FAFDE} - {C2A4C477-2BE6-494C-89F3-B51BA1376EBD} = {D04ACFD8-B76B-4D6C-BF02-F280CF75ABAA} - {18C9AB30-1CAF-4A41-95A2-0CA2D3E19854} = {D04ACFD8-B76B-4D6C-BF02-F280CF75ABAA} - {73322DE2-4EF3-41A8-86BE-BB9C2EEFDE68} = {D04ACFD8-B76B-4D6C-BF02-F280CF75ABAA} - {7605EED0-5C32-4994-A46F-CB2C7F6626B7} = {D772CB17-6D38-48F4-958E-6A721026C056} - {E66A6FB1-9A3A-4BD0-BED5-B3C841AD193A} = {7605EED0-5C32-4994-A46F-CB2C7F6626B7} - {2CAA5CD1-B135-4215-B9DE-8B15EB19F8FB} = {154531C9-D836-409A-9B2D-E7E893510855} - {1BAAD656-1CBB-4D3E-A983-0D14F518877A} = {7605EED0-5C32-4994-A46F-CB2C7F6626B7} - {0FEE2476-268F-4683-B3AA-8CA5932333C6} = {1BAAD656-1CBB-4D3E-A983-0D14F518877A} - {7D7B9019-333C-40E3-AC42-F21B6D638C09} = {7605EED0-5C32-4994-A46F-CB2C7F6626B7} - {2A16E720-4EE8-47A8-AF11-97DFE4B79C6D} = {7D7B9019-333C-40E3-AC42-F21B6D638C09} - {B81B8DF0-D48C-4D5C-B1EB-FC8C2ACCA29F} = {0FEE2476-268F-4683-B3AA-8CA5932333C6} - {76FAEC6F-2322-43DF-B96E-D2D0EDF57845} = {0FEE2476-268F-4683-B3AA-8CA5932333C6} - {421A512B-4C74-4461-9956-DC5864275D18} = {76FAEC6F-2322-43DF-B96E-D2D0EDF57845} - {154531C9-D836-409A-9B2D-E7E893510855} = {E66A6FB1-9A3A-4BD0-BED5-B3C841AD193A} - {D3311F39-9AE8-4F16-BE04-1D1D31135BA9} = {C10F6E3C-C515-4707-991E-4D5F193D5D86} - {D05A6C72-E20D-4B21-A544-E76A419329F8} = {73322DE2-4EF3-41A8-86BE-BB9C2EEFDE68} - {CDA2E23F-F2E4-4D36-85AE-43398D800DC4} = {73322DE2-4EF3-41A8-86BE-BB9C2EEFDE68} - {54B14EFD-5FF5-443C-B40D-F6B4B964309D} = {73322DE2-4EF3-41A8-86BE-BB9C2EEFDE68} - {A784112A-84CF-4226-8C80-307F53413D1F} = {73322DE2-4EF3-41A8-86BE-BB9C2EEFDE68} - {3674D600-79C9-4BCE-A19E-4A7FC6332426} = {73322DE2-4EF3-41A8-86BE-BB9C2EEFDE68} - {C10F6E3C-C515-4707-991E-4D5F193D5D86} = {D04ACFD8-B76B-4D6C-BF02-F280CF75ABAA} - {E0621B43-15E2-4080-B777-16C02E5B4611} = {C10F6E3C-C515-4707-991E-4D5F193D5D86} - {BAE6CE99-140A-4018-8BCB-9D63F54D6F07} = {C2A4C477-2BE6-494C-89F3-B51BA1376EBD} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {33A71C13-4DAD-484B-96AE-30E3B9F75D2C} - EndGlobalSection -EndGlobal diff --git a/pyIocApp/setup.c b/pyIocApp/setup.c index 4c880c0..055a2a3 100644 --- a/pyIocApp/setup.c +++ b/pyIocApp/setup.c @@ -24,8 +24,8 @@ #include "pydevsup.h" #ifdef _WIN32 +#include #define PATH_MAX _MAX_PATH -#include #endif static void cleanupPy(void *junk) diff --git a/requirements-deb10.txt b/requirements-deb10.txt index 91aeff2..039a17d 100644 --- a/requirements-deb10.txt +++ b/requirements-deb10.txt @@ -1,3 +1,2 @@ numpy==1.16.2 -#nose==1.3.7 nose2 From fa31fda86fbebdba62bfbc7cfe868fbcf19dbd3b Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Mon, 11 Sep 2023 11:05:49 +0100 Subject: [PATCH 20/54] Updated RULES_PY to use @$(INSTALL). This requires include $(CONFIG)/CONFIG_BASE for the definition of the INSTALL macro. epicsThreadExitMain is deprecated by recent EPICS base versions (and resolves to cantProceed). Being unsure as to what best to do about this, I commented it out in devSupMain.cpp. Python 2.7 has been obsoleted and won't install on the runner without taking special measures. Being unsure what to do about this, I have commented out builds that invoke 2.7. Github Windows-latest (i.e. Windows server 2022) is installed with VS2022 (not VS2019). Use of the debug build configuration will seek to link with the Python debug libraries that are not normally installed. I have a solution to this problem but we should debate how to proceed. Github Windows server 2019 is, I think, installed with VS2019, this should build OK with default configuration. --- .github/workflows/ci-scripts-build.yml | 60 +++++++++++++++----------- configure/RULES_PY | 11 ++--- pyIocApp/devsupMain.cpp | 2 +- 3 files changed, 39 insertions(+), 34 deletions(-) diff --git a/.github/workflows/ci-scripts-build.yml b/.github/workflows/ci-scripts-build.yml index c400628..6c62665 100644 --- a/.github/workflows/ci-scripts-build.yml +++ b/.github/workflows/ci-scripts-build.yml @@ -27,21 +27,21 @@ jobs: fail-fast: false matrix: include: - - os: ubuntu-latest - cmp: gcc - configuration: default - base: "7.0" - python: "2.7" - profile: deb8 - test: yes + #- os: ubuntu-latest + # cmp: gcc + # configuration: default + # base: "7.0" + # python: "2.7" + # profile: deb8 + # test: yes - - os: ubuntu-latest - cmp: gcc - configuration: default - base: "7.0" - python: "2.7" - profile: deb8 - test: yes + #- os: ubuntu-latest + # cmp: gcc + # configuration: default + # base: "7.0" + # python: "2.7" + # profile: deb8 + # test: yes - os: ubuntu-latest cmp: gcc @@ -84,27 +84,35 @@ jobs: test: yes - os: windows-latest - cmp: vs2019 + cmp: vs2022 configuration: debug base: "7.0" python: "3.10" profile: latest test: yes - - os: ubuntu-latest - cmp: gcc + - os: windows-2019 + cmp: vs2019 configuration: default - base: "3.15" - python: "2.7" - profile: deb8 + base: "7.0" + python: "3.10" + profile: latest test: yes - - os: ubuntu-latest - cmp: gcc - configuration: default - base: "3.14" - python: "2.7" - profile: deb8 + #- os: ubuntu-latest + # cmp: gcc + # configuration: default + # base: "3.15" + # python: "2.7" + # profile: deb8 + # test: yes + + #- os: ubuntu-latest + # cmp: gcc + # configuration: default + # base: "3.14" + # python: "2.7" + # profile: deb8 steps: - uses: actions/checkout@v3 diff --git a/configure/RULES_PY b/configure/RULES_PY index 9887ebe..9f15b01 100644 --- a/configure/RULES_PY +++ b/configure/RULES_PY @@ -3,16 +3,13 @@ ifndef PY_VER $(error Must include CONFIG_PY) endif +include $(CONFIG)/CONFIG_BASE + PY_FILES += $(PY:%=$(PY_INSTALL_DIR)/%) $(PY_FILES) : $(PY_INSTALL_DIR)/%: ../% -ifneq ($(OS),Windows_NT) - @[ -d $(dir $@) ] || install -d $(dir $@) - @echo "Install PY $@" - install -m 644 $< $@ -else - xcopy /S /Q /Y /F $(subst /,\,$<) $(subst /,\,$@)* -endif + $(ECHO) "Install PY $@" + @$(INSTALL) -d -m $(INSTALL_PERMISSIONS) $< $(@D) build: $(PY_FILES) diff --git a/pyIocApp/devsupMain.cpp b/pyIocApp/devsupMain.cpp index 17a2384..38eb7b9 100644 --- a/pyIocApp/devsupMain.cpp +++ b/pyIocApp/devsupMain.cpp @@ -205,7 +205,7 @@ int main(int argc, char *argv[]) iocsh(NULL); } else { if (loadedDb) { - epicsThreadExitMain(); + //epicsThreadExitMain(); } else { printf("%s: Nothing to do!\n", arg0); usage(EXIT_FAILURE); From 2fcf37aa8a58d7bdba18c9e2e93a90da30597653 Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Thu, 14 Sep 2023 17:17:02 +0100 Subject: [PATCH 21/54] Added use of the PY_LDLIBS variable to locate the Python import library. On Windows, the library isn't in a system folder so the fully-qualified path is required. --- devsupApp/src/Makefile | 2 +- makehelper.py | 5 ++++- pyIocApp/Makefile | 4 ++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/devsupApp/src/Makefile b/devsupApp/src/Makefile index 93434c6..32c89aa 100644 --- a/devsupApp/src/Makefile +++ b/devsupApp/src/Makefile @@ -29,7 +29,7 @@ _dbapi_SRCS += utest.c _dbapi_SRCS += pyDevSupCommon_registerRecordDeviceDriver.cpp _dbapi_LIBS += $(EPICS_BASE_IOC_LIBS) -_dbapi_SYS_LIBS_WIN32 += python$(PY_LD_VER) +_dbapi_LDFLAGS_WIN32 += $(PY_LDLIBS) _dbapi_SYS_LIBS_WIN32 += ws2_32 Advapi32 Dbghelp PY += devsup/__init__.py diff --git a/makehelper.py b/makehelper.py index 96cf74b..5bb3ab1 100644 --- a/makehelper.py +++ b/makehelper.py @@ -58,7 +58,10 @@ def get_python_lib(): print('PY_LD_VER :=',ldver, file=out) print('PY_INCDIRS :=',' '.join(incdirs), file=out) print('PY_LIBDIRS :=',' '.join(libdirs), file=out) -print('PY_LDLIBS :=', get_config_var('BLDLIBRARY') or '', file=out) +if sys.platform == 'win32': + print('PY_LDLIBS :=', os.path.join(sys.prefix, 'libs') + '\python'+ldver+'.lib', file=out) +else: + print('PY_LDLIBS :=', get_config_var('BLDLIBRARY') or '', file=out) print('HAVE_NUMPY :=',have_np, file=out) try: diff --git a/pyIocApp/Makefile b/pyIocApp/Makefile index 198e833..5741b68 100644 --- a/pyIocApp/Makefile +++ b/pyIocApp/Makefile @@ -18,7 +18,7 @@ SHRLIB_VERSION = 0 DBD += pyDevSup.dbd -pyDevSup$(PY_LD_VER)_SYS_LIBS += python$(PY_LD_VER) +pyDevSup$(PY_LD_VER)_LDFLAGS += $(PY_LDLIBS) pyDevSup$(PY_LD_VER)_LIBS += $(EPICS_BASE_IOC_LIBS) @@ -42,7 +42,7 @@ softIocPy_DBD += pyDevSup.dbd softIocPy_DBD += system.dbd softIocPy$(PY_VER)_LIBS += pyDevSup$(PY_LD_VER) -softIocPy$(PY_VER)_SYS_LIBS += python$(PY_LD_VER) +softIocPy$(PY_VER)_LDFLAGS += $(PY_LDLIBS) # softIocPy_registerRecordDeviceDriver.cpp derives from softIocPy.dbd softIocPy$(PY_VER)_SRCS += softIocPy_registerRecordDeviceDriver.cpp From 736a7fd49871a4fa774c5b4959aab48a7f7c29e4 Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Mon, 18 Sep 2023 14:40:02 +0100 Subject: [PATCH 22/54] Reverted change to apply the Python library through LDFLAGS only due to the linker order issue. Commissioned use of nose testing on Windows. This requires: a. (already noted) issue regarding simultaneous temporary file read and write to be addressed in util.py. b. Windows .pyd file does not search PATH for DLLs - instead the EPICS base path has to be explicitly added in __init__.py with os.add_dll_directory. Tested with Python 3.11 on Windows. --- .github/workflows/ci-scripts-build.yml | 4 ++-- devsupApp/src/Makefile | 4 ++++ devsupApp/src/devsup/__init__.py | 10 ++++++++++ devsupApp/src/devsup/test/util.py | 5 +++-- makehelper.py | 2 +- pyIocApp/Makefile | 2 ++ pyIocApp/setup.c | 2 +- 7 files changed, 23 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci-scripts-build.yml b/.github/workflows/ci-scripts-build.yml index 6c62665..a4b28a7 100644 --- a/.github/workflows/ci-scripts-build.yml +++ b/.github/workflows/ci-scripts-build.yml @@ -85,9 +85,9 @@ jobs: - os: windows-latest cmp: vs2022 - configuration: debug + configuration: default base: "7.0" - python: "3.10" + python: "3.11" profile: latest test: yes diff --git a/devsupApp/src/Makefile b/devsupApp/src/Makefile index 32c89aa..6a06416 100644 --- a/devsupApp/src/Makefile +++ b/devsupApp/src/Makefile @@ -66,7 +66,11 @@ pyconfig: ifneq (,$(T_A)) nose: +ifeq ($(OS),Windows_NT) + @set PYTHONPATH=$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH) && set XEPICS_BASE=$(EPICS_BASE) && $(PYTHON) -m nose2 -v devsup $(NOSEFLAGS) +else PYTHONPATH="${PYTHONPATH}:$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH)" $(PYTHON) -m nose2 -v devsup $(NOSEFLAGS) +endif # bounce back down to the sphinx generated Makefile # aren't Makefiles fun... diff --git a/devsupApp/src/devsup/__init__.py b/devsupApp/src/devsup/__init__.py index b309af3..9b5e8fb 100644 --- a/devsupApp/src/devsup/__init__.py +++ b/devsupApp/src/devsup/__init__.py @@ -1,7 +1,17 @@ import os +import sys import atexit import tempfile +if sys.platform == 'win32': + # See https://stackoverflow.com/questions/72858093/how-to-specify-pyd-dll-dependencies-search-paths-at-runtime-with-python + # This is required for use of e.g. nose testing, but + # not when running as an IOC, since the IOC will already have loaded EPICS base DLLs. + xepics_base = os.getenv('XEPICS_BASE') + epics_host_arch = os.getenv('EPICS_HOST_ARCH') + if xepics_base is not None and epics_host_arch is not None: + os.add_dll_directory(xepics_base.strip() + "/bin/" + epics_host_arch) + from . import _dbapi from ._dbapi import (EPICS_VERSION_STRING, diff --git a/devsupApp/src/devsup/test/util.py b/devsupApp/src/devsup/test/util.py index 6177a4b..70d1ff6 100644 --- a/devsupApp/src/devsup/test/util.py +++ b/devsupApp/src/devsup/test/util.py @@ -43,10 +43,11 @@ def setUp(self): _init(iocMain=False) # load base.dbd if self.db is not None: - with tempfile.NamedTemporaryFile() as F: + with tempfile.NamedTemporaryFile(delete=False) as F: F.write(self.db.encode('ascii')) - F.flush() + F.close() _dbapi.dbReadDatabase(F.name) + os.unlink(F.name) if self.autostart: self.iocInit() diff --git a/makehelper.py b/makehelper.py index 5bb3ab1..a41f38e 100644 --- a/makehelper.py +++ b/makehelper.py @@ -59,7 +59,7 @@ def get_python_lib(): print('PY_INCDIRS :=',' '.join(incdirs), file=out) print('PY_LIBDIRS :=',' '.join(libdirs), file=out) if sys.platform == 'win32': - print('PY_LDLIBS :=', os.path.join(sys.prefix, 'libs') + '\python'+ldver+'.lib', file=out) + print('PY_LDLIBS :=', '/LIBPATH:' + os.path.join(sys.prefix, 'libs'), file=out) else: print('PY_LDLIBS :=', get_config_var('BLDLIBRARY') or '', file=out) print('HAVE_NUMPY :=',have_np, file=out) diff --git a/pyIocApp/Makefile b/pyIocApp/Makefile index 5741b68..dc5a9e3 100644 --- a/pyIocApp/Makefile +++ b/pyIocApp/Makefile @@ -18,6 +18,7 @@ SHRLIB_VERSION = 0 DBD += pyDevSup.dbd +pyDevSup$(PY_LD_VER)_SYS_LIBS += python$(PY_LD_VER) pyDevSup$(PY_LD_VER)_LDFLAGS += $(PY_LDLIBS) pyDevSup$(PY_LD_VER)_LIBS += $(EPICS_BASE_IOC_LIBS) @@ -42,6 +43,7 @@ softIocPy_DBD += pyDevSup.dbd softIocPy_DBD += system.dbd softIocPy$(PY_VER)_LIBS += pyDevSup$(PY_LD_VER) +softIocPy$(PY_VER)_SYS_LIBS += python$(PY_LD_VER) softIocPy$(PY_VER)_LDFLAGS += $(PY_LDLIBS) # softIocPy_registerRecordDeviceDriver.cpp derives from softIocPy.dbd diff --git a/pyIocApp/setup.c b/pyIocApp/setup.c index 055a2a3..e63f3ef 100644 --- a/pyIocApp/setup.c +++ b/pyIocApp/setup.c @@ -139,7 +139,7 @@ static void pySetupReg(void) setupPyPath(); if(PyRun_SimpleString("import devsup\n" - "devsup._init(iocMain=False)\n" + "devsup._init(iocMain=True)\n" )) { PyErr_Print(); PyErr_Clear(); From 7a1857456d50da214ffa622edc6e12b04062bbfa Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Tue, 10 Oct 2023 14:06:27 +0100 Subject: [PATCH 23/54] Reverted change to use get_python_lib - it seems not to work correctly for earlier Python versions. --- makehelper.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/makehelper.py b/makehelper.py index a41f38e..4fc5257 100644 --- a/makehelper.py +++ b/makehelper.py @@ -27,16 +27,16 @@ from sysconfig import get_config_var try: - from distutils.sysconfig import get_python_inc, get_python_lib + from distutils.sysconfig import get_python_inc except ImportError: def get_python_inc(): return get_config_var('INCLUDEPY') or '' - def get_python_lib(): - return get_config_var('LIBDIR') or get_config_var('LIBDEST') or '', \ - get_config_var('BINDIR') or '', incdirs = [get_python_inc()] -libdirs = [get_python_lib()] +libdirs = [ + get_config_var('LIBDIR') or get_config_var('LIBDEST') or '', + get_config_var('BINDIR') or '', +] have_np='NO' try: From e8b96fb0c1080f746721764f8856bb6db8c9ece2 Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Tue, 10 Oct 2023 20:11:43 +0100 Subject: [PATCH 24/54] Does it need __init__.py? --- devsupApp/src/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 devsupApp/src/__init__.py diff --git a/devsupApp/src/__init__.py b/devsupApp/src/__init__.py new file mode 100644 index 0000000..e69de29 From 3e828ee3eb0b44ba54c0b855cb86e8ad58d94692 Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Wed, 11 Oct 2023 09:23:20 +0100 Subject: [PATCH 25/54] __init__.py needed in build directory? --- devsupApp/src/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/devsupApp/src/Makefile b/devsupApp/src/Makefile index 6a06416..240f3e2 100644 --- a/devsupApp/src/Makefile +++ b/devsupApp/src/Makefile @@ -32,6 +32,7 @@ _dbapi_LIBS += $(EPICS_BASE_IOC_LIBS) _dbapi_LDFLAGS_WIN32 += $(PY_LDLIBS) _dbapi_SYS_LIBS_WIN32 += ws2_32 Advapi32 Dbghelp +PY += __init__.py PY += devsup/__init__.py PY += devsup/_dbapi.dbd PY += devsup/_int64.dbd From 79978582332d575287328a2e777a1e62a5dcc4df Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Thu, 12 Oct 2023 11:22:06 +0100 Subject: [PATCH 26/54] Removed @ from Windows nose test command - so I can see what command is being passed. Reverted unnecessary changes to __init__.py usage. --- devsupApp/src/Makefile | 3 +-- devsupApp/src/__init__.py | 0 makehelper.py | 1 + 3 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 devsupApp/src/__init__.py diff --git a/devsupApp/src/Makefile b/devsupApp/src/Makefile index 240f3e2..4ceb6bd 100644 --- a/devsupApp/src/Makefile +++ b/devsupApp/src/Makefile @@ -32,7 +32,6 @@ _dbapi_LIBS += $(EPICS_BASE_IOC_LIBS) _dbapi_LDFLAGS_WIN32 += $(PY_LDLIBS) _dbapi_SYS_LIBS_WIN32 += ws2_32 Advapi32 Dbghelp -PY += __init__.py PY += devsup/__init__.py PY += devsup/_dbapi.dbd PY += devsup/_int64.dbd @@ -68,7 +67,7 @@ pyconfig: ifneq (,$(T_A)) nose: ifeq ($(OS),Windows_NT) - @set PYTHONPATH=$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH) && set XEPICS_BASE=$(EPICS_BASE) && $(PYTHON) -m nose2 -v devsup $(NOSEFLAGS) + set PYTHONPATH=$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH) && set XEPICS_BASE=$(EPICS_BASE) && $(PYTHON) -m nose2 -v devsup $(NOSEFLAGS) else PYTHONPATH="${PYTHONPATH}:$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH)" $(PYTHON) -m nose2 -v devsup $(NOSEFLAGS) endif diff --git a/devsupApp/src/__init__.py b/devsupApp/src/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/makehelper.py b/makehelper.py index 4fc5257..eaeece9 100644 --- a/makehelper.py +++ b/makehelper.py @@ -34,6 +34,7 @@ def get_python_inc(): incdirs = [get_python_inc()] libdirs = [ + # distutils.sysconfig.get_python_lib does not appear to work correctly on Ubuntu with Python versions < 3.10 get_config_var('LIBDIR') or get_config_var('LIBDEST') or '', get_config_var('BINDIR') or '', ] From c30175696625e48bf732537cf220ad0f80e5e03f Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Fri, 13 Oct 2023 11:51:42 +0100 Subject: [PATCH 27/54] Additional debugging added to check directory paths. --- devsupApp/src/Makefile | 2 ++ devsupApp/src/devsup/__init__.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/devsupApp/src/Makefile b/devsupApp/src/Makefile index 4ceb6bd..cce715f 100644 --- a/devsupApp/src/Makefile +++ b/devsupApp/src/Makefile @@ -67,6 +67,8 @@ pyconfig: ifneq (,$(T_A)) nose: ifeq ($(OS),Windows_NT) + dir "$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH)" + dir "$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH)/devsup" set PYTHONPATH=$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH) && set XEPICS_BASE=$(EPICS_BASE) && $(PYTHON) -m nose2 -v devsup $(NOSEFLAGS) else PYTHONPATH="${PYTHONPATH}:$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH)" $(PYTHON) -m nose2 -v devsup $(NOSEFLAGS) diff --git a/devsupApp/src/devsup/__init__.py b/devsupApp/src/devsup/__init__.py index 9b5e8fb..c15b6a1 100644 --- a/devsupApp/src/devsup/__init__.py +++ b/devsupApp/src/devsup/__init__.py @@ -8,7 +8,9 @@ # This is required for use of e.g. nose testing, but # not when running as an IOC, since the IOC will already have loaded EPICS base DLLs. xepics_base = os.getenv('XEPICS_BASE') + print("xepics_base = " + xepics_base) epics_host_arch = os.getenv('EPICS_HOST_ARCH') + print("epics_host_arch = " + epics_host_arch) if xepics_base is not None and epics_host_arch is not None: os.add_dll_directory(xepics_base.strip() + "/bin/" + epics_host_arch) From 26df4eb684b4712106349bd146ad7c97b4768d88 Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Fri, 13 Oct 2023 16:27:13 +0100 Subject: [PATCH 28/54] /c/hostedtoolcache/ syntax? --- devsupApp/src/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devsupApp/src/Makefile b/devsupApp/src/Makefile index cce715f..2147bfb 100644 --- a/devsupApp/src/Makefile +++ b/devsupApp/src/Makefile @@ -69,7 +69,7 @@ nose: ifeq ($(OS),Windows_NT) dir "$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH)" dir "$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH)/devsup" - set PYTHONPATH=$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH) && set XEPICS_BASE=$(EPICS_BASE) && $(PYTHON) -m nose2 -v devsup $(NOSEFLAGS) + set PYTHONPATH=$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH) && set XEPICS_BASE=$(EPICS_BASE) && $(subst /c/hostedtoolcache/,c:\hostedtoolcache\,$(PYTHON)) -m nose2 -v devsup $(NOSEFLAGS) else PYTHONPATH="${PYTHONPATH}:$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH)" $(PYTHON) -m nose2 -v devsup $(NOSEFLAGS) endif From 312add71ecc22b0a84638275ecf1a1ecd161237c Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Fri, 13 Oct 2023 16:44:17 +0100 Subject: [PATCH 29/54] Oops, always the slashes that get you. --- devsupApp/src/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devsupApp/src/Makefile b/devsupApp/src/Makefile index 2147bfb..db6c33e 100644 --- a/devsupApp/src/Makefile +++ b/devsupApp/src/Makefile @@ -69,7 +69,7 @@ nose: ifeq ($(OS),Windows_NT) dir "$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH)" dir "$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH)/devsup" - set PYTHONPATH=$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH) && set XEPICS_BASE=$(EPICS_BASE) && $(subst /c/hostedtoolcache/,c:\hostedtoolcache\,$(PYTHON)) -m nose2 -v devsup $(NOSEFLAGS) + set PYTHONPATH=$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH) && set XEPICS_BASE=$(EPICS_BASE) && $(subst /c/hostedtoolcache/,c:/hostedtoolcache/,$(PYTHON)) -m nose2 -v devsup $(NOSEFLAGS) else PYTHONPATH="${PYTHONPATH}:$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH)" $(PYTHON) -m nose2 -v devsup $(NOSEFLAGS) endif From cf1d31c834d57af022d559ac02a54650bfede682 Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Fri, 13 Oct 2023 17:17:03 +0100 Subject: [PATCH 30/54] Make sure we use any existing PYTHONPATH. --- devsupApp/src/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devsupApp/src/Makefile b/devsupApp/src/Makefile index db6c33e..f4ce01d 100644 --- a/devsupApp/src/Makefile +++ b/devsupApp/src/Makefile @@ -69,7 +69,7 @@ nose: ifeq ($(OS),Windows_NT) dir "$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH)" dir "$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH)/devsup" - set PYTHONPATH=$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH) && set XEPICS_BASE=$(EPICS_BASE) && $(subst /c/hostedtoolcache/,c:/hostedtoolcache/,$(PYTHON)) -m nose2 -v devsup $(NOSEFLAGS) + set PYTHONPATH=${PYTHONPATH};$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH) && set XEPICS_BASE=$(EPICS_BASE) && $(PYTHON) -m nose2 -v devsup $(NOSEFLAGS) else PYTHONPATH="${PYTHONPATH}:$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH)" $(PYTHON) -m nose2 -v devsup $(NOSEFLAGS) endif From f73a5a93dbb195a2ad85533ef82ce770357c5564 Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Fri, 13 Oct 2023 17:40:56 +0100 Subject: [PATCH 31/54] Silly syntax mistake. --- devsupApp/src/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devsupApp/src/Makefile b/devsupApp/src/Makefile index f4ce01d..485b765 100644 --- a/devsupApp/src/Makefile +++ b/devsupApp/src/Makefile @@ -69,7 +69,7 @@ nose: ifeq ($(OS),Windows_NT) dir "$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH)" dir "$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH)/devsup" - set PYTHONPATH=${PYTHONPATH};$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH) && set XEPICS_BASE=$(EPICS_BASE) && $(PYTHON) -m nose2 -v devsup $(NOSEFLAGS) + set PYTHONPATH=%PYTHONPATH%;$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH) && set XEPICS_BASE=$(EPICS_BASE) && $(PYTHON) -m nose2 -v devsup $(NOSEFLAGS) else PYTHONPATH="${PYTHONPATH}:$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH)" $(PYTHON) -m nose2 -v devsup $(NOSEFLAGS) endif From c6af763553e6b8794ba6be291f105bd740c4f91d Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Fri, 13 Oct 2023 18:04:01 +0100 Subject: [PATCH 32/54] Silly, PYTHONPATH doesn't exist until we define it. --- devsupApp/src/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devsupApp/src/Makefile b/devsupApp/src/Makefile index 485b765..cce715f 100644 --- a/devsupApp/src/Makefile +++ b/devsupApp/src/Makefile @@ -69,7 +69,7 @@ nose: ifeq ($(OS),Windows_NT) dir "$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH)" dir "$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH)/devsup" - set PYTHONPATH=%PYTHONPATH%;$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH) && set XEPICS_BASE=$(EPICS_BASE) && $(PYTHON) -m nose2 -v devsup $(NOSEFLAGS) + set PYTHONPATH=$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH) && set XEPICS_BASE=$(EPICS_BASE) && $(PYTHON) -m nose2 -v devsup $(NOSEFLAGS) else PYTHONPATH="${PYTHONPATH}:$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH)" $(PYTHON) -m nose2 -v devsup $(NOSEFLAGS) endif From dd2c1ecbb2846d2f3e2ce3f0bd62b3e8df943352 Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Fri, 20 Oct 2023 15:20:10 +0100 Subject: [PATCH 33/54] Try pushd / popd instead of set PYTHONPATH. --- devsupApp/src/Makefile | 2 +- devsupApp/src/devsup/__init__.py | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/devsupApp/src/Makefile b/devsupApp/src/Makefile index cce715f..bc0b114 100644 --- a/devsupApp/src/Makefile +++ b/devsupApp/src/Makefile @@ -69,7 +69,7 @@ nose: ifeq ($(OS),Windows_NT) dir "$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH)" dir "$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH)/devsup" - set PYTHONPATH=$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH) && set XEPICS_BASE=$(EPICS_BASE) && $(PYTHON) -m nose2 -v devsup $(NOSEFLAGS) + pushd "$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH)" && set XEPICS_BASE=$(EPICS_BASE) && $(PYTHON) -m nose2 -v devsup $(NOSEFLAGS) && popd else PYTHONPATH="${PYTHONPATH}:$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH)" $(PYTHON) -m nose2 -v devsup $(NOSEFLAGS) endif diff --git a/devsupApp/src/devsup/__init__.py b/devsupApp/src/devsup/__init__.py index c15b6a1..30bf1e3 100644 --- a/devsupApp/src/devsup/__init__.py +++ b/devsupApp/src/devsup/__init__.py @@ -7,10 +7,12 @@ # See https://stackoverflow.com/questions/72858093/how-to-specify-pyd-dll-dependencies-search-paths-at-runtime-with-python # This is required for use of e.g. nose testing, but # not when running as an IOC, since the IOC will already have loaded EPICS base DLLs. + xepics_base = None xepics_base = os.getenv('XEPICS_BASE') - print("xepics_base = " + xepics_base) + print("xepics_base = " + str(xepics_base)) + epics_host_arch = None epics_host_arch = os.getenv('EPICS_HOST_ARCH') - print("epics_host_arch = " + epics_host_arch) + print("epics_host_arch = " + str(epics_host_arch)) if xepics_base is not None and epics_host_arch is not None: os.add_dll_directory(xepics_base.strip() + "/bin/" + epics_host_arch) From 868e51d37165d3ed5b954f03fda041941082d933 Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Mon, 23 Oct 2023 16:53:15 +0100 Subject: [PATCH 34/54] Removed debugging statements - these are not helping. --- devsupApp/src/Makefile | 2 -- devsupApp/src/devsup/__init__.py | 2 -- 2 files changed, 4 deletions(-) diff --git a/devsupApp/src/Makefile b/devsupApp/src/Makefile index bc0b114..e5c7213 100644 --- a/devsupApp/src/Makefile +++ b/devsupApp/src/Makefile @@ -67,8 +67,6 @@ pyconfig: ifneq (,$(T_A)) nose: ifeq ($(OS),Windows_NT) - dir "$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH)" - dir "$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH)/devsup" pushd "$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH)" && set XEPICS_BASE=$(EPICS_BASE) && $(PYTHON) -m nose2 -v devsup $(NOSEFLAGS) && popd else PYTHONPATH="${PYTHONPATH}:$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH)" $(PYTHON) -m nose2 -v devsup $(NOSEFLAGS) diff --git a/devsupApp/src/devsup/__init__.py b/devsupApp/src/devsup/__init__.py index 30bf1e3..ac51634 100644 --- a/devsupApp/src/devsup/__init__.py +++ b/devsupApp/src/devsup/__init__.py @@ -9,10 +9,8 @@ # not when running as an IOC, since the IOC will already have loaded EPICS base DLLs. xepics_base = None xepics_base = os.getenv('XEPICS_BASE') - print("xepics_base = " + str(xepics_base)) epics_host_arch = None epics_host_arch = os.getenv('EPICS_HOST_ARCH') - print("epics_host_arch = " + str(epics_host_arch)) if xepics_base is not None and epics_host_arch is not None: os.add_dll_directory(xepics_base.strip() + "/bin/" + epics_host_arch) From de7ab4cfd7718cfeadb2cd77d804d27f32c6ff7f Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Tue, 24 Oct 2023 09:47:13 +0100 Subject: [PATCH 35/54] Updated CI-scripts as advised by mdavidsaver. --- .ci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci b/.ci index 1e0e326..899b183 160000 --- a/.ci +++ b/.ci @@ -1 +1 @@ -Subproject commit 1e0e326f74ffac4154ce80b5d41c410c754cf5d8 +Subproject commit 899b18336b4ce3bd9328fd30c33621224c78a4d7 From d44bb092964b2fda2ce4143098bd79cf670d6544 Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Tue, 24 Oct 2023 11:03:54 +0100 Subject: [PATCH 36/54] Put debug messages back in __init__.py and replaced slashes to use Windows style. --- devsupApp/src/devsup/__init__.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/devsupApp/src/devsup/__init__.py b/devsupApp/src/devsup/__init__.py index ac51634..06e267f 100644 --- a/devsupApp/src/devsup/__init__.py +++ b/devsupApp/src/devsup/__init__.py @@ -9,10 +9,16 @@ # not when running as an IOC, since the IOC will already have loaded EPICS base DLLs. xepics_base = None xepics_base = os.getenv('XEPICS_BASE') + print("xepics_base = " + str(xepics_base)) epics_host_arch = None epics_host_arch = os.getenv('EPICS_HOST_ARCH') + print("epics_host_arch = " + str(epics_host_arch)) if xepics_base is not None and epics_host_arch is not None: - os.add_dll_directory(xepics_base.strip() + "/bin/" + epics_host_arch) + xepics_base = xepics_base.strip() + xepics_base = xepics_base.replace("/",'\\') + dll_path = xepics_base + "\\bin\\" + epics_host_arch + print("dll_path = " + dll_path) + os.add_dll_directory(dll_path) from . import _dbapi From 69f6bb9c4a30539b821a9fd293e26243c42de3a1 Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Tue, 24 Oct 2023 12:35:23 +0100 Subject: [PATCH 37/54] Removed use of XEPICS_BASE env variable as EPICS_BASE is already an env variable. --- devsupApp/src/Makefile | 2 +- devsupApp/src/devsup/__init__.py | 13 ++++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/devsupApp/src/Makefile b/devsupApp/src/Makefile index e5c7213..53500fd 100644 --- a/devsupApp/src/Makefile +++ b/devsupApp/src/Makefile @@ -67,7 +67,7 @@ pyconfig: ifneq (,$(T_A)) nose: ifeq ($(OS),Windows_NT) - pushd "$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH)" && set XEPICS_BASE=$(EPICS_BASE) && $(PYTHON) -m nose2 -v devsup $(NOSEFLAGS) && popd + pushd "$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH)" && $(PYTHON) -m nose2 -v devsup $(NOSEFLAGS) && popd else PYTHONPATH="${PYTHONPATH}:$(abspath $(TOP))/python$(PY_LD_VER)/$(EPICS_HOST_ARCH)" $(PYTHON) -m nose2 -v devsup $(NOSEFLAGS) endif diff --git a/devsupApp/src/devsup/__init__.py b/devsupApp/src/devsup/__init__.py index 06e267f..c0ae1cb 100644 --- a/devsupApp/src/devsup/__init__.py +++ b/devsupApp/src/devsup/__init__.py @@ -7,16 +7,15 @@ # See https://stackoverflow.com/questions/72858093/how-to-specify-pyd-dll-dependencies-search-paths-at-runtime-with-python # This is required for use of e.g. nose testing, but # not when running as an IOC, since the IOC will already have loaded EPICS base DLLs. - xepics_base = None - xepics_base = os.getenv('XEPICS_BASE') - print("xepics_base = " + str(xepics_base)) + epics_base = None + epics_base = os.getenv('EPICS_BASE') + print("epics_base = " + str(epics_base)) epics_host_arch = None epics_host_arch = os.getenv('EPICS_HOST_ARCH') print("epics_host_arch = " + str(epics_host_arch)) - if xepics_base is not None and epics_host_arch is not None: - xepics_base = xepics_base.strip() - xepics_base = xepics_base.replace("/",'\\') - dll_path = xepics_base + "\\bin\\" + epics_host_arch + if epics_base is not None and epics_host_arch is not None: + epics_base = epics_base.replace("/",'\\') + dll_path = epics_base + "\\bin\\" + epics_host_arch print("dll_path = " + dll_path) os.add_dll_directory(dll_path) From cdb92e4514f0dc202d80205ba08aa7f008ca5bb1 Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Tue, 24 Oct 2023 13:04:43 +0100 Subject: [PATCH 38/54] Removed debug print statements again. --- devsupApp/src/devsup/__init__.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/devsupApp/src/devsup/__init__.py b/devsupApp/src/devsup/__init__.py index c0ae1cb..10c5a5f 100644 --- a/devsupApp/src/devsup/__init__.py +++ b/devsupApp/src/devsup/__init__.py @@ -7,16 +7,11 @@ # See https://stackoverflow.com/questions/72858093/how-to-specify-pyd-dll-dependencies-search-paths-at-runtime-with-python # This is required for use of e.g. nose testing, but # not when running as an IOC, since the IOC will already have loaded EPICS base DLLs. - epics_base = None epics_base = os.getenv('EPICS_BASE') - print("epics_base = " + str(epics_base)) - epics_host_arch = None epics_host_arch = os.getenv('EPICS_HOST_ARCH') - print("epics_host_arch = " + str(epics_host_arch)) if epics_base is not None and epics_host_arch is not None: epics_base = epics_base.replace("/",'\\') dll_path = epics_base + "\\bin\\" + epics_host_arch - print("dll_path = " + dll_path) os.add_dll_directory(dll_path) from . import _dbapi From 39a3e7fad016268caffa3b09deb369f1339b12aa Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Tue, 21 Nov 2023 16:27:51 +0000 Subject: [PATCH 39/54] Added tests & logic for lsi, lso and int64 types. --- devsupApp/src/dbfield.c | 4 +- devsupApp/src/devsup/test/test_db.py | 69 ++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 2 deletions(-) diff --git a/devsupApp/src/dbfield.c b/devsupApp/src/dbfield.c index 7b748ba..71f5e51 100644 --- a/devsupApp/src/dbfield.c +++ b/devsupApp/src/dbfield.c @@ -296,8 +296,8 @@ static PyObject* pyField_putval(pyField *self, PyObject* args) OP(LONG, epicsInt32, PyInt_AsLong); OP(ULONG, epicsUInt32, PyInt_AsLong); #ifdef HAVE_INT64 - OP(INT64, epicsInt32, PyLong_AsLongLong); - OP(UINT64, epicsUInt32, PyLong_AsLongLong); + OP(INT64, epicsInt64, PyLong_AsLongLong); + OP(UINT64, epicsUInt64, PyLong_AsLongLong); #endif OP(FLOAT, epicsFloat32,PyFloat_AsDouble); OP(DOUBLE,epicsFloat64,PyFloat_AsDouble); diff --git a/devsupApp/src/devsup/test/test_db.py b/devsupApp/src/devsup/test/test_db.py index 2dc33e0..8691bb5 100644 --- a/devsupApp/src/devsup/test/test_db.py +++ b/devsupApp/src/devsup/test/test_db.py @@ -2,6 +2,7 @@ import os import unittest import tempfile +import time import numpy from numpy.testing import assert_array_almost_equal, assert_array_equal @@ -129,6 +130,74 @@ def test_wf_string(self): assert_array_equal(rec.VAL, numpy.asarray(["zero", "", "one", "This is a really long string which shoul", "", "last"], dtype='S40')) +class TestLongStringField(IOCHelper): + db = """ + record(lsi, "rec:lsi") { + field(SIZV, 128) + field(SCAN, "I/O Intr") + } + record(lso, "rec:lso") { + field(SIZV, 128) + field(DOL, "rec:lsi.VAL$") + field(OMSL, "closed_loop") + } + """ + + def test_lsilso(self): + lsi = getRecord("rec:lsi") + lso = getRecord("rec:lso") + + with lsi: + self.assertEqual(lsi.VAL, "") + + lsi.VAL = "test" + self.assertEqual(lsi.VAL, "test") + + lsi.VAL = "" + self.assertEqual(lsi.VAL, "") + + # does not truncate + lsi.VAL = "This is a really long string which should NOT be truncated" + self.assertEqual(lsi.VAL, "This is a really long string which should NOT be truncated") + + lso.scan() + time.sleep(0.01) # The linked value needs a small amount of time to update. + + with lso: + self.assertEqual(lso.VAL, lsi.VAL) + +class TestInt64Field(IOCHelper): + db = """ + record(int64in, "rec:in64") { + field(SCAN, "I/O Intr") + } + record(int64out, "rec:out64") { + field(DOL, "rec:in64.VAL") + field(OMSL, "closed_loop") + } + """ + + def testint64(self): + in64 = getRecord("rec:in64") + out64 = getRecord("rec:out64") + + with in64: + self.assertEqual(in64.VAL, 0) + + in64.VAL = 42 + self.assertEqual(in64.VAL, 42) + + in64.VAL = 0x7FFFFFFFFFFFFFFE + self.assertEqual(in64.VAL, 0x7FFFFFFFFFFFFFFE) + + in64.VAL = 0x7FFFFFFFFFFFFFFF + self.assertEqual(in64.VAL, 0x7FFFFFFFFFFFFFFF) + + out64.scan() + time.sleep(0.01) # The linked value needs a small amount of time to update. + + with out64: + self.assertEqual(out64.VAL, in64.VAL) class TestDset(IOCHelper): db = """ From 7021a38943daae7d452a2b774ac92fac53926b0a Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Fri, 9 Aug 2024 10:34:47 +0100 Subject: [PATCH 40/54] Resolved merge conflict of makehelper.py --- makehelper.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/makehelper.py b/makehelper.py index eaeece9..108f69c 100644 --- a/makehelper.py +++ b/makehelper.py @@ -14,6 +14,7 @@ from __future__ import print_function import sys +import errno import os if len(sys.argv)<2: @@ -27,7 +28,7 @@ from sysconfig import get_config_var try: - from distutils.sysconfig import get_python_inc + from sysconfig import get_python_inc except ImportError: def get_python_inc(): return get_config_var('INCLUDEPY') or '' @@ -81,4 +82,4 @@ def get_python_inc(): print('PY_OK := YES', file=out) -out.close() +out.close() \ No newline at end of file From 0f70191e25272d5b271109d048b7e3ddd6d379f4 Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Fri, 9 Aug 2024 11:26:16 +0100 Subject: [PATCH 41/54] Addressed numpy 2.0 build error - see https://github.com/pytorch/pytorch/issues/121798 --- devsupApp/src/dbfield.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/devsupApp/src/dbfield.c b/devsupApp/src/dbfield.c index 71f5e51..5ee3afb 100644 --- a/devsupApp/src/dbfield.c +++ b/devsupApp/src/dbfield.c @@ -3,10 +3,17 @@ #undef _POSIX_C_SOURCE #undef _XOPEN_SOURCE +#ifdef _DEBUG +#undef _DEBUG #include #ifdef HAVE_NUMPY #include #endif +#define _DEBUG +#else +#include +#include +#endif #include #include @@ -98,7 +105,12 @@ static PyObject* build_array(PyObject* obj, void *data, unsigned short ftype, un desc = dbf2np[ftype]; if(ftype==DBF_STRING) { - desc->elsize = MAX_STRING_SIZE; +#if NPY_ABI_VERSION >= 0x02000000 + # See https://github.com/pytorch/pytorch/issues/121798 + PyDataType_SET_ELSIZE(desc, MAX_STRING_SIZE); +#else + desc->elsize = MAX_STRING_SIZE; +#endif } Py_XINCREF(desc); From 6399fd277f6479cb3b2c5b56a567eb0044077f55 Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Fri, 9 Aug 2024 11:35:14 +0100 Subject: [PATCH 42/54] Corrected comment typo. --- devsupApp/src/dbfield.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devsupApp/src/dbfield.c b/devsupApp/src/dbfield.c index 5ee3afb..193ea6c 100644 --- a/devsupApp/src/dbfield.c +++ b/devsupApp/src/dbfield.c @@ -106,7 +106,7 @@ static PyObject* build_array(PyObject* obj, void *data, unsigned short ftype, un desc = dbf2np[ftype]; if(ftype==DBF_STRING) { #if NPY_ABI_VERSION >= 0x02000000 - # See https://github.com/pytorch/pytorch/issues/121798 + // See https://github.com/pytorch/pytorch/issues/121798 PyDataType_SET_ELSIZE(desc, MAX_STRING_SIZE); #else desc->elsize = MAX_STRING_SIZE; From edfa412c19b38dfe20c1f3297295fc8fc1f30e2c Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Fri, 9 Aug 2024 12:29:49 +0100 Subject: [PATCH 43/54] Changed to use master branch of .ci --- .ci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci b/.ci index 899b183..0e93b70 160000 --- a/.ci +++ b/.ci @@ -1 +1 @@ -Subproject commit 899b18336b4ce3bd9328fd30c33621224c78a4d7 +Subproject commit 0e93b708551cb7bb212fda7029eccdf872dabc81 From a1ae41c2398b2de806b826ecc36171dbca621a0e Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Sat, 10 Aug 2024 12:07:53 +0100 Subject: [PATCH 44/54] Reverted undesired change of distutils.sysconfig --- makehelper.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/makehelper.py b/makehelper.py index 108f69c..fcfd0a4 100644 --- a/makehelper.py +++ b/makehelper.py @@ -28,7 +28,8 @@ from sysconfig import get_config_var try: - from sysconfig import get_python_inc + # NB, sysconfig.get_python_inc doesn't exist, but distutils.sysconfig.get_python_inc does for Python <= 3.11 + from distutils.sysconfig import get_python_inc except ImportError: def get_python_inc(): return get_config_var('INCLUDEPY') or '' From 5953d335f57cff9ef8ecbf344c4200cc9fd48464 Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Tue, 13 Aug 2024 15:16:34 +0100 Subject: [PATCH 45/54] Updated makehelper.py with support for Windows using the file version of #39. --- makehelper.py | 27 ++++++++------------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/makehelper.py b/makehelper.py index fcfd0a4..ceda7bc 100644 --- a/makehelper.py +++ b/makehelper.py @@ -26,25 +26,16 @@ pass out = open(sys.argv[1], 'w') -from sysconfig import get_config_var -try: - # NB, sysconfig.get_python_inc doesn't exist, but distutils.sysconfig.get_python_inc does for Python <= 3.11 - from distutils.sysconfig import get_python_inc -except ImportError: - def get_python_inc(): - return get_config_var('INCLUDEPY') or '' +from sysconfig import get_config_var, get_path, get_python_version -incdirs = [get_python_inc()] -libdirs = [ - # distutils.sysconfig.get_python_lib does not appear to work correctly on Ubuntu with Python versions < 3.10 - get_config_var('LIBDIR') or get_config_var('LIBDEST') or '', - get_config_var('BINDIR') or '', -] +incdirs = [get_path("include")] +libdir = get_config_var('LIBDIR') or get_config_var('LIBDEST') or '' have_np='NO' try: - from numpy.distutils.misc_util import get_numpy_include_dirs - incdirs = get_numpy_include_dirs()+incdirs + from numpy import get_include + numpy_dir = [get_include()] + incdirs = numpy_dir+incdirs have_np='YES' except ImportError: pass @@ -52,7 +43,7 @@ def get_python_inc(): print('TARGET_CFLAGS +=',get_config_var('BASECFLAGS') or '', file=out) print('TARGET_CXXFLAGS +=',get_config_var('BASECFLAGS') or '', file=out) -print('PY_VER :=',get_config_var('VERSION'), file=out) +print('PY_VER :=',get_python_version(), file=out) ldver = get_config_var('LDVERSION') if ldver is None: ldver = get_config_var('VERSION') @@ -60,11 +51,9 @@ def get_python_inc(): ldver = ldver+'_d' print('PY_LD_VER :=',ldver, file=out) print('PY_INCDIRS :=',' '.join(incdirs), file=out) -print('PY_LIBDIRS :=',' '.join(libdirs), file=out) +print('PY_LIBDIRS :=',libdir, file=out) if sys.platform == 'win32': print('PY_LDLIBS :=', '/LIBPATH:' + os.path.join(sys.prefix, 'libs'), file=out) -else: - print('PY_LDLIBS :=', get_config_var('BLDLIBRARY') or '', file=out) print('HAVE_NUMPY :=',have_np, file=out) try: From ff4392ba92edd1ed09d5660f4140bb1ed92b63c0 Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Tue, 13 Aug 2024 15:20:25 +0100 Subject: [PATCH 46/54] Also updated the Github build configuration which now includes Python 3.12. --- .github/workflows/ci-scripts-build.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/.github/workflows/ci-scripts-build.yml b/.github/workflows/ci-scripts-build.yml index a4b28a7..dbd2cfc 100644 --- a/.github/workflows/ci-scripts-build.yml +++ b/.github/workflows/ci-scripts-build.yml @@ -75,6 +75,14 @@ jobs: profile: latest test: yes + - os: ubuntu-latest + cmp: gcc + configuration: default + base: "7.0" + python: "3.12" + profile: latest + test: yes + - os: macos-latest cmp: gcc configuration: default @@ -83,6 +91,14 @@ jobs: profile: latest test: yes + - os: windows-latest + cmp: vs2022 + configuration: default + base: "7.0" + python: "3.12" + profile: latest + test: yes + - os: windows-latest cmp: vs2022 configuration: default From b9eca93dd770557bb481fd54144715f3419fa881 Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Mon, 24 Mar 2025 14:23:32 +0000 Subject: [PATCH 47/54] Updated at end of project. --- .github/workflows/ci-scripts-build.yml | 24 ----------------- devsupApp/src/dbrec.c | 19 ++++++++----- devsupApp/src/devsup/ptable.py | 37 +++++++++++++++----------- 3 files changed, 34 insertions(+), 46 deletions(-) diff --git a/.github/workflows/ci-scripts-build.yml b/.github/workflows/ci-scripts-build.yml index dbd2cfc..dbf7ad4 100644 --- a/.github/workflows/ci-scripts-build.yml +++ b/.github/workflows/ci-scripts-build.yml @@ -27,30 +27,6 @@ jobs: fail-fast: false matrix: include: - #- os: ubuntu-latest - # cmp: gcc - # configuration: default - # base: "7.0" - # python: "2.7" - # profile: deb8 - # test: yes - - #- os: ubuntu-latest - # cmp: gcc - # configuration: default - # base: "7.0" - # python: "2.7" - # profile: deb8 - # test: yes - - - os: ubuntu-latest - cmp: gcc - configuration: default - base: "7.0" - python: "3.7" - profile: deb10 - test: yes - - os: ubuntu-latest cmp: gcc configuration: default diff --git a/devsupApp/src/dbrec.c b/devsupApp/src/dbrec.c index 7802fe5..6c8584a 100644 --- a/devsupApp/src/dbrec.c +++ b/devsupApp/src/dbrec.c @@ -2,9 +2,9 @@ /* python has its own ideas about which version to support */ #undef _POSIX_C_SOURCE #undef _XOPEN_SOURCE - +/* See https://stackoverflow.com/questions/70705404/systemerror-py-ssize-t-clean-macro-must-be-defined-for-formats */ +#define PY_SSIZE_T_CLEAN #include - #include #include #include @@ -125,20 +125,27 @@ static PyObject* pyRecord_setSevr(pyRecord *self, PyObject *args, PyObject *kws) { dbCommon *prec = self->entry.precnode->precord; - static char* names[] = {"sevr", "stat", NULL}; + static char* names[] = {"sevr", "stat", "amsg", NULL}; short sevr = INVALID_ALARM, stat=COMM_ALARM; + char* amsg = ""; + Py_ssize_t lMsg; - if(!PyArg_ParseTupleAndKeywords(args, kws, "|hh", names, &sevr, &stat)) + /* see https://colinpaice.blog/2022/06/28/using-pyarg_parsetupleandkeywords-to-parse-data-in-python-external-functions/ */ + if(!PyArg_ParseTupleAndKeywords(args, kws, "|hhs#", names, &sevr, &stat, &amsg, &lMsg)) return NULL; if(sevrlastEpicsAlarmSev || statlastEpicsAlarmCond) { - PyErr_Format(PyExc_ValueError, "%s: Can't set alarms %d %d", prec->name, sevr, stat); + PyErr_Format(PyExc_ValueError, "%s: Can't set alarms %d %d %s", prec->name, sevr, stat, amsg); return NULL; } +#if EPICS_VERSION_INT {'name':'value'}\n" "Return a dictionary of all infos for this record."}, {"setSevr", (PyCFunction)pyRecord_setSevr, METH_VARARGS|METH_KEYWORDS, - "setSevr(sevr=INVALID_ALARM, stat=COMM_ALARM)\n" + "setSevr(sevr=INVALID_ALARM, stat=COMM_ALARM, amsg="")\n" "Set alarm new alarm severity/status. Record must be locked!"}, {"setTime", (PyCFunction)pyRecord_setTime, METH_VARARGS, "Set record timestamp if TSE==-2. Record must be locked!"}, diff --git a/devsupApp/src/devsup/ptable.py b/devsupApp/src/devsup/ptable.py index 6f87b70..d8869f3 100644 --- a/devsupApp/src/devsup/ptable.py +++ b/devsupApp/src/devsup/ptable.py @@ -10,7 +10,7 @@ _tables = {} from .db import IOScanListThread -from . import INVALID_ALARM, UDF_ALARM +from . import INVALID_ALARM, UDF_ALARM, NO_ALARM __all__ = [ 'Parameter', @@ -161,9 +161,12 @@ def __init__(self, table, name, scan): self.name = name self.table, self.scan, self._value = table, scan, None self.alarm, self.actions = 0, [] + self.stat = NO_ALARM + self.amsg = "" self._groups = set() self._sevr = None - self._stat = None + self._rec = None + self._locked = False def _get_value(self): return self._value def _set_value(self, val): @@ -262,8 +265,9 @@ def process(self, rec, reason=None): else: # sync record to table self.inst.table.log.debug('%s <- %s (%s)', self.inst.name, rec.NAME, rec.VAL) - self.inst._sevr = rec.field('SEVR') - self.inst._stat = rec.field('STAT') + if self.inst._sevr is None: + self.inst._sevr = rec.field('SEVR') + self.inst._rec = rec if self.vdata is None: nval = self.vfld.getval() else: @@ -275,20 +279,21 @@ def process(self, rec, reason=None): # Execute actions self.inst._exec(oval) - for G in self.inst._groups: - G._exec() - for param in G._params: - if self.inst != param and param._sevr is not None: - oldsevr = param._sevr.getval() - oldstat = param._stat.getval() - newstat = oldstat - if param.alarm == 0: - newstat = 0 - if oldsevr != param.alarm or oldstat != newstat: - param._sevr.putval(param.alarm) oldsevr = self.inst._sevr.getval() if oldsevr != self.inst.alarm: - rec.setSevr(self.inst.alarm) + rec.setSevr(self.inst.alarm, self.inst.stat, self.inst.amsg) + self.inst._locked = False + for G in self.inst._groups: + for param in G._params: + if self.inst != param and param._sevr is not None: + with param.table.lock: + oldsevr = param._sevr.getval() + if oldsevr != param.alarm: + if param._locked: + pass + else: + param._locked = True + param._rec.scan(sync=False, force=0) class TableBase(object): """Base class for all parameter tables. From cbadf2ac6f1ae966975e69316e160bbadd98603f Mon Sep 17 00:00:00 2001 From: pheest Date: Thu, 11 Sep 2025 17:55:27 +0100 Subject: [PATCH 48/54] Update ci-scripts-build.yml to allow manual workflow --- .github/workflows/ci-scripts-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-scripts-build.yml b/.github/workflows/ci-scripts-build.yml index dbf7ad4..d54f6ed 100644 --- a/.github/workflows/ci-scripts-build.yml +++ b/.github/workflows/ci-scripts-build.yml @@ -1,7 +1,7 @@ name: pyDevSup # Trigger on pushes and PRs to any branch -on: [push, pull_request] +on: [push, pull_request, workflow_dispatch] env: SETUP_PATH: .ci-local:.ci From fc9d69623c43d19788f60fb7d3ef1351074e2c8b Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Fri, 12 Sep 2025 16:47:09 +0100 Subject: [PATCH 49/54] Fixed problem with NPY_CARRAY and NPY_CARRAY_RO being unavailable in newer versions of numpy. --- devsupApp/src/dbfield.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/devsupApp/src/dbfield.c b/devsupApp/src/dbfield.c index 193ea6c..e795ecd 100644 --- a/devsupApp/src/dbfield.c +++ b/devsupApp/src/dbfield.c @@ -164,7 +164,7 @@ static int assign_array(DBADDR *paddr, PyObject *arr) } Py_XINCREF(desc); - if(!(aval = PyArray_FromAny(arr, desc, 1, 2, NPY_CARRAY, arr))) + if(!(aval = PyArray_FromAny(arr, desc, 1, 2, NPY_ARRAY_C_CONTIGUOUS | NPY_ARRAY_ALIGNED | NPY_ARRAY_WRITEABLE, arr))) return 1; if(elemsize!=PyArray_ITEMSIZE(aval)) { @@ -219,7 +219,7 @@ static PyObject* pyField_getval(pyField *self) if(self->addr.no_elements>1) { return build_array((PyObject*)self, rawfield, self->addr.field_type, - noe, NPY_CARRAY_RO); + noe, NPY_ARRAY_C_CONTIGUOUS | NPY_ARRAY_ALIGNED); } } @@ -377,7 +377,7 @@ static PyObject *pyField_getarray(pyField *self) } else data = self->addr.pfield; - return build_array((PyObject*)self, data, self->addr.field_type, self->addr.no_elements, NPY_CARRAY); + return build_array((PyObject*)self, data, self->addr.field_type, self->addr.no_elements, NPY_ARRAY_C_CONTIGUOUS | NPY_ARRAY_ALIGNED | NPY_ARRAY_WRITEABLE); } static PyObject *pyField_getlen(pyField *self) From 13e5cbe237682189d9a858c8d76f8d8bf3d2ba0a Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Fri, 12 Sep 2025 16:58:28 +0100 Subject: [PATCH 50/54] Windows server 2019 no longer available. --- .github/workflows/ci-scripts-build.yml | 25 +++++-------------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/.github/workflows/ci-scripts-build.yml b/.github/workflows/ci-scripts-build.yml index d54f6ed..23517fd 100644 --- a/.github/workflows/ci-scripts-build.yml +++ b/.github/workflows/ci-scripts-build.yml @@ -71,7 +71,7 @@ jobs: cmp: vs2022 configuration: default base: "7.0" - python: "3.12" + python: "3.11" profile: latest test: yes @@ -79,33 +79,18 @@ jobs: cmp: vs2022 configuration: default base: "7.0" - python: "3.11" + python: "3.12" profile: latest test: yes - - os: windows-2019 - cmp: vs2019 + - os: windows-latest + cmp: vs2022 configuration: default base: "7.0" - python: "3.10" + python: "3.13" profile: latest test: yes - #- os: ubuntu-latest - # cmp: gcc - # configuration: default - # base: "3.15" - # python: "2.7" - # profile: deb8 - # test: yes - - #- os: ubuntu-latest - # cmp: gcc - # configuration: default - # base: "3.14" - # python: "2.7" - # profile: deb8 - steps: - uses: actions/checkout@v3 with: From 253632150e6a68203f4db6804a64f8b37d34e67e Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Fri, 10 Oct 2025 16:38:21 +0100 Subject: [PATCH 51/54] Tested Windows (and Linux) builds with Base 3.15. Excluded int64 and long string for that reason. Base 3.14 doesn't work because RuntimeError: Requires Base >=3.15. --- .github/workflows/ci-scripts-build.yml | 114 +++++++++++++++++++++++-- devsupApp/src/dbfield.c | 25 +++--- devsupApp/src/devsup/__init__.py | 10 ++- devsupApp/src/devsup/test/test_db.py | 15 +++- makehelper.py | 2 +- pyIocApp/devsupMain.cpp | 2 +- pyIocApp/setup.c | 4 +- 7 files changed, 144 insertions(+), 28 deletions(-) diff --git a/.github/workflows/ci-scripts-build.yml b/.github/workflows/ci-scripts-build.yml index 23517fd..54e7a1b 100644 --- a/.github/workflows/ci-scripts-build.yml +++ b/.github/workflows/ci-scripts-build.yml @@ -11,8 +11,9 @@ env: jobs: build-base: - name: ${{ matrix.base }}/${{ matrix.os }}/${{ matrix.python }}/${{ matrix.extra }} + name: ${{ matrix.base }}/${{ matrix.os }}/${{ matrix.profile }}/${{ matrix.python }}/${{ matrix.extra }} runs-on: ${{ matrix.os }} + container: ${{ matrix.container }} # Set environment variables from matrix parameters env: CMP: ${{ matrix.cmp }} @@ -27,6 +28,57 @@ jobs: fail-fast: false matrix: include: + - os: ubuntu-latest + cmp: gcc + configuration: default + base: "7.0" + python: "3.7" + profile: deb10 + container: "python:3.7" + test: yes + + - os: ubuntu-latest + cmp: gcc + configuration: default + base: "7.0" + python: "3.9" + profile: deb11 + test: yes + + - os: ubuntu-latest + cmp: gcc + configuration: default + base: "7.0" + python: "3.11" + profile: deb12 + test: yes + + - os: ubuntu-latest + cmp: gcc + configuration: default + base: "7.0" + python: "3.13" + profile: deb13 + test: yes + + - os: ubuntu-latest + cmp: gcc + configuration: default + base: "7.0" + python: "3.6" + container: "python:3.6" + profile: latest + test: yes + + - os: ubuntu-latest + cmp: gcc + configuration: default + base: "7.0" + python: "3.7" + container: "python:3.7" + profile: latest + test: yes + - os: ubuntu-latest cmp: gcc configuration: default @@ -51,6 +103,14 @@ jobs: profile: latest test: yes + - os: ubuntu-latest + cmp: gcc + configuration: default + base: "7.0" + python: "3.11" + profile: latest + test: yes + - os: ubuntu-latest cmp: gcc configuration: default @@ -59,6 +119,14 @@ jobs: profile: latest test: yes + - os: ubuntu-latest + cmp: gcc + configuration: default + base: "7.0" + python: "3.13" + profile: latest + test: yes + - os: macos-latest cmp: gcc configuration: default @@ -67,6 +135,40 @@ jobs: profile: latest test: yes + - os: ubuntu-latest + cmp: gcc + configuration: default + base: "3.15" + python: "3.7" + container: "python:3.7" + profile: deb10 + test: yes + + - os: ubuntu-latest + cmp: gcc + configuration: default + base: "3.15" + python: "3.13" + profile: deb13 + test: yes + + #- os: ubuntu-latest + # cmp: gcc + # configuration: default + # base: "3.14" # RuntimeError: Requires Base >=3.15 ?? + # python: "3.7" + # container: "python:3.7" + # profile: deb10 + # test: yes + + - os: windows-latest + cmp: vs2022 + configuration: default + base: "3.15" + python: "3.11" + profile: latest + test: yes + - os: windows-latest cmp: vs2022 configuration: default @@ -96,6 +198,7 @@ jobs: with: submodules: true - name: Set up Python ${{ matrix.python }} + if: ${{ !matrix.container }} uses: actions/setup-python@v4 with: python-version: ${{ matrix.python }} @@ -110,13 +213,8 @@ jobs: EOF echo === configure/CONFIG_SITE.local === cat configure/CONFIG_SITE.local - - name: makehelper.py - run: python makehelper.py - - name: DSOs - shell: bash - run: find ${Python_ROOT_DIR} -name '*.dll' -o -name '*.so' -o -name '*.dylib' - - name: get_config_vars - run: python -c 'from sysconfig import get_config_vars; from pprint import pprint; pprint(get_config_vars())' + - name: Python sysconfig + run: python -m sysconfig - name: Prepare and compile dependencies run: python .ci/cue.py prepare - name: Build main module diff --git a/devsupApp/src/dbfield.c b/devsupApp/src/dbfield.c index e795ecd..104ddf2 100644 --- a/devsupApp/src/dbfield.c +++ b/devsupApp/src/dbfield.c @@ -3,16 +3,9 @@ #undef _POSIX_C_SOURCE #undef _XOPEN_SOURCE -#ifdef _DEBUG -#undef _DEBUG #include #ifdef HAVE_NUMPY -#include -#endif -#define _DEBUG -#else -#include -#include +#include <_numpy/ndarrayobject.h> #endif #include @@ -29,6 +22,11 @@ #endif #ifdef HAVE_NUMPY +/* See https://numpy.org/devdocs/reference/c-api/array.html */ +/* Allow compiling on NumPy 1.x */ +#if NPY_ABI_VERSION < 0x02000000 +#define PyArray_DescrProto PyArray_Descr +#endif static const int dbf2np_map[DBF_MENU+1] = { NPY_STRING, // DBF_STRING NPY_BYTE, // DBF_CHAR @@ -46,7 +44,7 @@ static const int dbf2np_map[DBF_MENU+1] = { NPY_INT16, // DBF_ENUM NPY_INT16, // DBF_MENU }; -static PyArray_Descr* dbf2np[DBF_MENU+1]; +static PyArray_DescrProto* dbf2np[DBF_MENU+1]; #endif typedef struct { @@ -126,23 +124,24 @@ static int assign_array(DBADDR *paddr, PyObject *arr) #ifdef HAVE_NUMPY void *rawfield = paddr->pfield; rset *prset; - PyObject *aval; + PyArrayObject *aval; + PyArrayObject * array = (PyArrayObject *)arr; unsigned elemsize = dbValueSize(paddr->field_type); unsigned long maxlen = paddr->no_elements, insize; PyArray_Descr *desc = dbf2np[paddr->field_type]; if(paddr->field_type==DBF_STRING && - (PyArray_NDIM(arr)!=2 || PyArray_DIM(arr,0)>maxlen || PyArray_DIM(arr,1)!=MAX_STRING_SIZE)) + (PyArray_NDIM(array)!=2 || PyArray_DIM(array,0)>maxlen || PyArray_DIM(array,1)!=MAX_STRING_SIZE)) { PyErr_Format(PyExc_ValueError, "String array has incorrect shape or is too large"); return 1; - } else if(PyArray_NDIM(arr)!=1 || PyArray_DIM(arr,0)>maxlen) { + } else if(PyArray_NDIM(array)!=1 || PyArray_DIM(array,0)>maxlen) { PyErr_Format(PyExc_ValueError, "Array has incorrect shape or is too large"); return 1; } - insize = PyArray_DIM(arr, 0); + insize = PyArray_DIM(array, 0); if(paddr->special==SPC_DBADDR && (prset=dbGetRset(paddr)) && diff --git a/devsupApp/src/devsup/__init__.py b/devsupApp/src/devsup/__init__.py index 10c5a5f..ad3ca24 100644 --- a/devsupApp/src/devsup/__init__.py +++ b/devsupApp/src/devsup/__init__.py @@ -58,6 +58,9 @@ __all__ = [] +def epics_version_int(): + return (EPICS_VERSION, EPICS_REVISION, EPICS_MODIFICATION, EPICS_PATCH_LEVEL) + def _init(iocMain=False): if not iocMain: # we haven't read/register base.dbd @@ -68,11 +71,12 @@ def _init(iocMain=False): dirname = os.path.dirname(__file__) dbd_name = dirname + "/_dbapi.dbd" _dbapi.dbReadDatabase(dbd_name) - epics_version_int = (EPICS_VERSION, EPICS_REVISION, EPICS_MODIFICATION, EPICS_PATCH_LEVEL) - if epics_version_int >= (3, 15, 0, 2): + if epics_version_int() >= (3, 15, 0, 2): + # Long strings are impletemented. dbd_name = dirname + "/_lsilso.dbd" _dbapi.dbReadDatabase(dbd_name) - if epics_version_int >= (3, 16, 1, 0): + if epics_version_int() >= (3, 16, 1, 0): + # Long ints are impletemented. dbd_name = dirname + "/_int64.dbd" _dbapi.dbReadDatabase(dbd_name) _dbapi._dbd_setup() diff --git a/devsupApp/src/devsup/test/test_db.py b/devsupApp/src/devsup/test/test_db.py index 8691bb5..cc8ec89 100644 --- a/devsupApp/src/devsup/test/test_db.py +++ b/devsupApp/src/devsup/test/test_db.py @@ -9,7 +9,7 @@ from ..db import getRecord from .. import _dbapi -from .. import _init +from .. import _init, epics_version_int from .util import IOCHelper @@ -142,8 +142,15 @@ class TestLongStringField(IOCHelper): field(OMSL, "closed_loop") } """ + if epics_version_int() < (3, 15, 0, 2): + # Long strings not impletemented yet. + db = None def test_lsilso(self): + if epics_version_int() < (3, 15, 0, 2): + # Long strings not impletemented yet. + return + lsi = getRecord("rec:lsi") lso = getRecord("rec:lso") @@ -176,8 +183,14 @@ class TestInt64Field(IOCHelper): field(OMSL, "closed_loop") } """ + if epics_version_int() < (3, 16, 1, 0): + # Long ints not impletemented yet. + db = None def testint64(self): + if epics_version_int() < (3, 16, 1, 0): + # Long ints not impletemented yet. + return in64 = getRecord("rec:in64") out64 = getRecord("rec:out64") diff --git a/makehelper.py b/makehelper.py index ceda7bc..ec25b7a 100644 --- a/makehelper.py +++ b/makehelper.py @@ -53,7 +53,7 @@ print('PY_INCDIRS :=',' '.join(incdirs), file=out) print('PY_LIBDIRS :=',libdir, file=out) if sys.platform == 'win32': - print('PY_LDLIBS :=', '/LIBPATH:' + os.path.join(sys.prefix, 'libs'), file=out) + print('PY_LDLIBS :=', '-LIBPATH:' + os.path.join(sys.prefix, 'libs'), file=out) print('HAVE_NUMPY :=',have_np, file=out) try: diff --git a/pyIocApp/devsupMain.cpp b/pyIocApp/devsupMain.cpp index 38eb7b9..17a2384 100644 --- a/pyIocApp/devsupMain.cpp +++ b/pyIocApp/devsupMain.cpp @@ -205,7 +205,7 @@ int main(int argc, char *argv[]) iocsh(NULL); } else { if (loadedDb) { - //epicsThreadExitMain(); + epicsThreadExitMain(); } else { printf("%s: Nothing to do!\n", arg0); usage(EXIT_FAILURE); diff --git a/pyIocApp/setup.c b/pyIocApp/setup.c index e63f3ef..f16d210 100644 --- a/pyIocApp/setup.c +++ b/pyIocApp/setup.c @@ -24,7 +24,6 @@ #include "pydevsup.h" #ifdef _WIN32 -#include #define PATH_MAX _MAX_PATH #endif @@ -134,7 +133,10 @@ static void cleanupPrep(initHookState state) static void pySetupReg(void) { Py_InitializeEx(0); +#if NPY_TARGET_VERSION < NPY_1_9_API_VERSION + /* See https://docs.python.org/3/whatsnew/3.9.html */ PyEval_InitThreads(); +#endif setupPyPath(); From 0e3d6b24f8282fdd829e288aa5fef3b23aca5b74 Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Fri, 10 Oct 2025 16:47:26 +0100 Subject: [PATCH 52/54] Oops, corrected mistakes. --- devsupApp/src/dbfield.c | 2 +- requirements-deb11.txt | 2 ++ requirements-deb12.txt | 2 ++ requirements-deb13.txt | 2 ++ 4 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 requirements-deb11.txt create mode 100644 requirements-deb12.txt create mode 100644 requirements-deb13.txt diff --git a/devsupApp/src/dbfield.c b/devsupApp/src/dbfield.c index 104ddf2..5c64f37 100644 --- a/devsupApp/src/dbfield.c +++ b/devsupApp/src/dbfield.c @@ -5,7 +5,7 @@ #include #ifdef HAVE_NUMPY -#include <_numpy/ndarrayobject.h> +#include #endif #include diff --git a/requirements-deb11.txt b/requirements-deb11.txt new file mode 100644 index 0000000..bc9b6d9 --- /dev/null +++ b/requirements-deb11.txt @@ -0,0 +1,2 @@ +numpy==1.19.5 +nose2==0.9.2 diff --git a/requirements-deb12.txt b/requirements-deb12.txt new file mode 100644 index 0000000..13118a8 --- /dev/null +++ b/requirements-deb12.txt @@ -0,0 +1,2 @@ +numpy==1.24.2 +nose2==0.12.0 diff --git a/requirements-deb13.txt b/requirements-deb13.txt new file mode 100644 index 0000000..abb51c7 --- /dev/null +++ b/requirements-deb13.txt @@ -0,0 +1,2 @@ +numpy==2.2.4 +nose2==0.15.1 From bda892e0007757c7a006474356306d3e367fca45 Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Fri, 31 Oct 2025 12:30:16 +0000 Subject: [PATCH 53/54] Moved toward tford's branch with some small changes. --- devsupApp/src/dbfield.c | 20 ++++++++------------ devsupApp/src/devsup/__init__.py | 1 - documentation/environment.rst | 14 +++++++------- documentation/gettingstarted.rst | 2 +- documentation/index.rst | 2 +- iocBoot/iocapplmon/st.cmd | 2 +- iocBoot/iocarchivemon/st.cmd | 2 +- iocBoot/iocarchivemon/st.cmd.main | 2 +- pyIocApp/setup.c | 1 - 9 files changed, 20 insertions(+), 26 deletions(-) diff --git a/devsupApp/src/dbfield.c b/devsupApp/src/dbfield.c index 5c64f37..ee17c6c 100644 --- a/devsupApp/src/dbfield.c +++ b/devsupApp/src/dbfield.c @@ -22,11 +22,6 @@ #endif #ifdef HAVE_NUMPY -/* See https://numpy.org/devdocs/reference/c-api/array.html */ -/* Allow compiling on NumPy 1.x */ -#if NPY_ABI_VERSION < 0x02000000 -#define PyArray_DescrProto PyArray_Descr -#endif static const int dbf2np_map[DBF_MENU+1] = { NPY_STRING, // DBF_STRING NPY_BYTE, // DBF_CHAR @@ -44,7 +39,11 @@ static const int dbf2np_map[DBF_MENU+1] = { NPY_INT16, // DBF_ENUM NPY_INT16, // DBF_MENU }; -static PyArray_DescrProto* dbf2np[DBF_MENU+1]; +static PyArray_Descr* dbf2np[DBF_MENU+1]; +#if NPY_ABI_VERSION < 0x02000000 + #define PyDataType_ELSIZE(descr) ((descr)->elsize) + #define PyDataType_SET_ELSIZE(descr, size) (descr)->elsize = size +#endif #endif typedef struct { @@ -103,12 +102,7 @@ static PyObject* build_array(PyObject* obj, void *data, unsigned short ftype, un desc = dbf2np[ftype]; if(ftype==DBF_STRING) { -#if NPY_ABI_VERSION >= 0x02000000 - // See https://github.com/pytorch/pytorch/issues/121798 PyDataType_SET_ELSIZE(desc, MAX_STRING_SIZE); -#else - desc->elsize = MAX_STRING_SIZE; -#endif } Py_XINCREF(desc); @@ -131,7 +125,9 @@ static int assign_array(DBADDR *paddr, PyObject *arr) PyArray_Descr *desc = dbf2np[paddr->field_type]; if(paddr->field_type==DBF_STRING && - (PyArray_NDIM(array)!=2 || PyArray_DIM(array,0)>maxlen || PyArray_DIM(array,1)!=MAX_STRING_SIZE)) + (PyArray_NDIM(array) != 2 || + PyArray_DIM(array, 0) > (npy_intp) maxlen || + PyArray_DIM(array, 1) != MAX_STRING_SIZE)) { PyErr_Format(PyExc_ValueError, "String array has incorrect shape or is too large"); return 1; diff --git a/devsupApp/src/devsup/__init__.py b/devsupApp/src/devsup/__init__.py index ad3ca24..2ce3ba3 100644 --- a/devsupApp/src/devsup/__init__.py +++ b/devsupApp/src/devsup/__init__.py @@ -81,7 +81,6 @@ def _init(iocMain=False): _dbapi.dbReadDatabase(dbd_name) _dbapi._dbd_setup() - def _fini(iocMain=False): if iocMain: _dbapi.initHookAnnounce(9999) # our magic/fake AtExit hook diff --git a/documentation/environment.rst b/documentation/environment.rst index a33677b..076d7cb 100644 --- a/documentation/environment.rst +++ b/documentation/environment.rst @@ -4,7 +4,7 @@ Runtime Environment The pyDevSup module initializes the interpreter during the registration phase of IOC startup with the *pySetupReg* registrar function. :: - #!../../bin/linux-x86_64/softIocPy2.7 + #!../../bin/linux-x86_64/softIocPy3.6 # Interpreter not started dbLoadDatabase("../../dbd/softIocPy.dbd",0,0) softIocPy_registerRecordDeviceDriver(pdbbase) @@ -51,7 +51,7 @@ file. :: The default or preferred Python version can be specificed in *configure/CONFIG_SITE* :: - PY_VER ?= 2.7 + PY_VER ?= 3.6 The following should be added to individual EPICS Makefiles. :: @@ -64,8 +64,8 @@ The following should be added to individual EPICS Makefiles. :: This will add or amend several make variables. The ``USR_*FLAGS`` variables may be extended with appropriate flags for building python modules. The ``PY_VER`` -variable is defined with the Python version number found in install directories (eg "2.7"). -The ``PY_LD_VER`` variable is defined with the python library version number (eg "3.2mu"), +variable is defined with the Python version number found in install directories (eg "3.6"). +The ``PY_LD_VER`` variable is defined with the python library version number (eg "3.6mu"), which may be the same as ``PY_VER``. Include pyDevSup in your IOC @@ -113,11 +113,11 @@ Installing for several Python versions The recipe for building and installing the pyDevSup module for several python version side by side is :: - make PY_VER=2.6 + make PY_VER=3.6 make clean - make PY_VER=2.7 + make PY_VER=3.10 make clean - make PY_VER=3.2 + make PY_VER=3.14 make clean The ``PYTHON`` make variable can be specified if the interpreter executable diff --git a/documentation/gettingstarted.rst b/documentation/gettingstarted.rst index ef542ef..294494a 100644 --- a/documentation/gettingstarted.rst +++ b/documentation/gettingstarted.rst @@ -24,7 +24,7 @@ The :py:meth:`process ` method increments the *VAL* field Start this IOC with. :: - $ ./bin/linux-x86_64/softIocPy2.7 -d cntrec.db + $ ./bin/linux-x86_64/softIocPy3.6 -d cntrec.db Starting iocInit ... iocRun: All initialization complete diff --git a/documentation/index.rst b/documentation/index.rst index 2acf7b1..ec7ae61 100644 --- a/documentation/index.rst +++ b/documentation/index.rst @@ -8,7 +8,7 @@ pydevsup documentation *pyDevSup* is a means of writing EPICS device support code in Python. -It currently supports EPICS >=3.14.12 and python versions: 2.7, and >=3.2. +It currently supports EPICS >=3.15 and python versions: >=3.6 The numpy package is also required. The source can be found at http://github.com/mdavidsaver/pyDevSup diff --git a/iocBoot/iocapplmon/st.cmd b/iocBoot/iocapplmon/st.cmd index aa5f9d7..f345464 100755 --- a/iocBoot/iocapplmon/st.cmd +++ b/iocBoot/iocapplmon/st.cmd @@ -1,4 +1,4 @@ -#!../../bin/linux-x86_64/softIocPy3.10 +#!../../bin/linux-x86_64/softIocPy3.6 < envPaths diff --git a/iocBoot/iocarchivemon/st.cmd b/iocBoot/iocarchivemon/st.cmd index df1e3ff..632e7a6 100755 --- a/iocBoot/iocarchivemon/st.cmd +++ b/iocBoot/iocarchivemon/st.cmd @@ -1,4 +1,4 @@ -#!../../bin/linux-x86_64/softIocPy3.10 +#!../../bin/linux-x86_64/softIocPy3.6 < envPaths diff --git a/iocBoot/iocarchivemon/st.cmd.main b/iocBoot/iocarchivemon/st.cmd.main index df00b9c..ea10a94 100755 --- a/iocBoot/iocarchivemon/st.cmd.main +++ b/iocBoot/iocarchivemon/st.cmd.main @@ -1,4 +1,4 @@ -#!../../bin/linux-x86_64/softIocPy2.7 +#!../../bin/linux-x86_64/softIocPy3.6 < envPaths diff --git a/pyIocApp/setup.c b/pyIocApp/setup.c index f16d210..fa29ed7 100644 --- a/pyIocApp/setup.c +++ b/pyIocApp/setup.c @@ -137,7 +137,6 @@ static void pySetupReg(void) /* See https://docs.python.org/3/whatsnew/3.9.html */ PyEval_InitThreads(); #endif - setupPyPath(); if(PyRun_SimpleString("import devsup\n" From a2fec4c32592a494bf62b78689eeb82aa43ec8fb Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Wed, 17 Dec 2025 18:12:50 +0000 Subject: [PATCH 54/54] Re-engineered the alarm handling stuff. Updated the readme file with changed repository location. --- README.md | 4 ++-- devsupApp/src/devsup/ptable.py | 40 ++++++++++------------------------ 2 files changed, 13 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 7251f5a..2fecd12 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,6 @@ pyDevSup EPICS Device support in Python. -See [documentation](http://mdavidsaver.github.io/pyDevSup) +See [documentation](http://epics-modules.github.io/pyDevSup) -For file [releases](https://github.com/mdavidsaver/pyDevSup/releases) +For file [releases](https://github.com/epics-modules/pyDevSup/releases) diff --git a/devsupApp/src/devsup/ptable.py b/devsupApp/src/devsup/ptable.py index d8869f3..b575c08 100644 --- a/devsupApp/src/devsup/ptable.py +++ b/devsupApp/src/devsup/ptable.py @@ -164,9 +164,6 @@ def __init__(self, table, name, scan): self.stat = NO_ALARM self.amsg = "" self._groups = set() - self._sevr = None - self._rec = None - self._locked = False def _get_value(self): return self._value def _set_value(self, val): @@ -237,19 +234,19 @@ def process(self, rec, reason=None): """Read a value from the table into the record """ with self.inst.table.lock: - nval, alrm = self.inst.value, self.inst.alarm - self.inst.table.log.debug('%s -> %s (%s)', self.inst.name, rec.NAME, nval) + value, alarm, stat, msg = self.inst.value, self.inst.alarm, self.inst.stat, self.inst.amsg + self.inst.table.log.debug('%s -> %s (%s)', self.inst.name, rec.NAME, value) - if nval is not None: + if value is not None: if self.vdata is None: - self.vfld.putval(nval) + self.vfld.putval(value) else: - if len(nval)>len(self.vdata): + if len(value)>len(self.vdata): nval = nval[:len(self.vdata)] - self.vdata[:len(nval)] = nval - self.vfld.putarraylen(len(nval)) - if alrm: - rec.setSevr(alrm) + self.vdata[:len(value)] = value + self.vfld.putarraylen(len(value)) + if alarm: + rec.setSevr(alarm, stat, msg) else: # undefined value rec.setSevr(INVALID_ALARM, UDF_ALARM) @@ -265,9 +262,6 @@ def process(self, rec, reason=None): else: # sync record to table self.inst.table.log.debug('%s <- %s (%s)', self.inst.name, rec.NAME, rec.VAL) - if self.inst._sevr is None: - self.inst._sevr = rec.field('SEVR') - self.inst._rec = rec if self.vdata is None: nval = self.vfld.getval() else: @@ -279,21 +273,9 @@ def process(self, rec, reason=None): # Execute actions self.inst._exec(oval) - oldsevr = self.inst._sevr.getval() - if oldsevr != self.inst.alarm: - rec.setSevr(self.inst.alarm, self.inst.stat, self.inst.amsg) - self.inst._locked = False + rec.setSevr(self.inst.alarm, self.inst.stat, self.inst.amsg) for G in self.inst._groups: - for param in G._params: - if self.inst != param and param._sevr is not None: - with param.table.lock: - oldsevr = param._sevr.getval() - if oldsevr != param.alarm: - if param._locked: - pass - else: - param._locked = True - param._rec.scan(sync=False, force=0) + G._exec() class TableBase(object): """Base class for all parameter tables.

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≈<F@OK9~$&%P3&0ShA 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 Wfc)oc)WE+g;1T)r8{pLr;C}$&iu-K< literal 17123 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 From 020f760db41bb75497cb0c2fe66e409dd1d324fa Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Sat, 4 Mar 2023 12:41:13 +0000 Subject: [PATCH 06/54] Updated to VS2022 and Python 3.11 --- devsupApp/_dbapi.vcxproj | 50 +++++++++++++++++------------------ devsupApp/src/dbapi.c | 11 ++++++-- devsupApp/src/dbdset.c | 8 +++++- devsupApp/src/dbfield.c | 9 +++++-- devsupApp/src/dbrec.c | 9 +++++-- devsupApp/src/pydevsup.h | 8 +++++- devsupApp/src/utest.c | 8 +++++- pyIocApp/pyDevSup310.vcxproj | 50 +++++++++++++++++------------------ pyIocApp/setup.c | 9 +++++-- pyIocApp/softIocPy310.vcxproj | 50 +++++++++++++++++------------------ 10 files changed, 126 insertions(+), 86 deletions(-) diff --git a/devsupApp/_dbapi.vcxproj b/devsupApp/_dbapi.vcxproj index 1e86232..4e68255 100644 --- a/devsupApp/_dbapi.vcxproj +++ b/devsupApp/_dbapi.vcxproj @@ -73,59 +73,59 @@ SubversionScc Svn _dbapi - 10.0.17763.0 + 10.0 DynamicLibrary true - v141 + v143 false DynamicLibrary true - v141 + v143 false DynamicLibrary true - v141 + v143 false DynamicLibrary true - v141 + v143 false DynamicLibrary false true - v141 + v143 false DynamicLibrary false true - v141 + v143 false DynamicLibrary false true - v141 + v143 false DynamicLibrary false true - v141 + v143 false @@ -189,14 +189,14 @@ Level3 Disabled XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";_DEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python311\include;C:\Python311\Lib\site-packages\numpy\core\include 4251 Console true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python310\libs + C:\Python311\libs @@ -221,14 +221,14 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com Level3 Disabled XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";_DEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python311\include;C:\Python311\Lib\site-packages\numpy\core\include 4251 Console true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python310\libs + C:\Python311\libs @@ -253,14 +253,14 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com Level3 Disabled XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";_DEBUG;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python311\include;C:\Python311\Lib\site-packages\numpy\core\include MultiThreadedDebug Console true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python310\libs + C:\Python311\libs @@ -285,14 +285,14 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com Level3 Disabled XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";_DEBUG;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python311\include;C:\Python311\Lib\site-packages\numpy\core\include MultiThreadedDebug Console true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python310\libs + C:\Python311\libs @@ -319,7 +319,7 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com true true XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";NDEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python311\include;C:\Python311\Lib\site-packages\numpy\core\include 4251 @@ -328,7 +328,7 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com true true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python310\libs + C:\Python311\libs @@ -355,7 +355,7 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com true true XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";NDEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python311\include;C:\Python311\Lib\site-packages\numpy\core\include 4251 @@ -364,7 +364,7 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com true true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python310\libs + C:\Python311\libs @@ -391,7 +391,7 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com true true XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";NDEBUG;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python311\include;C:\Python311\Lib\site-packages\numpy\core\include MultiThreaded @@ -400,7 +400,7 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com true true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python310\libs + C:\Python311\libs @@ -427,7 +427,7 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com true true XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";NDEBUG;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python311\include;C:\Python311\Lib\site-packages\numpy\core\include MultiThreaded @@ -436,7 +436,7 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com true true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python310\libs + C:\Python311\libs diff --git a/devsupApp/src/dbapi.c b/devsupApp/src/dbapi.c index f859cd6..430b5bf 100644 --- a/devsupApp/src/dbapi.c +++ b/devsupApp/src/dbapi.c @@ -2,10 +2,17 @@ #undef _POSIX_C_SOURCE #undef _XOPEN_SOURCE -#include -#ifdef HAVE_NUMPY +#ifdef _DEBUG +#undef _DEBUG +#include +#include +#define _DEBUG +#else +#include #include #endif +#ifdef HAVE_NUMPY +#endif #include diff --git a/devsupApp/src/dbdset.c b/devsupApp/src/dbdset.c index 845d1b2..dc129f5 100644 --- a/devsupApp/src/dbdset.c +++ b/devsupApp/src/dbdset.c @@ -3,7 +3,13 @@ #undef _POSIX_C_SOURCE #undef _XOPEN_SOURCE -#include +#ifdef _DEBUG +#undef _DEBUG +#include +#define _DEBUG +#else +#include +#endif #include #include diff --git a/devsupApp/src/dbfield.c b/devsupApp/src/dbfield.c index 4a03cba..91ce75a 100644 --- a/devsupApp/src/dbfield.c +++ b/devsupApp/src/dbfield.c @@ -3,8 +3,13 @@ #undef _POSIX_C_SOURCE #undef _XOPEN_SOURCE -#include -#ifdef HAVE_NUMPY +#ifdef _DEBUG +#undef _DEBUG +#include +#include +#define _DEBUG +#else +#include #include #endif diff --git a/devsupApp/src/dbrec.c b/devsupApp/src/dbrec.c index 7802fe5..8eb2d4d 100644 --- a/devsupApp/src/dbrec.c +++ b/devsupApp/src/dbrec.c @@ -3,8 +3,13 @@ #undef _POSIX_C_SOURCE #undef _XOPEN_SOURCE -#include - +#ifdef _DEBUG +#undef _DEBUG +#include +#define _DEBUG +#else +#include +#endif #include #include #include diff --git a/devsupApp/src/pydevsup.h b/devsupApp/src/pydevsup.h index 21cce23..4625082 100644 --- a/devsupApp/src/pydevsup.h +++ b/devsupApp/src/pydevsup.h @@ -5,7 +5,13 @@ #include #include -#include +#ifdef _DEBUG +#undef _DEBUG +#include +#define _DEBUG +#else +#include +#endif #ifndef VERSION_INT # define VERSION_INT(V,R,M,P) ( ((V)<<24) | ((R)<<16) | ((M)<<8) | (P)) diff --git a/devsupApp/src/utest.c b/devsupApp/src/utest.c index 95eeb1d..cadb708 100644 --- a/devsupApp/src/utest.c +++ b/devsupApp/src/utest.c @@ -3,7 +3,13 @@ #undef _POSIX_C_SOURCE #undef _XOPEN_SOURCE -#include +#ifdef _DEBUG +#undef _DEBUG +#include +#define _DEBUG +#else +#include +#endif #include #include diff --git a/pyIocApp/pyDevSup310.vcxproj b/pyIocApp/pyDevSup310.vcxproj index 787bbc5..ddf8711 100644 --- a/pyIocApp/pyDevSup310.vcxproj +++ b/pyIocApp/pyDevSup310.vcxproj @@ -64,59 +64,59 @@ SubversionScc Svn pyDevSup310 - 10.0.17763.0 + 10.0 DynamicLibrary true - v141 + v143 false DynamicLibrary true - v141 + v143 false StaticLibrary true - v141 + v143 false StaticLibrary true - v141 + v143 false DynamicLibrary false true - v141 + v143 false DynamicLibrary false true - v141 + v143 false StaticLibrary false true - v141 + v143 false StaticLibrary false true - v141 + v143 false @@ -181,8 +181,8 @@ Level3 Disabled - XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python310";XEPICS_ARCH="$(Configuration)";_DEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include + XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python311";XEPICS_ARCH="$(Configuration)";_DEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python311\include;C:\Python311\Lib\site-packages\numpy\core\include 4251 @@ -210,8 +210,8 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com Level3 Disabled - XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python310";XEPICS_ARCH="$(Configuration)";_DEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include + XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python311";XEPICS_ARCH="$(Configuration)";_DEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python311\include;C:\Python311\Lib\site-packages\numpy\core\include 4251 @@ -239,8 +239,8 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com Level3 Disabled - XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python310";XEPICS_ARCH="$(Configuration)";_DEBUG;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include + XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python311";XEPICS_ARCH="$(Configuration)";_DEBUG;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python311\include;C:\Python311\Lib\site-packages\numpy\core\include MultiThreadedDebug @@ -267,8 +267,8 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com Level3 Disabled - XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python310";XEPICS_ARCH="$(Configuration)";_DEBUG;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include + XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python311";XEPICS_ARCH="$(Configuration)";_DEBUG;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python311\include;C:\Python311\Lib\site-packages\numpy\core\include MultiThreadedDebug @@ -297,8 +297,8 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com MaxSpeed true true - XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python310";XEPICS_ARCH="$(Configuration)";NDEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include + XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python311";XEPICS_ARCH="$(Configuration)";NDEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python311\include;C:\Python311\Lib\site-packages\numpy\core\include 4251 @@ -330,8 +330,8 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com MaxSpeed true true - XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python310";XEPICS_ARCH="$(Configuration)";NDEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include + XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python311";XEPICS_ARCH="$(Configuration)";NDEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python311\include;C:\Python311\Lib\site-packages\numpy\core\include 4251 @@ -363,8 +363,8 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com MaxSpeed true true - XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python310";XEPICS_ARCH="$(Configuration)";NDEBUG;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include + XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python311";XEPICS_ARCH="$(Configuration)";NDEBUG;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python311\include;C:\Python311\Lib\site-packages\numpy\core\include MultiThreaded @@ -395,8 +395,8 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com MaxSpeed true true - XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python310";XEPICS_ARCH="$(Configuration)";NDEBUG;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include + XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python311";XEPICS_ARCH="$(Configuration)";NDEBUG;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python311\include;C:\Python311\Lib\site-packages\numpy\core\include MultiThreaded diff --git a/pyIocApp/setup.c b/pyIocApp/setup.c index 4c880c0..0e556ba 100644 --- a/pyIocApp/setup.c +++ b/pyIocApp/setup.c @@ -5,8 +5,13 @@ #undef _POSIX_C_SOURCE #undef _XOPEN_SOURCE -#include -#ifdef HAVE_NUMPY +#ifdef _DEBUG +#undef _DEBUG +#include +#include +#define _DEBUG +#else +#include #include #endif diff --git a/pyIocApp/softIocPy310.vcxproj b/pyIocApp/softIocPy310.vcxproj index 03dded0..5e62a5e 100644 --- a/pyIocApp/softIocPy310.vcxproj +++ b/pyIocApp/softIocPy310.vcxproj @@ -72,59 +72,59 @@ SubversionScc Svn softIocPy310 - 10.0.17763.0 + 10.0 Application true - v141 + v143 false Application true - v141 + v143 false Application true - v141 + v143 false Application true - v141 + v143 false Application false true - v141 + v143 false Application false true - v141 + v143 false Application false true - v141 + v143 false Application false true - v141 + v143 false @@ -186,13 +186,13 @@ Level3 Disabled WIN32;XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";_DEBUG;EPICS_CALL_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;..\devsupApp\src + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python311\include;..\devsupApp\src Console true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python310\libs + C:\Python311\libs @@ -217,13 +217,13 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com Level3 Disabled WIN32;XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";_DEBUG;EPICS_CALL_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;..\devsupApp\src + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python311\include;..\devsupApp\src Console true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python310\libs + C:\Python311\libs @@ -248,14 +248,14 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com Level3 Disabled WIN32;XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";_DEBUG;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;..\devsupApp\src + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python311\include;..\devsupApp\src MultiThreadedDebug Console true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python310\libs + C:\Python311\libs @@ -280,14 +280,14 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com Level3 Disabled WIN32;XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";_DEBUG;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;..\devsupApp\src + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python311\include;..\devsupApp\src MultiThreadedDebug Console true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python310\libs + C:\Python311\libs @@ -314,7 +314,7 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com true true WIN32;XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";NDEBUG;EPICS_CALL_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;..\devsupApp\src + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python311\include;..\devsupApp\src Console @@ -322,7 +322,7 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com true true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python310\libs + C:\Python311\libs @@ -349,7 +349,7 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com true true WIN32;XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";NDEBUG;EPICS_CALL_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;..\devsupApp\src + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python311\include;..\devsupApp\src Console @@ -357,7 +357,7 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com true true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python310\libs + C:\Python311\libs @@ -384,7 +384,7 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com true true WIN32;XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";NDEBUG;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;..\devsupApp\src + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python311\include;..\devsupApp\src MultiThreaded @@ -393,7 +393,7 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com true true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python310\libs + C:\Python311\libs @@ -420,7 +420,7 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com true true WIN32;XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";NDEBUG;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;..\devsupApp\src + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python311\include;..\devsupApp\src MultiThreaded @@ -429,7 +429,7 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com true true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python310\libs + C:\Python311\libs From 934709180238d01c764b8277e9958cf3d5c419a2 Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Thu, 9 Mar 2023 17:20:10 +0000 Subject: [PATCH 07/54] Got it working with Michael's help. --- devsupApp/_dbapi.vcxproj | 54 ++++++++++++++-------------- devsupApp/src/dbapi.c | 16 +++++++++ devsupApp/src/devsup/__init__.py | 6 ++-- iocBoot/iocweatherbnl/st.cmd | 4 +-- pyDevSup.sln | 22 ++++++------ pyIocApp/pyDevSup310.vcxproj | 38 ++++++++++---------- pyIocApp/softIocPy310.vcxproj | 58 +++++++++++++++--------------- pyIocApp/softIocPy310.vcxproj.user | 11 ++++-- weatherApp/weather.py | 6 ++-- 9 files changed, 119 insertions(+), 96 deletions(-) diff --git a/devsupApp/_dbapi.vcxproj b/devsupApp/_dbapi.vcxproj index 4e68255..da8949a 100644 --- a/devsupApp/_dbapi.vcxproj +++ b/devsupApp/_dbapi.vcxproj @@ -54,13 +54,13 @@ - + {422a8c73-836c-48cb-86c8-0591e69c0ca1} - + {9cf8d9ab-e47d-4923-a251-80e40b4e7144} - + {e9d99fc7-e592-472b-b2e2-c3b0d81d8169} @@ -188,15 +188,15 @@ Level3 Disabled - XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";_DEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python311\include;C:\Python311\Lib\site-packages\numpy\core\include + XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";_DEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include 4251 Console true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python311\libs + C:\Python310\libs @@ -220,15 +220,15 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com Level3 Disabled - XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";_DEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python311\include;C:\Python311\Lib\site-packages\numpy\core\include + XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";_DEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include 4251 Console true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python311\libs + C:\Python310\libs @@ -252,15 +252,15 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com Level3 Disabled - XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";_DEBUG;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python311\include;C:\Python311\Lib\site-packages\numpy\core\include + XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";_DEBUG;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include MultiThreadedDebug Console true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python311\libs + C:\Python310\libs @@ -284,15 +284,15 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com Level3 Disabled - XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";_DEBUG;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python311\include;C:\Python311\Lib\site-packages\numpy\core\include + XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";_DEBUG;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include MultiThreadedDebug Console true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python311\libs + C:\Python310\libs @@ -318,8 +318,8 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com MaxSpeed true true - XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";NDEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python311\include;C:\Python311\Lib\site-packages\numpy\core\include + XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";NDEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include 4251 @@ -328,7 +328,7 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com true true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python311\libs + C:\Python310\libs @@ -354,8 +354,8 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com MaxSpeed true true - XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";NDEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python311\include;C:\Python311\Lib\site-packages\numpy\core\include + XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";NDEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include 4251 @@ -364,7 +364,7 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com true true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python311\libs + C:\Python310\libs @@ -390,8 +390,8 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com MaxSpeed true true - XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";NDEBUG;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python311\include;C:\Python311\Lib\site-packages\numpy\core\include + XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";NDEBUG;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include MultiThreaded @@ -400,7 +400,7 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com true true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python311\libs + C:\Python310\libs @@ -426,8 +426,8 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com MaxSpeed true true - XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";NDEBUG;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python311\include;C:\Python311\Lib\site-packages\numpy\core\include + XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;XEPICS_ARCH="$(Configuration)";NDEBUG;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include MultiThreaded @@ -436,7 +436,7 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com true true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python311\libs + C:\Python310\libs diff --git a/devsupApp/src/dbapi.c b/devsupApp/src/dbapi.c index 430b5bf..eb57538 100644 --- a/devsupApp/src/dbapi.c +++ b/devsupApp/src/dbapi.c @@ -32,6 +32,22 @@ #include "pydevsup.h" +#ifdef INCdbAccessDefsh +#pragma message("INCdbAccessDefsh") +#endif + +#ifdef INCLdb_access_routinesh +#pragma message("INCLdb_access_routinesh") +#error +#endif + +#ifdef INCLdb_converth +#pragma message("INCLdb_converth") +#error +#endif + + + initHookState pyInitLastState; extern int pyDevSupCommon_registerRecordDeviceDriver(DBBASE *pbase); diff --git a/devsupApp/src/devsup/__init__.py b/devsupApp/src/devsup/__init__.py index d1ff048..ea33c37 100644 --- a/devsupApp/src/devsup/__init__.py +++ b/devsupApp/src/devsup/__init__.py @@ -2,9 +2,9 @@ import atexit import tempfile -from . import _dbapi +import devsup._dbapi -from ._dbapi import (EPICS_VERSION_STRING, +from devsup._dbapi import (EPICS_VERSION_STRING, EPICS_DEV_SNAPSHOT, EPICS_SITE_VERSION, EPICS_VERSION, @@ -79,7 +79,7 @@ def _init(iocMain=False): """.encode('ascii')) F.close() _dbapi.dbReadDatabase(F.name) - os.unlink(F.name) + #os.unlink(F.name) _dbapi._dbd_setup() diff --git a/iocBoot/iocweatherbnl/st.cmd b/iocBoot/iocweatherbnl/st.cmd index a6426a6..7fd6710 100755 --- a/iocBoot/iocweatherbnl/st.cmd +++ b/iocBoot/iocweatherbnl/st.cmd @@ -4,7 +4,7 @@ cd("$(TOP)") -epicsEnvSet("http_proxy", "http://proxy:8888/") +#epicsEnvSet("http_proxy", "http://proxy:8888/") epicsEnvSet("PYTHONPATH", "${TOP}/python/$(ARCH)") @@ -18,4 +18,4 @@ dbl > weather.dbl system "cp weather.dbl /cf-update/${HOSTNAME}.${IOCNAME}.dbl" # Start Reference tracker -py "from devsup import disect; disect.periodic(10)" +#py "from devsup import disect; disect.periodic(10)" diff --git a/pyDevSup.sln b/pyDevSup.sln index 984f63b..5fd39bd 100644 --- a/pyDevSup.sln +++ b/pyDevSup.sln @@ -2,15 +2,15 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 VisualStudioVersion = 15.0.28307.136 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Com", "..\..\base-7.0.6.1\modules\libcom\src\Com.vcxproj", "{E9D99FC7-E592-472B-B2E2-C3B0D81D8169}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Com", "..\..\base-7.0.7\modules\libcom\src\Com.vcxproj", "{E9D99FC7-E592-472B-B2E2-C3B0D81D8169}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ca", "..\..\base-7.0.6.1\modules\ca\src\client\ca.vcxproj", "{361BCEBD-8B02-4B15-B28B-863F0602CB99}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ca", "..\..\base-7.0.7\modules\ca\src\client\ca.vcxproj", "{361BCEBD-8B02-4B15-B28B-863F0602CB99}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "e_flex", "..\..\base-7.0.6.1\modules\libcom\src\flex\e_flex.vcxproj", "{280222D8-1C6B-430D-8F32-C8A47397525B}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "e_flex", "..\..\base-7.0.7\modules\libcom\src\flex\e_flex.vcxproj", "{280222D8-1C6B-430D-8F32-C8A47397525B}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "antelope", "..\..\base-7.0.6.1\modules\libcom\src\yacc\antelope.vcxproj", "{B06AFD40-69E3-4D78-B401-75A27C869381}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "antelope", "..\..\base-7.0.7\modules\libcom\src\yacc\antelope.vcxproj", "{B06AFD40-69E3-4D78-B401-75A27C869381}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "base-7.0.6.1", "base-7.0.6.1", "{D772CB17-6D38-48F4-958E-6A721026C056}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "base-7.0.7", "base-7.0.7", "{D772CB17-6D38-48F4-958E-6A721026C056}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{AF70446C-3E93-42DF-9943-18DDCFA4991A}" EndProject @@ -20,21 +20,21 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "yacc", "yacc", "{D915C7BF-E EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tools", "tools", "{72F51F37-2669-43E0-A166-04E8FD34B294}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tools", "..\..\base-7.0.6.1\src\tools\tools.vcxproj", "{5CCE1C6A-2BD5-48BF-99E2-D29B58F91991}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tools", "..\..\base-7.0.7\src\tools\tools.vcxproj", "{5CCE1C6A-2BD5-48BF-99E2-D29B58F91991}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ioc", "ioc", "{5499ACCB-903F-4F89-AAFA-C82E7AF7F132}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dbCore", "..\..\base-7.0.6.1\modules\database\src\ioc\dbCore.vcxproj", "{422A8C73-836C-48CB-86C8-0591E69C0CA1}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dbCore", "..\..\base-7.0.7\modules\database\src\ioc\dbCore.vcxproj", "{422A8C73-836C-48CB-86C8-0591E69C0CA1}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dbRecStd", "..\..\base-7.0.6.1\modules\database\src\std\dbRecStd.vcxproj", "{9CF8D9AB-E47D-4923-A251-80E40B4E7144}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dbRecStd", "..\..\base-7.0.7\modules\database\src\std\dbRecStd.vcxproj", "{9CF8D9AB-E47D-4923-A251-80E40B4E7144}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "softIoc", "softIoc", "{BA5F5A20-2C40-4066-AE19-9853DFF82EEE}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "softIoc", "..\..\base-7.0.6.1\modules\database\src\std\softIoc\softIoc.vcxproj", "{CE14B4D8-C63F-4EA6-9DE4-CACE48EA092C}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "softIoc", "..\..\base-7.0.7\modules\database\src\std\softIoc\softIoc.vcxproj", "{CE14B4D8-C63F-4EA6-9DE4-CACE48EA092C}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "bpt", "bpt", "{3BE95765-EB5A-44D6-9369-A8759A2FAFDE}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "makeBpt", "..\..\base-7.0.6.1\modules\database\src\ioc\bpt\makeBpt.vcxproj", "{A17BA797-3CA6-47F9-B47E-673118EABA1A}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "makeBpt", "..\..\base-7.0.7\modules\database\src\ioc\bpt\makeBpt.vcxproj", "{A17BA797-3CA6-47F9-B47E-673118EABA1A}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "pyDevSup", "pyDevSup", "{D04ACFD8-B76B-4D6C-BF02-F280CF75ABAA}" EndProject @@ -62,7 +62,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "std", "std", "{B81B8DF0-D48 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tools", "tools", "{76FAEC6F-2322-43DF-B96E-D2D0EDF57845}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dbtools", "..\..\base-7.0.6.1\modules\database\src\tools\dbtools.vcxproj", "{421A512B-4C74-4461-9956-DC5864275D18}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dbtools", "..\..\base-7.0.7\modules\database\src\tools\dbtools.vcxproj", "{421A512B-4C74-4461-9956-DC5864275D18}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{154531C9-D836-409A-9B2D-E7E893510855}" EndProject diff --git a/pyIocApp/pyDevSup310.vcxproj b/pyIocApp/pyDevSup310.vcxproj index ddf8711..a7c5d3a 100644 --- a/pyIocApp/pyDevSup310.vcxproj +++ b/pyIocApp/pyDevSup310.vcxproj @@ -38,13 +38,13 @@ - + {422a8c73-836c-48cb-86c8-0591e69c0ca1} - + {9cf8d9ab-e47d-4923-a251-80e40b4e7144} - + {e9d99fc7-e592-472b-b2e2-c3b0d81d8169} @@ -181,8 +181,8 @@ Level3 Disabled - XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python311";XEPICS_ARCH="$(Configuration)";_DEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python311\include;C:\Python311\Lib\site-packages\numpy\core\include + XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python310";XEPICS_ARCH="$(Configuration)";_DEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include 4251 @@ -210,8 +210,8 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com Level3 Disabled - XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python311";XEPICS_ARCH="$(Configuration)";_DEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python311\include;C:\Python311\Lib\site-packages\numpy\core\include + XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python310";XEPICS_ARCH="$(Configuration)";_DEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include 4251 @@ -239,8 +239,8 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com Level3 Disabled - XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python311";XEPICS_ARCH="$(Configuration)";_DEBUG;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python311\include;C:\Python311\Lib\site-packages\numpy\core\include + XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python310";XEPICS_ARCH="$(Configuration)";_DEBUG;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include MultiThreadedDebug @@ -267,8 +267,8 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com Level3 Disabled - XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python311";XEPICS_ARCH="$(Configuration)";_DEBUG;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python311\include;C:\Python311\Lib\site-packages\numpy\core\include + XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python310";XEPICS_ARCH="$(Configuration)";_DEBUG;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include MultiThreadedDebug @@ -297,8 +297,8 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com MaxSpeed true true - XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python311";XEPICS_ARCH="$(Configuration)";NDEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python311\include;C:\Python311\Lib\site-packages\numpy\core\include + XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python310";XEPICS_ARCH="$(Configuration)";NDEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include 4251 @@ -330,8 +330,8 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com MaxSpeed true true - XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python311";XEPICS_ARCH="$(Configuration)";NDEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python311\include;C:\Python311\Lib\site-packages\numpy\core\include + XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python310";XEPICS_ARCH="$(Configuration)";NDEBUG;EPICS_CALL_DLL;EPICS_BUILD_DLL;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include 4251 @@ -363,8 +363,8 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com MaxSpeed true true - XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python311";XEPICS_ARCH="$(Configuration)";NDEBUG;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python311\include;C:\Python311\Lib\site-packages\numpy\core\include + XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python310";XEPICS_ARCH="$(Configuration)";NDEBUG;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include MultiThreaded @@ -395,8 +395,8 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com MaxSpeed true true - XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python311";XEPICS_ARCH="$(Configuration)";NDEBUG;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python311\include;C:\Python311\Lib\site-packages\numpy\core\include + XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";HAVE_NUMPY;PYDIR="python310";XEPICS_ARCH="$(Configuration)";NDEBUG;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;..\devsupApp\src;C:\Python310\include;C:\Python310\Lib\site-packages\numpy\core\include MultiThreaded diff --git a/pyIocApp/softIocPy310.vcxproj b/pyIocApp/softIocPy310.vcxproj index 5e62a5e..f0e6eec 100644 --- a/pyIocApp/softIocPy310.vcxproj +++ b/pyIocApp/softIocPy310.vcxproj @@ -38,16 +38,16 @@ - + {361bcebd-8b02-4b15-b28b-863f0602cb99} - + {422a8c73-836c-48cb-86c8-0591e69c0ca1} - + {9cf8d9ab-e47d-4923-a251-80e40b4e7144} - + {e9d99fc7-e592-472b-b2e2-c3b0d81d8169} @@ -64,7 +64,7 @@ - {D3311F39-9AE8-4F16-BE04-1D1D31135BA9} + {D3310F39-9AE8-4F16-BE04-1D1D31035BA9} Win32Proj WithAsyn Svn @@ -185,14 +185,14 @@ Level3 Disabled - WIN32;XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";_DEBUG;EPICS_CALL_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python311\include;..\devsupApp\src + WIN32;XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";_DEBUG;EPICS_CALL_DLL;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;..\devsupApp\src Console true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python311\libs + C:\Python310\libs @@ -216,14 +216,14 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com Level3 Disabled - WIN32;XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";_DEBUG;EPICS_CALL_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python311\include;..\devsupApp\src + WIN32;XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";_DEBUG;EPICS_CALL_DLL;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;..\devsupApp\src Console true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python311\libs + C:\Python310\libs @@ -247,15 +247,15 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com Level3 Disabled - WIN32;XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";_DEBUG;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python311\include;..\devsupApp\src + WIN32;XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";_DEBUG;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;..\devsupApp\src MultiThreadedDebug Console true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python311\libs + C:\Python310\libs @@ -279,15 +279,15 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com Level3 Disabled - WIN32;XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";_DEBUG;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python311\include;..\devsupApp\src + WIN32;XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";_DEBUG;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;..\devsupApp\src MultiThreadedDebug Console true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python311\libs + C:\Python310\libs @@ -313,8 +313,8 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com MaxSpeed true true - WIN32;XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";NDEBUG;EPICS_CALL_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python311\include;..\devsupApp\src + WIN32;XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";NDEBUG;EPICS_CALL_DLL;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;..\devsupApp\src Console @@ -322,7 +322,7 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com true true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python311\libs + C:\Python310\libs @@ -348,8 +348,8 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com MaxSpeed true true - WIN32;XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";NDEBUG;EPICS_CALL_DLL;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python311\include;..\devsupApp\src + WIN32;XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";NDEBUG;EPICS_CALL_DLL;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;..\devsupApp\src Console @@ -357,7 +357,7 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com true true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python311\libs + C:\Python310\libs @@ -383,8 +383,8 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com MaxSpeed true true - WIN32;XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";NDEBUG;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python311\include;..\devsupApp\src + WIN32;XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";NDEBUG;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;..\devsupApp\src MultiThreaded @@ -393,7 +393,7 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com true true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python311\libs + C:\Python310\libs @@ -419,8 +419,8 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com MaxSpeed true true - WIN32;XEPICS_BASE="\\epics\\base-7.0.6.1";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";NDEBUG;_CRT_SECURE_NO_WARNINGS - $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python311\include;..\devsupApp\src + WIN32;XEPICS_BASE="\\epics\\base-7.0.7";XPYDEV_BASE="$(SolutionDir.Replace('\', '/'))";PYDIR="python310";XEPICS_ARCH="$(Configuration)";NDEBUG;_CRT_SECURE_NO_WARNINGS + $(SolutionDir)include;$(SolutionDir)include\os\win32;$(SolutionDir)include\compiler\msvc;C:\Python310\include;..\devsupApp\src MultiThreaded @@ -429,7 +429,7 @@ perl -CSD $(OutDir)registerRecordDeviceDriver.pl -I$(SolutionDir)dbd -o O.Com true true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;dbghelp.lib - C:\Python311\libs + C:\Python310\libs diff --git a/pyIocApp/softIocPy310.vcxproj.user b/pyIocApp/softIocPy310.vcxproj.user index da99072..2124ba9 100644 --- a/pyIocApp/softIocPy310.vcxproj.user +++ b/pyIocApp/softIocPy310.vcxproj.user @@ -21,9 +21,16 @@ PYTHONPATH=$(SolutionDir)devsupApp\src WindowsLocalDebugger - PATH=%PATH%;C:\Python310 -PYTHONPATH=$(SolutionDir)devsupApp\src + HOSTNAME=localhost +set +IOCNAME=weatherbnl +TOP=../../ +PATH=C:\Python310;C:\Windows +PYTHONPATH=$(SolutionDir)devsupApp\src;$(SolutionDir)weatherApp +ARCH="$(Configuration)" WindowsLocalDebugger + ..\iocBoot\iocweatherbnl + st.cmd HOSTNAME=localhost diff --git a/weatherApp/weather.py b/weatherApp/weather.py index 15351ac..7835f5b 100644 --- a/weatherApp/weather.py +++ b/weatherApp/weather.py @@ -5,9 +5,9 @@ from weakref import WeakValueDictionary -from devsupApp.src.devsup.hooks import addHook -from devsupApp.src.devsup.util import StoppableThread -from devsupApp.src.devsup.db import IOScanListBlock +from devsup.hooks import addHook +from devsup.util import StoppableThread +from devsup.db import IOScanListBlock try: import pymetar From f4fe5483caa353325d11f16b3210aea559daa1c4 Mon Sep 17 00:00:00 2001 From: Peter Heesterman Date: Sat, 1 Apr 2023 14:11:41 +0100 Subject: [PATCH 08/54] Deleted report document. --- devsupApp/src/devsup/__init__.py | 2 +- documentation/report on pyDevSup.docx | Bin 232860 -> 0 bytes 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 documentation/report on pyDevSup.docx diff --git a/devsupApp/src/devsup/__init__.py b/devsupApp/src/devsup/__init__.py index ea33c37..72f5031 100644 --- a/devsupApp/src/devsup/__init__.py +++ b/devsupApp/src/devsup/__init__.py @@ -79,7 +79,7 @@ def _init(iocMain=False): """.encode('ascii')) F.close() _dbapi.dbReadDatabase(F.name) - #os.unlink(F.name) + os.unlink(F.name) _dbapi._dbd_setup() diff --git a/documentation/report on pyDevSup.docx b/documentation/report on pyDevSup.docx deleted file mode 100644 index b4e56b5a76640b974aa3bdd23d2d3e9e1753d9f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 232860 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