7

私は現在 C で書かれたプロジェクトを開発していますが、少なくとも 2 つのプラットフォーム (x86_64 と arm) 用の ASM でいくつかの関数を書く予定です。だから私はいくつかのソースファイルを持っているかもしれません:

  • ジェネリック/one.c
  • ジェネリック/two.c
  • ジェネリック/three.c
  • アーム/one.s
  • x86_64/two.s

可能であれば、configure スクリプトが .c ファイルよりも .s ファイルを選択するようにしたいと思います。したがって、腕に構築すると、one.s、two.c、three.c などになります。

Automake でこれをうまく行うのは難しいか不可能に思えます。しかし、Automake をやめたら、自分の依存関係を追跡する必要があります (うーん)。

これを行う最善の方法は何ですか?

4

3 に答える 3

3

これが私がすることです。

configure.ac

...
AC_CANONICAL_SYSTEM
AM_PROG_AS
AC_PROG_CC
...
PROC=""
AS_CASE([$host_cpu], [x86_64], [PROC="x86_64"], [arm*], [PROC="arm"])

AM_CONDITIONAL([CPU_X86_64], [test "$PROC" = "x86_64"])
AM_CONDITIONAL([CPU_ARM], [test "$PROC" = "arm"])
AM_CONDITIONAL([CPU_UNDEFINED], [test "x$PROC" = "x"])

Makefile.am

lib_LTLIBRARIES = libfoo.la
libfoo_la_SOURCES = \
$(top_srcdir)/generic/three.c

if CPU_ARM
libfoo_la_SOURCES += $(top_srcdir)/arm/one.s \
$(top_srcdir)/generic/two.c
endif

if CPU_X86_64
libfoo_la_SOURCES += $(top_srcdir)/generic/one.c \
$(top_srcdir)/x86_64/two.s
endif

if CPU_UNDEFINED
libfoo_la_SOURCES += $(top_srcdir)/generic/one.c \
$(top_srcdir)/generic/two.c
endif
于 2013-03-14T17:55:53.670 に答える
2

automake マニュアルのConditional Sourcesセクションは、正しい方向を示しているはずです。の値に基づいて決定をAC_CANONICAL_HOST下します。configure.ac$host

automake2 つのファイルが同じオブジェクトにコンパイルできる場合は好ましくありません。マニュアルのリンク部分のようにソースの名前を変更できない場合は、次のようなことを試してみてください (次のファイルがあることを確認してsubdir-objectsくださいAM_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])

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)
于 2013-03-14T01:13:46.173 に答える
2

AC_CANONICAL_HOST を使用して、条件付きで正しいサブディレクトリを選択できます。たとえば、configure.ac次のようになります。

AC_CANONICAL_HOST
AC_SUBST([USE_DIR],[$host_cpu])
test -d $srcdir/$USE_DIR || USE_DIR=generic

そして次にMakefile.am

SUBDIRS = $(USE_DIR) common

とでcommon/Makefile.am

LDADD = ../$(USE_DIR)/libfoo.a

そしてそれぞれで${host_cpu}/Makefile.am

noinst_LIBRARIES = libfoo.a
libfoo_a_SOURCES = one.s ../common/two.c

これは、説明したものとはわずかに異なるディレクトリ構造を使用しています。すべてのプラットフォームで使用される C ファイルはcommon、プラットフォーム固有のディレクトリに構築された便利なライブラリに入り、リンクされます。いくつかの c ファイルが一部のプラットフォームでのみ使用される場合、それらを共通に配置し、それらを必要とするプラットフォームの Makefile.am で明示的に参照できます。

于 2013-03-14T08:49:29.080 に答える