标签: gnu-make

便携式等效的GNU使%风格的模式规则

我正在按照Autotools页面上的使用检查的指示,试图在(当前)小型C项目中构建对单元测试的支持.虽然我使用的是Cgreen而不是Check.

我遇到了第9步的问题,这导致automake发出关于使用'%'的警告 - 样式模式规则是GNU make扩展.

具体的制定规则是:

check_%.$(OBJEXT) : $(srcdir)/%.c
    $(COMPILE) -DCHECKING -c -o $@ $^
Run Code Online (Sandbox Code Playgroud)

我想知道是否有一种等效的方法来指定不依赖于gnu make扩展的规则.

c automake portability makefile gnu-make

5
推荐指数
1
解决办法
2635
查看次数

简明的Makefile

我正在做一些Makefile重构,并试图找出实现Makefile的最简洁的方法,它执行以下操作:

  1. 有一个变量列出了所有源文件(可以是C和C++文件)
  2. 所有目标文件都在OBJ_DIR中生成
  3. 如果对象目录不存在,则创建该对象目录

这是我到目前为止:

...

OBJ_DIR = obj/
BIN_DIR = bin/
PROGRAM = program

SRCS = test1.cpp test2.c

OBJS  = $(addprefix $(OBJ_DIR), \
        $(patsubst %.cpp, %.o,  \
        $(patsubst %.c, %.o, $(SRCS))))

$(BIN_DIR)$(PROGRAM) : $(OBJS)
    $(CREATE_OUT_DIR)
    $(LINK)

$(OBJ_DIR)%.o : %.c
    $(CREATE_OBJ_DIR)
    $(CCOMPILE)

$(OBJ_DIR)%.o : %.cpp
    $(CREATE_OBJ_DIR)
    $(CPPCOMPILE)

...
Run Code Online (Sandbox Code Playgroud)

我想为每个.o编译消除对$(CREATE_OBJ_DIR)的调用.有人知道怎么做吗?我尝试添加这个,但它不会构建目标文件:

$(OBJS): | $(OBJ_DIR)

$(OBJ_DIR):
    $(CREATE_OBJ_DIR)
Run Code Online (Sandbox Code Playgroud)

makefile gnu-make

5
推荐指数
1
解决办法
652
查看次数

Makefile $ @ variable - 它用于什么?

我是学习make文件的新手.我正在读这篇文章.有谁能告诉我什么是$@变量用于makefile内部?

unix gcc makefile gnu-make

5
推荐指数
1
解决办法
5620
查看次数

有没有办法告诉automake不要解释部分的automakefile?

有没有办法告诉automake不要解释部分Makefile.am?

具体来说,我试图在Makefile.am中编码Makefile条件.正如其他人注意到的那样,这不起作用,因为automake解释了endif结构.

有没有办法逃脱或引用Makefile.am文件中的字符串,以便automake逐字复制到目标Makefile?具体来说,我不希望它在以下内容中解释endif:

ifeq "$(SOMEVAR)" ""
SOMEVAR="default_value"
endif
Run Code Online (Sandbox Code Playgroud)

automake makefile gnu-make

5
推荐指数
1
解决办法
994
查看次数

<命令行>:1:1:错误:宏名称必须是标识符

我是Linux和makefile的新手.我有一个生成.a文件的makefile.当我运行makefile时,我收到以下错误.我不知道代码的哪一部分,错误发生.

[oracle@dyl02703app004 erm]# make -f erm_make_ida all
.... Compiling /home/wholesale/children/dev5/comps/erm/obj/ermparseyac.c
cc  -g                         -DANSI -D -DTRACE_ON -DIDA_VERSION='"ISP-RG-V5.10.7GEN2A"' -DNO_MCP -DBUILDING_ERP  -I/home/wholesale/children/dev5/comps/erm/include -I/home/wholesale/children/dev5/comps/erm/src -I/home/wholesale/children/dev5/comps/erm/module_test  -I/home/wholesale/children/dev5/comps/erm/include  -I/home/wholesale/children/dev5/comps/cfm/include    -c /home/wholesale/children/dev5/comps/erm/src/ermparseyac.c -o /home/wholesale/children/dev5/comps/erm/obj/ermparseyac.o
<command line>:1:1: error: macro names must be identifiers
make: *** [/home/wholesale/children/dev5/comps/erm/obj/ermparseyac.o] Error 1
Run Code Online (Sandbox Code Playgroud)

有什么建议...?

linux command-line gnu-make

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

错误:stdio.h:make期间没有此类文件或目录错误

我正在尝试在Ubuntu中编译以下程序.但我一直收到错误:"stdio.h:没有这样的文件或目录"错误.

