标签: gnu-make

如何让Makefile确定系统的lib目录?

在尝试从源代码安装程序时,我发现它将库安装到/ usr/lib/[program] /,因为这是在64位系统上,它不起作用.我不得不将库复制到/ usr/lib64/[program].请注意,库文件是python,因此与体系结构无关.

Makefile有: libdir = /usr/lib

如何在64位系统和32 位系统上实现libdir相同?lib64lib

makefile gnu-make

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

请参阅Makefile中的shell脚本输出

如何在Makefile中构建目标之前执行shell脚本,并在运行时查看输出?

我有一个调用的脚本prepare.sh生成一堆.pyx文件..pyx文件是我的构建过程涉及make的起点.它来自.pyx - > .c - > .o - > .so

我不喜欢在make之前单独运行prepare.sh.我想让它为我运行它.

我让它工作,但我没有看到命令的输出.我想看看它.这就是我现在拥有的:

PATH := ${PYTHONHOME}/bin:${PATH}

NOTHING:=$(shell ./prepare.sh)

PYXS?=$(wildcard merged/*.pyx)
SOURCES=$(PYXS:.pyx=.c)
OBJECTS=$(SOURCES:.c=.o)
SOBJECTS=$(OBJECTS:.o=.so)
Run Code Online (Sandbox Code Playgroud)

makefile gnu-make

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

Makefile不删除中间文件

Makefile不是删除中间文件.我已经定了.INTERMEDIATE.这是我的Makefile:

OBJECTS=prefixer.o stack.o
CFLAGS=-Werror -Wmissing-prototypes -g
LIBS=-lm
CC=gcc

prefixer : $(OBJECTS)
    $(CC) -o prefixer $(OBJECTS) $(LIBS)

prefixer.o : stack.h
    $(CC) -c prefixer.c -o $@ $(CFLAGS)
stack.o : stack.c stack.h
    $(CC) -c stack.c -o $@ $(CFLAGS)

.INTERMEDIATE: %.o

.PHONY: clean
clean : 
    -rm prefixer *.o
Run Code Online (Sandbox Code Playgroud)

有什么问题.INTERMEDIATE

c makefile gnu-make

3
推荐指数
2
解决办法
2930
查看次数

GNU make:生成提取tarball的规则

我有一个Makefile,它提取了一系列tarball.现在规则写得像:

dirname:
        tar zxvf file.tar.gz
Run Code Online (Sandbox Code Playgroud)

以及依赖于扩展的tarball引用的其他目标dirname.但是,为每个tarball定义这样的规则是一种杂乱无章.所以,我正在尝试使用该eval函数自动生成这些规则.我的尝试看起来像这样:

TARFILES = $(wildcard *.tar.gz *.tgz)
define extract_tmpl =
 $(shell tar tf $(1) | head -1):
        tar zxvf $(1)
endef
$(foreach file, $(TARFILES), $(eval $(call extract_tmpl, $(file))))
Run Code Online (Sandbox Code Playgroud)

但它似乎没有用.我正在测试这个tarball(在同一个目录中):

$ ls Python-2.6.6.tgz 
Python-2.6.6.tgz
$ tar tf Python-2.6.6.tgz | head -1
Python-2.6.6/
$ make Python-2.6.6/
make-3.79.1-p7: *** No rule to make target `Python-2.6.6/'.  Stop.
Run Code Online (Sandbox Code Playgroud)

它似乎应该对我有用,但说实话,我甚至不确定我怎么能看到它扩展到什么.这里有什么明显的错吗?

makefile gnu-make

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

使用配置文件部署可执行文件

我是新手在Linux上部署用C/C++编写的程序,我想知道在这种情况下你会做什么.

我有一个二进制文件(用GNU Make编译),需要读取配置文件(如myprogram.conf).但是当我编写一个Makefile来部署这个文件时/usr/bin/,配置文件应该放在哪里?可执行文件如何知道它在哪里?

c c++ linux gnu-make

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

在Makefile中一次运行所有目标

我有一个Makefile如下

all:
    bison -d -v parser.y
    flex  -o parser.lex.c parser.lex
    gcc  -o cparser parser.lex.c parser.tab.c -lfl -lm 
clean:
    rm parser.tab.h parser.tab.c parser.output parser.lex.c     
Run Code Online (Sandbox Code Playgroud)

当我在终端中运行make时它只运行目标all.

我已尝试添加 .PHONY:all clean,.PHONY:clean即使它只运行all.我应该在Makefile中进行哪些更改,以便它运行所有目标?

系统配置:
Ubuntu 14.10
GNU Make 4.0

makefile gnu-make

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

Bash片段在makefile中不起作用

我有一个版本文件verfile,其中包含以下版本字符串
V1.1.2

在Makefile中我打算读取这个版本的字符串,所以我写了Makefile如下,

filepath        :=      $(PWD)
versionfile     :=      $(filepath)/verfile

all:
        cat $(versionfile)
        version=$(shell cat $(versionfile))
        echo "version=$(version)"
Run Code Online (Sandbox Code Playgroud)

现在,当我运行make文件时,我得到了以下输出

cat /home/ubuntu/ankur/verfile
v1.1.2
version=v1.1.2
echo "version="
version=
Run Code Online (Sandbox Code Playgroud)

所以我无法在变量中存储版本字符串并在以后使用它,我不知道我做错了什么?

有什么建议/指针吗?

在阅读了"Didier Trosset"的回答后,我改变了我的makefile,如下所示,

filepath        :=      $(PWD)
versionfile     :=      $(filepath)/verfile
myversion       :=      ""

all:

ifeq ($(wildcard $(versionfile)),)
all:
        echo "File not present"
else
all: myversion = $(shell cat $(versionfile))
endif
all:
        echo "myversion = $(myversion)"
Run Code Online (Sandbox Code Playgroud)

以下是输出

echo "myversion = v1.1.2"
myversion = v1.1.2
Run Code Online (Sandbox Code Playgroud)

linux bash makefile gnu-make

3
推荐指数
2
解决办法
4291
查看次数

使用.INTERMEDIATE在makefile中建立不可靠的并行构建吗?

我有一个生成多个输出文件的工具,众所周知,这很难在make中建模。我正在使用GNU Makefile规则中的配方,该规则从单个源文件生成一些目标,这似乎简单可靠。而且几乎可以正常工作。

不幸的是,关于并行构建,我看到了一些非常奇怪的行为,有时似乎会删除依赖关系。我不明白为什么。

这是我的测试用例:

out3: out1 out2
    touch out3

.INTERMEDIATE: out.intermediate
out1 out2: out.intermediate
out.intermediate: in
    touch out1 out2
Run Code Online (Sandbox Code Playgroud)

如果我构建一次,它将起作用:

$ touch in
$ make -f test.mk out3 -j4
touch out1 out2
touch out3
Run Code Online (Sandbox Code Playgroud)

out1并且out2一起建造一次,这很好;然后out3根据结果​​构建。

现在,我触摸输入文件,模拟增量构建,然后重试:

$ touch in
$ make -f test.mk out3 -j4
touch out1 out2
Run Code Online (Sandbox Code Playgroud)

这是重建out1out2,正确的...但它一直没有重建out3,它应该有。然后,如果我执行另一个构建:

$ make -f test.mk out3 -j4
touch out3
Run Code Online (Sandbox Code Playgroud)

...然后赶上了。

适用于并行构建。-j1建立良好的工作。 …

makefile gnu-make

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

如何在makefile中用点分割字符串

我已经制定了这样的目标

test.%
    export var1=$(basename $*) && export var2=$(subst .,,$(suffix $*))
Run Code Online (Sandbox Code Playgroud)

我喜欢用 test.var1.var2

现在我想再做一个级别,比如 test.var1.var2.var3我怎么能在makefile中得到它

编辑:

我想这样做的原因是因为我使用Make文件来部署多个应用程序,我想要很多变量.以便用户可以部署

make install.{app1}.{test}.{build_number}
Run Code Online (Sandbox Code Playgroud)

makefile gnu-make

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

批处理:GNU-make,Snakemake还是什么?

我需要通过将它们传递给matlab或python脚本来处理目录中的一组文件.

对于目录中的每个输入文件FileName.IN,我需要获取输出文件FileName.OUT.

如果解决方案是Python或bash脚本并不重要.

为了实现我的目标,我尝试了GNU Make(或Python Snakemake),但是我有点卡在它上面.看起来我可以说GNU Make要做: "嘿,对于每个输出(目标)文件FileName.out搜索相应的FileName.IN(先决条件)".

然而,如前所述,我想要做的恰恰相反.

  • make(或snakemake)正确的选择?
  • 你还有什么建议?

我的makefile代码看起来像这样,但它不能完成这项工作(我是GNU make的新手):

in_files = *.IN
out_files = *.out
$(out_files) : $(in_files)
    matlab -nosplash -nodesktop -r "a_matlab_function('$<','$@')"
Run Code Online (Sandbox Code Playgroud)

python bash gnu-make batch-processing snakemake

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

标签 统计

gnu-make ×10

makefile ×8

bash ×2

c ×2

linux ×2

batch-processing ×1

c++ ×1

python ×1

snakemake ×1