标签: gnu-make

如何在makefile中抑制回声?

我在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

makefile gnu-make

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

"找不到GNU Make.尝试设置环境变量GNUMAKE."

我正在尝试按照本文所述安装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?

macos install sbcl gnu-make

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

gnu将许多文件复制到一个位置

该问题在精神上与问题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变量的约束下编写规则以实现期望的效果.

gnu-make

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

Makefile中的简单字符串替换

我想libswscale.so.2libswscale.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 gnu-make substitution

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

找不到ifdef命令(GNU make 3.81)

我有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上找到了关于这个错误的一些链接但是还没有能够解决这个问题.

gnu-make

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

为什么条件变量赋值设置一个值,而标准赋值却没有?

就此问题而言,条件变量赋值是指?=运算符,而标准赋值是指:=运算符。

我试图通过将命令分配给变量,然后使用来检查命令,以检查是否存在命令,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

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

在Makefile变量中使用`date`

使用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 gnu-make

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

Makefile目标依赖项中的变量替换

我有一个包含相关依赖项的目标的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.

makefile gnu-make

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

如何创建Makefile以在C中编译单个任意文件名

我是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)

我需要做些什么来使它工作?

c gcc makefile gnu-make

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

GNU Make:检查并行作业数

我想对(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

但是也许有些更新和/或更容易的东西。

makefile gnu-make

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

标签 统计

gnu-make ×10

makefile ×6

c ×1

gcc ×1

install ×1

macos ×1

sbcl ×1

substitution ×1