小编Bru*_*ams的帖子

'cmake rebuild_cache' for*just*a subdirectory?

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 …

build-process build cmake meson-build

7
推荐指数
1
解决办法
2322
查看次数

cmake 使用 PUBLIC_HEADER 将库和开发文件安装为单独的组件

我希望创建两个包,一个包含共享库,另一个包含供开发使用的标头。

一个有效的解决方案是:

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 比安装目录有什么优势吗?

cmake

7
推荐指数
1
解决办法
8886
查看次数

为什么需要超级用户权限来读取Linux上的实时时钟?

实时时钟/ 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身份运行,但没有真正的理由它不能成为用户空间应用程序.我怀疑它需要使用实时时钟,但我的问题仍然存在.

linux clock real-time-clock

6
推荐指数
1
解决办法
885
查看次数

Multiconfiguration / matrix build pipeline in Jenkins

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)

continuous-integration jenkins jenkins-pipeline

6
推荐指数
1
解决办法
436
查看次数

使用python argparse模块首先报告无效选项(或使用正则表达式)

在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)

python argparse

5
推荐指数
1
解决办法
803
查看次数

如何在目标平台上探测系统版gcc使用的C++ ABI

我有一个配置探针,它根据平台和版本确定要传递给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 ++的次要版本并不总是二进制兼容.我的目的是始终在运行和编译时使用完全相同的版本(如果不使用主机本机版本).

c++ linux gcc configure c++14

5
推荐指数
1
解决办法
2243
查看次数

cmake:如何将目标从子目录导入到更高级别?

给定一个递归构建结构。如何将目标从较低级别导入到较高级别?这是一个简化的示例:

顶级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)

在顶层,所有目标都是可见的:

  • make foo - 构建 foo
  • 制作酒吧 - 建造酒吧
  • make both - 建立 foo & bar

在底层(sub1/subdir)只有是可见的:

  • 制作酒吧 - 建造酒吧

在中间层,只有foo作为目标可见:

  • make foo - 构建 foo
  • make both - 建立 foo & bar

制作帮助显示:

以下是此 Makefile 的一些有效目标:
...全部(如果未提供目标,则为默认值)
... 干净的
... 依靠
... edit_cache
...重建缓存
... 两个都
... foo
... foo.o
... …

cmake

5
推荐指数
1
解决办法
1689
查看次数

确定采样音频的时间戳

我继承了一个使用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> …

c alsa

5
推荐指数
1
解决办法
865
查看次数

您如何创建用于测试的 debian 软件包的虚假安装?

我有一个以前只针对基于 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)

但我更愿意更接近于真正的包是如何安装的。另外我认为这不会运行preinstallpostinstall脚本。

类似的问题建议使用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)

这并没有表明清楚什么是错误的。 …

dpkg deb

5
推荐指数
1
解决办法
1525
查看次数

HTTP 中的多重响应是否合法?

我对 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 这样的东西?

http publish-subscribe chunked-encoding

5
推荐指数
1
解决办法
5898
查看次数