我有一个相当大的makefile,它通过计算变量中的名称来动态创建多个目标.(例如foo $(VAR):$(PREREQS)).有没有什么方法可以让gnu make在扩展这些变量之后吐出一系列目标?
我希望能够获得aribitrary makefile的目标.我正在尝试为我的shell编写一个完成函数.
如何从命令行传递参数到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) 我有一种非常舒适的方式来通过几行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情况下创建空文件?
我对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)
我错过了什么吗?
我阅读了一些关于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不知道如何只处理数据文件的一小部分.
我安装MinGW和MSYS,补充C:\MinGW\bin到PATH,但我仍然无法在Windows上运行的Makefile cmd.我想运行cmd.exe并在那里键入,例如,make all但我的cmd说没有这样的命令.
我该怎么办?我不想使用MSYS shell,这不是重点.任何想法如何在Windows cmd中使用GNU Make,因为我可以在Ubuntu中使用它?我对此不感兴趣Cygwin.
我通常使用选项:-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) 我知道CFLAGS(或CXXFLAGS for C++)是针对编译器的,而CPPFLAGS是由预处理器使用的.
但我仍然不明白其中的区别.
我需要为#include包含的头文件指定一个包含路径 - 因为#include是一个预处理器指令,是我唯一关心的预处理器(CPPFLAGS)吗?
在什么情况下我需要给编译器一个额外的包含路径?
通常,如果预处理器找到并包含所需的头文件,为什么需要告知额外的包含目录?CFLAGS有什么用?
(在我的情况下,我实际上发现这两个允许我编译我的程序,这增加了混乱...我可以使用CFLAGS 或 CPPFLAGS来实现我的目标(至少在autoconf上下文中.)给出了什么?)