标签: gnu-make

使用 Makefile 条件检查文件是否存在

我正在尝试使用 Makefile 条件检查文件是否存在。

我尝试过以下语法,但似乎不起作用:

Path = /usr/local/myFileVer1
ifeq ($(wildcard $(Path)),)  
version = 1
else
version = 2
endif
Run Code Online (Sandbox Code Playgroud)

我认为如果文件不存在,通配符语句将计算为空字符串,因此它将落入 else 语句中。那并没有发生。

知道我还能尝试什么吗?

makefile gnu-make

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

读取makefile中的环境变量值

如果我尝试从 makefile 中访问某些环境变量,则不会显示它们。我的应用程序创建一个环境变量 MACHTYPE,其值为“DELLMACHINE”。我想在 make 文件中使用 echo 命令打印这个值。这是代码

@echo $(MACHTYPE)
Run Code Online (Sandbox Code Playgroud)

执行上述命令后,将显示空字符串。

有趣的是,其他环境变量(例如 PATH)工作正常,但 MACHTYPE 显示为空字符串。有谁知道为什么会发生这种情况?

makefile gnu-make

2
推荐指数
1
解决办法
4187
查看次数

makefile - 构建具有多个目标的多个文件

我有一个包含多个 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 gnu-make dockerfile

2
推荐指数
1
解决办法
1597
查看次数

允许 Makefile 附加和覆盖目标

我的所有服务都有基本 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)

makefile gnu-make

2
推荐指数
1
解决办法
6061
查看次数

如何简化 Makefile 中的重复规则 (GNU Make)

使用 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 gnu-make

2
推荐指数
1
解决办法
342
查看次数

如何在 Makefile 中转义最后的反斜杠以表示字面反斜杠?

这是我的 Makefile:

SLASH = \

all:
    echo '$(SLASH)'
Run Code Online (Sandbox Code Playgroud)

这是输出:

$ make all
echo ''

$
Run Code Online (Sandbox Code Playgroud)

\最后的意思是在 中继续行,Makefile所以它最终将一个空字符串分配给SLASH

如何将文字反斜杠分配给SLASH

makefile escaping gnu-make backslash

2
推荐指数
1
解决办法
606
查看次数

Makefile“激活”Python虚拟环境

我正在尝试使用 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)

makefile gnu-make virtualenv

2
推荐指数
1
解决办法
4192
查看次数

MAKEFILE 中的键值对

我是 makefle 的新手,我在 makefile 中需要数组,然后我发现我可以实现具有变量,其项目用空格分隔,然后迭代它。现在我想要像映射(键,值)对这样的东西来存储带有键的值。问题:我可以在 makefile 中添加它吗?提前致谢..

bash gnu makefile key-value gnu-make

2
推荐指数
1
解决办法
4507
查看次数

fortran:错误:(1) 处的实际参数与 (2) 处的实际参数之间类型不匹配(INTEGER(8)/INTEGER(2))

我是 Fortran 初学者,正在运行 Fortran 编写的模型。当我尝试编译它时,我收到一条错误消息,如下所示:

\n
libtool: 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)

linux fortran makefile gnu-make gfortran

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

Makefile 中的 @echo 总是会导致错误“*** 缺少分隔符。停止。”

我放

@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。

makefile gnu-make echo xv6 windows-subsystem-for-linux

2
推荐指数
1
解决办法
4374
查看次数