Компиляция ANTLR 3C для AIX

Я не слишком знаком с компиляцией для C, поэтому, если я не даю достаточно информации, дайте мне знать, что вам нужно, чтобы я опубликовал!

Вот резюме: мне нужно запустить ANTLR на целевом языке C на несколько старом компьютере IBM AIX. Я быстро отказался от компиляции с помощью утилит IBM CC/make и установил на машину версию gcc (4.2) и GNU make. Проблема в том, что хотя скрипт configure определяет правильную архитектуру, похоже, он не отвечает должным образом.

Конкретная версия ANTLR, которую я использую, — это версия 3.2, цель C. Фактическая обнаруженная цель: powerpc-ibm-aix-5.3.0.0.

Вот что я сделал. Первая вопиющая ошибка, которую я вижу, заключается в том, что он добавил к параметрам флаг «-m32». Хорошо, я могу достаточно просто удалить это из make-файла, и в этом случае gcc по умолчанию должен иметь значение -maix32.

Вторая проблема: я получаю сообщение об ошибке, указывающее мне путь к stdio.h и говорящее «ошибка: дубликат« неподписанный »». Итак, configure сделал оператор «define» в автоматически сгенерированном файле antlr3config.h... Я могу это прокомментировать, и ошибка исчезнет.

Третий вопрос... здесь я застрял.

/opt/freeware/bin/make  all-am
make[1]: Entering directory `/scrubber/libantlr3c-3.2'
if /bin/sh ./libtool --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -I. -I. -Iinclude    -O2  -Wall -MT antlr3baserecognizer.lo -MD -MP -MF ".deps/antlr3baserecognizer.Tpo" -c -o antlr3baserecognizer.lo `test -f 'src/antlr3baserecognizer.c' || echo './'`src/antlr3baserecognizer.c; \
then mv -f ".deps/antlr3baserecognizer.Tpo" ".deps/antlr3baserecognizer.Plo"; else rm -f ".deps/antlr3baserecognizer.Tpo"; exit 1; fi
gcc -DHAVE_CONFIG_H -I. -I. -I. -Iinclude -O2 -Wall -MT antlr3baserecognizer.lo -MD -MP -MF .deps/antlr3baserecognizer.Tpo -c src/antlr3baserecognizer.c -o antlr3baserecognizer.o
In file included from include/antlr3baserecognizer.h:39,
             from src/antlr3baserecognizer.c:9:
include/antlr3defs.h:343: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'ANTLR3_SALENT'
make[1]: *** [antlr3baserecognizer.lo] Error 1
make[1]: Leaving directory `/scrubber/libantlr3c-3.2'
make: *** [all] Error 2

Вот ссылка на конкретный файл antlr3defs.c, включенный в библиотеку ANTLR: https://docs.google.com/file/d/0B9XS1f8YfyB4cFJRZTdWM1pMWWs/edit?usp=sharing

О, и я могу скомпилировать его на других платформах, таких как Ubuntu или Cygwin (хотя я не могу использовать их для этой задачи). Хотя я не совсем знаком с AIX и имею ограниченный опыт компиляции программ на C. Возможно, мне нужно установить некоторые вещи с помощью скрипта конфигурации?

Спасибо!

РЕДАКТИРОВАТЬ: Достигнут прогресс, поэтому обновите этот пост, чтобы сохранить информацию вместе.

Я смог устранить указанную выше ошибку, добавив параметр --disable-abiflags при запуске сценария настройки... этот параметр удаляет флаги -m32 и -m64 gcc. Это позволяло скрипту configure работать корректно, но приводило ассемблер в замешательство при запуске make. Чтобы дать ему руководство, я добавил флаг -Wa,-a32 в CFLAFS в Makefile, тем самым сообщив ассемблеру, что мне нужна 32-битная версия.

Оставалась только одна проблема.

ar cru .libs/libantlr3c.a  antlr3baserecognizer.o antlr3basetree.o antlr3basetreeadaptor.o antlr3bitset.o antlr3collections.o antlr3commontoken.o antlr3commontree.o antlr3commontreeadaptor.o antlr3commontreenodestream.o antlr3convertutf.o antlr3cyclicdfa.o antlr3debughandlers.o antlr3encodings.o antlr3exception.o antlr3filestream.o antlr3inputstream.o antlr3intstream.o antlr3lexer.o antlr3parser.o antlr3rewritestreams.o antlr3string.o antlr3stringstream.o antlr3tokenstream.o antlr3treeparser.o antlr3ucs2inputstream.o
ar: 0707-128 The OBJECT_MODE environment variable has an invalid setting.
    OBJECT_MODE must be 32, 64, 32_64, d64 or any.
make[1]: *** [libantlr3c.la] Error 1

Проблема в том, что не имеет значения, что я устанавливаю. Я попытался запустить make, не установив его, а затем использовал экспорт, чтобы установить его:

export OBJECT_MODE=32

Я могу ввести echo $OBJECT_MODE, и он действительно выведет 32... но, похоже, он не обнаружит его при запуске make.

Я смог обойти это, отредактировав скрипт «libtool», добавив «-X 32» к параметрам ar, чтобы переопределить все, что он читал. Долгосрочным решением, вероятно, будет ltmain.sh и повторный запуск configure.


person shaddow    schedule 08.04.2013    source источник


Ответы (1)


Это строка, о которой идет речь:

typedef socklen_t ANTLR3_SALENT;

поскольку socklen_t не определено, вы не можете typedef это, в том числе socket.h следует это исправить

#include <sys/socket.h>

Изменить: после повторного просмотра файла следует включить socket.h, если вы запустите скрипт настройки.

#ifdef HAVE_SOCKET_H
# include   <socket.h>
#else
# if HAVE_SYS_SOCKET_H
#  include  <sys/socket.h>
# endif
#endif
person iabdalkader    schedule 08.04.2013
comment
Это заставило меня задуматься. Конечно, многое из этого действительно терпит неудачу. Он просто говорит «нет», когда вы запускаете скрипт для разных тестов, но журнал делает это намного яснее. Оказывается, скрипт configure часто запускает gcc... проблема в том, что он включает флаг -m32, которого, по-видимому, нет в gcc для машин AIX :( Нужно ли мне создавать собственный скрипт configure? Я никогда не использовал autoconf. Я МОГУ найти/заменить -m32, но это кажется хакерским. - person shaddow; 09.04.2013
comment
@shaddow попробуйте заново сгенерировать скрипт configure, запустите autoconf - person iabdalkader; 09.04.2013
comment
Я смог использовать параметр настройки, чтобы обойти это (я обновил исходный вопрос). Было бы сложно перенастроить сценарий, так как autoconf не установлен на машине, с которой я работаю. Я могу скомпилировать сейчас, хотя. Спасибо!! - person shaddow; 09.04.2013