当前位置: 首页 > 面试题库 >

Makefile命令替换问题

哈宪
2023-03-14
问题内容

如果给定其他配置文件,则rebar不会自动重建文件。因此,我尝试在Makefile级别上执行此操作:

REBAR=./rebar
REBAR_DEBUG=$(REBAR) -C rebar.debug.config
REBAR_COMPILE=$(REBAR) get-deps compile
LAST_CONFIG:=$(cat config.tmp)
PLT=dialyzer/sqlite3.plt

all: config_normal compile

compile:
    $(REBAR_COMPILE)

test:
    $(REBAR_COMPILE) eunit

clean:
    -rm -rf deps ebin priv doc/* .eunit c_src/*.o

docs:
    $(REBAR_COMPILE) doc

static: config_debug
    $(REBAR_DEBUG) get-deps compile
ifeq ($(wildcard $(PLT)),)
    dialyzer --build_plt --apps kernel stdlib erts --output_plt $(PLT) 
else
    dialyzer --plt $(PLT) -r ebin
endif

cross_compile: config_cross
    $(REBAR_COMPILE) -C rebar.cross_compile.config

valgrind: clean
    $(REBAR_DEBUG) get-deps compile
    valgrind --tool=memcheck --leak-check=yes --num-callers=20 ./test.sh

ifeq ($(LAST_CONFIG),normal)
config_normal:
    echo "$(LAST_CONFIG) == normal"
else
config_normal: clean
    echo "$(LAST_CONFIG) != normal"
    rm -f config.tmp
    echo "normal" > config.tmp
endif

ifeq ($(LAST_CONFIG),debug)
config_debug: ;
else
config_debug: clean
    rm -f config.tmp
    echo "debug" > config.tmp
endif

ifeq ($(LAST_CONFIG),cross)
config_cross: ;
else
config_cross: clean
    rm -f config.tmp
    echo "cross" > config.tmp
endif

.PHONY: all compile test clean docs static valgrind config_normal config_debug config_cross

希望的意图很明显:当我使用需要特定配置文件的目标时,请检查上次是否使用了相同的文件;运行clean并记录我们现在使用的配置。

但这不起作用,并且文件会不断重新编译

aromanov@alexey-desktop:~/workspace/gmcontroller/lib/sqlite3$ make
rm -rf deps ebin priv doc/* .eunit c_src/*.o
echo " != normal"
 != normal
rm -f config.tmp
echo "normal" > config.tmp
./rebar get-deps compile
==> sqlite3 (get-deps)
==> sqlite3 (compile)
Compiled src/sqlite3_lib.erl
Compiled src/sqlite3.erl
Compiling c_src/sqlite3_drv.c

尽管config.tmp包含“ normal”:

aromanov@alexey-desktop:~/workspace/gmcontroller/lib/sqlite3$ LAST_CONFIG=$(cat config.tmp); echo $LAST_CONFIG
normal

我想念什么?


问题答案:

shell在定义变量时,您缺少用于实际调用外部程序的部分。

LAST_CONFIG:=$(shell cat config.tmp)


 类似资料:
  • 每条规则中的命令和操作系统Shell的命令行是一致的。make会一按顺序一条一条的执行命令,每条命令的开头必须以[Tab]键开头,除非,命令是紧跟在依赖规则后面的分号后的。在命令行之间中的空格或是空行会被忽略,但是如果该空格或空行是以Tab键开头的,那么make会认为其是一个空命令。 我们在UNIX下可能会使用不同的Shell,但是make的命令默认是被“/bin/sh”——UNIX的标准Shel

  • 命令替换将会重新分配一个命令使用命令替换的典型形式是使用后置引用(`...`). 后置引用形式的命令(就是被反引号括起来)将会产生命令行文本. 1 script_name=`basename $0` 2 echo "The name of this script is $script_name." 这样的话, 命令的输出可以被当成传递到另一个命令的参数, 或者保存到变量中, 甚至可以用

  • 行动时刻 - 使用命令替换 到目前为止,我们使用双引号来包含将被引用的变量。 Unlang还具有反引号字符串,允许命令替换。这些反引号内的字符串的计算方式类似于可以进行字符串扩展的双引号字符串。 让我们修改上一个练习,以显示操作中的命令替换: 1.编辑FreeRADIUS配置目录下的sites-available / default虚拟服务器,并在该部分顶部的post-auth部分中添加以下内容:

  • 问题内容: 我正在尝试使用命令行perl替换多行文件中的文本。我正在使用Ubuntu Natty。 以下是我的文本文件(称为test.txt)的内容: 以下是我的perl命令: 但是,下面是我最终得到的结果,而不是替换文件中的所有文本: 我在RegexBuddy中为Perl尝试了Regex,它与文本文件中的所有内容都匹配,但是由于某些原因,在命令行上使用perl不能正常工作。 我将不胜感激。 提前

  • 在上一节的基础上,我们给脚本加上更新时间及更新人信息: #!/bin/bash # sysinfo_page - A script to produce an HTML file title="System Information for" cat <<- _EOF_ <html> <head> <title> $title $HOSTNAME

  • 在 zsh 中为命令的着色输出有点简单。请考虑 zsh 提示符中的以下示例: 你会得到预期的青色HH: MM: SS。它也能按预期在提示符下工作。现在假设我想用不同的颜色给分钟和秒上色。我没有设法使用实现它,可以吗? 我可以使用ANSI代码使其工作,但即使这样,它也可以用于打印,在~/.zshrc: < code > print-P " % F { cyan } $(date ' % H:\ e[