From 296e93516189c0134843fd56ac4f10d36ccf284f Mon Sep 17 00:00:00 2001 From: Marius Elvert Date: Tue, 17 Dec 2019 16:56:58 +0100 Subject: [PATCH 01/17] Allow different paths for CPPZMQ on windows, was previously assumed to be the same as ZMQ --- appveyor.yml | 5 +++-- configure/cmake_win.cmake | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 88e24aecc..17f12a7ec 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -259,16 +259,17 @@ install: - cmd: cd "C:\projects\cppTango" - cmd: set BOOST_ROOT=%BOOST_ROOT% - cmd: set ZMQ_BASE=C:/projects/zeromq/ + - cmd: set CPPZMQ_BASE=C:/projects/zeromq/ - cmd: set IDL_BASE=%IDL_BIN% - cmd: set OMNI_BASE=C:/projects/omniorb/ - cmd: set PTHREAD_WIN=C:/projects/pthreads-win32/ - cmd: if not defined USE_PCH set USE_PCH=OFF #- cmd: cmake -G "%CMAKE_GENERATOR%" -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=TRUE -DBUILD_SHARED_LIBS=TRUE . #- cmd: cmake -G "%CMAKE_GENERATOR%" -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=TRUE . - - cmd: cmake -G "%CMAKE_GENERATOR%" -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=TRUE -DIDL_BASE="%IDL_BASE%" -DOMNI_BASE="%OMNI_BASE%" -DZMQ_BASE="%ZMQ_BASE%" -DPTHREAD_WIN=%PTHREAD_WIN% -DUSE_PCH=%USE_PCH% . + - cmd: cmake -G "%CMAKE_GENERATOR%" -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=TRUE -DIDL_BASE="%IDL_BASE%" -DOMNI_BASE="%OMNI_BASE%" -DZMQ_BASE="%ZMQ_BASE%" -DCPPZMQ_BASE="%ZMQ_BASE%" -DPTHREAD_WIN=%PTHREAD_WIN% -DUSE_PCH=%USE_PCH% . - cmd: cd c:/projects/debug_build #- cmd: cmake -G "%CMAKE_GENERATOR%" -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=TRUE -DBUILD_SHARED_LIBS=TRUE -DCMAKE_BUILD_TYPE=Debug . - - cmd: cmake -G "%CMAKE_GENERATOR%" -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=TRUE -DCMAKE_BUILD_TYPE=Debug -DIDL_BASE="%IDL_BASE%" -DOMNI_BASE="%OMNI_BASE%" -DZMQ_BASE="%ZMQ_BASE%" -DPTHREAD_WIN=%PTHREAD_WIN% -DUSE_PCH=%USE_PCH% . + - cmd: cmake -G "%CMAKE_GENERATOR%" -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=TRUE -DCMAKE_BUILD_TYPE=Debug -DIDL_BASE="%IDL_BASE%" -DOMNI_BASE="%OMNI_BASE%" -DZMQ_BASE="%ZMQ_BASE%" -DCPPZMQ_BASE="%ZMQ_BASE%" -DPTHREAD_WIN=%PTHREAD_WIN% -DUSE_PCH=%USE_PCH% . clone_folder: C:\projects\cppTango diff --git a/configure/cmake_win.cmake b/configure/cmake_win.cmake index 9fdfe8db7..7e84d17c0 100644 --- a/configure/cmake_win.cmake +++ b/configure/cmake_win.cmake @@ -162,8 +162,8 @@ install(DIRECTORY $ENV{OMNI_BASE}/include/omniVms DESTINATION include COMPONENT install(FILES $ENV{OMNI_BASE}/include/omniconfig.h DESTINATION include COMPONENT headers) install(FILES $ENV{OMNI_BASE}/include/omnithread.h DESTINATION include COMPONENT headers) install(FILES $ENV{ZMQ_BASE}/include/zmq.h DESTINATION include COMPONENT headers) -install(FILES $ENV{ZMQ_BASE}/include/zmq.hpp DESTINATION include COMPONENT headers) -install(FILES $ENV{ZMQ_BASE}/include/zmq_addon.hpp DESTINATION include COMPONENT headers) +install(FILES $ENV{CPPZMQ_BASE}/include/zmq.hpp DESTINATION include COMPONENT headers) +install(FILES $ENV{CPPZMQ_BASE}/include/zmq_addon.hpp DESTINATION include COMPONENT headers) install(FILES $ENV{ZMQ_BASE}/include/zmq_utils.h DESTINATION include COMPONENT headers) if (CMAKE_BUILD_TYPE STREQUAL "Debug") From f2276a3af505bf48744bf2cba9a1e0410fce676a Mon Sep 17 00:00:00 2001 From: Reynald Bourtembourg Date: Wed, 15 Jan 2020 16:32:01 +0100 Subject: [PATCH 02/17] Remove avoidable blocks --- cppapi/client/attr_proxy.cpp | 8 -------- cppapi/client/devapi_base.cpp | 8 -------- 2 files changed, 16 deletions(-) diff --git a/cppapi/client/attr_proxy.cpp b/cppapi/client/attr_proxy.cpp index bbc5fee34..83df10e22 100644 --- a/cppapi/client/attr_proxy.cpp +++ b/cppapi/client/attr_proxy.cpp @@ -432,14 +432,6 @@ void AttributeProxy::parse_name(std::string &full_name) { name_wo_prot = full_name.substr(pos + 3); } - else if (protocol == TACO_PROTOCOL) - { - TangoSys_OMemStream desc; - desc << "Taco protocol is not supported" << std::ends; - ApiWrongNameExcept::throw_exception((const char*)"API_UnsupportedProtocol", - desc.str(), - (const char*)"AttributeProxy::parse_name()"); - } else { TangoSys_OMemStream desc; diff --git a/cppapi/client/devapi_base.cpp b/cppapi/client/devapi_base.cpp index 06c0d5985..758de5953 100644 --- a/cppapi/client/devapi_base.cpp +++ b/cppapi/client/devapi_base.cpp @@ -2115,14 +2115,6 @@ void DeviceProxy::parse_name(std::string &full_name) { name_wo_prot = full_name_low.substr(pos + 3); } - else if (protocol == TACO_PROTOCOL) - { - TangoSys_OMemStream desc; - desc << "Taco protocol is not supported" << std::ends; - ApiWrongNameExcept::throw_exception((const char *) "API_UnsupportedProtocol", - desc.str(), - (const char *) "DeviceProxy::parse_name()"); - } else { TangoSys_OMemStream desc; From 567ad161a41e28efc004ef272ace7b76773c1dfd Mon Sep 17 00:00:00 2001 From: Reynald Bourtembourg Date: Wed, 15 Jan 2020 16:40:35 +0100 Subject: [PATCH 03/17] Remove obsolete TACO_PROTOCOL definition --- cppapi/client/devapi.h | 1 - 1 file changed, 1 deletion(-) diff --git a/cppapi/client/devapi.h b/cppapi/client/devapi.h index 4692ec814..bdcd05265 100644 --- a/cppapi/client/devapi.h +++ b/cppapi/client/devapi.h @@ -424,7 +424,6 @@ enum cb_sub_model #define CONNECTION_NOTOK 0 #define PROT_SEP "://" -#define TACO_PROTOCOL "taco" #define TANGO_PROTOCOL "tango" #define MODIFIER '#' From 6f877419259358e19a5bc3208e66455bede75326 Mon Sep 17 00:00:00 2001 From: Thomas Braun Date: Fri, 24 Jan 2020 10:31:50 +0100 Subject: [PATCH 04/17] appveyor.yml: Fail jobs faster The common case is that we are not debugging MSVC failures, therefore we don't need to wait until the timeout hits if an error occurred. This can be easily changed back for debugging. --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index a1edcf666..8dcf92848 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -189,7 +189,7 @@ on_finish: on_failure: #RDP for failure - - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) + # - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) artifacts: - path: ./*.exe From 9269595019f594350af7644c50fec1f0885ad8b4 Mon Sep 17 00:00:00 2001 From: Thomas Braun Date: Fri, 1 Nov 2019 22:18:31 +0100 Subject: [PATCH 05/17] appveyor.yml: Add inline deployment on tag push Automate the deployment from appveyor. We want to publish all artifacts as a new draft prelease on tag push only. For reference see https://www.appveyor.com/docs/deployment/github/ and https://www.appveyor.com/docs/appveyor-yml/. I have created a new github machine user named cppTango-bot for that. And also a personal access token which was encrypted on the appveyor site. --- appveyor.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/appveyor.yml b/appveyor.yml index a1edcf666..9aef8754a 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -195,3 +195,20 @@ artifacts: - path: ./*.exe - path: ./*.zip - path: ./*.msi + +deploy: +- provider: GitHub + tag: $(APPVEYOR_REPO_TAG_NAME) + description: "Release $(APPVEYOR_REPO_TAG_NAME)" + auth_token: + # User: cppTango-bot + # Personal Access token with repo scope, encrypted via https://ci.appveyor.com/tools/encrypt + secure: KnvPAbdhmiTQxTLOGq7nyNs6d1JYbKVKspPgigzQ3fDrI+nkaxqWCw6UmRkS2Gqe + artifact: /.*/ + repository: tango-controls/cppTango + draft: true + prerelease: true + force_update: true + # deploy on tag push only + on: + APPVEYOR_REPO_TAG: true From baf521c43a54773b1077c03aa4c619dcd9b5ad40 Mon Sep 17 00:00:00 2001 From: Reynald Bourtembourg Date: Tue, 11 Feb 2020 18:32:58 +0100 Subject: [PATCH 06/17] Fix memory leak in Attribute::get_att_device_class() (#678) --- cppapi/server/attribute.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cppapi/server/attribute.cpp b/cppapi/server/attribute.cpp index 8c8e3a941..0c0f4b90a 100644 --- a/cppapi/server/attribute.cpp +++ b/cppapi/server/attribute.cpp @@ -5313,7 +5313,7 @@ DeviceClass *Attribute::get_att_device_class(std::string &dev_name) // Check whether our device is listed in this class for (size_t i = 0; i < dev_list.size(); ++i) { - if (dev_list[i]->name() == dev_name) + if (dev_list[i]->get_name() == dev_name) { // Our device is listed in this class, returns the corresponding DeviceClass pointer return tmp_cl_list[loop]; From 2d551d3a1f21303276c13693e912a0ebfd35b689 Mon Sep 17 00:00:00 2001 From: Reynald Bourtembourg Date: Thu, 13 Feb 2020 14:46:21 +0100 Subject: [PATCH 07/17] travis.yml: remove deprecated skip_cleanup (#682) skip_cleanup is now deprecated, and cleanup is false by default. Please refer to https://blog.travis-ci.com/2019-08-27-deployment-tooling-dpl-v2-preview-release for more details --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 09b7eaa69..193e88287 100644 --- a/.travis.yml +++ b/.travis.yml @@ -95,7 +95,6 @@ after_success: deploy: - provider: script script: bash .travis/deploy.sh - skip_cleanup: true on: tags: true From 7289e5c7ba8d5c6fc59f91224e5c76508d76921c Mon Sep 17 00:00:00 2001 From: Lorenzo Pivetta <5919598+lorenzopivetta@users.noreply.github.com> Date: Fri, 14 Feb 2020 10:16:43 +0100 Subject: [PATCH 08/17] Add switch to disable mmx (#676) --- configure/CMakeLists.txt | 1 + cppapi/server/jpeg_mmx/CMakeLists.txt | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/configure/CMakeLists.txt b/configure/CMakeLists.txt index 34e98406b..8dbae7717 100644 --- a/configure/CMakeLists.txt +++ b/configure/CMakeLists.txt @@ -239,3 +239,4 @@ include(GNUInstallDirs) include(configure/coveralls.cmake) option(TANGO_USE_USING_NAMESPACE "Use \"using namespace\" in header files (deprecated, but ON for backwards compatibility.)." ON) +option(TANGO_JPEG_MMX "Build MMX support" ON) diff --git a/cppapi/server/jpeg_mmx/CMakeLists.txt b/cppapi/server/jpeg_mmx/CMakeLists.txt index 927e902c7..441776349 100644 --- a/cppapi/server/jpeg_mmx/CMakeLists.txt +++ b/cppapi/server/jpeg_mmx/CMakeLists.txt @@ -20,21 +20,29 @@ if(WIN32) target_compile_definitions(jpeg_mmx_objects_sta PRIVATE _64BITS) else() target_compile_options(jpeg_mmx_objects_dyn PRIVATE -O0) - target_compile_definitions(jpeg_mmx_objects_dyn PRIVATE JPG_USE_ASM) target_compile_options(jpeg_mmx_objects_sta PRIVATE -O0) - target_compile_definitions(jpeg_mmx_objects_sta PRIVATE JPG_USE_ASM) + if(TANGO_JPEG_MMX) + target_compile_definitions(jpeg_mmx_objects_dyn PRIVATE JPG_USE_ASM) + target_compile_definitions(jpeg_mmx_objects_sta PRIVATE JPG_USE_ASM) + endif() endif() else(WIN32) add_library(jpeg_mmx_objects OBJECT ${SOURCES}) - target_compile_options(jpeg_mmx_objects PRIVATE -mmmx -fPIC) + if(TANGO_JPEG_MMX) + target_compile_options(jpeg_mmx_objects PRIVATE -mmmx -fPIC) + else() + target_compile_options(jpeg_mmx_objects PRIVATE -fPIC) + endif() if(${PLATFORM} EQUAL 64) target_compile_definitions(jpeg_mmx_objects PRIVATE _64BITS) else() target_compile_options(jpeg_mmx_objects PRIVATE -O0) - target_compile_definitions(jpeg_mmx_objects PRIVATE JPG_USE_ASM) + if(TANGO_JPEG_MMX) + target_compile_definitions(jpeg_mmx_objects PRIVATE JPG_USE_ASM) + endif() endif() endif(WIN32) From a81c15845593de31bc98cb7b0ebd59aa45b57173 Mon Sep 17 00:00:00 2001 From: Thomas Braun Date: Thu, 23 Jan 2020 21:41:03 +0100 Subject: [PATCH 09/17] CMakeLists.txt: Rework test suite handling We now support switching the test suite build off using the standard CTest option BUILD_TESTING. This allows environments where the test compilation fails to skip it in a consistent manner. This also removes the unconditional call to enable_testing() which the CTest module now does only if BUILD_TESTING is ON. Co-authored-by: Michal Liszcz --- CMakeLists.txt | 6 +++--- INSTALL.md | 1 + appveyor.yml | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5ff570e54..ba8929909 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,7 +14,6 @@ if (USE_PCH AND NOT (CMAKE_CXX_COMPILER_ID MATCHES "GNU|MSVC|Clang")) set(USE_PCH OFF) endif() -enable_testing() #need to define the version of the library set(MAJOR_VERSION "9") set(MINOR_VERSION "4") @@ -46,9 +45,10 @@ include_directories(${CMAKE_CURRENT_BINARY_DIR}/log4tango/include) #source code add_subdirectory("log4tango") add_subdirectory("cppapi") -if(NOT WIN32) + +if(BUILD_TESTING) add_subdirectory("cpp_test_suite") -endif(NOT WIN32) +endif() if(WIN32) include(configure/cmake_win.cmake) diff --git a/INSTALL.md b/INSTALL.md index 38b530b21..009d3559d 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -28,6 +28,7 @@ - `-DCMAKE_VERBOSE_MAKEFILE=true` - `-DTANGO_USE_USING_NAMESPACE=` choose `OFF` for modern builds - `-DUSE_PCH=` +- `-DBUILD_TESTING=` Build the test suite (`ON` by default) Typical output: diff --git a/appveyor.yml b/appveyor.yml index a1edcf666..25443f920 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -141,10 +141,10 @@ install: - cmd: if not defined USE_PCH set USE_PCH=OFF #- cmd: cmake -G "%CMAKE_GENERATOR%" -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=TRUE -DBUILD_SHARED_LIBS=TRUE . #- cmd: cmake -G "%CMAKE_GENERATOR%" -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=TRUE . - - cmd: cmake -G "%CMAKE_GENERATOR%" -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=TRUE -DIDL_BASE="%IDL_BASE%" -DOMNI_BASE="%OMNI_BASE%" -DZMQ_BASE="%ZMQ_BASE%" -DPTHREAD_WIN=%PTHREAD_WIN% -DUSE_PCH=%USE_PCH% . + - cmd: cmake -G "%CMAKE_GENERATOR%" -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=TRUE -DIDL_BASE="%IDL_BASE%" -DOMNI_BASE="%OMNI_BASE%" -DZMQ_BASE="%ZMQ_BASE%" -DPTHREAD_WIN=%PTHREAD_WIN% -DUSE_PCH=%USE_PCH% -DBUILD_TESTING=OFF . - cmd: cd c:/projects/debug_build #- cmd: cmake -G "%CMAKE_GENERATOR%" -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=TRUE -DBUILD_SHARED_LIBS=TRUE -DCMAKE_BUILD_TYPE=Debug . - - cmd: cmake -G "%CMAKE_GENERATOR%" -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=TRUE -DCMAKE_BUILD_TYPE=Debug -DIDL_BASE="%IDL_BASE%" -DOMNI_BASE="%OMNI_BASE%" -DZMQ_BASE="%ZMQ_BASE%" -DPTHREAD_WIN=%PTHREAD_WIN% -DUSE_PCH=%USE_PCH% . + - cmd: cmake -G "%CMAKE_GENERATOR%" -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=TRUE -DCMAKE_BUILD_TYPE=Debug -DIDL_BASE="%IDL_BASE%" -DOMNI_BASE="%OMNI_BASE%" -DZMQ_BASE="%ZMQ_BASE%" -DPTHREAD_WIN=%PTHREAD_WIN% -DUSE_PCH=%USE_PCH% -DBUILD_TESTING=OFF . clone_folder: C:\projects\cppTango From 59cda6e0b42f288e7ba2c03283d214be53d48a27 Mon Sep 17 00:00:00 2001 From: Marius Elvert Date: Tue, 18 Feb 2020 16:07:06 +0100 Subject: [PATCH 10/17] Use CPPZMQ_BASE env variable to feed CMake --- appveyor.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 17f12a7ec..63e160a5b 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -266,10 +266,10 @@ install: - cmd: if not defined USE_PCH set USE_PCH=OFF #- cmd: cmake -G "%CMAKE_GENERATOR%" -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=TRUE -DBUILD_SHARED_LIBS=TRUE . #- cmd: cmake -G "%CMAKE_GENERATOR%" -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=TRUE . - - cmd: cmake -G "%CMAKE_GENERATOR%" -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=TRUE -DIDL_BASE="%IDL_BASE%" -DOMNI_BASE="%OMNI_BASE%" -DZMQ_BASE="%ZMQ_BASE%" -DCPPZMQ_BASE="%ZMQ_BASE%" -DPTHREAD_WIN=%PTHREAD_WIN% -DUSE_PCH=%USE_PCH% . + - cmd: cmake -G "%CMAKE_GENERATOR%" -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=TRUE -DIDL_BASE="%IDL_BASE%" -DOMNI_BASE="%OMNI_BASE%" -DZMQ_BASE="%ZMQ_BASE%" -DCPPZMQ_BASE="%CPPZMQ_BASE%" -DPTHREAD_WIN=%PTHREAD_WIN% -DUSE_PCH=%USE_PCH% . - cmd: cd c:/projects/debug_build #- cmd: cmake -G "%CMAKE_GENERATOR%" -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=TRUE -DBUILD_SHARED_LIBS=TRUE -DCMAKE_BUILD_TYPE=Debug . - - cmd: cmake -G "%CMAKE_GENERATOR%" -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=TRUE -DCMAKE_BUILD_TYPE=Debug -DIDL_BASE="%IDL_BASE%" -DOMNI_BASE="%OMNI_BASE%" -DZMQ_BASE="%ZMQ_BASE%" -DCPPZMQ_BASE="%ZMQ_BASE%" -DPTHREAD_WIN=%PTHREAD_WIN% -DUSE_PCH=%USE_PCH% . + - cmd: cmake -G "%CMAKE_GENERATOR%" -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=TRUE -DCMAKE_BUILD_TYPE=Debug -DIDL_BASE="%IDL_BASE%" -DOMNI_BASE="%OMNI_BASE%" -DZMQ_BASE="%ZMQ_BASE%" -DCPPZMQ_BASE="%CPPZMQ_BASE%" -DPTHREAD_WIN=%PTHREAD_WIN% -DUSE_PCH=%USE_PCH% . clone_folder: C:\projects\cppTango From b15f129a1d083d1af2032363b161eb143ed1fca8 Mon Sep 17 00:00:00 2001 From: Marius Elvert Date: Tue, 18 Feb 2020 18:17:13 +0100 Subject: [PATCH 11/17] Fix omniidl error checks --- cppapi/server/idl/CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cppapi/server/idl/CMakeLists.txt b/cppapi/server/idl/CMakeLists.txt index 0d8e61bca..d74a8367a 100644 --- a/cppapi/server/idl/CMakeLists.txt +++ b/cppapi/server/idl/CMakeLists.txt @@ -6,16 +6,16 @@ message("Using IDL=${IDL_PKG_INCLUDE_DIRS}") find_program(OMNIIDL NAMES omniidl PATHS ${OMNIIDL_PATH}) -if(${OMNIIDL-NOTFOUND}) +if(NOT OMNIIDL) message(FATAL_ERROR "Could not find omniidl") endif() execute_process(COMMAND ${OMNIIDL} -I${IDL_PKG_INCLUDE_DIRS} -bcxx -Wbh=.h -Wbs=SK.cpp -Wbd=DynSK.cpp -Wba ${IDL_PKG_INCLUDE_DIRS}/tango.idl WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - RESULT_VARIABLE FAILED) + RESULT_VARIABLE OMNIIDL_RETURN_CODE) -if(${FAILED}) - message(SEND_ERROR " Failed to generate source files from idl. rv=${FAILED}") +if(OMNIIDL_RETURN_CODE) + message(SEND_ERROR " Failed to generate source files from idl. rv=${OMNIIDL_RETURN_CODE}") endif() function(replace_in_file FILENAME SEARCH NEW_CONTENT) From abbf0842b4fa3d12e91b0eab4d4a53ce9666b9a9 Mon Sep 17 00:00:00 2001 From: Reynald Bourtembourg Date: Fri, 6 Mar 2020 15:40:51 +0100 Subject: [PATCH 12/17] Change library SONAME to libtango.so.94 (#593) The next version will not be binary compatible with cppTango 9.3 versions. --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ba8929909..758277ee5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,7 +28,7 @@ endif() #convenient versions set(LIBRARY_VERSION "${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_VERSION}") -set(SO_VERSION "${MAJOR_VERSION}") +set(SO_VERSION "${MAJOR_VERSION}${MINOR_VERSION}") set(TANGO_HOST $ENV{TANGO_HOST}) include(configure/CMakeLists.txt) From 7261bd8fadc216f07dc848b574b93020076fdcdd Mon Sep 17 00:00:00 2001 From: mliszcz Date: Fri, 19 Jul 2019 19:31:30 +0200 Subject: [PATCH 13/17] Add test for event recovery after restart (#496) Tests that event subscription is restored immediately after the device restart. --- cpp_test_suite/new_tests/cxx_dserver_misc.cpp | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/cpp_test_suite/new_tests/cxx_dserver_misc.cpp b/cpp_test_suite/new_tests/cxx_dserver_misc.cpp index be97a45c4..3cbb353e9 100644 --- a/cpp_test_suite/new_tests/cxx_dserver_misc.cpp +++ b/cpp_test_suite/new_tests/cxx_dserver_misc.cpp @@ -6,6 +6,26 @@ #undef SUITE_NAME #define SUITE_NAME DServerMiscTestSuite +struct EventCallback : public Tango::CallBack +{ + EventCallback() + : num_of_all_events(0) + , num_of_error_events(0) + {} + + void push_event(Tango::EventData* event) + { + num_of_all_events++; + if (event->err) + { + num_of_error_events++; + } + } + + int num_of_all_events; + int num_of_error_events; +}; + class DServerMiscTestSuite: public CxxTest::TestSuite { protected: @@ -203,6 +223,38 @@ cout << "str = " << str << endl; TS_ASSERT(dserver->info().server_id == full_ds_name); TS_ASSERT(dserver->info().server_version == server_version); } + + /* Tests that subscriber can receive events immediately after + * a device restart without a need to wait for re-subscription. + */ + void test_event_subscription_recovery_after_device_restart() + { + EventCallback callback{}; + + std::string attribute_name = "event_change_tst"; + + TS_ASSERT_THROWS_NOTHING(device1->subscribe_event( + attribute_name, + Tango::USER_EVENT, + &callback)); + + TS_ASSERT_THROWS_NOTHING(device1->command_inout("IOPushEvent")); + Tango_sleep(2); + TS_ASSERT_EQUALS(2, callback.num_of_all_events); + TS_ASSERT_EQUALS(0, callback.num_of_error_events); + + { + Tango::DeviceData input{}; + input << device1_name; + TS_ASSERT_THROWS_NOTHING(dserver->command_inout("DevRestart", input)); + } + + TS_ASSERT_THROWS_NOTHING(device1->command_inout("IOPushEvent")); + Tango_sleep(2); + TS_ASSERT_EQUALS(3, callback.num_of_all_events); + TS_ASSERT_EQUALS(0, callback.num_of_error_events); + } + }; #undef cout #endif // DServerMiscTestSuite_h From c6768977f98a1ce60569c57759857cb6c3b10fc7 Mon Sep 17 00:00:00 2001 From: mliszcz Date: Sun, 21 Jul 2019 11:50:58 +0200 Subject: [PATCH 14/17] Restore subscribed clients after dev restart (#496) --- cppapi/server/attribute.cpp | 21 +++++++++------------ cppapi/server/attribute.h | 4 ++-- cppapi/server/eventcmds.cpp | 11 +++++++---- cppapi/server/multiattribute.cpp | 15 +++++++++++++++ 4 files changed, 33 insertions(+), 18 deletions(-) diff --git a/cppapi/server/attribute.cpp b/cppapi/server/attribute.cpp index 9c2d15c75..0e33c6848 100644 --- a/cppapi/server/attribute.cpp +++ b/cppapi/server/attribute.cpp @@ -5895,21 +5895,18 @@ bool Attribute::data_ready_event_subscribed() // //-------------------------------------------------------------------------------------------------------------------- -void Attribute::set_client_lib(int _l,std::string &ev_name) +void Attribute::set_client_lib(int client_lib_version, EventType event_type) { - cout4 << "Attribute::set_client_lib(" << _l << "," << ev_name << ")" << std::endl; - int i; - for (i = 0; i < numEventType; i++) - { - if (ev_name == EventName[i]) - { - break; - } - } + cout4 << "Attribute::set_client_lib(" + << client_lib_version << "," + << EventName[event_type] << ")" << std::endl; - if (count(client_lib[i].begin(), client_lib[i].end(), _l) == 0) + if (0 == count( + client_lib[event_type].begin(), + client_lib[event_type].end(), + client_lib_version)) { - client_lib[i].push_back(_l); + client_lib[event_type].push_back(client_lib_version); } } diff --git a/cppapi/server/attribute.h b/cppapi/server/attribute.h index e524842ab..fe864a3c8 100644 --- a/cppapi/server/attribute.h +++ b/cppapi/server/attribute.h @@ -2302,9 +2302,9 @@ class Attribute bool is_mem_exception() {return att_mem_exception;} virtual bool is_fwd_att() {return false;} - void set_client_lib(int,std::string &); + void set_client_lib(int, EventType); std::vector &get_client_lib(EventType _et) {return client_lib[_et];} - void remove_client_lib(int,const std::string &); + void remove_client_lib(int, const std::string &); void add_config_5_specific(AttributeConfig_5 &); void add_startup_exception(std::string,const DevFailed &); diff --git a/cppapi/server/eventcmds.cpp b/cppapi/server/eventcmds.cpp index 01564a15c..91976d024 100644 --- a/cppapi/server/eventcmds.cpp +++ b/cppapi/server/eventcmds.cpp @@ -581,10 +581,13 @@ void DServer::event_subscription(std::string &dev_name,std::string &obj_name,std // if (client_lib != 0) - { - omni_mutex_lock oml(EventSupplier::get_event_mutex()); - attribute.set_client_lib(client_lib,event); - } + { + EventType event_type = CHANGE_EVENT; + tg->event_name_2_event_type(event, event_type); + + omni_mutex_lock oml(EventSupplier::get_event_mutex()); + attribute.set_client_lib(client_lib, event_type); + } } else if (event == EventName[PIPE_EVENT]) { diff --git a/cppapi/server/multiattribute.cpp b/cppapi/server/multiattribute.cpp index 2d85d9c37..e75cba44a 100644 --- a/cppapi/server/multiattribute.cpp +++ b/cppapi/server/multiattribute.cpp @@ -1563,31 +1563,46 @@ void MultiAttribute::set_event_param(std::vector &eve) if (eve[i].change.empty() == false) { for (ite = eve[i].change.begin();ite != eve[i].change.end();++ite) + { att.set_change_event_sub(*ite); + att.set_client_lib(*ite, CHANGE_EVENT); + } } if (eve[i].periodic.empty() == false) { for (ite = eve[i].periodic.begin();ite != eve[i].periodic.end();++ite) + { att.set_periodic_event_sub(*ite); + att.set_client_lib(*ite, PERIODIC_EVENT); + } } if (eve[i].archive.empty() == false) { for (ite = eve[i].archive.begin();ite != eve[i].archive.end();++ite) + { att.set_archive_event_sub(*ite); + att.set_client_lib(*ite, ARCHIVE_EVENT); + } } if (eve[i].att_conf.empty() == false) { for (ite = eve[i].att_conf.begin();ite != eve[i].att_conf.end();++ite) + { att.set_att_conf_event_sub(*ite); + att.set_client_lib(*ite, ATTR_CONF_EVENT); + } } if (eve[i].user.empty() == false) { for (ite = eve[i].user.begin();ite != eve[i].user.end();++ite) + { att.set_user_event_sub(*ite); + att.set_client_lib(*ite, USER_EVENT); + } } if (eve[i].quality == true) From 1a07976fe869bfa0e69a226f2952b006e280890c Mon Sep 17 00:00:00 2001 From: mliszcz Date: Sun, 21 Jul 2019 13:14:16 +0200 Subject: [PATCH 15/17] Use attribute name when restoring events state (#496) --- cppapi/server/device.cpp | 4 ++-- cppapi/server/multiattribute.cpp | 6 +++--- cppapi/server/multiattribute.h | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cppapi/server/device.cpp b/cppapi/server/device.cpp index d9834374c..631eb0f38 100644 --- a/cppapi/server/device.cpp +++ b/cppapi/server/device.cpp @@ -6116,7 +6116,7 @@ void DeviceImpl::get_event_param(std::vector &eve) ep.notifd = false; ep.zmq = true; - ep.attr_id = -1; + ep.attribute_name = ""; ep.quality = false; ep.data_ready = false; ep.dev_intr_change = true; @@ -6143,7 +6143,7 @@ void DeviceImpl::set_event_param(std::vector &eve) { for (size_t loop = 0; loop < eve.size(); loop++) { - if (eve[loop].attr_id == -1) + if (eve[loop].attribute_name.empty()) { if (eve[loop].dev_intr_change == true) { diff --git a/cppapi/server/multiattribute.cpp b/cppapi/server/multiattribute.cpp index e75cba44a..2701a7b1b 100644 --- a/cppapi/server/multiattribute.cpp +++ b/cppapi/server/multiattribute.cpp @@ -1520,7 +1520,7 @@ void MultiAttribute::get_event_param(std::vector &eve) else ep.zmq = false; - ep.attr_id = i; + ep.attribute_name = attr_list[i]->get_name(); ep.change = ch; ep.quality = qu; ep.archive = ar; @@ -1552,9 +1552,9 @@ void MultiAttribute::set_event_param(std::vector &eve) { for (size_t i = 0;i < eve.size();i++) { - if (eve[i].attr_id != -1) + if (! eve[i].attribute_name.empty()) { - Tango::Attribute &att = get_attr_by_ind(eve[i].attr_id); + Tango::Attribute &att = get_attr_by_name(eve[i].attribute_name.c_str()); { omni_mutex_lock oml(EventSupplier::get_event_mutex()); diff --git a/cppapi/server/multiattribute.h b/cppapi/server/multiattribute.h index ed3cb7111..6405630d0 100644 --- a/cppapi/server/multiattribute.h +++ b/cppapi/server/multiattribute.h @@ -47,7 +47,7 @@ class DeviceClass; struct EventPar { - long attr_id; + std::string attribute_name; std::vector change; std::vector archive; bool quality; From 3eb67d661f1122c9a2b0246f54d699f8471ed9b0 Mon Sep 17 00:00:00 2001 From: mliszcz Date: Mon, 9 Mar 2020 17:52:18 +0100 Subject: [PATCH 16/17] Rename EventPar struct to EventSubscriptionState --- cppapi/server/CMakeLists.txt | 3 +- cppapi/server/device.cpp | 6 ++-- cppapi/server/device.h | 5 ++-- cppapi/server/dserver.cpp | 14 ++++----- cppapi/server/dserver.h | 5 ++-- cppapi/server/event_subscription_state.h | 37 ++++++++++++++++++++++++ cppapi/server/multiattribute.cpp | 8 ++--- cppapi/server/multiattribute.h | 20 ++----------- 8 files changed, 62 insertions(+), 36 deletions(-) create mode 100644 cppapi/server/event_subscription_state.h diff --git a/cppapi/server/CMakeLists.txt b/cppapi/server/CMakeLists.txt index 2b9557324..4fd6c8377 100644 --- a/cppapi/server/CMakeLists.txt +++ b/cppapi/server/CMakeLists.txt @@ -128,7 +128,8 @@ set(HEADERS attrdesc.h w_pipe.tpp subdev_diag.h encoded_attribute.h - encoded_format.h) + encoded_format.h + event_subscription_state.h) add_subdirectory(idl) add_subdirectory(jpeg) diff --git a/cppapi/server/device.cpp b/cppapi/server/device.cpp index 631eb0f38..d0ad011b1 100644 --- a/cppapi/server/device.cpp +++ b/cppapi/server/device.cpp @@ -6106,13 +6106,13 @@ void DeviceImpl::remove_local_command(const std::string &cmd_name) // //------------------------------------------------------------------------------------------------------------------ -void DeviceImpl::get_event_param(std::vector &eve) +void DeviceImpl::get_event_param(EventSubscriptionStates& eve) { ZmqEventSupplier *event_supplier_zmq = Util::instance()->get_zmq_event_supplier(); if (event_supplier_zmq->any_dev_intr_client(this) == true) { - EventPar ep; + EventSubscriptionState ep; ep.notifd = false; ep.zmq = true; @@ -6139,7 +6139,7 @@ void DeviceImpl::get_event_param(std::vector &eve) // //------------------------------------------------------------------------------------------------------------------ -void DeviceImpl::set_event_param(std::vector &eve) +void DeviceImpl::set_event_param(const EventSubscriptionStates& eve) { for (size_t loop = 0; loop < eve.size(); loop++) { diff --git a/cppapi/server/device.h b/cppapi/server/device.h index ed856a49b..30945bd83 100644 --- a/cppapi/server/device.h +++ b/cppapi/server/device.h @@ -45,6 +45,7 @@ #include #include #include +#include "event_subscription_state.h" namespace Tango { @@ -3423,8 +3424,8 @@ class DeviceImpl : public virtual POA_Tango::Device void disable_intr_change_ev() {intr_change_ev = false;} bool is_intr_change_ev_enable() {return intr_change_ev;} - void get_event_param(std::vector &); - void set_event_param(std::vector &); + void get_event_param(EventSubscriptionStates&); + void set_event_param(const EventSubscriptionStates&); void set_client_lib(int _l) {if (count(client_lib.begin(),client_lib.end(),_l)==0)client_lib.push_back(_l);} diff --git a/cppapi/server/dserver.cpp b/cppapi/server/dserver.cpp index c0eff10d0..049684b1c 100644 --- a/cppapi/server/dserver.cpp +++ b/cppapi/server/dserver.cpp @@ -882,7 +882,7 @@ void DServer::restart(std::string &d_name) std::vector &p_obj = dev_to_del->get_poll_obj_list(); std::vector dev_pol; - std::vector eve; + EventSubscriptionStates eve; for (i = 0;i < p_obj.size();i++) { @@ -1193,7 +1193,7 @@ void ServRestartThread::run(void *ptr) // Memorize event parameters and devices interface // - std::map > map_events; + ServerEventSubscriptionState map_events; std::map map_dev_inter; dev->mem_event_par(map_events); @@ -1977,14 +1977,14 @@ void DServer::mcast_event_for_att(std::string &dev_name,std::string &att_name,st // //------------------------------------------------------------------------------------------------------------------ -void DServer::mem_event_par(std::map > &_map) +void DServer::mem_event_par(ServerEventSubscriptionState& _map) { for (size_t i = 0;i < class_list.size();i++) { std::vector &dev_list = class_list[i]->get_device_list(); for (size_t j = 0;j < dev_list.size();j++) { - std::vector eve; + EventSubscriptionStates eve; dev_list[j]->get_device_attr()->get_event_param(eve); dev_list[j]->get_event_param(eve); @@ -2010,7 +2010,7 @@ void DServer::mem_event_par(std::map > &_map) // //------------------------------------------------------------------------------------------------------------------ -void DServer::apply_event_par(std::map > &_map) +void DServer::apply_event_par(const ServerEventSubscriptionState& _map) { for (size_t i = 0;i < class_list.size();i++) { @@ -2018,8 +2018,8 @@ void DServer::apply_event_par(std::map > &_map for (size_t j = 0;j < dev_list.size();j++) { std::string &dev_name = dev_list[j]->get_name(); - std::map >::iterator ite; - ite = _map.find(dev_name); + + const auto ite = _map.find(dev_name); if (ite != _map.end()) { diff --git a/cppapi/server/dserver.h b/cppapi/server/dserver.h index eff64b6af..922ff107f 100644 --- a/cppapi/server/dserver.h +++ b/cppapi/server/dserver.h @@ -38,6 +38,7 @@ #define _DSERVER_H #include +#include "event_subscription_state.h" namespace Tango { @@ -128,8 +129,8 @@ public : void _create_cpp_class(const char *c1,const char *c2) {this->create_cpp_class(c1,c2);} void mcast_event_for_att(std::string &,std::string &,std::vector &); - void mem_event_par(std::map > &); - void apply_event_par(std::map > &); + void mem_event_par(ServerEventSubscriptionState&); + void apply_event_par(const ServerEventSubscriptionState&); void mem_devices_interface(std::map &); void changed_devices_interface(std::map &); diff --git a/cppapi/server/event_subscription_state.h b/cppapi/server/event_subscription_state.h new file mode 100644 index 000000000..e72e3a225 --- /dev/null +++ b/cppapi/server/event_subscription_state.h @@ -0,0 +1,37 @@ +#ifndef _EVENT_SUBSCRIPTION_STATE_H +#define _EVENT_SUBSCRIPTION_STATE_H + +#include +#include +#include + +namespace Tango +{ + +using EventClientLibVersion = int; +using EventClientLibVersions = std::vector; + +struct EventSubscriptionState +{ + std::string attribute_name; + + EventClientLibVersions change; + EventClientLibVersions archive; + EventClientLibVersions periodic; + EventClientLibVersions user; + EventClientLibVersions att_conf; + + bool quality; + bool data_ready; + bool dev_intr_change; + + bool notifd; + bool zmq; +}; + +using EventSubscriptionStates = std::vector; +using ServerEventSubscriptionState = std::map; + +} + +#endif diff --git a/cppapi/server/multiattribute.cpp b/cppapi/server/multiattribute.cpp index 2701a7b1b..5391fdf21 100644 --- a/cppapi/server/multiattribute.cpp +++ b/cppapi/server/multiattribute.cpp @@ -1449,7 +1449,7 @@ void MultiAttribute::read_alarm(std::string &status) // //------------------------------------------------------------------------------------------------------------------ -void MultiAttribute::get_event_param(std::vector &eve) +void MultiAttribute::get_event_param(EventSubscriptionStates& eve) { unsigned int i; @@ -1508,7 +1508,7 @@ void MultiAttribute::get_event_param(std::vector &eve) if (once_more == true) { - EventPar ep; + EventSubscriptionState ep; if (attr_list[i]->use_notifd_event() == true) ep.notifd = true; @@ -1548,7 +1548,7 @@ void MultiAttribute::get_event_param(std::vector &eve) // //------------------------------------------------------------------------------------------------------------------ -void MultiAttribute::set_event_param(std::vector &eve) +void MultiAttribute::set_event_param(const EventSubscriptionStates& eve) { for (size_t i = 0;i < eve.size();i++) { @@ -1558,7 +1558,7 @@ void MultiAttribute::set_event_param(std::vector &eve) { omni_mutex_lock oml(EventSupplier::get_event_mutex()); - std::vector::iterator ite; + std::vector::const_iterator ite; if (eve[i].change.empty() == false) { diff --git a/cppapi/server/multiattribute.h b/cppapi/server/multiattribute.h index 6405630d0..a861f66c4 100644 --- a/cppapi/server/multiattribute.h +++ b/cppapi/server/multiattribute.h @@ -38,6 +38,7 @@ #define _MULTIATTRIBUTE_H #include +#include "event_subscription_state.h" namespace Tango { @@ -45,21 +46,6 @@ namespace Tango class AttrProperty; class DeviceClass; -struct EventPar -{ - std::string attribute_name; - std::vector change; - std::vector archive; - bool quality; - std::vector periodic; - std::vector user; - std::vector att_conf; - bool data_ready; - bool dev_intr_change; - bool notifd; - bool zmq; -}; - //============================================================================= // // The MultiAttribute class @@ -280,8 +266,8 @@ class MultiAttribute void remove_attribute(std::string &,bool); std::vector &get_w_attr_list() {return writable_attr_list;} bool is_att_quality_alarmed(); - void get_event_param(std::vector &); - void set_event_param(std::vector &); + void get_event_param(EventSubscriptionStates&); + void set_event_param(const EventSubscriptionStates&); void add_alarmed_quality_factor(std::string &); void add_default(std::vector &,std::string &,std::string &,long); void add_attr(Attribute *att); From 7c65021ffdcdea4889978cf91b549c8c32c3ef8d Mon Sep 17 00:00:00 2001 From: Michal Liszcz Date: Fri, 27 Mar 2020 13:56:49 +0100 Subject: [PATCH 17/17] Enforce non-interactive package installation in CI (#701) Fixes issue with failing ubuntu:focal jobs due to tzdata package asking user to provide information about location and timezone. --- .travis/debian10/Dockerfile | 2 ++ .travis/debian8/Dockerfile | 2 ++ .travis/debian9/Dockerfile | 2 ++ .travis/gcc-latest/Dockerfile | 2 ++ .travis/llvm-latest/Dockerfile | 2 ++ .travis/ubuntu-20.04/Dockerfile | 2 ++ 6 files changed, 12 insertions(+) diff --git a/.travis/debian10/Dockerfile b/.travis/debian10/Dockerfile index c036e8c4d..efa0cff3f 100644 --- a/.travis/debian10/Dockerfile +++ b/.travis/debian10/Dockerfile @@ -6,6 +6,8 @@ ARG APP_GID=2000 MAINTAINER TANGO Controls team +ENV DEBIAN_FRONTEND=noninteractive + RUN apt-get update && apt-get install -y \ apt-utils \ build-essential \ diff --git a/.travis/debian8/Dockerfile b/.travis/debian8/Dockerfile index 5fcc76cdc..b3ba73f59 100644 --- a/.travis/debian8/Dockerfile +++ b/.travis/debian8/Dockerfile @@ -6,6 +6,8 @@ ARG APP_GID=2000 MAINTAINER TANGO Controls team +ENV DEBIAN_FRONTEND=noninteractive + RUN sed -i '/jessie-updates/d' /etc/apt/sources.list # Now archived RUN apt-get update && apt-get install -y \ diff --git a/.travis/debian9/Dockerfile b/.travis/debian9/Dockerfile index 388778fa7..cd6edd5b5 100644 --- a/.travis/debian9/Dockerfile +++ b/.travis/debian9/Dockerfile @@ -6,6 +6,8 @@ ARG APP_GID=2000 MAINTAINER TANGO Controls team +ENV DEBIAN_FRONTEND=noninteractive + RUN apt-get update && apt-get install -y \ apt-utils \ build-essential \ diff --git a/.travis/gcc-latest/Dockerfile b/.travis/gcc-latest/Dockerfile index c09dbc110..822a84e01 100644 --- a/.travis/gcc-latest/Dockerfile +++ b/.travis/gcc-latest/Dockerfile @@ -6,6 +6,8 @@ ARG APP_GID=2000 MAINTAINER TANGO Controls team +ENV DEBIAN_FRONTEND=noninteractive + RUN apt-get update && apt-get install -y \ apt-utils \ build-essential \ diff --git a/.travis/llvm-latest/Dockerfile b/.travis/llvm-latest/Dockerfile index 2d428aed3..c588d8e43 100644 --- a/.travis/llvm-latest/Dockerfile +++ b/.travis/llvm-latest/Dockerfile @@ -8,6 +8,8 @@ ARG APP_GID=2000 MAINTAINER TANGO Controls team +ENV DEBIAN_FRONTEND=noninteractive + RUN apt-get update && apt-get install -y \ apt-utils \ build-essential \ diff --git a/.travis/ubuntu-20.04/Dockerfile b/.travis/ubuntu-20.04/Dockerfile index 791659a4f..243a09a10 100644 --- a/.travis/ubuntu-20.04/Dockerfile +++ b/.travis/ubuntu-20.04/Dockerfile @@ -6,6 +6,8 @@ ARG APP_GID=2000 MAINTAINER TANGO Controls team +ENV DEBIAN_FRONTEND=noninteractive + RUN apt-get update && apt-get install -y \ apt-utils \ build-essential \