小编Joh*_*ohn的帖子

你能用perl强制刷新输出吗?

我在perl中有以下两行:

print "Warning: this will overwrite existing files.  Continue? [y/N]: \n";
my $input = <STDIN>;
Run Code Online (Sandbox Code Playgroud)

问题是在perl脚本暂停输入之前,打印行没有执行.也就是说,perl脚本似乎无缘无故地无缘无故地停止.我猜测输出是以某种方式缓冲的(这就是为什么我把\n放入,但这似乎没有帮助).我对perl很新,所以我很感激有关如何解决这个问题的任何建议.

perl flush autoflush

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

强制Makefile中的先决条件顺序

我有一个第三方makefile,我希望在第一个构建自定义目标(T2)之前不会构建其中一个目标(T1).通常,这可以通过使T2成为T1的先决条件来实现.但是,T1在其中一个规则中使用了$ ^ ..因此,通过添加先决条件,我最终打破了构建......我所拥有的是:

T1: x y z T2
    $(MAKE) -j $^;
    # fails because T2 should not be passed to the make!!!

.PHONY: T2

T2:
    #do some linking and prep for T1
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以确保T2在T1之前运行?(注意:上面的例子实际上有点简化.T1实际上是Linux内核makefile中的vmlinux目标,因此重写它不仅困难,而且使代码不可移植.而且,我之前无法运行T2由于某些其他依赖项而在内核上调用make).

makefile gnu-make

14
推荐指数
1
解决办法
7987
查看次数

将环境变量导出到Makefile shell

我想在Makefile中立即扩展shell命令,但是我希望shell命令能够访问Makefile中的环境变量.如果我使用$(shell ...),它会立即扩展,但是无法访问变量.如果我使用反引号,扩展不是立即的,它会在以后的Makefile中导致我的问题.我想知道是否有任何方法可以立即扩展反引号,或者将当前环境传递给$(shell)命令.

例如,以下makefile:

SOME_VAR := some_val
export SOME_VAR

VAR1 := `echo $$SOME_VAR`
export VAR1
VAR2 := `echo $$VAR1`

all:
      @echo VAR1=$(VAR1)
      @echo VAR2=$(VAR2)
Run Code Online (Sandbox Code Playgroud)

将输出:

~/tmp/t2> make
VAR1=some_val
VAR2=`echo $SOME_VAR`
Run Code Online (Sandbox Code Playgroud)

我想要它打印"VAR2 = some_val".真实的例子有点复杂(环境变量是从父makefile继承的,我正在尝试使用perl脚本编辑变量),但原理是一样的.

任何帮助表示赞赏.

shell makefile

10
推荐指数
2
解决办法
4万
查看次数

C测试变量是否在只读部分

我想编写一个低级日志记录功能,如下所示:

DO_DBG("some string", val1, val2)
Run Code Online (Sandbox Code Playgroud)

我想要它做的是,出于性能原因,将指针存储到字符串而不是字符串的副本.这假设字符串是只读文字.为了防止人们不得不调试调试器,如果编译器可以抱怨如果第一个参数DO_DBG位于代码与文本等的可写段中,那将是很好的.我想知道是否存在这样做的机制.(我正在使用gcc 4.9.1,ld 2.24).

c macros gcc

10
推荐指数
1
解决办法
731
查看次数

如何在GNU Make中定义ifeq?

我正在尝试在Makefile中的一个定义内部执行ifeq,但我似乎遇到了一些错误,我想知道我是否遗漏了一些东西.我有以下Makefile:

$(info ---- start ----)
ifeq ("X","Y")
$(info DOES not appear_1)
endif

define TESTDEF
ifeq ("X","Y")
$(info SHOULD not appear)
# $(error DEFINITELY SHOULD not error...)
endif
endef

$(eval $(call TESTDEF, 1,2,3))
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

---- start ----
SHOULD not appear
Makefile:14: *** DEFINATELY SHOULD not error....  Stop.
Run Code Online (Sandbox Code Playgroud)

