使用GNU Make我想从变量中删除值:
VAR := x.c y.c z.c
<snip>
VAR += x_x.c y_y.c
Run Code Online (Sandbox Code Playgroud)
我现在想从变量中删除"xc"和"yc".我尝试过使用subst命令,但也删除了x_x.c.
有没有办法做到这一点?
最终变量应如下所示:
VAR = z.c x_x.c y_y.c
Run Code Online (Sandbox Code Playgroud) 在GNU Make 3.81中,我需要在工具链的任何部分发生错误时删除锁定文件.是否有特殊目标可以让我这样做?我需要编写包装脚本吗?
在下面的示例中,如果file.out的规则失败,我需要unlock_id.
谢谢!-Jeff
all: lock_id file.out unlock_id
file.out: file.in
file-maker < file.in > $@
lock_id:
lockfile file.lock
unlock_id:
rm -rf file.lock
Run Code Online (Sandbox Code Playgroud) 我有一个Makefile,它可以从一个新的shell中完美地调用,即:
make -C /dir/
Run Code Online (Sandbox Code Playgroud)
但是,如果我从另一个 Makefile 调用此Makefile ,则由于某些复杂的依赖性问题而失败.清楚地了解嵌套调用,通过打印make[1]:等显而易见,我怀疑make是以某种方式与其子进程共享变量.
无论如何在Makefile中调用一个干净的 make?如果我的构建工作是从一个干净的shell,它应该可以从另一个Makefile调用它而不解决脚本内部的恐怖!:)
谢谢!
最新版本make有一个选项--output-sync,可以使每个目标的STDOUT成为原子,以便在使用时不会交错多个目标的语句make --jobs=N
不幸的是,我必须使用,make v 3.81因为这是我们的SDK附带的那个.
为了确定我是否需要--output-sync,我在目标周围添加了一些"保护声明"
all: $(patsubst %.cpp, %.o, $(wildcard *.cpp))
%.o: %.cpp
@echo BEFORE
@echo MAKEFLAGS=$(MAKEFLAGS)
qcc.exe $(CC_FLAGS) $@ $<
@echo AFTER
Run Code Online (Sandbox Code Playgroud)
输出非常交错.
AFTER
BEFOREAFTER
AFTER
AFTER
Run Code Online (Sandbox Code Playgroud)
有没有办法模拟--output-sync功能?
据我所知,如果有一种方法可以"锁定STDOUT mutex"预配方并在配方后释放它,那么构建速度可能会受到影响.
我很好修改我们的每个目标,如果这是它需要的.
我想std::experimental::filesystem在我的代码中使用,这要求我使用-lstdc++fsGCC和-lc++experimentalClang 进行编译。目前,我有一个makefile,makefile.clang反映了编译方面的差异,或者,我考虑过使用clang构建目标,以便可以运行build clang。
有一些规范的方法可以在Makefile中设置特定于编译器的标志吗?
我正在编写一个需要定义一些环境变量的 makefile。我正在尝试使用这样的东西来实现这一目标:
define check-var-defined
ifndef $(1)
$(error $(1) is not defined)
endif
endef
$(call check-var-defined,VAR1)
$(call check-var-defined,VAR2)
$(call check-var-defined,VAR3)
rule1:
#stuff
Run Code Online (Sandbox Code Playgroud)
当我运行不带参数的 make 时,我得到:
$ make
Makefile:7: *** VAR1 is not defined. Stop.
Run Code Online (Sandbox Code Playgroud)
但是当我使用指定的 VAR1 运行它时,我得到了同样的错误。
$ make VAR1=hello
Makefile:7: *** VAR1 is not defined. Stop.
Run Code Online (Sandbox Code Playgroud)
有什么想法为什么这行不通吗?我该怎么做才能使这项工作成功?提前致谢。
(请注意,我需要检查运行 makefile 时是否实际定义了变量,因为我需要进一步包含另一个 makefle,并且在执行此操作时需要正确设置变量)。
当且仅当文件已经存在时,我想引用依赖项的时间戳.我有这样的模式规则:
%.pdf: %.sil
sile $< -o $@
Run Code Online (Sandbox Code Playgroud)
这在正常情况下工作得很好,但.sil文件对同名的lua文件进行外部引用(如果存在).我如何知道这一点,以便它检查时间戳并重新生成PDF,如果lua文件更新,但如果文件根本不存在则忽略依赖关系?
这个:
%.pdf: %.sil %.lua
sile $< -o $@
Run Code Online (Sandbox Code Playgroud)
...仅适用于文件存在的情况,如果不存在则会导致错误.
假设项目目录下包含src、bin、lib、doc等子目录,那么项目的makefile放在哪里呢?
例如,
一些项目将其 makefile 放在src/项目根目录的子目录中,
有些项目将其 makefile 放在项目的根目录中。
我觉得第二种方式更有逻辑性。您能否提供一些案例,说明哪些情况下最好将 makefile 放在根目录src/或其他目录中,原因是什么?
如何在Makefile目标中定义局部变量?
我想避免重复文件名,例如:
zsh:
FILENAME := "text.txt"
@echo "Copying ${FILENAME}...";
scp "${FILENAME}" "user@host:/home/user/${FILENAME}"
Run Code Online (Sandbox Code Playgroud)
但我收到错误:
FILENAME := "text.txt"
/bin/sh: FILENAME: command not found
Run Code Online (Sandbox Code Playgroud)
与相同$(FILENAME)
试
zsh:
export FILENAME="text.txt"
@echo "Copying ${FILENAME} to $(EC2)";
Run Code Online (Sandbox Code Playgroud)
给我一个空值:
Copying ...
Run Code Online (Sandbox Code Playgroud) 后
cd build
cmake -B . -DCMAKE_TOOLCHAIN_FILE=~/vcpkg/scripts/buildsystems/vcpkg.cmake -S ..
Run Code Online (Sandbox Code Playgroud)
好像
cmake --build .
Run Code Online (Sandbox Code Playgroud)
和
make
Run Code Online (Sandbox Code Playgroud)
在 macOS 上执行相同的操作。
那么,我什么时候应该使用其中之一呢?