在尝试从源代码安装程序时,我发现它将库安装到/ usr/lib/[program] /,因为这是在64位系统上,它不起作用.我不得不将库复制到/ usr/lib64/[program].请注意,库文件是python,因此与体系结构无关.
Makefile有:
libdir = /usr/lib
如何在64位系统和32 位系统上实现libdir相同?lib64lib
如何在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不是删除中间文件.我已经定了.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?
我有一个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)
它似乎应该对我有用,但说实话,我甚至不确定我怎么能看到它扩展到什么.这里有什么明显的错吗?
我是新手在Linux上部署用C/C++编写的程序,我想知道在这种情况下你会做什么.
我有一个二进制文件(用GNU Make编译),需要读取配置文件(如myprogram.conf).但是当我编写一个Makefile来部署这个文件时/usr/bin/,配置文件应该放在哪里?可执行文件如何知道它在哪里?
我有一个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
我有一个版本文件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) 我有一个生成多个输出文件的工具,众所周知,这很难在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)
这是重建out1和out2,正确的...但它一直没有重建out3,它应该有。然后,如果我执行另一个构建:
$ make -f test.mk out3 -j4
touch out3
Run Code Online (Sandbox Code Playgroud)
...然后赶上了。
这仅适用于并行构建。-j1建立良好的工作。 …
我已经制定了这样的目标
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) 我需要通过将它们传递给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)