在 Fedora24 上从源代码构建 REDHAWK CF

Building REDHAWK CF from Source on Fedora24

我正在尝试在 Fedora24 机器上从源代码构建 REDHAWK CF。我遇到了一些障碍,希望大家能就以下两个问题提供指导:

1) 我克隆了 RedhawkSDR/redhawk 存储库,并试图在 redhawk.git/redhawk/core/src 中构建 CF。 F24 随 GCC6 一起发布,并且基于列出的受支持平台(RHEL / CentOS 6 系列),我猜这比上游正在测试的平台要早一些。在我克隆时,core 位于 cfea23b,标记为 v2.0.1.

为了构建它,我不得不进行四处更改。我认为后两个是 GCC6 所需的更改(即 gnu-c++14),但我认为无论使用的 C++ 标准如何,前两个都是必需的。也就是说,这些线路最后一次触及是在 2016 年 2 月——因此我很担心。我敢打赌,如果这些是真正的错误,现在应该已经被发现了,这让我相信我做错了什么。

我的变更集如下:

diff --git a/src/control/framework/nodebooter.cpp b/src/control/framework/nodebooter.cpp
index d79c291..dbd97ad 100644
--- a/src/control/framework/nodebooter.cpp
+++ b/src/control/framework/nodebooter.cpp
@@ -141,7 +141,7 @@ void loadPRFExecParams (const std::string& prfFile, ExecParams& execParams)
         prf.load(prfStream);
     } catch (const ossie::parser_error& ex) {
         std::string parser_error_line = ossie::retrieveParserErrorLineNumber(ex.what());
-        LOG_ERROR(nodebooter, "Failed to parse PRF file " << prfStream<< ". " << parser_error_line << "The XML parser returned the following error: " << ex.what());
+        LOG_ERROR(nodebooter, "Failed to parse PRF file " << prfFile<< ". " << parser_error_line << "The XML parser returned the following error: " << ex.what());
         exit(EXIT_FAILURE);
     }
     prfStream.close();
