On 03/23/2012 10:10 AM, Christopher Howard wrote: > On 03/21/2012 03:39 PM, Christopher Howard wrote: >> Hi. I'm still working on learning autotools (been reading through all >> the manuals) so bear with me. There is something I've been trying to >> figure out, and I would appreciate any guidance: >> >> So, I write C code, and typically try to make it as portable as >> possible. However, I also am somewhat enthusiastic about amd64 assembly >> programming (with GAS syntax) - and so I like to optimize code for that >> architecture. >> >> What I want my configure script to do is check if I am compiling on the >> amd64 architecture, and if so: >> >> * define something appropriate in the config.h, which I can use to >> conditionally leave out the more generic C functions from source files, and >> >> * Put some extra (assembly) source files in a variable (e.g. >> amd64sort.S, amd64insert.S, amd64filter.S...) so that they can be >> appended as extra source in the Makefile. Presumably I'd have something >> like this in Makefile.am: >> >> code: >> -------- >> bin_PROGRAMS = myprogram >> myprogram_SOURCES = ${ARCH_DEPS} myprogram.c >> -------- >> >> I want to be able to have the assembly in separate source files, instead >> of inline, for maintainability reasons. >> > > Er... hello? Anybody there? Hmm... must be my anti-magnetic personality. > Sorry, but it's not unusual for a message to go unanswered for few days on this list. Sometimes also for a week or more, seldom even forever. We're all voluntaries here, so you get an answer only when we have time to think and write it. > Well, having despaired of getting outside help (if you can't get help at > the autoconf mailing list, where else do you go?) I dove back into the > problem, scouring the manuals as best I could. I was able to come up > with this solution, which seems to work: > > * I had to add AC_PROG_AS to configure.ac to get configure properly set > up to use assembly. > You mean 'AM_PROG_AS', right? If yes, that should be the correct way to proceed. > * I added the following to configure.ac to do the check, add to the > config file, and prep things for automake: > > code: > -------- > AC_CHECK_DECL([__amd64__], > [AC_DEFINE([AMD64_OPT], 1, [Define to 1 to activate amd64 optimizations]) > echo engaging amd64 optimizations > AM_CONDITIONAL([AMD64], [true])]) > -------- > Not knowing anything of assembly myself (AMD64 nor generic), I cannot say whether and how much this is correct. But if it works correctly in your use cases, chances are that it's good enough at least as a starting point; you can refine it later if the needs arise. > * I used this conditional in Makefile.am: > > code: > -------- > if AMD64 > myprogam_SOURCES = test.S myprogam.c > else > myprogam_SOURCES = myprogam.c > endif > -------- > For what concerns automake, this is the way to go. Such an idiom can work more generally as well; in case you want to provide both a version optimized for AMD64 and one optimized for SPARC of a given source file, as well as a "fallback" C implementation, you could do something like this (untested): configure.ac: ------------- dnl: warning: totally fictitious checks AC_CHECK_DECL([__amd64__], [have_amd64=yes], [have_amd64=no]) AC_CHECK_DECL([__sparc__], [have_sparc=yes], [have_sparc=no]) AM_CONDITIONAL([AMD64], [test $have_amd64 = yes]) AM_CONDITIONAL([SPARC], [test $have_sparc = yes]) AM_CONDITIONAL([ASSEMBLY], [test $have_sparc = yes || test $have_amd64 = yes]) Makefile.am: ------------ myprogam_SOURCES = main.c generic.c if ASSEMBLY if AMD64 myprog_SOURCES += func-amd64.S endif if SPARC myprog_SOURCES += func-sparc.S endif else !ASSEMBLY myprog_SOURCES += func-generic.c endif ASSEMBLY > Seems to work - not sure if it is the proper or sensible way to do it. > I'd says it is. > Not sure how portable either: I think some systems use an __AMD64__ > declaration instead of __amd64__, but I'm not sure about that. I should > perhaps be checking for either one. > I can't help you with this due to lack of knowledge on my part, sorry. > I originally tried something more like what I mentioned in my first > post, but automake died, complaining that "Configure substitutions are > not allowed in _SOURCES variables". > This is expected, as currently Automake needs to know all the possible contents of a _SOURCES variable at automake time (and AC_SUBSTs doesn't allow that, while conditionals does). Regards, Stefano _______________________________________________ Autoconf mailing list Autoconf@xxxxxxx https://lists.gnu.org/mailman/listinfo/autoconf