标签: gnu-make

makefile for 循环中的变量扩展

APPS = a b c

a_OBJ = x.o y.o z.o
b_OBJ =  p.o q.o r.o
c_OBJ = s.o t.o k.o

all:
    for i in $(APPS);   \
    do
       echo $("$${i}_OBJ");  \
    done;
Run Code Online (Sandbox Code Playgroud)

在上面给出的示例 Makefile 中,我想打印 for 循环内的 obj 文件列表,但该列表没有按预期扩展,为了正确扩展 OBJ 列表,我在这里到底缺少什么。

makefile gnu-make

4
推荐指数
1
解决办法
4807
查看次数

如何在makefile中设置环境变量?

如何在 Windows 上的 makefile 中正确设置环境变量?我收到关于CreateProcess.

C:\>make.exe -f build.makefile start
export MALLOC_PERTURB_=110
process_begin: CreateProcess(NULL, export MALLOC_PERTURB_=110, ...) failed.
make (e=2): The system cannot find the file specified.
c:\testmake.makefile:4: recipe for target 'start' failed
make: *** [start] Error 2

START: 
    export NODE_ENV=110
    echo $(NODE_ENV)
Run Code Online (Sandbox Code Playgroud)

gcc gnu makefile gnu-make

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

Makefile:防止无限模式递归

我以为这很简单

%.png: ../figs/%.png
        convert $? -resize '40%' $@
Run Code Online (Sandbox Code Playgroud)

也就是说,我想从 "../figs/" 中的相应图像生成此目录中的图像。

但是,上述导致了无限的依赖链,因为../figs/foo.png匹配%.png并因此 make 尝试检查../figs/../figs/foo.png,匹配%.png并因此 make 尝试检查。. . 最终,以“文件名太长”停止。

我肯定错过了什么。什么是干净的解决方案?

makefile gnu-make

4
推荐指数
1
解决办法
309
查看次数

Makefile 错误退出并显示一条消息

有没有什么方法可以在错误发生时输出错误信息。详细说一下,我想知道一个文件内容是否等于另一个文件内容。如果不是,make应该退出并输出错误信息。

test:
    cmp --silent tmp/test.txt tmp/test_de.txt ||    (error DecryptFile is different from original)
Run Code Online (Sandbox Code Playgroud)

tmp/test.txt不等于时tmp/test_de.txt,输出为:

cmp --silent tmp/test.txt tmp/test_de.txt | (error DecryptFile is different from original)
/bin/sh: 1: error: not found
makefile:38: recipe for target 'test' failed
make: *** [test] Error 127
Run Code Online (Sandbox Code Playgroud)

/bin/sh: 1: 错误:未找到

结果不是我想要的。我只是想要这样的错误信息:

makefile:38: *** missing separator. Stop.
Run Code Online (Sandbox Code Playgroud)

bash shell makefile gnu-make

4
推荐指数
1
解决办法
9899
查看次数

如何防止在 make / shell 中对字符串进行评估?

我有这个makefile:

echo:
    echo "PASS=$(PASS)"
Run Code Online (Sandbox Code Playgroud)

我调用:

PASS='MYPA$$' make
Run Code Online (Sandbox Code Playgroud)

这显示了我:

echo "PASS=MYPA$"
PASS=MYPA$
Run Code Online (Sandbox Code Playgroud)

有人在评估$$->$

这是壳吗?不是在输入值时,因为我使用单引号,防止外壳对其进行评估。

也许 make 调用的 shell 正在执行此操作...

或者是不是 make本身?

我怎样才能避免它?

bash shell makefile gnu-make

4
推荐指数
1
解决办法
614
查看次数

提取Makefile中%匹配的字符串部分

我正在做我的 CS 作业,它由许多单文件程序组成。我的工作目录如下所示:

133.c 134.c 220.c 281.c 337.c 338.c 339.c makefile
Run Code Online (Sandbox Code Playgroud)

我写了一个像这样的Makefile:

133.c 134.c 220.c 281.c 337.c 338.c 339.c makefile
Run Code Online (Sandbox Code Playgroud)

所以当我想编译第 220 题的程序时,我输入:

ibug@wsl:~ $ make 220
gcc  -o 220 220.c
ibug@wsl:~ $
Run Code Online (Sandbox Code Playgroud)

我想写一个clean-%规则,这样当我在 shell 中运行它时,结果应该如下所示

ibug@wsl:~ $ make clean-133
rm -f 133
ibug@wsl:~ $ make clean-281
rm -f 281
ibug@wsl:~ $ make clean-337
rm -f 337
Run Code Online (Sandbox Code Playgroud)

