Инструктирайте Automake да използва C++ компилатор за *.S файлове?

Имаме C++ проект. Трябва да сглобим *.S файл чрез компилатора. В нашия GNUmakefile използваме:

# ARM asm implementation.
aes-armv4.o : aes-armv4.S
    $(CXX) $(CXXFLAGS) $(AES_FLAGS) -mfloat-abi=$(FP_ABI) -c $<

Имаме следното в нашия Makefile.am, който зависи от AC_SUBST([AES_FLAGS], [-march=armv7-a -Wa,--noexecstack]) в configure.ac:

libaes_armv4_la_SOURCES = aes-armv4.S
libaes_armv4_la_CXXFLAGS = $(AM_CXXFLAGS) $(AES_FLAGS)

Полученият Makefile обаче използва компилатора C и не успява да използва флаговете, които сме задали за изходния файл:

make[1]: Entering directory '/home/build/cryptopp'
/bin/bash ./libtool --mode=compile gcc -DHAVE_CONFIG_H -I. -g -O2 -MT aes-armv4.lo -MD -MP -MF .deps/aes-armv4.Tpo -c -o aes-armv4.lo aes-armv4.S
libtool: compile: gcc -DHAVE_CONFIG_H -I. -g -O2 -MT aes-armv4.lo -MD -MP -MF .deps/aes-armv4.Tpo -c aes-armv4.S -fPIC -DPIC -o .libs/aes-armv4.o
libtool: compile: gcc -DHAVE_CONFIG_H -I. -g -O2 -MT aes-armv4.lo -MD -MP -MF .deps/aes-armv4.Tpo -c aes-armv4.S -o aes-armv4.o >/dev/null 2>&1
mv -f .deps/aes-armv4.Tpo .deps/aes-armv4.Plo

AES_FLAGS осигурява -march=armv7-a -Wa,--noexecstack. -march=armv7-a повишава производителността поради неподравнени товари, а -Wa,--noexecstack е изискване за сигурност.

Ръководството не посочва как да кажете на Autotools да използва C++ компилатора в този случай. Вижте също 8.9 C++ поддръжка.

Как да кажа на Automake да използва C++ компилатора и флаговете за изходния файл?


Нашият configure.ac има следното. Липсва препратка към C компилатора и никога не засяга AC_PROG_CC, CFLAGS или AM_CFLAGS, защото ние сме C++ проект:

AC_PROG_CXX
AC_LANG([C++])

...
AC_SUBST([AES_FLAGS], [-march=armv7-a -Wa,--noexecstack])

person jww    schedule 28.07.2018    source източник
comment
gnu.org/software/automake/manual/html_node/   -  person Sam Varshavchik    schedule 29.07.2018


Отговори (2)


automake използва макроса CCAS, за да укаже кой компилатор да стартира, като използва CCASFLAGS и AM_CCASFLAGS, за да укаже всякакви персонализирани опции за компилиране.

Повече информация

person Sam Varshavchik    schedule 29.07.2018

# Old-style (but portable) inference rules for assembler and C++
.SUFFIXES:
.SUFFIXES: .s .S .sx .o .cpp .cc .C .cxx .c++ .cp

.S.o:
    $(CXX) $(CXXFLAGS) $(AES_FLAGS) -mfloat-abi=$(FP_ABI) -c $<

######## OR ########

# GNU make pattern rule syntax
%.o: %.S
    $(CXX) $(CXXFLAGS) $(AES_FLAGS) -mfloat-abi=$(FP_ABI) -c $<

Ако използвате GNU make, тогава няма значение кой ще изберете, но трябва да сте наясно с използването и ограниченията на правилата за извод на POSIX (GNU make ги нарича "suffix rules"), включително факта, че не могат да имат никакви зависимости (в противен случай се считат за нормални цели) и факта, че вашите суфикси трябва да бъдат предварително дефинирани.

Имплементациите make, които съм използвал, имат набор от правила по подразбиране за C++ и понякога дори допълнителни разширения за определени специфични за изпълнението функции, като например компилиране в код на асемблер, в допълнение към правилата по подразбиране, предписани от POSIX.

Така или иначе, не ги комбинирайте, или можете да объркате вашата make помощна програма, да не говорим за себе си.

person Community    schedule 29.07.2018