在我的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)
任何人都知道为什么它不适合我?
我经常发现Bash语法非常有用,例如像diff <(sort file1) <(sort file2).中的进程替换.
是否可以在Makefile中使用此类Bash命令?我在考虑这样的事情:
file-differences:
diff <(sort file1) <(sort file2) > $@
Run Code Online (Sandbox Code Playgroud)
在我的GNU Make 3.80中,这会产生错误,因为它使用shell而不是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情况下创建空文件?
有没有办法在目标体内重新分配Makefile变量值?
我想要做的是为调试编译添加一些额外的标志:
%.erl: %.beam
$(ERLC) $(ERLFLAGS) -o ebin $<
test: clean debug_compile_flag compile compile_test
debug_compile:
$(ERLCFLAGS) += -DTEST
Run Code Online (Sandbox Code Playgroud)
因此,如果我调用测试目标,我想清理我的环境,添加一些新标志(比如现有的-DTEST),再次编译整个代码(第一个源,然后是测试模块).
我不想复制/粘贴用于编译的代码,因为有很多逻辑放在这里和那里.
有没有一些简单的方法来重新定义变量值,以便我可以重用现有的代码?
我该如何工作?它出错"make:somevariable:command not found"
sometarget:
somevariable = somevalue
Run Code Online (Sandbox Code Playgroud)
完整示例:
CXXFLAGS = -I/usr/include/test -shared -fPIC
OBJ = main.o Server.o
blabla : $(OBJ)
ifeq ($(argsexec),true)
# Creates an executable
CXXFLAGS = -I/usr/include/test
$(CXX) -o blabla $(OBJ) $(CXXFLAGS)
else
# Creates a library
DESTDIR = /home/pc
$(CXX) -o blabla $(OBJ) $(CXXFLAGS)
./bn.sh
endif
Run Code Online (Sandbox Code Playgroud) 我有一个脚本压缩我的CSS文件并输出输出文件的文件名.
我正在尝试构建一个makefile来自动化该过程:
all:
@echo "Compiling CSS"
CSS_OUTPUT=$(shell php minify_css.php )
echo $(CSS_OUTPUT)
Run Code Online (Sandbox Code Playgroud)
我正在尝试将输出文件名存储在CSS_OUTPUT变量中,但我做错了,因为整个makefile只是打印出来:
$ make
abcdefg.css
Compiling CSS
CSS_OUTPUT=
echo
Run Code Online (Sandbox Code Playgroud)
因此未分配输出CSS_OUTPUT.另外,为什么php输出之前打印@echo "Compiling CSS"?
我试过这个:
all:
@echo "Compiling CSS"
CSS_OUTPUT=$(shell echo php minify_css.php )
echo $(CSS_OUTPUT)
Run Code Online (Sandbox Code Playgroud)
但它只会变得更糟:
$ make
Compiling CSS
CSS_OUTPUT=php minify_css.php
./minify_css.php: line 1: ?php: No such file or directory
./minify_css.php: line 3: syntax error near unexpected token `dirname'
./minify_css.php: line 3: `require_once( dirname(__FILE__) . DIRECTORY_SEPARATOR . 'maintenance.php' );'
make: *** [css] Error 2
Run Code Online (Sandbox Code Playgroud)
编辑 …
有没有办法在每次使用时重新评估变量的定义?例如:
MAP_FILES = $(shell find $(TMP) -name "*.map")
all: generate_map_files work_with_map_files
generate_map_files:
./map-builder
work\_with\_map_files: $(MAP_FILES)
./map-user
%.map:
./map-edit $@
Run Code Online (Sandbox Code Playgroud)
因此,在读取makefile时将评估MAP_FILES,如果$ TMP目录中没有.map文件,则该变量将为空.但是在generate_map_files规则完成后,目录中会有.map文件,我希望这些.map文件的列表成为work_with_map_files规则的先决条件.
在生成之前我不知道.map文件的文件名,因此我无法明确声明带有文件名的变量.我需要在生成映射文件列表后设置变量.任何建议都会非常有帮助.谢谢.
如何使用在 make 目标中定义的变量
.PHONY: foo
VAR_GLOBAL=$(shell cat /tmp/global)
foo:
echo "local" > /tmp/local
VAR_LOCAL=$(shell cat /tmp/local)
echo ${VAR_GLOBAL}
echo ${VAR_LOCAL}
Run Code Online (Sandbox Code Playgroud)
这是执行输出:
$ echo global > /tmp/global
$ make foo
echo "local" > /tmp/local
VAR_LOCAL=local
echo global
global
echo
Run Code Online (Sandbox Code Playgroud)