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)
一切正常。
到目前为止,我使用的是一个非常基本的 makefile,需要对其进行扩展。 由于我只知道makefile的最基本的东西,所以我在这里寻求帮助。
我的 makefile 的最顶部定义了一些我用于不同构建等的值。
这里的重要部分是 EVALFILE
。它应该 link 到一个二进制文件,并且在像 make ... EVALFILE="example.bin"
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)
一切正常。