diff --git a/src/control/sdr/dommgr/ApplicationFactory_impl.cpp b/src/control/sdr/dommgr/ApplicationFactory_impl.cpp
index d370519..92699e0 100644
--- a/src/control/sdr/dommgr/ApplicationFactory_impl.cpp
+++ b/src/control/sdr/dommgr/ApplicationFactory_impl.cpp
@@ -194,7 +194,7 @@ void ApplicationFactory_impl::ValidateSPD(CF::FileManager_ptr fileMgr,
                                           const bool require_prf, 
                                           const bool require_scd) {
   SoftPkg pkg;
-  ValidateSPD(fileMgr, pkg, false, false );
+  ValidateSPD(fileMgr, pkg, sfw_profile, require_prf, require_scd);
 }

 void ApplicationFactory_impl::ValidateSPD(CF::FileManager_ptr fileMgr, 
diff --git a/src/control/sdr/dommgr/applicationSupport.cpp b/src/control/sdr/dommgr/applicationSupport.cpp
index 1daa7ce..fbb5ac8 100644
--- a/src/control/sdr/dommgr/applicationSupport.cpp
+++ b/src/control/sdr/dommgr/applicationSupport.cpp
@@ -853,7 +853,7 @@ const bool  ComponentInfo::isScaCompliant()

 bool ComponentInfo::isAssignedToDevice() const
 {
-    return assignedDevice;
+  return static_cast<bool>(assignedDevice);
 }

 bool ComponentInfo::checkStruct(CF::Properties &props)
diff --git a/src/testing/sdr/dev/devices/CppTestDevice/cpp/CppTestDevice.h b/src/testing/sdr/dev/devices/CppTestDevice/cpp/CppTestDevice.h
index 8e1c396..af71c53 100644
--- a/src/testing/sdr/dev/devices/CppTestDevice/cpp/CppTestDevice.h
+++ b/src/testing/sdr/dev/devices/CppTestDevice/cpp/CppTestDevice.h
@@ -28,7 +28,7 @@ class CppTestDevice_i : public CppTestDevice_base
 {
     ENABLE_LOGGING
     public:
-       static const float MAX_LOAD = 4.0;
+       static constexpr float MAX_LOAD = 4.0;

        CppTestDevice_i(char *devMgr_ior, char *id, char *lbl, char *sftwrPrfl);
         CppTestDevice_i(char *devMgr_ior, char *id, char *lbl, char *sftwrPrfl, char *compDev);

2) 有了这个补丁,我就可以构建 CF 了。不幸的是,运行 make test 失败并显示以下内容:

cd testing; ./runtests.py
Searching for files in tests/ with prefix test_*.py

Creating the Test Domain

bhilburn22299

R U N N I N G  T E S T S
SDRROOT:  /home/bhilburn/src/redhawk.git/redhawk/core/src/testing/sdr

Loading module tests/test_00_PythonFramework.py
LOADING
Loading module tests/test_00_PythonUtils.py
LOADING
Loading module tests/test_00_ValidateTestDomain.py
LOADING
Loading module tests/test_01_DeviceManager.py
LOADING
Traceback (most recent call last):
  File "./runtests.py", line 231, in <module>
    suite = TestCollector(files, testMethodPrefix=options.prefix, prompt=options.prompt)
  File "./runtests.py", line 112, in __init__
    self.loadTests()
  File "./runtests.py", line 129, in loadTests
    self.addTest(loader.loadTestsFromTestCase(candidate))
  File "./runtests.py", line 104, in loadTestsFromTestCase
    return self.suiteClass(map(testCaseClass, testCaseNames))
  File "/home/bhilburn/src/redhawk.git/redhawk/core/src/testing/_unitTestHelpers/scatest.py", line 328, in __init__
    self._root = self._ns._narrow(CosNaming.NamingContext)
  File "/usr/lib/python2.7/site-packages/omniORB/CORBA.py", line 585, in _narrow
    return self._obj.narrow(repoId, 1)
omniORB.CORBA.TRANSIENT: CORBA.TRANSIENT(omniORB.TRANSIENT_ConnectFailed, CORBA.COMPLETED_NO)
Makefile:1023: recipe for target 'test' failed
make: *** [test] Error 1

根据 Installation Instructions,我敢打赌 omniORB 配置不正确。不过,我无法弄清楚我到底错过了什么。我已经按照安装说明对 /etc/omniORB.cfg 进行了更改,但是当我尝试手动调用 cleanomni 时,我看到了这个:

sh: /etc/init.d/omniNames: No such file or directory

我的猜测是,当通过 RPM 安装 CF 时,会完成一些安装说明中未描述的额外配置步骤。是否有任何文档可以更详细地分解这些内容?

我还必须在您建议的相同位置修补框架,并采用与您相同的方法。我还必须配置以下内容:

CXXFLAGS='-g -O2 -fpermissive' ./configure --disable-log4cxx

因为我没有 log4cxx 并且 dnf 搜索没有找到它。

至于 make test 调用,我相信您需要具有 omniNames 运行ning 才能执行。如果您安装了 omniORB-servers,您应该能够 sudo systemctl start omniNames.service。我在docker图像中运行宁,所以我直接开始它:

/usr/bin/omniNames -start -always -logdir /var/log/omniORB/ -errlog /var/log/omniORB/error.log

因为我相信我需要做一些额外的工作才能使 systemctl 在 docker 中发挥良好的作用。在此之后,单元测试应该 运行。尽管我还执行了 make install 并在 $OSSIEHOME/etc/profile.d 中获取了 profile.d 脚本。当然,我没有安装 omniEvents 所以我的充满了:

ERROR:DomainManager - Service unvailable, Unable to create event channel: IDM_Channel

关于 cleanomni 脚本,这个脚本非常依赖于系统,我相信只适用于 CentOS6。它应该停止 omni 服务,删除 "logs"(更像是持久性),然后重新启动它们。根据 omniNames 的启动/编译方式,每个系统的日志目录可能不同。我通常只是手动清理它或使用 bash 脚本来 stop/clean/start 服务。

经过漫长的等待,我的单元测试确实完成了,结果如下:

Ran 498 tests in 1587.850s FAILED (failures=11, errors=35)

虽然这可能不是一个好的评估;一些测试依赖于 omniEvents,一些依赖于正在安装的 valgrind 等库,一些需要 BULKIO 等。所以你的测试结果可能会有所不同,并且可能需要额外检查以查看失败是否合法。