在 bash 中,我可以拆分一个字符串,类似于 How to split a string in shell and get the last field
foo=1:2:3:4:5
echo ${foo##*:}
Run Code Online (Sandbox Code Playgroud)
如何在 makefile 中使用 make 实现类似的效果?我发现的任何解决方案都比 bash 吊坠复杂得多。
我尝试使用:
$(shell ${foo##*:})但这失败了,因为字符串似乎没有正确终止。
run:
cd ..; \
@echo $(shell pwd)
Run Code Online (Sandbox Code Playgroud)
抛出这个:
/bin/sh: @echo: command not found
Run Code Online (Sandbox Code Playgroud)
以下工作正常,并打印当前目录:
run:
@echo $(shell pwd)
Run Code Online (Sandbox Code Playgroud)
你知道为什么吗?
我是 Vim 的 ctags ctrl-] 快捷键的忠实用户。我最近制作了一个标记文件,其中主要语言是 Make。当我尝试将光标放在带有连字符的变量(例如 dl-routines)上时 ctrl-] 时,出现错误。如果我的光标位于“dl-routines”变量中的“dl”上方,则会出现错误
tag not found: dl
Run Code Online (Sandbox Code Playgroud)
如果我的光标位于“dl-routines”变量中的“routines”上方,则会出现错误
tag not found: routines
Run Code Online (Sandbox Code Playgroud)
我知道 Vim 的
:ta tagname
Run Code Online (Sandbox Code Playgroud)
不过我想使用 ctrl-] 因为它可以减少出错的空间。
我正在尝试编写一个使用特定于目标的变量的 makefile,但是虽然在每个目标和先决条件主体中正确设置了变量,但先决条件列表本身并未使用该变量进行更新,从而导致检查和检查错误的先决条件叫。
如何也更新先决条件中特定于目标的变量?
在下面的示例中, 和make foo都make bar应该打印“world”,但make foo打印“hello”。
X=hello
hello:
echo "hello"
world:
echo "world"
foo:X=world
foo:$(X)
bar:X=world
bar:
make $(X)
Run Code Online (Sandbox Code Playgroud)
我试图实现的目标是,通过将文件夹作为特定于目标的变量传递,不同的目标将构建类似的先决条件 - 相同的文件,在不同的文件夹中。问题是,如下例所示,如果第一个目标被调用(foo在示例中为 ),则调用第二个目标不会执行任何操作。
DIR=fooDir
FILE=$(DIR)/filename
$(FILE):
touch $(FILE)
echo $(FILE)
foo: $(FILE)
bar:DIR=barDir
bar: $(FILE)
Run Code Online (Sandbox Code Playgroud) 我正在用 C++ 编写一个应用程序,并使用自动工具制作构建脚本。然后,最终用户将能够./configure && make && make install在源目录中运行。我的问题是:同样的命令可以在 Windows 上使用吗?如果没有,我如何使用 autotools 实现类似的过程?或者 autotools 无法为 Windows 生成构建脚本?如果是这样,哪个构建工具可以用于 Windows?提前致谢 !
我有一个遗留工作项目,其中包含 8000 多个文件。它包括源代码和库,因此可以独立运行。
但是,当我第一次运行 make 命令时,大约需要 4 小时,而在添加代码后第二次执行该命令要快得多,通常需要 5-10 分钟。我的第一个问题是为什么第二次更快?
其次,为什么当整个目录被转移(在 make 构建之后)到另一台计算机时,make 命令仍然需要 4 小时而不是 5-10 分钟才能完成?
我在计算生物物理实验室工作.我不是程序员,虽然我得到报酬就像一个人.这是我的问题:该实验室的主要产品是一个巨大的(50多个源文件)C程序.我需要让我们的实验室程序与另一个实验室的工具包一起工作,这恰好是一系列C++库(.a文件)的形式.我可以使用以下makefile为我们的程序编译主库:
CC = gcc
#CC = icc
CFLAGS = -g -Wall
#CFLAGS = -xT -openmp -I/opt/local/include -I/usr/local/include -I/opt/GDBM/include
#CFLAGS = -O3 -g -Wall -I/opt/GDBM/include -fopenmp
LIB = mcce.a
AR = ar
ARFLAGS = rvs
SRC = all.c ddvv.c geom_3v_onto_3v.c ins_res.c strip.c\
app.c del_conf.c geom_apply.c line_2v.c vdotv.c\
avv.c del_prot.c geom_inverse.c load_all_param.c vector_normalize.c\
avvvv.c del_res.c geom_move.c load_param.c vector_vminusv.c\
cpy_conf.c det3.c geom_reset.c mxm4.c vector_vplusv.c\
cpy_prot.c det4.c geom_roll.c new_prot.c vector_vxv.c\
cpy_res.c dll.c get_files.c param_get.c param_exist.c\
db_close.c dvv.c iatom.c param_sav.c\
db_open.c free_strings.c ins_conf.c plane_3v.c pdbline2atom.c\ …Run Code Online (Sandbox Code Playgroud) 我正在使用一些我需要运行的MPI代码mpirun.
我正在使用一个已经存在的shell脚本,我希望在现有的行前面添加.
所以梦想是:
app=mpirun $(app)
Run Code Online (Sandbox Code Playgroud)
我知道可以使用+ =附加到变量,但是我可以预先添加吗?
我已经git了一个项目,在其Makefile中的某个时刻,我正在过滤掉某个目录中的内容:
relevant = $(filter-out irrelevant/%,$^)
Run Code Online (Sandbox Code Playgroud)
现在我想在一个VPATH启用的环境中使用它.因此,我的依赖关系的路径$^可能不会再开始了irrelevant,而是类似../src/irrelevant或相似的东西.
有没有办法过滤掉任何包含 irrelevant任何位置的东西?即如下所示?
relevant = $(filter-out %irrelevant/%,$^)
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为显然模式filter-out只能包含一个%通配符.我知道我可以通过shell调用,grep或其他方式实现这一点,但我希望Makefile中有一些函数组合.
经过一番挣扎之后,我写下了以下模式规则
%.o : $(addprefix $(SRCDIR),$(notdir $(@:.o=.f90)))
$(COMPILE) $(addprefix $(SRCDIR),$(notdir $(@:.o=.f90))) -o $@
Run Code Online (Sandbox Code Playgroud)
SRCDIR是找到相应源代码文件的位置。目标文件和源代码文件位于单独的目录中,并且目标文件名包含其路径。因此,对于每个目标文件,源代码文件名都是通过文本替换获得的,并以开头SRCDIR。
我怎样才能更简洁地做到这一点?
谢谢。