Makefile 更改目录并调用 git 函数

Makefile change directory and call git function

到目前为止,我使用的是一个非常基本的 makefile,需要对其进行扩展。 由于我只知道makefile的最基本的东西,所以我在这里寻求帮助。


我的 makefile 的最顶部定义了一些我用于不同构建等的值。 这里的重要部分是 EVALFILE。它应该 link 到一个二进制文件,并且在像 make ... EVALFILE="example.bin"

这样调用 make 时主要是手动设置的
CC       = g++
SRC      = *.cpp syzygy/tbprobe.c
LIBS     = -pthread -Wl,--whole-archive -lpthread -Wl,--no-whole-archive
FOLDER   = bin/
ROOT     = ../
NAME     = Koivisto
EVALFILE = none
EXE      = $(ROOT)$(FOLDER)$(NAME)_$(MAJOR).$(MINOR)
MINOR    = 0
MAJOR    = 5

如果 EVALFILE 没有用户输入,我想从我的 git 存储库中的子模块中获取文件。

ifeq ($(EVALFILE),none)
    pwd:=$(shell pwd);                  \
    cd $(ROOT);                         \
    git submodule update --init;        \
    cd $(pwd);                          \ 
    EVALFILE := ../networks/default.net
endif

为此,我想先复制密码,稍后再重新设置。然后我切换到存储库的根目录,调用我的 git 子模块函数来更新子模块。此处感兴趣的子模块是 ../networks/,它将包含一个 default.net,最终应将其用作二进制文件。

不幸的是,上面的代码似乎不起作用。执行make命令后查看networks/文件夹,里面好像没有文件。此外,EVALFILE 没有以这种方式设置。如果我将 EVALFILE := ../networks/default.net 移动到顶部,它确实会被设置,但在 networks/.

中仍然没有任何内容

我假设我没有正确调用 cd, git.. 调用。

如果有人能帮助我,我会很高兴。

您正在使用 $(EVALFILE) 的内容进行操作。如果它不存在,你想使用默认文件,你可能需要 运行 一个配方来制作它。

如果变量是在命令行上设置的,则 makefile 中的赋值不是 运行。

所以只需在 makefile 中对默认值进行简单赋值,您期望“在调用 make 时主要手动设置”:

EVALFILE := ../networks/default.net

并提供一个规则来设置默认值(如果它不存在):

../networks/default.net:
        git -C .. submodule update --init

(因为 Markdown 吃掉了制表符,所以有一个制表符替代了前导空格)。

然后在需要 evalfile 的食谱中,将其作为依赖项传入:

mytest: this that $(EVALFILE)

一切正常。