【问题标题】:Make one specific target in Makefile tree在 Makefile 树中创建一个特定的目标
【发布时间】:2015-03-14 13:51:02
【问题描述】:

我正在构建 Syslinux,并且我想要一个不同的 CC 用于一个特定的目录。我不能只用该文件的特殊参数调用make,而不是修补Makefile?我还没想好怎么做。

当我正常运行make 时,最后几行是:

make -r -C lzo SRC="/syslinux-6.03/lzo" OBJ="/syslinux-6.03/bios/lzo" \
     -f /syslinux-6.03/lzo/Makefile all
make[3]: Entering directory '/syslinux-6.03/bios/lzo'
gcc  -o prepcore prepcore.o lzo.a 

但如果我 cd 进入 bios/lzo 并运行 make prepcore,它就不起作用,可能是因为它需要父目录 Makefiles 中的一些环境。错误信息是:

make: Entering directory '/syslinux-6.03/lzo'
/syslinux-6.03/lzo/Makefile:14: /build.mk: No such file or directory
make: *** No rule to make target '/build.mk'.  Stop.
make: Leaving directory '/syslinux-6.03/lzo'

所以我的问题是,告诉 make“对于当前目录树,找到 <file> 的目标并制作它”的正确方法是什么?

【问题讨论】:

  • 您的问题的答案是,您必须找到目标的名称并将其传递给make。然后 make 将构建该目标。但是,你已经知道了,因为你描述了运行make prepcore;这里prepcore 是您要求make 构建的目标的名称。所以我不明白你的问题。
  • @MadScientist 就像我说的那样,它不起作用。它试图在没有lzo.a 的情况下进行链接,这会导致无法解析的符号。
  • 您问的是如何从命令行构建特定目标。我告诉过你你是怎么做到的。您似乎真正想知道的是,“我应该调用我的 makefile 环境中的哪个目标以使链接正常工作”,当然我们无法告诉您,因为我们没有您的 makefile,所以我们不知道存在什么目标或它们做什么。您必须查看您的 makefile 并找到正确的目标,然后运行 ​​make 并给出该目标名称。
  • syslinux makefile 需要变量SRCOBJMAKEDIR。试试make -r -C lzo SRC="/path/to/syslinux-6.03/lzo" OBJ="/path/to/syslinux-6.03/bios/lzo" MAKEDIR="/path/to/syslinux-6.03/mk" -f /path/to/syslinux-6.03/lzo/Makefile prepcore(cwd 应该是/path/to/syslinux-6.03

标签: makefile gnu-make


【解决方案1】:

这里是使用remake 的方法。您运行“remake”并在要更改的目标上设置断点。然后使用 remake 的“write”命令将运行的命令写入 shell 脚本。然后,您可以编辑该 shell 脚本以调整它运行的命令以进行您想要的更改。 shell 脚本中将包含一个更改目录命令,您可能希望将其注释掉。

这是一个例子:

$ rm job.o
$ remake -X job.o
GNU Make 4.1+dbg0.91
Built for x86_64-unknown-linux-gnu
...
-> (/src/external-vcs/github/remake/Makefile:621)
Makefile: Makefile.in config.status
remake<0> s
... # Step until job.o
remake<9> s
Must remake target 'job.o'.
Makefile:781: update target 'job.o' due to: job.c /usr/include/stdc-predef.h ...
##>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
depbase=`echo job.o | sed 's|[^/]*$|.deps/&|;s|\.o$||'`;\
gcc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -DINCLUDEDIR=\"/usr/local/include\" -DHAVE_CONFIG_H -I.    -DMAKE_MAINTAINER_MODE  -pthread -I/usr/include/guile/2.0   -Wall -Wextra -Wdeclaration-after-statement -Wshadow -Wpointer-arith -Wbad-function-cast -g -O2 -MT job.o -MD -MP -MF    $depbase.Tpo -c -o job.o job.c &&\
mv -f $depbase.Tpo $depbase.Po
##<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
++ (/src/external-vcs/github/remake/.deps/job.Po:1)
job.o
remake<10> w
File "/tmp/job.o.sh" written.
remake<11>

现在看看它写的文件:

#!/bin/bash
#/tmp/github/remake/.deps/job.Po:1
#cd /tmp/remake
depbase=`echo job.o | sed 's|[^/]*$|.deps/&|;s|\.o$||'`;\
    gcc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -DINCLUDEDIR=\"/usr/local/include\" -DHAVE_CONFIG_H -I.    -DMAKE_MAINTAINER_MODE  -pthread -I/usr/include/guile/2.0   -Wall -Wextra -Wdeclaration-after-statement -Wshadow -Wpointer-arith -Wbad-function-cast -g -O2 -MT job.o -MD -MP -MF $depbase.Tpo -c -o job.o job.c &&\
mv -f $depbase.Tpo $depbase.Po

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    相关资源
    最近更新 更多