有一些我不知道的伎俩吗?有可能做ifeq的内部定义吗?(注意:这发生在我的本机GNU 3.81 make和我的mips uclibc交叉编译器上)

makefile

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

你可以使用带有switch语句的builtin_expect吗?

switch在一些时间关键代码中有一个声明.我试图用它来优化它__builtin_expect,但它似乎没有起作用.我想知道是否有人可以告诉我,我是否遗漏了一些细节,或者编译器是否只是没有针对它进行优化.我在我的主机上尝试了以下内容:

int main() {
    volatile int v=0;
    long i = 0;

    for (i=0; i<1000000000L; i++) {
            switch(__builtin_expect(v, EXPT)) {
            case 7:
                    v=7;
                    break;
            default:
                    v=7;
                    break;
            }
    }
    return v;
}
Run Code Online (Sandbox Code Playgroud)

然后我编译并运行如下:

~/code/builtinexpect> gcc bie.c -o bie -D EXPT=0 && time ./bie 

real    0m2.092s  
user    0m2.086s
sys     0m0.000s
~/code/builtinexpect> gcc bie.c -o bie -D EXPT=7 && time ./bie 

real    0m2.092s
user    0m2.086s
sys     0m0.000s
Run Code Online (Sandbox Code Playgroud)

我使用的是GCC 4.5.1版.

gcc switch-statement branch-prediction

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

我可以在gyp中使用环境变量吗?

我对gyp完全不熟悉,所以请原谅任何关于这个问题的无知 - 我正在尝试将一个使用gyp的项目整合到make生成的更大环境中.有问题的.gyp文件有一个C文件的-L选项,它指向一个硬编码目录.我想将其更改为指向基于父项目的makefile中的变量集的目录.
在构建项目之前,我可以使用sed来搜索和替换字符串,但这看起来很混乱.我想知道是否可以从gyp文件中访问环境变量?

gyp

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

从linux内核中产生

我在Linux(3.4)中有一个实时线程.在某些条件下,我希望它将控制权放弃到具有相同优先级的其他线程,即使它还没有完成使用其当前时间片.我在考虑使用以下代码:

if (condition) {
    resched_task();
    cond_resched();
}
Run Code Online (Sandbox Code Playgroud)

但是,我没有看到代码中有其他人这样做,让我觉得还有其他(更好的?)方式.有没有标准的方法来做到这一点?

linux multithreading real-time scheduled-tasks

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

如果过时,则防止仅重新构建订单先决条件

一位同事刚刚遇到了这个问题,我想我会问以下问题是否有任何巧妙的解决方案:我有一个 GNU makefile:

a: | b
    touch $@
b:c
    touch $@
c:
    touch $@
Run Code Online (Sandbox Code Playgroud)

然后我运行:

~/tmp> make a
touch c
touch b
touch a
~/tmp> make a
make: `a' is up to date.
~/tmp> touch b
~/tmp> make a
make: `a' is up to date.
~/tmp> touch c
~/tmp> make a
touch b
Run Code Online (Sandbox Code Playgroud)

它会重建,ba如果我触摸c. b如果仅通过订单先决条件调用它,有没有办法不重建?(在现实生活中b是一个具有数百个依赖项的文件,在make a调用时可能不存在。我不能使b的先决条件仅按顺序排列,因为那样会破坏make b

makefile

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

从具有重复条目名称的tar文件中提取

如果多次将同一文件添加到tar文件中,然后提取该文件,是否可以保证提取的版本与上次添加的版本相同?

~/tmp> echo hi > foo
~/tmp> tar -cf bar.tar foo
~/tmp> echo bye > foo
~/tmp> tar -uf bar.tar foo 
~/tmp> tar -tf bar.tar
foo
foo
~/tmp> rm foo
~/tmp> tar -xf bar.tar foo
~/tmp> cat foo
bye
Run Code Online (Sandbox Code Playgroud)

它会有意义,但我找不到任何相关的文档.我想知道知道的人是否知道,或者是否有人知道这不是真的情况?

bash tar

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