如果我有这样的Makefile规则:
a b c:
echo "Creating a b c"
touch a b c
output: a b c
cat a b c > output
Run Code Online (Sandbox Code Playgroud)
然后我运行make -j9输出
make看到3个依赖项(a,b,c),查找如何生成它们:(上面的"ab c"规则),但接下来会发生什么?如果没有意识到"ab c"规则只需要运行一次来创建所有3个目标吗?
这就是实际做的事情:
[pavel@orianna test]$ make -j9 output -n
echo "Creating a b c"
touch a b c
echo "Creating a b c"
touch a b c
echo "Creating a b c"
touch a b c
cat a b c > output
[pavel@orianna test]$
Run Code Online (Sandbox Code Playgroud)
相同的配方运行3次,每次依赖一次以规则"输出"!
有谁知道它为什么会这样?
有人最近.c.o在Makefile中提到了交叉兼容性的目标,但我不明白它的目的.任何人都可以澄清吗?
我需要在我的Makefile中获取一个参数,该参数由表单中的主机标识符组成
host[:port]
Run Code Online (Sandbox Code Playgroud)
冒号和端口是可选的.所以以下所有内容都是有效的:
foo.example.com
ssl.example.com:443
localhost:5000
Run Code Online (Sandbox Code Playgroud)
等等
我想拆就可选结肠串并分配给变量,使HOST包含foo.example.com,ssl.example.com,localhost等,PORT分别包含80个(默认端口),443和500.
我有一个makefile,我想从输入中读取模块名称,然后根据它的名称创建目录.这是我的代码:
build:
@read -p "Enter Module Name:" module;
module_dir=./modules/$$module
mkdir -p $$module_dir/build;
Run Code Online (Sandbox Code Playgroud)
但是在设置module_dir之后,它只包含./modules/(没有连接模块名称).
我的代码有什么问题?
谢谢你的回答
我使用GNU make和我使用的自动变量,在$<,$^等我知道这$<仅仅是第一要义,并$^为所有的先决条件. 有没有办法获得第二个先决条件?
我在执行linux工具时有一个makefile规则.我需要检查工具命令的退出状态,如果该命令失败,则必须中止make.
我试过用$ ?, $$来检查?\ $?makefile中的etc等.但是当makefile运行时,它们会给我语法错误.
这样做的正确方法是什么?
这是Makefile中的相关规则
Run Code Online (Sandbox Code Playgroud)mycommand \ if [ $$? -ne 0 ]; \ then \ echo "mycommand failed"; \ false; \ fi
我是编程新手,所以这是一个抽象的问题而不是技术问题.我一直在使用IDE来学习,但我听说它们在创建可执行文件时过于简化了编译,汇编和链接的行为.
我正在尝试下载和编译库而不依赖于IDE(在本例中为librocket).我首先必须使用Cmake来创建二进制文件.配置和生成后,我没有在输出目录中看到任何目标文件或.cpp文件.然后我不得不使用gnu make命令,然后在输出目录中创建目标文件和.cpp文件.
从下载源代码到实际创建目标文件的步骤是Cmake和gnu make吗?在什么时候编译器和链接器实际调用?
我已经成功编译了一个我编写的测试库,然后编译了另一个使用g ++链接到它的程序,但我有点迷失,因为我必须使用Cmake和gnu make而不是直接调用编译器.
如果Makefile本身被更改,安全的赌注是将所有目标都视为过时.
有没有一种聪明的方法来添加这种依赖?还有其他选择吗?
如何以及何时在make文件中引用字符串?什么是最佳做法?
以下是引用方式吗?
$(warning $(shell ls -ld "$(CURDIR)" ) )
Run Code Online (Sandbox Code Playgroud)
我熟悉Bash,你通常引用变量来允许嵌入空格.你是否在makefile中这样做?
我该如何使用字符串进行赋值语句?
vara := "$(CURDIR)"
varb := $(CURDIR)
varc := /home/me/source
vard := "/home/me/source"
Run Code Online (Sandbox Code Playgroud)
平等后的空间怎么样?
我已经看过如何从make目标手动调用另一个目标?,但我的问题有点不同; 考虑这个例子(注意,stackoverflow.com将选项卡更改为显示中的空格;但如果您尝试编辑,则选项卡将保留在源代码中):
TEXENGINE=pdflatex
pdflatex:
echo the engine is $(TEXENGINE)
lualatex:
TEXENGINE=lualatex
echo Here I want to call the pdflatex rule, to check $(TEXENGINE) there!
Run Code Online (Sandbox Code Playgroud)
在这里,如果我运行默认目标(pdflatex),我得到预期的输出:
$ make pdflatex
echo the engine is pdflatex
the engine is pdflatex
Run Code Online (Sandbox Code Playgroud)
但是,有了目标lualatex,我想:
make变量更改TEXENGINE为lualatex,然后pdflatex(使用它)相同的代码.我怎么能这样做?
很明显,在我的lualatex规则中,我甚至没有设法更改TEXENGINE变量,因为我在尝试时得到了这个:
$ make lualatex
TEXENGINE=lualatex
echo Here I want to call the pdflatex rule, to check pdflatex there!
Here I want …Run Code Online (Sandbox Code Playgroud)