标签: gnu-make

从Make Variables中删除值

使用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)

variables makefile gnu-make

7
推荐指数
1
解决办法
2825
查看次数

在Makefile中,如何清理lockfile文件?

在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)

lockfile makefile gnu-make onerror

7
推荐指数
1
解决办法
2837
查看次数

从makefile中调用make

我有一个Makefile,它可以从一个新的shell中完美地调用,即:

make -C /dir/
Run Code Online (Sandbox Code Playgroud)

但是,如果我从另一个 Makefile 调用此Makefile ,则由于某些复杂的依赖性问题而失败.清楚地了解嵌套调用,通过打印make[1]:等显而易见,我怀疑make是以某种方式与其子进程共享变量.

无论如何在Makefile中调用一个干净的 make?如果我的构建工作是从一个干净的shell,它应该可以从另一个Makefile调用它而不解决脚本内部的恐怖!:)

谢谢!

makefile gnu-make multiple-makefiles

7
推荐指数
1
解决办法
1万
查看次数

GNU make 3.81 - 怎么做'--output-sync = target'

最新版本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"预配方并在配方后释放它,那么构建速度可能会受到影响.

我很好修改我们的每个目标,如果这是它需要的.

c++ makefile gnu-make

7
推荐指数
1
解决办法
720
查看次数

如何为clang和gcc编写makefile?

我想std::experimental::filesystem在我的代码中使用,这要求我使用-lstdc++fsGCC和-lc++experimentalClang 进行编译。目前,我有一个makefilemakefile.clang反映了编译方面的差异,或者,我考虑过使用clang构建目标,以便可以运行build clang

有一些规范的方法可以在Makefile中设置特定于编译器的标志吗?

c++ makefile gnu-make

7
推荐指数
1
解决办法
2695
查看次数

使用 GNU-make 函数检查变量是否已定义

我正在编写一个需要定义一些环境变量的 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,并且在执行此操作时需要正确设置变量)。

makefile gnu-make

6
推荐指数
1
解决办法
6086
查看次数

如何在Makefile中创建模式规则依赖项可选?

当且仅当文件已经存在时,我想引用依赖项的时间戳.我有这样的模式规则:

%.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)

...仅适用于文件存在的情况,如果不存在则会导致错误.

dependencies makefile gnu-make

6
推荐指数
1
解决办法
1010
查看次数

我应该在哪里放置项目的 makefile?

假设项目目录下包含srcbinlibdoc等子目录,那么项目的makefile放在哪里呢?

例如,

  • 一些项目将其 makefile 放在src/项目根目录的子目录中,

  • 有些项目将其 makefile 放在项目的根目录中。

我觉得第二种方式更有逻辑性。您能否提供一些案例,说明哪些情况下最好将 makefile 放在根目录src/或其他目录中,原因是什么?

makefile gnu-make

6
推荐指数
1
解决办法
3576
查看次数

在 Makefile 目标中定义局部变量

如何在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)

makefile gnu-make

6
推荐指数
1
解决办法
1万
查看次数

cmake --build 与 make,有什么区别?

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 上执行相同的操作。

那么,我什么时候应该使用其中之一呢?

c++ macos makefile cmake gnu-make

6
推荐指数
2
解决办法
4404
查看次数