为了调试一个复杂的 XSLT 转换,我将它分成几个部分:首先我构建%.1.xml,然后我用它来构建%.2.xml,最后我构建%.3.xml. 一切正常,但是如果我要求 Make 构建最后一个,那么 Make 总是会删除中间的%.1.xml和%.2.xml,而我宁愿保留它们。我试图将所有.xml文件标记为.PRECIOUS:
.PRECIOUS: %.xml
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用。(我也尝试使用%.1.xmland %.2.xml,但这也不起作用。然后我尝试以.SECONDARY相同的方式将它们标记为相同的负面结果。它不删除中间文件的唯一方法是当文件已经存在;在这种情况下,它只重建它们。但如果文件不存在,它总是删除它们。
我错过了什么?
GNU 制作 4.1。
更新: Makefile,>>代表TAB:
sample-%.1.xml: sample-%.0.xml job.1.xslt job.xslt
>> xsltproc $(filter %.1.xslt,$^) $(filter %.xml,$^) > $@
sample-%.2.xml: sample-%.1.xml job.2.xslt job.xslt
>> xsltproc $(filter %.2.xslt,$^) $(filter %.xml,$^) > $@
sample-%.3.xml: sample-%.2.xml job.3.xslt job.xslt
>> xsltproc $(filter %.3.xslt,$^) $(filter %.xml,$^) > $@
.SECONDARY: %.xml # …Run Code Online (Sandbox Code Playgroud) 考虑以下 Makefile:
MAKEFLAGS += --warn-undefined-variables
define foobar
echo "$(1)"
endef
.PHONY: all
all:
$(foobar)
Run Code Online (Sandbox Code Playgroud)
有没有办法让宏带有默认参数而不产生未定义的变量警告?我的意思是:有时我会用参数调用“foobar”,但有时不会。在后一种情况下,我希望为 $(1) 设置一个默认值。
我有一些作为 RPM 分发的软件项目。它们使用语义版本控制进行版本控制,我们在其上附加了一个版本号。使用常规约定,这是MAJOR.MINOR.PATCH-REL_NUM。尽管超出了本文的范围,但版本号存储在 git 中。在公布目标的makefile看起来是这样的:
release:
make clean
$(BLD_ROOT)/tools/incr_rel_num
# Although the third step, this was re-ordered to step 1
$(eval RELEASE_NUMBER=$(shell cat $(BLD_ROOT)/path/to/rel_num.txt))
make rpm RPM_RELEASE_NUM=$(RELEASE_NUMBER)
Run Code Online (Sandbox Code Playgroud)
在调试时,我最终发现,虽然调用eval是配方中的第三步,但它实际上是首先被评估的!这就是为什么 RPM 的版本号总是比我看到的推送到遥控器的版本号少。
我在这方面做了很多谷歌搜索,但我没有找到任何解释在食谱中使用eval时的评估顺序的命中。也许它甚至不是关于eval而是一般的功能。此外,我也没有在 make 的 GNU 手册中找到有关这方面的详细说明(如果有的话,请指出是哪一章)。我已经解决了这个问题,所以它不是一个麻烦,我只是想知道,这是预期的,如果是,为什么?
我是比较新的CMake,我已经开发了一个小的项目,建立一个库,链接到一个共享库,命名external_library。我的CMakeLists.txt文件看起来像这样:
cmake_minimum_required(VERSION 2.8.12)
project(project_name)
include_directories(path_to_external_library_source_code)
add_subdirectory(path_to_external_library_header_files subproject/external_library)
target_link_libraries(project_name external_library)
install(TARGETS project_name DESTINATION installation_path)
Run Code Online (Sandbox Code Playgroud)
当我构建项目(使用make)时,它运行良好,并正确创建了链接(我已使用ldd命令检查过它)。但是,当我尝试安装它(使用make install)时,安装路径中生成的文件未链接到指定的共享库。
ldd再次使用,我查了一下安装路径中生成的库中没有找到共享库,虽然在构建路径中生成的库中找到了。我怎么能解决这个问题?
谢谢。
Pd:我CMake 3.5.1在Ubuntu 16.04.2 LTS.
我的FreeBSD是11.0,并发现make无法处理ifdef指令。例如:
ifdef VERBOSE
Q :=
else
Q := @
endif
Run Code Online (Sandbox Code Playgroud)
该make会抱怨:
make: "/root/Project/powermon/Makefile" line 13: Need an operator
make: "/root/Project/powermon/Makefile" line 15: Need an operator
make: "/root/Project/powermon/Makefile" line 17: Need an operator
Run Code Online (Sandbox Code Playgroud)
我目前的解决方案正在使用gmake。那么是否有任何make端口FreeBSD支持处理ifdef?
我有兴趣从互联网上的某个位置下载年度数据。我有一个GetYearData.py执行此操作的 python 脚本,将年份和输出文件名作为命令行参数。我想一次在几年的数据上运行这个脚本;我想使用 Make,这样如果我更改开始或结束年份,我就不必重新下载所有数据。
我可以用一个非常简单的 Makefile 做一年:
data/YearData_2000.txt : GetYearData.py
python $< --year 2000 --outfile $@
Run Code Online (Sandbox Code Playgroud)
但是,我想这样做一个循环(或类似的构造),以便在 bash 中的序列中的每一年YEARS=($(seq $(SYEAR) 1 $(EYEAR)))- 我传递--year $(Y)给我的脚本并为--outfile?
我正在编写一个 Makefile 来将弹性 beantalk 应用程序的部署包装到多个环境中。这是我第一次编写“高级”makefile,遇到了一些麻烦。
我的目标如下:
make deploy本身应该使用ENVIRONMENT=$(USER)和部署ENV_TYPE=staging。ENVIRONMENT=production那么ENV_TYPE=production,否则ENV_TYPE=staging。deploy目标后缀a-和环境名称。例如:make deploy-production。给我带来最大麻烦的是第 3 点。由于任何未命名为 production 的环境都属于暂存类型,因此我尝试使用模式匹配来定义部署到暂存环境的目标。这是我目前所拥有的:
ENVIRONMENT = $(USER)
ifeq ($ENVIRONMENT, production)
ENV_TYPE=production
else
ENV_TYPE=staging
endif
DOCKER_TAG ?= $(USER)
CONTAINER_PORT ?= 8000
ES_HOST = logging-ingest.$(ENV_TYPE).internal:80
.PHONY: deploy
deploy:
-pip install --upgrade awsebcli
sed "s/<<ES_HOST>>/$(ES_HOST)/" < 01-filebeat.template > .ebextensions/01-filebeat.config
sed "s/<<DOCKER_TAG>>/$(DOCKER_TAG)/" < Dockerrun.template | sed "s/<<CONTAINER_PORT>>/$(CONTAINER_PORT)/" > Dockerrun.aws.json
eb labs cleanup-versions --num-to-leave 10 --older-than …Run Code Online (Sandbox Code Playgroud) 在我的生成文件中,我有:
all:
for i in {20..50000..10} ; do \
echo "Computing $$i" ;\
done
Run Code Online (Sandbox Code Playgroud)
这应该在单独的行上打印数字 20, 30, 40, ..., 50000。
这适用于 Debian oldstable(GNU Make 4.0、GNU Bash 4.3),但不适用于 Debian stable(GNU Make 4.1 和 GNU Bash 4.4.12)。
Debian 稳定版只打印字符串“{20..50000..10}”。为什么是这样?在 makefile 中编写这个 for 循环的可移植方式是什么?
在问之前我看到了这个,尝试但没有帮助: 基于变量的条件编译到makefile
就我而言,我src_file.c包含:
#ifndef WITH_ATS
#define WITH_ATS
#include "ats.h"
#endif
Run Code Online (Sandbox Code Playgroud)
而 Makefile 有:
ifdef WITH_ATS
INCLUDEDIR += -I../at2_build/include/
LDFLAGS += -L$(AT2) -lat2 -Wl,-rpath=$(AT2)
CFLAGS += -DWITH_ATS
endif
Run Code Online (Sandbox Code Playgroud)
我正在尝试的是,如果我做make WITH_ATS=1文件应该用编译的atslib编译,而如果make WITH_ATS=0编译应该没有atslib。
任何帮助将不胜感激。
我的 Makefile 中有这个设置。
action1:
does something
action2: action1
does something else
Run Code Online (Sandbox Code Playgroud)
我想保留我的配置,以防我想action1用作 的依赖项action2,但有时我想在运行时忽略 action1 make action2(例如,我想运行make action2而不必包含action1)。我可以设置某种标志以在运行目标时忽略依赖项,我该怎么做?