#include <stdio.h>

int main(void)
{
  printf("Hello world");
}
Run Code Online (Sandbox Code Playgroud)

我的makefile是:

obj-m += hello.o 
all:
    make -I/usr/include -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Run Code Online (Sandbox Code Playgroud)

c ubuntu gnu-make

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

使用gnu make正确构建git子模块

我目前正在尝试编写一个Makefile,以正确构建包含git子模块的项目。该子模块具有自己的makefile集,并一次生成多个目标,包括一些库。

此Makefile应该具有以下属性。

  • 即使使用并行构建,也不要两次重建子模块。
  • 子模块代码已更改时更新子模块目标(可能是因为我浏览了主存储库的修订版)。
  • 子模块库更改后,重新链接主项目。
  • 不要在顶层项目中复制粘贴子模块的Makefile(即保持Makefile递归)。

只是为了设定想法,这似乎是可行的。

FOO_SUBDIR := $(CURDIR)/foo
LDFLAGS := -L$(FOO_SUBDIR)

FOO_LIBSFILES := $(FOO_SUBDIR)/libfoo.a $(FOO_SUBDIR)/libgnufoo.a
FOO_LDLIBS := -lfoo -lgnufoo


.PHONY: all
all: main

# There are theoretically 3 main binaries
main: main.c $(FOO_LIBSFILES)
    gcc -o $@ $< $(LDFLAGS) $(FOO_LDLIBS)

$(FOO_LIBSFILES): libfoo
    @# Do nothing

.PHONY: libfoo
libfoo:
    $(MAKE) -C $(FOO_SUBDIR)
Run Code Online (Sandbox Code Playgroud)

我添加了空食谱似乎很有效,但我不明白为什么。

这个想法是始终依靠子模块的Makefile进行重建(或不重建)libfoo.alibgnufoo.a,并让主Makefile决定是否main需要重建。没有空食谱,它是行不通的。当foo/foo.c被修改,然后libfoo.a重新生成,但make不重建main

我有一种空的配方强制检查目标文件的日期的感觉。但是我找不到有关此行为的文档。

这是正确的方法吗?我应该注意的任何陷阱?还有什么比较晦涩的方法吗?或有关此行为的任何文档?

提前致谢。

git makefile gnu-make git-submodules

5
推荐指数
1
解决办法
1917
查看次数

我能否确定在Makefile中是否使用了--jobs?

我想根据是否启用并行构建来设置一些变量,因此我尝试了以下操作:

jobs:
»·echo "executing jobs job"

ifneq (,$(findstring -j,$(MAKEFLAGS)))
»·$(warning "parallel!")
else
»·$(warning "not parallel!")
endif
Run Code Online (Sandbox Code Playgroud)

这就是发生的情况:

$ make -j2
Makefile:2: "not parallel!"
echo "executing jobs job"
executing jobs job
Run Code Online (Sandbox Code Playgroud)

我也尝试过测试$(JOBS),但是没有运气。

我有办法告诉Makefile内部是否使用了--jobs参数吗?


附加信息:

$ make --version
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for x86_64-pc-linux-gnu
Run Code Online (Sandbox Code Playgroud)

makefile gnu-make

5
推荐指数
1
解决办法
251
查看次数

如何在vim中显示实际语法突出显示?

最近,我用vim文本编辑器编写了一个没有文件扩展名的文本文件,并用高亮显示了单行引号(如)'word'和以冒号(如)结尾的所有单词。word:

我喜欢这种突出显示。

但是因为我没有键入任何通常以开头的命令,所以ESC :command我很惊讶这是怎么发生的。

是否有命令显示正在使用的实际语法突出显示?

我已经尝试过:set syntax=php似乎只用不同颜色的命令类似的命令word:

有人有建议吗?

vim file-type makefile syntax-highlighting gnu-make

5
推荐指数
2
解决办法
1642
查看次数

C-函数具有内部链接,但未定义

我有这个文件夹结构:

结构体

我编写了一个简单的函数来测试文件夹结构,以查看是否所有头文件都存在,但是当我使用make命令进行编译时,出现以下错误:

警告:函数“ stampa”具有内部链接,但未定义

我的lagrange.h文件我有这个:

#ifndef LAGRANGE_H

static void stampa(int i);

#endif /* LAGRANGE_H */
Run Code Online (Sandbox Code Playgroud)

lagrange.c文件中我有这个:

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

#include <stdio.h>

void stampa(int i){
    printf("%d", i);
}
Run Code Online (Sandbox Code Playgroud)

最后,int main.c我只是简单地调用stampa传递给他们一个数字的函数。

c makefile compilation gnu-make

5
推荐指数
1
解决办法
4867
查看次数