我已经走了这么远:

.PHONY: clean-%

SRC = $(wildcard %.c)
BIN = $(patsubst %.c,%,$(SRC))

clean-%:
    rm -f ??????
Run Code Online (Sandbox Code Playgroud)

我应该用什么来代替问号?

我正在使用 GNU Make 4.1(在适用于 …

linux makefile gnu-make

4
推荐指数
1
解决办法
1411
查看次数

使用 bash 4 语法将 Makefile 中字符串的第一个字母大写

在 bash 4(及更高版本)中,要大写存储在 variable 中的字符串的第一个字母L1,我可以执行以下操作:

L1=en
Ll1=${L1^}
echo $Ll1
Run Code Online (Sandbox Code Playgroud)

这打印En.

我正在尝试在 Makefile 中做类似的事情,但我无法使${L1^}语法起作用。

SHELL := /bin/bash

L1 = en
Ll1 := $(shell echo ${L1^})

all:
    @echo $(Ll1)
Run Code Online (Sandbox Code Playgroud)

产生空白输出。

我可以在不求助于 tr/sed 的情况下使用这种 bash 语法吗?

PS我确实需要将它分配给一个变量而不是直接回显它。我正在使用 bash 4.3.48 和 GNU make 4.1。

bash makefile capitalization gnu-make bash4

4
推荐指数
1
解决办法
1441
查看次数

如何使用 gnuwin32 Makefile 执行 powershell/cmd 命令?

我尝试使用 curl、rm 等命令,使用以下 makefile 处理器在 Windows 中的 makefiles 中启动:http : //gnuwin32.sourceforge.net/packages/make.htm

这似乎是不可能的,而我似乎对命令非常有限。有哪些方法可以扩展我的命令集?

我将不胜感激任何帮助。谢谢

windows powershell makefile gnu-make

4
推荐指数
1
解决办法
6325
查看次数

Makefile 将目标作为两个列表的叉积

我花了一天的大部分时间试图弄清楚这一点。我想使用 make 来构建一个具有不同操作系统目标和多个二进制文件的 golang 项目。我想我想使用 gnu make

我精简的 Makefile 看起来像:

main= mailworker websocket worker init
os= linux freebsd darwin

all: $(main)

$(main): ensure_build_path
    @echo "Build $@ Version: $(GIT_REV)"
    @rm -rf $(BUILD_PREFIX)/$@
    GO111MODULE=on GOARCH=amd64 $(GO) build  -o $(BUILD_PREFIX)/$@ ./bin/$@/$@.go
Run Code Online (Sandbox Code Playgroud)

现在我想添加GOOS=$(os)到构建命令/为每个主要的 X os 组合生成一个目标。我的测试/ lern Makefile 看起来像:

os=linux freebsd darwin
main=mailworker websocket worker init

define build_template =
t:=$(addprefix $(1), $(2))
$(info $(t))
$(t):
    @echo $(1) $(2) $$@
endef

$(foreach P, $(main), $(foreach O, $(os), $(eval $$(call build_template, $O, $P))) ) …
Run Code Online (Sandbox Code Playgroud)

makefile gnu-make

4
推荐指数
1
解决办法
409
查看次数

编译 Readline 时对“tputs”的未定义引用

我想在 Ubuntu 上编译安装 readline 库。

我执行以下操作:

wget http://git.savannah.gnu.org/cgit/readline.git/snapshot/readline-8.0.tar.gz
tar -zxvf readline-8.0.tar.gz
cd readline-8.0
./configure --prefix=`pwd`/readline
make
make install
Run Code Online (Sandbox Code Playgroud)

没错,但是当我使用-lreadline选项时,出现如下错误:

readline/lib/libreadline.so: undefined reference to `tputs'
readline/lib/libreadline.so: undefined reference to `tgoto'
readline/lib/libreadline.so: undefined reference to `tgetflag'
readline/lib/libreadline.so: undefined reference to `UP'
readline/lib/libreadline.so: undefined reference to `tgetent'
readline/lib/libreadline.so: undefined reference to `tgetnum'
readline/lib/libreadline.so: undefined reference to `PC'
readline/lib/libreadline.so: undefined reference to `tgetstr'
Run Code Online (Sandbox Code Playgroud)

我想知道我做错了什么,为什么以及该怎么做?

如果你帮助我,我将不胜感激。

shell ubuntu compilation readline gnu-make

4
推荐指数
1
解决办法
4965
查看次数