Поручить Automake использовать компилятор С++ для файлов *.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 источник


Ответы (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 называет их "суффиксными правилами"), включая тот факт, что они не могут иметь никаких зависимостей (иначе они считаются нормальными target) и тот факт, что ваши суффиксы должны быть предопределены.

Реализации make, которые я использовал, имеют набор правил по умолчанию для C++, а иногда даже дополнительные расширения для определенных функций, специфичных для реализации, таких как компиляция кода на ассемблере, в дополнение к правила по умолчанию, предписанные POSIX.

В любом случае, не объединяйте их, иначе вы можете перепутать свою make утилиту, не говоря уже о себе.

person Community    schedule 29.07.2018