2013-03-13 4 views
5

Sto sviluppando un progetto che è attualmente scritto in C ma ho intenzione di scrivere alcune delle funzioni in asm per almeno due piattaforme (x86_64 e arm) . Così potrei avere qualche file di origine:Utilizzo degli autotools per un progetto con codice sorgente specifico della piattaforma (più piattaforme)

generico/one.c generico/two.c generico/three.c

braccio/one.s

x86_64/two.s

Mi piacerebbe che lo script di configurazione scelga i file .s sui file .c quando possibile. Quindi la costruzione sul braccio sarà one.s, two.c, three.c ecc.

Sembra difficile o impossibile farlo bene con automake. Ma se dovessi abbandonare l'automake dovrò tenere traccia delle mie dipendenze (ugh).

Qual è il modo migliore per farlo?

+1

"Ma se fosso automake dovrò monitorare le mie dipendenze (ugh)." questa è una falsa dicotomia! Non dimenticare di strumenti come CMake. Infatti, ecco una [grande lista] (https://en.wikipedia.org/wiki/List_of_build_automation_software#Build_script_generation_tools) – congusbongus

risposta

2

La sezione Conditional Sources del manuale di automake dovrebbe indirizzarti nella giusta direzione. Stai per volere AC_CANONICAL_HOST in configure.ac e quindi prendere le decisioni in base al valore di $host.

automake non mi piace se due file possono essere compilati sullo stesso oggetto. Se non è possibile rinominare i sorgenti come nella parte legata del manuale, si consiglia di provare qualcosa di simile (assicuratevi di avere subdir-objects in 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]) 

In 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) 
+2

Avevo già capito come fare quel bit in configure.ac, il problema è che anche se si aggiunge one.c e one.s per build_SOURCES condizionalmente in Makefile.am, automake si lamenterà che entrambi generano one.o. – Borbus

2

È possibile utilizzare AC_CANONICAL_HOST e quindi condizionato selezionare la sottodirectory corretta Ad esempio, in configure.ac:.

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

e poi in Makefile.am:

SUBDIRS = $(USE_DIR) common 

e in common/Makefile.am:

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

e in ogni ${host_cpu}/Makefile.am:

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

Questo utilizza un leggermente diversa struttura di directory che si descrive. I file C utilizzati su tutte le piattaforme andrebbero in common e saranno collegati a una libreria di convenienza costruita nella directory specifica della piattaforma. Se alcuni file c sono utilizzati solo su alcune piattaforme, puoi metterli in comune e farli riferimento esplicitamente nel Makefile.am per le piattaforme che ne hanno bisogno.

+1

Sta andando a interrompere 'make dist'? –

+0

Dovrebbe essere $ host_cpu non $ target_cpu ma qualcosa del genere potrebbe funzionare. L'obiettivo è per cose come compilatori che possono essere configurati per essere compilati per compilare per altre piattaforme (cross-compiler). Ho già pensato a qualcosa di simile, ma ho avuto di nuovo problemi. – Borbus

+1

Inoltre: 'AC_CANONICAL_TARGET' non è quello che vuoi. '--target' serve per impostare l'architettura di destinazione dei compilatori. '--host' è la macchina che esegue i binari compilati. –

2

Ecco cosa faccio.

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.Sono

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 
Problemi correlati