2013-03-13 12 views
5

के साथ एक प्रोजेक्ट के लिए ऑटोोटूल का उपयोग करना मैं वर्तमान में सी में लिखा गया एक प्रोजेक्ट विकसित कर रहा हूं लेकिन मैं कम से कम दो प्लेटफ़ॉर्म (x86_64 और arm) के लिए एएसएम में कुछ फ़ंक्शन लिखने की योजना बना रहा हूं। । तो मैं कुछ स्रोत फ़ाइलें हो सकता है:प्लेटफ़ॉर्म विशिष्ट स्रोत कोड (एकाधिक प्लेटफ़ॉर्म)

सामान्य/one.c सामान्य/two.c सामान्य/three.c

बांह/one.s

x86_64/two.s

मुझे यह पसंद है कि कॉन्फ़िगर स्क्रिप्ट .c फ़ाइलों पर .s फ़ाइलों को जब संभव हो। तो हाथ पर निर्माण एक.s, दो.c, तीन.c आदि होगा

ऑटोकेक के साथ यह अच्छी तरह से करना मुश्किल या असंभव लगता है। लेकिन अगर मैं automake ditch अगर मुझे अपनी निर्भरताओं (यूघ) को ट्रैक करना होगा।

ऐसा करने का सबसे अच्छा तरीका क्या है?

+1

"लेकिन अगर मैं automake खाई मैं अपने ही निर्भरता (ओह) ट्रैक करने के लिए होगा।" यह एक झूठी dichotomy है! सीएमके जैसे टूल्स के बारे में मत भूलना। वास्तव में, यहां एक [बड़ी सूची] है (https://en.wikipedia.org/wiki/List_of_build_automation_software#Build_script_generation_tools) – congusbongus

उत्तर

2

Conditional Sources ऑटोमेक मैनुअल के अनुभाग आपको सही दिशा में इंगित करना चाहिए। आप AC_CANONICAL_HOSTconfigure.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]) 

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

मुझे पहले ही पता चला था कि config.ac में उस बिट को कैसे करना है, समस्या यह है कि यदि आप जोड़ते हैं Make.cileCam में सशर्त रूप से build_SOURCES बनाने के लिए एक.c और one.s, automake शिकायत करेगा कि वे दोनों एक .o उत्पन्न करते हैं। – Borbus

2

आप configure.ac में AC_CANONICAL_HOST उपयोग कर सकते हैं और उसके बाद सशर्त सही उपनिर्देशिका चयन उदाहरण के लिए,:।

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 

यह एक अलग निर्देशिका संरचना की तुलना में आप का वर्णन का उपयोग करता है। सभी प्लेटफॉर्म पर उपयोग की जाने वाली सी फाइलें common में जाएंगी और प्लेटफ़ॉर्म विशिष्ट निर्देशिका में निर्मित सुविधा लाइब्रेरी से लिंक होंगी। अगर कुछ सी फाइलों का उपयोग केवल कुछ प्लेटफार्मों पर किया जाता है, तो आप उन प्लेटफ़ॉर्म के लिए मेकफ़ाइल.एम में स्पष्ट रूप से उन्हें संदर्भित कर सकते हैं और उन्हें संदर्भित कर सकते हैं।

+1

क्या यह 'डिस्ट डिस्ट' तोड़ने जा रहा है? –

+0

यह $ host_cpu $ target_cpu नहीं होना चाहिए लेकिन ऐसा कुछ काम कर सकता है। लक्ष्य कंपेलरों जैसी चीजों के लिए है जिसे अन्य प्लेटफ़ॉर्म (क्रॉस-कंपाइलर) के लिए संकलित करने के लिए कॉन्फ़िगर किया जा सकता है। मैंने पहले से ही कुछ इसी तरह के बारे में सोचा था लेकिन फिर से मुसीबत में भाग गया। – Borbus

+1

इसके अलावा: 'AC_CANONICAL_TARGET' वह नहीं है जो आप चाहते हैं। '- लक्ष्य' कंपाइलरों के लक्ष्य आर्किटेक्चर को स्थापित करने के लिए है। '--होस्ट' वह मशीन है जो निर्मित बाइनरी चलाती है। –

2

यहां मैं क्या करता हूं।

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।हूँ

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 
संबंधित मुद्दे