标签: gnu-make

使分割字符串获取最后一个元素

在 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##*:})但这失败了,因为字符串似乎没有正确终止。

string bash split makefile gnu-make

3
推荐指数
1
解决办法
5365
查看次数

/bin/sh: @echo: 未找到命令

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)

你知道为什么吗?

linux bash makefile gnu-make

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

ctags 无法找到包含连字符的变量

我是 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-] 因为它可以减少出错的空间。

vim makefile ctags gnu-make exuberant-ctags

3
推荐指数
1
解决办法
283
查看次数

Makefile:目标依赖项声明中特定于目标的变量

我正在尝试编写一个使用特定于目标的变量的 makefile,但是虽然在每个目标和先决条件主体中正确设置了变量,但先决条件列表本身并未使用该变量进行更新,从而导致检查和检查错误的先决条件叫。

如何也更新先决条件中特定于目标的变量?

在下面的示例中, 和make foomake 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)

makefile gnu-make

3
推荐指数
1
解决办法
2481
查看次数

如何使用自动工具为 Windows 生成配置脚本

我正在用 C++ 编写一个应用程序,并使用自动工具制作构建脚本。然后,最终用户将能够./configure && make && make install在源目录中运行。我的问题是:同样的命令可以在 Windows 上使用吗?如果没有,我如何使用 autotools 实现类似的过程?或者 autotools 无法为 Windows 生成构建脚本?如果是这样,哪个构建工具可以用于 Windows?提前致谢 !

windows autotools configure gnu-make

3
推荐指数
1
解决办法
3492
查看次数

为什么make的结果不能跨计算机共享

我有一个遗留工作项目,其中包含 8000 多个文件。它包括源代码和库,因此可以独立运行。

但是,当我第一次运行 make 命令时,大约需要 4 小时,而在添加代码后第二次执行该命令要快得多,通常需要 5-10 分钟。我的第一个问题是为什么第二次更快?

其次,为什么当整个目录被转移(在 make 构建之后)到另一台计算机时,make 命令仍然需要 4 小时而不是 5-10 分钟才能完成?

c++ gnu-make

3
推荐指数
1
解决办法
84
查看次数

更新旧版C makefile以包含C++源文件

我在计算生物物理实验室工作.我不是程序员,虽然我得到报酬就像一个人.这是我的问题:该实验室的主要产品是一个巨大的(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)

c c++ legacy makefile gnu-make

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

预先简化扩展变量

我正在使用一些我需要运行的MPI代码mpirun.

我正在使用一个已经存在的shell脚本,我希望在现有的行前面添加.

所以梦想是:

app=mpirun $(app)
Run Code Online (Sandbox Code Playgroud)

我知道可以使用+ =附加到变量,但是我可以预先添加吗?

makefile gnu-make

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

使用多个通配符过滤

我已经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中有一些函数组合.

filtering glob makefile wildcard gnu-make

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

具有不同目录中文件的模式规则?

经过一番挣扎之后,我写下了以下模式规则

%.o : $(addprefix $(SRCDIR),$(notdir $(@:.o=.f90)))
        $(COMPILE) $(addprefix $(SRCDIR),$(notdir $(@:.o=.f90))) -o $@
Run Code Online (Sandbox Code Playgroud)

SRCDIR是找到相应源代码文件的位置。目标文件和源代码文件位于单独的目录中,并且目标文件名包含其路径。因此,对于每个目标文件,源代码文件名都是通过文本替换获得的,并以开头SRCDIR

我怎样才能更简洁地做到这一点?

谢谢。

makefile gnu-make

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