小编pab*_*ouk的帖子

如何在Makefile中更改CC等变量的默认值

(GNU)make使用了几个变量,如:

  • CC - 默认情况下为C编译器 cc
  • CFLAGS - C编译器的标志,默认为空

我想在我的中指定一些我自己的默认值Makefile.在下面的示例中,我使用条件赋值运算符?=在运行时能够覆盖我的默认值make:

CFLAGS ?= CFLAGS_my_default
CC ?= CC_my_default

print:
    echo CC=$(CC) CFLAGS=$(CFLAGS)
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不会改变CC变量的值,因为原始默认值保持不变.CFLAGS由我的赋值设置,因为变量最初是空的:

$ make print
echo CC=cc CFLAGS=CFLAGS_my_default
CC=cc CFLAGS=CFLAGS_my_default
Run Code Online (Sandbox Code Playgroud)

从环境变量覆盖按预期工作:

$ CC=CC_from_env CFLAGS=CFLAGS_from_env make print
echo CC=CC_from_env CFLAGS=CFLAGS_from_env
CC=CC_from_env CFLAGS=CFLAGS_from_env
Run Code Online (Sandbox Code Playgroud)

如何更改变量的默认值,并且仍然可以在调用时覆盖它们make

variables makefile default-value gnu-make

14
推荐指数
2
解决办法
8477
查看次数

如何从位置而不是名称给出的字段值初始化 Pydantic 对象?

我无法找到一种简单的方法来根据位置给定的字段值(例如在列表而不是字典中)初始化 Pydantic 对象,因此我编写了类方法positional_fields()来从可迭代创建所需的字典:

from typing import Optional, Iterable, Any, Dict
from pydantic import BaseModel


class StaticRoute(BaseModel):
    if_name: str
    dest_ip: str
    mask: str
    gateway_ip: str
    distance: Optional[int]
    
    @classmethod
    def positional_fields(cls, values: Iterable) -> Dict[str, Any]:
        return dict(zip(cls.__fields__, values))


input_lines = """
  route ab 10.0.0.0 255.0.0.0 10.220.196.23 1
  route gh 10.0.2.61 255.255.255.255 10.220.198.38 1
""".splitlines()

for line in input_lines:
    words = line.split()
    if words and words[0] == 'route':
        sroute = StaticRoute(**StaticRoute.positional_fields(words[1:]))
        print(sroute)
Run Code Online (Sandbox Code Playgroud)
if_name='ab' dest_ip='10.0.0.0' mask='255.0.0.0' gateway_ip='10.220.196.23' distance=1
if_name='gh' dest_ip='10.0.2.61' mask='255.255.255.255' …
Run Code Online (Sandbox Code Playgroud)

python iterable pydantic

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

为什么程序输出重定向会导致其子进程的输出乱序?

在我在 Linux 上运行的 C 程序中,它使用创建子进程system()我注意到,当我将stdout重定向到管道或文件时,子进程的输出在缓冲 I/O 函数的输出之前发送,例如printf(). 当stdout被留在终端时,输出按预期顺序排列。我将程序简化为以下示例:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    printf("1. output from printf()\n");
    system("echo '2. output from a command called using system()'");

    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

stdout进入终端时的预期输出:

$ ./iobuffer
1. output from printf()
2. output from a command called using system()
Run Code Online (Sandbox Code Playgroud)

stdout重定向到管道或文件时的输出乱序:

$ ./iobuffer | cat
2. output from a command called using system()
1. output from printf()
Run Code Online (Sandbox Code Playgroud)

c subprocess buffering io-redirection

2
推荐指数
1
解决办法
693
查看次数