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 列表,我在这里到底缺少什么。
如何在 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) 我以为这很简单
%.png: ../figs/%.png
convert $? -resize '40%' $@
Run Code Online (Sandbox Code Playgroud)
也就是说,我想从 "../figs/" 中的相应图像生成此目录中的图像。
但是,上述导致了无限的依赖链,因为../figs/foo.png匹配%.png并因此 make 尝试检查../figs/../figs/foo.png,匹配%.png并因此 make 尝试检查。. . 最终,以“文件名太长”停止。
我肯定错过了什么。什么是干净的解决方案?
有没有什么方法可以在错误发生时输出错误信息。详细说一下,我想知道一个文件内容是否等于另一个文件内容。如果不是,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) 我有这个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本身?
我怎样才能避免它?
我正在做我的 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(在适用于 …
在 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。
我尝试使用 curl、rm 等命令,使用以下 makefile 处理器在 Windows 中的 makefiles 中启动:http : //gnuwin32.sourceforge.net/packages/make.htm
这似乎是不可能的,而我似乎对命令非常有限。有哪些方法可以扩展我的命令集?
我将不胜感激任何帮助。谢谢
我花了一天的大部分时间试图弄清楚这一点。我想使用 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) 我想在 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)
我想知道我做错了什么,为什么以及该怎么做?
如果你帮助我,我将不胜感激。