【问题标题】:compile specific source file in Linux coreutils package在 Linux coreutils 包中编译特定的源文件
【发布时间】:2014-03-27 03:15:53
【问题描述】:

我需要从 Linux coreutils 源文件编译特定版本的 cp(复制)和 mv(移动)实用程序。而不是编译整个包:

./configure
make

这需要很长时间,我怎样才能只编译 cp (./src/cp.c) 和 mv (./src/mv.c)?

我试图删除不相关的 c 文件,但 cp.c 和 mv.c 有太多依赖项无法跟踪...我意识到这是简化问题的愚蠢方法。一定有一个单行代码或什么东西告诉 make 或 gcc 只编译 cp 和 mv!

使用的示例源代码:http://ftp.gnu.org/gnu/coreutils/coreutils-8.21.tar.xz

提前致谢!

【问题讨论】:

  • cp.c and mv.c have too many dependencies 那么你怎么能只编译`cp(./src/cp.c)和mv(./src/mv.c)`?
  • 我的意思是只编译最小/基本文件以生成 cp 和 mv。
  • 好的,没错,但您还必须编译相关文件。并禁用来自 makefile 的不需要的构建。

标签: c linux gcc compilation makefile


【解决方案1】:

在运行 configure 之后运行 make src/cp src/mv 应该可以工作,但是 coreutils 构建系统没有正确设置依赖项。 cpmv 依赖于生成的源文件,这些文件不被 Makefile 跟踪。但是,您需要的生成文件是在默认 make all 的开头创建的,因此您可以开始完整构建,并在它超过 GEN 行后立即将其终止:

$ ./configure
...
$ make
  GEN    lib/alloca.h
  GEN    lib/c++defs.h
  ...
  GEN    src/version.c
  GEN    src/version.h
make  all-recursive
make[1]: Entering directory `/home/andrew/coreutils-8.21'
Making all in po
make[2]: Entering directory `/home/andrew/coreutils-8.21/po'
make[2]: Leaving directory `/home/andrew/coreutils-8.21/po'
Making all in .
make[2]: Entering directory `/home/andrew/coreutils-8.21'
  CC     lib/set-mode-acl.o
  CC     lib/copy-acl.o
^C
make[2]: *** wait: No child processes.  Stop.
make[2]: *** Waiting for unfinished jobs....
make[2]: *** wait: No child processes.  Stop.
make[1]: *** wait: No child processes.  Stop.
make[1]: *** Waiting for unfinished jobs....
make[1]: *** wait: No child processes.  Stop.
make: *** wait: No child processes.  Stop.
make: *** Waiting for unfinished jobs....
make: *** wait: No child processes.  Stop.

然后运行make src/cp src/mv 来构建你需要的程序:

$ make src/cp src/mv
  CC     src/cp.o
  CC     src/copy.o
  CC     src/cp-hash.o
  CC     src/extent-scan.o
  CC     src/version.o
  AR     src/libver.a
  CC     lib/argmatch.o
  CC     lib/argv-iter.o
  CC     lib/backupfile.o
  ... 230 other files ...
  CC     lib/vasprintf.o
  CC     lib/vfprintf.o
  CC     lib/vprintf.o
  AR     lib/libcoreutils.a
  CCLD   src/cp
  CC     src/mv.o
  CC     src/remove.o
  CCLD   src/mv
$ src/cp --version
cp (GNU coreutils) 8.21
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Torbjörn Granlund, David MacKenzie, and Jim Meyering.

【讨论】:

  • 哇!非常感谢您的解决方案并节省了我很多时间!
【解决方案2】:

您需要深入了解在 ./configure 之后创建的 make 文件。尝试找出与您的源代码构建过程相关的 make 命令。

【讨论】:

    【解决方案3】:

    我相信禁用你不想要或不需要的功能(例如支持 Native Language Support),只包含绝对必要的模块(例如 gnulib),然后构建整个项目仍然是最快和最简单的方法得到你需要的东西。

    【讨论】:

      【解决方案4】:

      coreutils 只需要很短的时间来编译。 请注意,它很好地支持并行编译,因此请在 make 中添加 -j $(nproc) 选项。

      最大的时间部分是由于配置是强制性的。

      因此 coreutils 最初使用 BUILT_SOURCES 生成构建中所需的一些源。 自动制作手册说

      "you cannot use BUILT_SOURCES if the ability to run ‘make foo’ on a clean tree is important to you."
      

      鉴于构建时间相对较短,并且 从干净的树进行部分构建的不寻常用例, coreutils 项目避免手动指定所有依赖项, 而是使用如上所述的 BUILT_SOURCES

      【讨论】:

      • 感谢您的洞察力。下次我一定会尝试并行编译! :-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-17
      • 1970-01-01
      相关资源
      最近更新 更多