我在Makefile中有以下PHONY目标
install:
echo /usr/bin/shelldecrypt must be writable
cp shelldecrypt /usr/bin
Run Code Online (Sandbox Code Playgroud)
当我运行目标时,它会显示正在执行的命令
提示> make install
输出是
echo /usr/bin/shelldecrypt must be writable
/usr/bin/shelldecrypt must be writable
cp shelldecrypt /usr/bin
按我的意思输出它
/usr/bin/shelldecrypt must be writable
cp shelldecrypt /usr/bin
我正在尝试按照本文所述安装Steel Bank Common Lisp .
但是,当我这样做时:
sh-3.2# INSTALL_ROOT=/usr/local sh install.sh
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
GNU Make not found. Try setting the environment variable GNUMAKE.
Run Code Online (Sandbox Code Playgroud)
我究竟如何在Mac OS X上安装GNU Make并设置环境变量GNUMAKE?
该问题在精神上与问题2543127类似.
我有一个带有头文件列表的gnu makefile.每个头文件可以位于不同的目录中,例如,
HEADERS = $(wildcard *.h) $(wildcard foo/*.h) $(wildcard bar/*.h)
Run Code Online (Sandbox Code Playgroud)
我想让makefile将所有标题复制到include目录
INCDIR = ../include
Run Code Online (Sandbox Code Playgroud)
当调用虚拟目标(例如ALL)时,它将适当地更新include目录中的头文件,即
.PHONY: ALL
ALL : $(addprefix $(INCDIR)/,$(notdir $(HEADERS)))
Run Code Online (Sandbox Code Playgroud)
显然,如果我知道目录列表是什么,我可以很容易地完成我想要的.如果我这样做,那么我可以写一些规则(某些东西)就像这样(不完全正确,但你得到了这个):
$(addprefix $(INCDIR)/,$(notdir $(filter foo/%.h,$(HEADERS)))) : %.h : foo/%.h
@cp -f $< $@
$(addprefix $(INCDIR)/,$(notdir $(filter bar/%.h,$(HEADERS)))) : %.h : bar/%.h
@cp -f $< $@
$(addprefix $(INCDIR)/,$(notdir $(filter-out bar/%.h,$(filter-out foo/%.h,$(HEADERS))))) : %.h : %.h
@cp -f $< $@
Run Code Online (Sandbox Code Playgroud)
有两个问题的方法,(1)随着的目录数量的增加和(2)我在makefile写这包括,不知道目录,所有它知道是变量INCDIR和头繁琐; 它不直接知道目录foo /,bar /和./,而不是通过$(sort $(dir $(HEADERS)))
问题:如何在仅提供INCDIR和HEADERS变量的约束下编写规则以实现期望的效果.
我想libswscale.so.2用libswscale.so(变量分别调用$(SLIBNAME_WITH_MAJOR)和变量$(SLIBNAME))替换字符串.这是我在Makefile中尝试过的:
$(SUBDIR)$(SLIBNAME_WITH_MAJOR): $(OBJS) $(SUBDIR)lib$(NAME).ver
[...]
@echo SHFLAGS=$(SHFLAGS)
@echo SLIBNAME_WITH_MAJOR=$(SLIBNAME_WITH_MAJOR)
@echo SLIBNAME=$(SLIBNAME)
@echo A $(patsubst $(SLIBNAME_WITH_MAJOR),$(SLIBNAME),$(SHFLAGS))
@echo B $(SHFLAGS:$(SLIBNAME_WITH_MAJOR)=$(SLIBNAME))
@echo C $($(SHFLAGS):$(SLIBNAME_WITH_MAJOR)=$(SLIBNAME))
@echo D $(SHFLAGS:$(SLIBNAME_WITH_MAJOR)=$(SLIBNAME))
@echo E $(subst $(SLIBNAME_WITH_MAJOR),$(SLIBNAME),$(SHFLAGS))
@echo F $(subst l,L,$(SHFLAGS))
Run Code Online (Sandbox Code Playgroud)
输出是
SHFLAGS=-shared -Wl,-soname,libswscale.so.2 -Wl,-Bsymbolic -Wl,--version-script,libswscale/libswscale.ver
SLIBNAME_WITH_MAJOR=libswscale.so.2
SLIBNAME=libswscale.so
A -shared -Wl,-soname,libswscale.so.2 -Wl,-Bsymbolic -Wl,--version-script,libswscale/libswscale.ver
B -shared -Wl,-soname,libswscale.so.2 -Wl,-Bsymbolic -Wl,--version-script,libswscale/libswscale.ver
C
D -shared -Wl,-soname,libswscale.so.2 -Wl,-Bsymbolic -Wl,--version-script,libswscale/libswscale.ver
E -shared -Wl,-soname,libswscale.so.2 -Wl,-Bsymbolic -Wl,--version-script,libswscale/libswscale.ver
F -shared -WL,-soname,libswscale.so.2 -WL,-BsymboLic -WL,--version-script,LibswscaLe/LibswscaLe.ver
Run Code Online (Sandbox Code Playgroud)
最后一个(F)特别荒谬.这有什么不对?是因为它$(SHFLAGS)也是由变量组成的吗?
我有makefile一个简单的helloWorld程序:
helloWorld: helloWorld.cpp
echo "Argument entered is $(foo)"
ifdef foo
echo "Defined.";
else
echo "Not defined.";
endif
g++ -Wall -pedantic -g helloWorld.cpp -o h
Run Code Online (Sandbox Code Playgroud)
当我调用make命令行像这样:make foo=bar,我得到以下错误:
bar
"not set"
echo "Argument entered is bar"
Argument entered is bar
ifdef foo
make: ifdef: Command not found
make: *** [helloWorld] Error 127
Run Code Online (Sandbox Code Playgroud)
我已经在SO上找到了关于这个错误的一些链接但是还没有能够解决这个问题.
就此问题而言,条件变量赋值是指?=运算符,而标准赋值是指:=运算符。
我试图通过将命令分配给变量,然后使用来检查命令,以检查是否存在命令,ifdef但是我看到了不同的行为,具体取决于我用来进行初始分配的两个运算符中的哪个。
这是一个简化的Makefile示例。请注意,在我的系统上既没有foo也不bar存在,因此我希望两项检查都能触发“未找到”分支。
FOO := $(shell which foo)
BAR ?= $(shell which bar)
all:
ifdef FOO
echo "FOO found with value '${FOO}'"
else
echo "FOO not found"
endif
ifdef BAR
echo "BAR found with value '${BAR}'"
else
echo "BAR not found"
endif
Run Code Online (Sandbox Code Playgroud)
运行时make,我得到以下结果:
FOO not found
BAR found with value ''
Run Code Online (Sandbox Code Playgroud)
在GNU的make文件说,ifdef寻找一个非空值。
为什么这两个赋值运算符的行为和产生的结果不同?
使用GNU Make 4.1,在我的Makefile中,我可以用这个创建一个时间戳日志文件::
flush_log:
@echo "==> flush logs"
cat file > file_`date +%FT%T%Z`.log
Run Code Online (Sandbox Code Playgroud)
但是谁应该:
file_`date +%FT%T%Z`.log
Run Code Online (Sandbox Code Playgroud)
在Makefile里面的var中,例如wc在它上面吗?
我试过(没有成功):
flush_log:
@echo "==> flush logs"
logfile:=file_$(shell date +%FT%T%Z).log
cat my_log > $(logfile)
echo `wc -l $(logfile)`
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
$ make flush_log
==> flush logs
logfile:=file_2016-12-24T20:09:52CET.log
/bin/sh: 1: logfile:=file_2016-12-24T20:09:52CET.log: not found
Makefile:7: recipe for target 'flush_log' failed
make: *** [flush_log] Error 127
$
Run Code Online (Sandbox Code Playgroud)
我遵循/sf/answers/1045760411/和Simply扩展变量的建议https://www.gnu.org/software/make/manual/html_node/Flavors.html#Flavors
我有一个包含相关依赖项的目标的Makefile.所以我使用查找表,如:
APPS = a b c
dependency.lookup.a := x
dependency.lookup.b := y
dependency.lookup.c := z
$(APPS): %: path/$(dependency.lookup.%).datafile
do something with $(dependency.lookup.$@)
Run Code Online (Sandbox Code Playgroud)
这个makefile给了我错误.***没有规则来制作目标'path/.datafile'
约束:只有MinGW.不能使用shell/MSYS.也支持FreeBSD.
我是C编程的新手,我想知道在Makefile中编写什么来编译单个.c文件.
说我有一个多.c一个文件夹中的文件),即sample1.c,sample2.c,sample3.c等等),我只是想编一个特定的文件名.我想只键入" make sample2",它将编译并调用一个输出sample2(几乎.c保持名称).
我已经阅读了几个解决方案,有人可能会提出这个建议,但没有成功.
SRC = $(shell find . -type f -name \*.c)
executable: $(SRC:.c=.o)
gcc -std=gnu99 $@ $^
Run Code Online (Sandbox Code Playgroud)
我需要做些什么来使它工作?
我想对(GNU)生成文件添加快速检查,以提醒用户-j/ --jobs(并行生成)的可用性。也就是说,类似
$ make
TIP: this will build faster if you use use "make -j"
Building ..
$ make -j
Building in parallel ..
Run Code Online (Sandbox Code Playgroud)
执行Makefile时,如何确定并行作业的数量?
这里有个窍门 http://blog.jgc.org/2015/03/gnu-make-insanity-finding-value-of-j.html
以及对GNU的建议更改在此处 https://github.com/esantoro/make/commit/b0334e7f3009dc58dbc8e6e6fdec94711537fb3b
但是也许有些更新和/或更容易的东西。