我在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很新,所以我很感激有关如何解决这个问题的任何建议.
我有一个第三方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中立即扩展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脚本编辑变量),但原理是一样的.
任何帮助表示赞赏.
我想编写一个低级日志记录功能,如下所示:
DO_DBG("some string", val1, val2)
Run Code Online (Sandbox Code Playgroud)
我想要它做的是,出于性能原因,将指针存储到字符串而不是字符串的副本.这假设字符串是只读文字.为了防止人们不得不调试调试器,如果编译器可以抱怨如果第一个参数DO_DBG
位于代码与文本等的可写段中,那将是很好的.我想知道是否存在这样做的机制.(我正在使用gcc 4.9.1,ld 2.24).
我正在尝试在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交叉编译器上)
我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版.
我对gyp完全不熟悉,所以请原谅任何关于这个问题的无知 - 我正在尝试将一个使用gyp的项目整合到make生成的更大环境中.有问题的.gyp文件有一个C文件的-L选项,它指向一个硬编码目录.我想将其更改为指向基于父项目的makefile中的变量集的目录.
在构建项目之前,我可以使用sed来搜索和替换字符串,但这看起来很混乱.我想知道是否可以从gyp文件中访问环境变量?
我在Linux(3.4)中有一个实时线程.在某些条件下,我希望它将控制权放弃到具有相同优先级的其他线程,即使它还没有完成使用其当前时间片.我在考虑使用以下代码:
if (condition) {
resched_task();
cond_resched();
}
Run Code Online (Sandbox Code Playgroud)
但是,我没有看到代码中有其他人这样做,让我觉得还有其他(更好的?)方式.有没有标准的方法来做到这一点?
一位同事刚刚遇到了这个问题,我想我会问以下问题是否有任何巧妙的解决方案:我有一个 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)
它会重建,b
但a
如果我触摸c
. b
如果仅通过订单先决条件调用它,有没有办法不重建?(在现实生活中b
是一个具有数百个依赖项的文件,在make a
调用时可能不存在。我不能使b
的先决条件仅按顺序排列,因为那样会破坏make b
)
如果多次将同一文件添加到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)
它会有意义,但我找不到任何相关的文档.我想知道知道的人是否知道,或者是否有人知道这不是真的情况?