在 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 等。所以你的测试结果可能会有所不同,并且可能需要额外检查以查看失败是否合法。
我正在尝试在 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 等。所以你的测试结果可能会有所不同,并且可能需要额外检查以查看失败是否合法。