我正在尝试使用 Makefile 条件检查文件是否存在。
我尝试过以下语法,但似乎不起作用:
Path = /usr/local/myFileVer1
ifeq ($(wildcard $(Path)),)
version = 1
else
version = 2
endif
Run Code Online (Sandbox Code Playgroud)
我认为如果文件不存在,通配符语句将计算为空字符串,因此它将落入 else 语句中。那并没有发生。
知道我还能尝试什么吗?
如果我尝试从 makefile 中访问某些环境变量,则不会显示它们。我的应用程序创建一个环境变量 MACHTYPE,其值为“DELLMACHINE”。我想在 make 文件中使用 echo 命令打印这个值。这是代码
@echo $(MACHTYPE)
Run Code Online (Sandbox Code Playgroud)
执行上述命令后,将显示空字符串。
有趣的是,其他环境变量(例如 PATH)工作正常,但 MACHTYPE 显示为空字符串。有谁知道为什么会发生这种情况?
我有一个包含多个 Dockerfile 的项目,每个文件都位于我用作 Docker 映像标签的命名目录中。我需要为每个 Dockerfile 构建、测试和推送每个 docker 映像。我需要做什么才能使用 GNU Make 进行如下工作?
# BUILDS needs to be a list of directories, not a list of Dockerfiles
BUILDS := $(wildcard */Dockerfile)
VERSION := $(shell git rev-parse --short=12 --verify HEAD)
DOCKER_REPO_URL := quay.io/reponame
define docker_build =
$(1):
@echo "Building $$@"
docker build -t $$@ --force-rm $$@
endef
define docker_test =
$(1):
@echo "Testing $$@"
docker inspect $$@
docker run --rm $$@ help
endef
define docker_push =
$(1):
@echo "Pushing $$@"
docker tag …Run Code Online (Sandbox Code Playgroud) 我的所有服务都有基本 Makefile,在某些情况下我想使用默认的“测试”目标,在其他情况下我想覆盖\添加它。这些是我迄今为止拥有的文件(显然它没有按预期工作......)。
生成文件库
test:
./.../run-tests.sh
Run Code Online (Sandbox Code Playgroud)
生成文件
BASE_FILE := /path/to/MakefileBase
include ${BASE_FILE}
test:
@$(MAKE) -f $(BASE_FILE) test # un/comment this line in order to run the default tests.
# echo "custom test"
Run Code Online (Sandbox Code Playgroud)
当我运行测试并注释掉第一行时,我得到以下结果
Makefile:10: warning: overriding commands for target `test'
/.../MakefileBase:63: warning: ignoring old commands for target `test'
echo "no tests"
no tests
Run Code Online (Sandbox Code Playgroud)
除了警告它按预期工作之外,问题是当我尝试使用父函数时,我收到以下错误:
Makefile:9: warning: overriding commands for target `test'
/.../MakefileBase:63: warning: ignoring old commands for target `test'
make[1]: test: No such file or directory
make[1]: *** No rule to …Run Code Online (Sandbox Code Playgroud) 使用 GNU Make 3.81。这个 Makefile 有一些重复的规则,我觉得可以简化,但我不知道如何去做。
如果目录不存在,Makefile 需要解压 tarball。然后,它应该将 tarball 中的源文件版本复制到 tarball 中,然后对其运行配置和 make 以生成目标二进制文件。
BLARG = blarg-1.8.6
blarg: $(BLARG)/get_key.c $(BLARG)/grab_key.c $(BLARG)/keys.c $(BLARG)/options.c $(BLARG)/blarg.c
cd $(BLARG) && ./configure --disable-guile && $(MAKE) && cp blarg ../
$(BLARG):
cp /pub/tars/$(BLARG).tar.gz .
tar -xvf $(BLARG).tar.gz
rm $(BLARG).tar.gz
$(BLARG)/get_key.c: get_key.c | $(BLARG)
cp $< $@
$(BLARG)/grab_key.c: grab_key.c | $(BLARG)
cp $< $@
$(BLARG)/keys.c: keys.c | $(BLARG)
cp $< $@
$(BLARG)/options.c: options.c | $(BLARG)
cp $< $@
$(BLARG)/blarg.c: blarg.c | $(BLARG)
cp $< $@
$(BLARG)/options.h: …Run Code Online (Sandbox Code Playgroud) 这是我的 Makefile:
SLASH = \
all:
echo '$(SLASH)'
Run Code Online (Sandbox Code Playgroud)
这是输出:
$ make all
echo ''
$
Run Code Online (Sandbox Code Playgroud)
\最后的意思是在 中继续行,Makefile所以它最终将一个空字符串分配给SLASH。
如何将文字反斜杠分配给SLASH?
我正在尝试使用 Makefile 创建一个 Python 虚拟环境,并在 make 命令完成后激活它,以方便用户操作。显然,这是不可能的,因为“子进程无法改变父进程的环境”。我想知道是否有任何解决方法。到目前为止,这是我的 Makefile 的一部分: .PHONY: create-venv venv .DEFAULT_GOAL := all SHELL=/bin/bash
CPUTYPE = $(shell uname -m | sed "s/\\ /_/g")
SYSTYPE = $(shell uname -s)
BUILDDIR = build/$(SYSTYPE)-$(CPUTYPE)
VENV_NAME?=venv
VENV_DIR=$(BUILDDIR)/${VENV_NAME}
VENV_BIN=$(shell pwd)/${VENV_DIR}/bin
VENV_ACTIVATE=. ${VENV_BIN}/activate
PYTHON=${VENV_BIN}/python3
create-venv:
test -d $(BUILDDIR) || mkdir -p $(BUILDDIR)
which python3 || apt install -y python3 python3-pip
test -d $(VENV_DIR) || python3 -m venv $(VENV_DIR)
venv: ${VENV_BIN}/activate
${VENV_BIN}/activate: setup.py
test -d $(VENV_DIR) || make create-venv
${PYTHON} -m pip install …Run Code Online (Sandbox Code Playgroud) 我是 makefle 的新手,我在 makefile 中需要数组,然后我发现我可以实现具有变量,其项目用空格分隔,然后迭代它。现在我想要像映射(键,值)对这样的东西来存储带有键的值。问题:我可以在 makefile 中添加它吗?提前致谢..
我是 Fortran 初学者,正在运行 Fortran 编写的模型。当我尝试编译它时,我收到一条错误消息,如下所示:
\nlibtool: link: (cd ".libs" && rm -f "libgrib_api_f77.so" && ln -s "libgrib_api_f77.so.1.0.0" "libgrib_api_f77.so")\nlibtool: link: ar cru .libs/libgrib_api_f77.a grib_fortran.o grib_f77.o\nlibtool: link: ranlib .libs/libgrib_api_f77.a\nlibtool: link: ( cd ".libs" && rm -f "libgrib_api_f77.la" && ln -s "../libgrib_api_f77.la" "libgrib_api_f77.la" )\ngfortran -c -o same_int_long.o same_int_long.f90\nsame_int_long.f90:23:18:\n \n 17 | call check_long(x2(1),x2(2),ret)\n | 2\n......\n 23 | call check_long(x4(1),x4(2),ret)\n | 1\nError: Type mismatch between actual argument at (1) and actual argument at (2) (INTEGER(4)/INTEGER(2)).\nsame_int_long.f90:29:18:\n \n 17 | call check_long(x2(1),x2(2),ret)\n | 2\n......\n 29 …Run Code Online (Sandbox Code Playgroud) 我放
@echo "============= $(TOOLPREFIX) ================="
Run Code Online (Sandbox Code Playgroud)
在许多操作系统课程使用的xv6 Makefile的第34行中,希望打印出变量TOOLPREFIX的值。但我总是出错
Makefile:37: *** missing separator. Stop.
Run Code Online (Sandbox Code Playgroud)
该行位于任何目标之前。我尝试了所有能做的事情,比如在命令开头添加 Tab、将命令移动到 Makefile 中的任何位置,或者删除 echo 之前的符号 @,但无论如何我总是收到错误。但如果我注释掉这个命令,就没有错误了。那么,我应该如何正确打印出这个Makefile中的变量呢?
顺便说一句,如果我在命令开头添加 Tab,我得到的错误是“Makefile:37: *** 配方在第一个目标之前开始。停止。” 但如果我将 @echo 命令移至 Makefile 的底部,则会显示“Makefile:287: *** 缺少分隔符。停止。” 又出来了。
环境是Windows Subsystem for Linux,安装了ubuntu 20.04。
gnu-make ×10
makefile ×10
backslash ×1
bash ×1
dockerfile ×1
echo ×1
escaping ×1
fortran ×1
gfortran ×1
gnu ×1
key-value ×1
linux ×1
virtualenv ×1
windows-subsystem-for-linux ×1
xv6 ×1