标签: makefile

列出GNU中的目标/目标,使其在定义中包含变量

我有一个相当大的makefile,它通过计算变量中的名称来动态创建多个目标.(例如foo $(VAR):$(PREREQS)).有没有什么方法可以让gnu make在扩展这些变量之后吐出一系列目标?

我希望能够获得aribitrary makefile的目标.我正在尝试为我的shell编写一个完成函数.

makefile gnu-make

99
推荐指数
6
解决办法
6万
查看次数

如何从命令行传递参数到Makefile?

如何从命令行传递参数到Makefile?

我明白我能做到

$ make action VAR="value"
$ value
Run Code Online (Sandbox Code Playgroud)

Makefile

VAR = "default"
action:
    @echo $(VAR)
Run Code Online (Sandbox Code Playgroud)

我如何获得以下行为?

$ make action value
value
Run Code Online (Sandbox Code Playgroud)

怎么样

$make action value1 value2
value1 value2
Run Code Online (Sandbox Code Playgroud)

parameters command-line arguments makefile

99
推荐指数
5
解决办法
12万
查看次数

makefile中的多行bash命令

我有一种非常舒适的方式来通过几行bash命令编译我的项目.但现在我需要通过makefile编译它.考虑到每个命令都在自己的shell中运行,我的问题是在makefile中运行多行bash命令的最佳方法什么,相互依赖? 例如,像这样:

for i in `find`
do
    all="$all $i"
done
gcc $all
Run Code Online (Sandbox Code Playgroud)

另外,有人可以解释为什么即使单行命令bash -c 'a=3; echo $a > file'在终端中工作正常,但在makefile情况下创建空文件?

bash makefile

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

CMake输出/构建目录

我对cmake很新,并阅读了一些关于如何使用它的教程,并编写了一些复杂的50行CMake脚本,以便为3个不同的编译器制作程序.这可能总结了我在cmake的所有知识.

现在我的问题是我有一些源代码,当我制作程序时,我不想触摸/弄乱它的文件夹.我想要所有cmake并使输出文件和文件夹进入../Compile/,所以我在我的cmake脚本中更改了一些变量,并且它在我的笔记本电脑上做了类似的事情时工作了一段时间:

Compile$ cmake ../src
Compile$ make
Run Code Online (Sandbox Code Playgroud)

在那里,我现在在文件夹中有一个干净的输出,这正是我正在寻找的.

现在我转移到另一台计算机,并重新编译CMake 2.8.11.2,我几乎回到原点!它总是将事物编译到我的CMakeLists.txt所在的src文件夹中.

我在cmake脚本中选择目录的部分是:

set(dir ${CMAKE_CURRENT_SOURCE_DIR}/../Compile/)
set(EXECUTABLE_OUTPUT_PATH ${dir} CACHE PATH "Build directory" FORCE)
set(LIBRARY_OUTPUT_PATH ${dir} CACHE PATH "Build directory" FORCE)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${dir})
set(CMAKE_BUILD_FILES_DIRECTORY ${dir})
set(CMAKE_BUILD_DIRECTORY ${dir})
set(CMAKE_BINARY_DIR  ${dir})
SET(EXECUTABLE_OUTPUT_PATH ${dir})
SET(LIBRARY_OUTPUT_PATH ${dir}lib)
SET(CMAKE_CACHEFILE_DIR ${dir})
Run Code Online (Sandbox Code Playgroud)

现在它始终以:

-- Build files have been written to: /.../src
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

c++ makefile build cmake output

98
推荐指数
5
解决办法
19万
查看次数

make中的"all"代表什么?

我阅读了一些关于Makefile的教程,但对我而言,目标"所有"代表什么以及它的作用仍然不清楚.

有任何想法吗?

makefile

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

GNU Makefile规则从单个源文件生成一些目标

我试图做以下事情.有一个程序,调用它foo-bin,它接收一个输入文件并生成两个输出文件.一个愚蠢的Makefile规则是:

file-a.out file-b.out: input.in
    foo-bin input.in file-a.out file-b.out
Run Code Online (Sandbox Code Playgroud)

但是,这并没有make以任何方式告诉两个目标将同时生成.make在串行运行时这很好,但如果一个人尝试make -j16或同样疯狂的话,可能会造成麻烦.

问题是,是否存在为这种情况编写正确的Makefile规则的方法?很明显,它会生成一个DAG,但不知何故,GNU make手册没有说明如何处理这种情况.

两次运行相同的代码并仅生成一个结果是不可能的,因为计算需要时间(想想:小时).仅输出一个文件也相当困难,因为它经常用作GNUPLOT的输入,GNUPLOT不知道如何只处理数据文件的一小部分.

makefile

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

如何在Windows上使用GNU Make?

我安装MinGW和MSYS,补充C:\MinGW\binPATH,但我仍然无法在Windows上运行的Makefile cmd.我想运行cmd.exe并在那里键入,例如,make all但我的cmd说没有这样的命令.

我该怎么办?我不想使用MSYS shell,这不是重点.任何想法如何在Windows cmd中使用GNU Make,因为我可以在Ubuntu中使用它?我对此不感兴趣Cygwin.

windows cmd makefile gnu-make

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

检查Makefile中是否存在程序

如何检查程序是否可以从Makefile中调用?

(也就是说,程序应存在于路径中或以其他方式可调用.)

例如,它可用于检查安装的编译器.

例如类似这个问题,但不假设底层shell是POSIX兼容的.

makefile gnu-make

94
推荐指数
8
解决办法
5万
查看次数

如何将宏定义从"make"命令行参数(-D)传递给C源代码?

我通常使用选项:-Dname = value将宏定义从"make命令行"传递给"makefile".该定义可在makefile中访问.

我还使用类似的编译器选项将宏定义从"makefile"传递到"源代码":-Dname = value(在许多编译器中都支持).可以在源代码中访问此定义.

我现在需要的是允许我的makefile用户能够立即将"make.exe命令行"中的任意宏定义传递给"源代码",而无需更改makefile中的任何内容.

所以用户可以输入:make -f mymakefile.mk -SOMEOPTION var = 5

然后直接代码main.c可以看到var:

int main()
{
  int i = var;
}
Run Code Online (Sandbox Code Playgroud)

c macros makefile

93
推荐指数
4
解决办法
10万
查看次数

CFLAGS与CPPFLAGS

我知道CFLAGS(或CXXFLAGS for C++)是针对编译器的,而CPPFLAGS是由预处理器使用的.

但我仍然不明白其中的区别.

我需要为#include包含的头文件指定一个包含路径 - 因为#include是一个预处理器指令,是我唯一关心的预处理器(CPPFLAGS)吗?

在什么情况下我需要给编译器一个额外的包含路径?

通常,如果预处理器找到并包含所需的头文件,为什么需要告知额外的包含目录?CFLAGS有什么用?

(在我的情况下,我实际上发现这两个允许我编译我的程序,这增加了混乱...我可以使用CFLAGS CPPFLAGS来实现我的目标(至少在autoconf上下文中.)给出了什么?)

autoconf makefile autotools cflags

92
推荐指数
2
解决办法
11万
查看次数