任何人都可以清楚地解释变量赋值在Makefile中是如何工作的.
有什么区别:
VARIABLE = value
VARIABLE ?= value
VARIABLE := value
VARIABLE += value
Run Code Online (Sandbox Code Playgroud)
我已经阅读了GNU Make手册中的部分,但它对我来说仍然没有意义.
例如,我的makefile中有类似的东西:
all:
cd some_directory
Run Code Online (Sandbox Code Playgroud)
但是当我输入时,我make只看到'cd some_directory',就像在echo命令中一样.
我使用CMake与GNU Make,并希望完全看到所有命令(例如编译器如何执行,所有标志等).
GNU make有--debug,但似乎没有任何其他选项有用吗?CMake是否在生成的Makefile中提供了额外的标志以进行调试?
在我的makefile中,我有一个变量'NDK_PROJECT_PATH',我的问题是如何在编译时将其打印出来?
我读了Make文件echo显示"$ PATH"字符串,我试过:
@echo $(NDK_PROJECT_PATH)
@echo $(value NDK_PROJECT_PATH)
Run Code Online (Sandbox Code Playgroud)
两个都给了我
"build-local.mk:102: *** missing separator. Stop."
Run Code Online (Sandbox Code Playgroud)
任何人都知道为什么它不适合我?
在我的GNUmakefile中,我希望有一个使用临时目录的规则.例如:
out.tar: TMP := $(shell mktemp -d)
echo hi $(TMP)/hi.txt
tar -C $(TMP) cf $@ .
rm -rf $(TMP)
Run Code Online (Sandbox Code Playgroud)
如上所述,上述规则在解析规则时创建临时目录.这意味着,即使我没有直接创建.tar,也会创建许多临时目录.我想避免我的/ tmp被未使用的临时目录弄乱.
是否有办法使该变量仅在触发规则时定义,而不是在定义时定义?
我的主要想法是将mktemp和tar转储到shell脚本中,但这看起来有点难看.
我在app特定目录中有几个Makefile,如下所示:
/project1/apps/app_typeA/Makefile
/project1/apps/app_typeB/Makefile
/project1/apps/app_typeC/Makefile
Run Code Online (Sandbox Code Playgroud)
每个Makefile在此路径中包含一个.inc文件:
/project1/apps/app_rules.inc
Run Code Online (Sandbox Code Playgroud)
在app_rules.inc里面我正在设置我希望在构建时放置二进制文件的目的地.我希望所有二进制文件都在各自的app_type路径中:
/project1/bin/app_typeA/
Run Code Online (Sandbox Code Playgroud)
我尝试过使用$(CURDIR),像这样:
OUTPUT_PATH = /project1/bin/$(CURDIR)
Run Code Online (Sandbox Code Playgroud)
但相反,我把二进制文件埋在整个路径名中,如下所示:( 注意冗余)
/project1/bin/projects/users/bob/project1/apps/app_typeA
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能获得执行的"当前目录",这样我才能知道app_typeX为了将二进制文件放在各自的类型文件夹中?
我已经使用了rake(一个Ruby make程序),它有一个选项来获取所有可用目标的列表,例如
> rake --tasks
rake db:charset # retrieve the charset for your data...
rake db:collation # retrieve the collation for your da...
rake db:create # Creates the databases defined in y...
rake db:drop # Drops the database for your curren...
...
Run Code Online (Sandbox Code Playgroud)
但似乎没有选择在GNU make中执行此操作.
显然,代码几乎就在那里,截至2007年 - http://www.mail-archive.com/help-make@gnu.org/msg06434.html.
无论如何,我几乎没有从makefile中提取目标,你可以将其包含在makefile中.
list:
@grep '^[^#[:space:]].*:' Makefile
Run Code Online (Sandbox Code Playgroud)
它将为您提供已定义目标的列表.这只是一个开始 - 例如,它不会过滤掉依赖项.
> make list
list:
copy:
run:
plot:
turnin:
Run Code Online (Sandbox Code Playgroud) 我的项目有以下makefile,我想为发布和调试版本配置它.在我的代码中,我有很多#ifdef DEBUG宏,所以这只是设置这个宏并将-g3 -gdwarf2标志添加到编译器的问题.我怎样才能做到这一点?
$(CC) = g++ -g3 -gdwarf2
$(cc) = gcc -g3 -gdwarf2
all: executable
executable: CommandParser.tab.o CommandParser.yy.o Command.o
g++ -g -o output CommandParser.yy.o CommandParser.tab.o Command.o -lfl
CommandParser.yy.o: CommandParser.l
flex -o CommandParser.yy.c CommandParser.l
gcc -g -c CommandParser.yy.c
CommandParser.tab.o: CommandParser.y
bison -d CommandParser.y
g++ -g -c CommandParser.tab.c
Command.o: Command.cpp
g++ -g -c Command.cpp
clean:
rm -f CommandParser.tab.* CommandParser.yy.* output *.o
Run Code Online (Sandbox Code Playgroud)
只是为了澄清,当我说发布/调试版本时,我希望能够只键入make并获得发布版本或make debug获得调试版本,而无需手动注释掉makefile中的内容.