I have an issue with the generation of makefiles stage of CMake being slow which is similar to this unanswered question:
CMake is slow to generate makefiles
My project is made up of a top level CMakeLists.txt file which uses add_subdirectory() to add various subprojects for individual library and executable components.
For a given component, the CMakeLists.txt file contains something like:
add_library(mylib SHARED
sourceFile1.cpp
sourceFile2.cpp
...
)
Run Code Online (Sandbox Code Playgroud)
I can build just the contents of that directory using:
make mylib
Run Code Online (Sandbox Code Playgroud)
If …
我希望创建两个包,一个包含共享库,另一个包含供开发使用的标头。
一个有效的解决方案是:
INSTALL(TARGETS mylib
COMPONENT core
LIBRARY DESTINATION ${LIBDIR}
)
INSTALL (
DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMPONENT devel
DESTINATION ${INCLUDEDIR}
FILES_MATCHING PATTERN "*.h")
Run Code Online (Sandbox Code Playgroud)
然而,CMake 也有一个“PUBLIC_HEADER”目的地。这样你就可以做类似的事情:
INSTALL(TARGETS mylib
LIBRARY DESTINATION ${LIBDIR}
PUBLIC_HEADER DESTINATION ${INCLUDEDIR}
)
Run Code Online (Sandbox Code Playgroud)
我似乎无法让它发挥作用。即使头文件显式添加到 ADD_LIBRARY(),${INCLUDEDIR} 也不会安装任何内容。有人可以举一个例子来说明这是如何工作的吗?
另一个问题是我想要不同包中的库和标头,所以理想情况下我想要:
INSTALL(TARGETS mylib
COMPONENT core
LIBRARY DESTINATION ${LIBDIR}
)
INSTALL(TARGETS mylib
COMPONENT devel
PUBLIC_HEADER DESTINATION ${INCLUDEDIR}
)
Run Code Online (Sandbox Code Playgroud)
但 PUBLIC_HEADER 似乎需要设置 LIBRARY DESTINATION 。有没有办法做到这一点?无论如何,PUBLIC_HEADER 比安装目录有什么优势吗?
实时时钟/ dev/rtc可以使用hwclock -r 读取,但只能以root身份读取.
>hwclock -r --debug hwclock from util-linux 2.23.2 hwclock: cannot open /dev/rtc: Permission denied No usable clock interface found. hwclock: Cannot access the Hardware Clock via any known method. >sudo hwclock -r [sudo] password for xxx: Wed 26 Apr 2017 12:44:01 BST -0.281946 seconds
我想不出有任何理由阻止任何用户阅读时钟.那么,为什么在这里需要根接取?
我唯一的想法是它必须与低级查询有关,可以某种方式与系统接口.也许如果你不断阅读/ dev/rtc,你可以阻止它足够长时间来扰乱内核?
上下文:我现在负责从/ dev/rtc读取的应用程序.因此,它必须以root身份运行,但没有真正的理由它不能成为用户空间应用程序.我怀疑它需要使用实时时钟,但我的问题仍然存在.
What is modern best practice for multi-configuration builds (with Jenkins)?
I want to support multiple branches and multiple configurations.
For example for each version V1, V2 of the software I want builds targeting platforms P1 and P2.
We have managed to set up multi-branch declarative pipelines. Each build has its own docker so its easy to support multiple platforms.
pipeline {
agent none
stages {
stage('Build, test and deploy for P1) {
agent {
dockerfile {
filename 'src/main/docker/Jenkins-P1.Dockerfile'
}
} …Run Code Online (Sandbox Code Playgroud) 在Python中使用argparse模块时,我正在寻找一种方法来捕获无效选项并更好地报告它们.https://docs.python.org/3/library/argparse.html#invalid-arguments上的文档提供了一个示例:
parser = argparse.ArgumentParser(prog='PROG'
parser.add_argument('--foo', type=int)
parser.add_argument('bar', nargs='?')
# invalid option
parser.parse_args(['--bar'])
usage: PROG [-h] [--foo FOO] [bar]
PROG: error: no such option: --bar
Run Code Online (Sandbox Code Playgroud)
然而,由于不首先报告错误的选项,所以很容易将其绊倒.例如:
import argparse
import datetime
def convertIsoTime(timestamp):
"""read ISO-8601 time-stamp using the AMS conventional format YYYY-MM-DDThh:mm:ssUTC"""
try:
return datetime.datetime.strptime(timestamp,"%Y-%m-%dT%H:%M:%SUTC")
except:
raise argparse.ArgumentTypeError("'{}' is not a valid ISO-8601 time-stamp".format(timestamp))
parser = argparse.ArgumentParser()
parser.add_argument('startTime', type=convertIsoTime)
parser.add_argument('--good', type=int,
help='foo')
args = parser.parse_args(['--gold','5','2015-01-01T00:00:00UTC'])
Run Code Online (Sandbox Code Playgroud)
将报告:
error: argument startTime: '5' is not a valid ISO-8601 time-stamp
Run Code Online (Sandbox Code Playgroud)
当我希望它报告更有用时:
error: no such …Run Code Online (Sandbox Code Playgroud) 我有一个配置探针,它根据平台和版本确定要传递给g ++的标志.我通常使用更高版本的gcc而不是本机安装版本,以便获得对C++ 14功能的访问.在较旧的平台上,这意味着我需要添加-D_GLIBCXX_USE_CXX11_ABI = 0以使用旧的C++ ABI,或者我无法与主机版本的C++库链接.然而,一些较新的平台确实使用新的ABI,在这种情况下需要-D_GLIBCXX_USE_CXX11_ABI = 1(或根本没有).
我可以根据目标平台的版本(即lsb_release -a的输出)来做到这一点,但我想要一个更通用的方法.
我认为我已经用原生编译器编译了一个C++ hello world程序(与我后来的编译器相反),但我无法弄清楚如何探测ABI版本.例如
>strings hello | grep ABI .note.ABI-tag >strings hello | grep CXX GLIBCXX_3.4
或类似地使用hello探针程序使用的libstdc ++版本.
ldd ./hello | grep stdc++ | sed -e 's_.* /_/_' | cut -f 1 -d' ' |xargs strings | grep
有没有人有更好的建议?
更新: 事实上我根本不需要这样做.我真正的问题是我有一个较旧版本的libstdc ++.所以闲逛.编译选择了一个版本6.0.20,运行时选择了一个不兼容的6.0.19(反之亦然).我有一个未解决的符号,我错误地将其归咎于ABI版本.与流行的看法相反,libstdc ++的次要版本并不总是二进制兼容.我的目的是始终在运行和编译时使用完全相同的版本(如果不使用主机本机版本).
给定一个递归构建结构。如何将目标从较低级别导入到较高级别?这是一个简化的示例:
顶级CMakeLists.txt:
cmake_minimum_required(VERSION 2.8)
add_subdirectory(sub1)
Run Code Online (Sandbox Code Playgroud)
sub1/CMakeLists.txt:
add_subdirectory(subdir)
add_executable(foo EXCLUDE_FROM_ALL
foo.cpp)
add_custom_target(both)
add_dependencies(both DEPENDS foo bar)
Run Code Online (Sandbox Code Playgroud)
sub1/subdir/CMakeLists.txt:
add_executable(bar EXCLUDE_FROM_ALL
bar.cpp)
Run Code Online (Sandbox Code Playgroud)
在顶层,所有目标都是可见的:
在底层(sub1/subdir)只有栏是可见的:
在中间层,只有foo作为目标可见:
制作帮助显示:
以下是此 Makefile 的一些有效目标: ...全部(如果未提供目标,则为默认值) ... 干净的 ... 依靠 ... edit_cache ...重建缓存 ... 两个都 ... foo ... foo.o ... …
我继承了一个使用snd_pcm_readn().
确定应该与检索到的每个样本相关联的时间戳的最可靠方法是什么?
据推测,ALSA 或捕获卡本身会进行某种缓冲,这意味着 clock_gettime() 可能存在可变错误(尤其是因为这是一个多线程应用程序)。
在我看来,它应该是这样的:
if((alsa_result = snd_pcm_readn(card->capture_handle,
card->capture_buff,
card->buffer_size)) == 0)
{
snd_pcm_status_t pcm_status;
snd_timestamp_t snd_timestamp; //actually a struct timeval under the hood
if (snd_pcm_status(card->capture_handle, &pcm_status) == 0)
{
snd_pcm_status_get_tstamp(&pcm_status, &snd_timestamp);
// translate timeval into milliseconds
const uint64_t millis = (snd_timestamp.tv_sec * (uint64_t)1000) + (snd_timestamp.tv_usec / 1000);
}
Run Code Online (Sandbox Code Playgroud)
}
但是,snd_timestamp 指的是什么时间?它是检索到的第一个样本还是最后一个样本,我们是否需要考虑自 snd_pcm_readn() 返回以来可能已捕获的样本?
我发现的 ALSA 文档在细节上很粗略。snd_pcm_status_get_tstamp()如果时间戳未启用(例如,请参阅https://www.kernel.org/doc/html/v4.10/sound/designs/timestamping.html),它甚至有效。
参考好的(最好是在线的)ALSA 相关阅读材料的奖励积分。
与此相关,我目前无法编译上面的代码,因为它说:
error: storage size of ‘pcm_status’ isn’t known
snd_pcm_status_t pcm_status;
Run Code Online (Sandbox Code Playgroud)
我有#include <alsa/pcm.h> …
我有一个以前只针对基于 RPM 的发行版的软件包,我现在正在为基于 Debian 的发行版构建 .deb 软件包。
目的是从与您正在构建的系统隔离的用户空间模拟测试安装。它可能是多用户的,您不希望仅仅为了构建软件而需要 root 访问权限。我们的许多测试已经模拟了安装目录结构。这是使用构建的包模拟实际安装的下一步。
对于 RPM 包,我能够使用以下方法创建测试安装:
WSDIR=/where/I/want/my/tests/to/run
rpmdb --initdb --dbpath "$WSDIR"/rpmdb
rpm --relocate /opt="$WSDIR"/opt --dbpath $WSDIR/rpmdb -i <package>.rpm
Run Code Online (Sandbox Code Playgroud)
Debian 世界中的等价物是这样的:
dpkg --force-not-root --admindir=$WSDIR/dpkg --root=$WSDIR/install --install "$DEB"
Run Code Online (Sandbox Code Playgroud)
但是,我被困在相当于该rpmdb --initdb步骤的地方。
请注意,我可以使用以下方法解压缩存档:
dpkg-deb -x "$DEB" $WSDIR/install
Run Code Online (Sandbox Code Playgroud)
但我更愿意更接近于真正的包是如何安装的。另外我认为这不会运行preinstall和postinstall脚本。
类似的问题建议使用deboostrap来创建chroot环境,但这会创建一个完整的新安装。除了矫枉过正之外,它对于自动化测试来说太慢了。我打算在实际测试环境中进一步测试之前使用它来快速测试安装包。
到目前为止我的实验:
(cd $WSDIR/dpkg && mkdir alternatives info parts triggers updates)
cp /var/lib/dpkg/status $WSDIR/dpkg/status
Run Code Online (Sandbox Code Playgroud)
最好的结果是:
dpkg: error: unable to access dpkg status area: No such file or directory
Run Code Online (Sandbox Code Playgroud)
这并没有表明清楚什么是错误的。 …
我对 HTTP 协议的细微差别有点生疏,我想知道它是否可以直接支持发布/订阅?
HTTP 是一种请求响应协议。所以客户端发送请求,服务器发回响应。在 HTTP 1.0 中,为每个请求建立了一个新连接。现在 HTTP 1.1 改进了 HTTP 1.0,允许客户端保持连接打开并发出多个请求。
我意识到您可以将 HTTP 连接升级到 websocket 以进行快速的 2 路通信。我很好奇的是这是否是绝对必要的?
例如,如果我请求资源“ http://somewhere.com/fetch/me/slowly ”
服务器有空直接回复两次吗?例如首先接受 202,然后在内容准备好后不久接受内容,但没有客户端先发送额外的请求?
IE
Client: GET http://somewhere.com/fetch/me/slowly
Server: 202 "please wait..."
Server: 200 "here's your document"
Run Code Online (Sandbox Code Playgroud)
以这种方式实现发布/订阅服务是否正确?例如:
Client: http://somewhere.com/subscribe
Server: item 1
...
Server: item 2
Run Code Online (Sandbox Code Playgroud)
我的印象是这“可能”有效,因为客户端通常会有一个事件循环来监视连接,但在技术上是错误的(因为不需要以这种方式实现遵循协议的客户端)。
但是,如果您使用分块传输编码,这将起作用。
HTTP/2 似乎也允许这样做,但我不清楚是否进行了更改以使其成为可能。
我还没有看到太多关于 pub/sub 的讨论,所以如果使用带有或不带有分块编码的普通 HTTP/1.1 有什么问题怎么办?
如果这有效,为什么你需要像 RSS 或 ATOM 这样的东西?