将Autotools用于具有特定于平台的源代码的项目

Bor*_*bus 6 c assembly automake autoconf autotools

我正在开发一个目前用C语言编写的项目,但我计划在ASM中为至少两个平台(x86_64和arm)编写一些函数.所以我可能有一些源文件:

  • 通用/ one.c
  • 通用/ two.c
  • 通用/ three.c
  • ARM/one.s
  • x86_64的/ two.s

我喜欢它,以便配置脚本在可能的情况下选择.s文件.c文件.所以建立在arm上将是one.s,two.c,three.c等.

使用Automake很难或不可能做到这一点.但如果我放弃Automake,我将不得不追踪自己的依赖(呃).

最好的方法是什么?

Jac*_*lly 2

automake 手册的条件源部分应该为您指明正确的方向。你会想要AC_CANONICAL_HOST加入configure.ac,然后根据 的价值做出决定$host

automake如果两个文件可以编译为同一个对象,我不会喜欢它。如果您无法像手册的链接部分中那样重命名源,您可能需要尝试类似的操作(确保您subdir-objectsAM_INIT_AUTOMAKE

# Note the $() isn't a shell command substitution.
# The quoting means it'll be expanded by `make'.
MODULE_ONE_OBJ='generic/one.$(OBJEXT)'
MODULE_TWO_OBJ='generic/two.$(OBJEXT)'
case $host in
  # ...
  arm*)
    MODULE_ONE='arm/one.$(OBJEXT)'
    ;;
  x86_64)
    MODULE_TWO='x86/two.$(OBJEXT)'
    ;;
esac
AC_SUBST([MODULE_ONE])
AC_SUBST([MODULE_TWO])
Run Code Online (Sandbox Code Playgroud)

Makefile.am

bin_PROGRAMS = foo
foo_SOURCES = foo.c
EXTRA_foo_SOURCES = arm/one.s x86/two.c
foo_LDADD = $(MODULE_ONE) $(MODULE_TWO)
foo_DEPENDENCIES = $(MODULE_ONE) $(MODULE_TWO)
Run Code Online (Sandbox Code Playgroud)

  • 我已经弄清楚如何在configure.ac中执行此操作,问题是即使您在Makefile.am中有条件地将one.c和one.s添加到build_SOURCES,automake也会抱怨它们都生成one.o。 (2认同)