Я успешно завершил компиляцию AWS C ++ SDK в стандартной установке Solaris 11.4 и обнаружил несколько проблем, которые могут вызвать указанные проблемы.
Начните с чистого дерева исходных текстов.
Удалить -Werror
Первое, что нужно сделать, это удалить параметры компилятора -Werror
.Версия OpenSSL, установленная по умолчанию в Solaris 11.4, имеет несколько устаревших функций, а опция -Werror
приводит к сбою сборки, когда он сталкивается с этими устаревшими версиями.Я использовал эту команду find
, запускаемую из верхнего каталога дерева исходных текстов AWS SDK, чтобы удалить все параметры -Werror
:
vi `find . | xargs grep -l Werror`
Вы получите около трех или четырех файлов, только два из которыхфактически устанавливают -Werror
в качестве опции компилятора.Просто удалите строки "-Werror"
из этих файлов.
Исправьте, что POSIX определяет
Затем запустите cmake .
в верхнем каталоге.Это не удастся, потому что загружаемые файлы cmake будут иметь неправильные параметры командной строки POSIX - -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=500
.Это 500
неправильно._POSIX_C_SOURCE=200809L
соответствует _XOPEN_SOURCE=700
._XOPEN_SOURCE=500
- SUSv2, около 1997 .Неправильно компилировать приложение SUSv2 с C99.
Per 2.2.1 Строго соответствующее приложение POSIX , параграф 8 :
Для языка программирования C следует определить _POSIX_C_SOURCE
как 200809L
до включения любого заголовка
и 2.2.4 Строго соответствующее приложение XSI, пункт 8 :
Для языка программирования C следует определить _XOPEN_SOURCE
равным 700
до включения любого заголовка
Per Illumos sys/feature_tests.h
file (основанный на OpenSolaris, который был также основой для Solaris 11):
* Feature Test Macro Specification
* ------------------------------------------------ -------------
* _XOPEN_SOURCE XPG3
* _XOPEN_SOURCE && _XOPEN_VERSION = 4 XPG4
* _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED = 1 XPG4v2
* _XOPEN_SOURCE = 500 XPG5
* _XOPEN_SOURCE = 600 (or POSIX_C_SOURCE=200112L) XPG6
* _XOPEN_SOURCE = 700 (or POSIX_C_SOURCE=200809L) XPG7
Файлы cmake
, загружаемые через git
, должны быть отредактированы:
vi `find .deps | xargs grep -l XOPEN_SOURCE`
Изменить любое -D_XOPEN_SOURCE=500
до -D_XOPEN_SOURCE=700
и повторите cmake .
.На этот раз он должен успешно завершиться.
Затем запустите gmake
.(Я считаю, что gmake
намного лучше работает в Solaris практически для всех проектов с открытым исходным кодом, поскольку многие проекты с открытым исходным кодом используют специфичные для GNU расширения make
.)
Теперь вы можете исправить любой испорченный исходный код, который вынаткнуться на.
Исправить испорченный исходный код
1
Файл aws-sdk-cpp/aws-cpp-sdk-core/source/platform/linux-shared/OSVersionInfo.cpp
имеетследующий неправильный код:
Aws::String ComputeOSVersionString()
{
utsname name;
int32_t success = uname(&name);
для POSIX , правильный тип struct utsname
, а не просто utsname
:
int uname(struct utsname *name);
Код AWS требуетсябыть:
Aws::String ComputeOSVersionString()
{
struct utsname name;
int success = uname(&name);
И нет, я, безусловно, не впечатлен качеством кода AWS, учитывая, что это, хм, хохот :
while (!feof(outputStream))
Да, фактический while (!feof())
цикл ...
2
Файл aws-sdk-cpp / aws-cpp-sdk-mediaconvert/include/aws/mediaconvert/model/M2tsSegmentationMarkers.h использует перечисление со значением EBP
, которое конфликтует с регистром EBP
#define
в /usr/include/sys/regset.h
.
Я просто изменил его на EBP_HASH
, как кажетсянесколько сопоставьте код:
vi `find . | xargs grep -l EBP`
3
Файл aws-sdk-cpp / aws-cpp-sdk-route53domains / include / aws /route53domains / model / CountryCode.h создает значение перечисления ES
, которое конфликтует с регистром ES
#define
в /usr/include/sys/regset.h
.Я просто добавил
#ifdef ES
#undef ES
#endif
и компиляция продолжилась.Я не знаю, могло ли это #undef
что-нибудь сломать.
4
Файл aws-sdk-cpp / aws-cpp-sdk-waf / include / aws / waf / model / GeoMatchConstraintValue.h имеет значение перечисления ES
, GS
и SS
, которое конфликтует с ES
, GS
и SS
зарегистрируйтесь #define
в /usr/include/sys/regset.h
.
Опять же, я просто добавил еще несколько #undef
:
#ifdef ES
#undef ES
#endif
#ifdef GS
#undef GS
#endif
#ifdef SS
#undef SS
#endif
Мне действительно интересно, почемуsys/regset.h
означает #include
почти во всем в AWS SDK.
5
Та же проблема в aws-sdk-cpp / aws-cpp-sdk-waf-регион / include / aws / waf-регион / модель / GeoMatchConstraintValue.h . То же исправление, добавьте:
#ifdef ES
#undef ES
#endif
#ifdef GS
#undef GS
#endif
#ifdef SS
#undef SS
#endif
Обратите внимание, что компиляция на оборудовании SPARC означает, что значение #define
из sys/regset.h
будет совершенно другим, а любые ошибки будут совершенно другими.
6
Файл aws-sdk-cpp / aws-cpp-sdk-core-tests / utils / FileSystemUtilsTest.cpp неверно предполагает, что значение POSIX NAME_MAX
определено. В соответствии с значениями переменной пути POSIX стандарт (шахтный шрифт):
Значения переменных пути
Значения в следующем списке могут быть константами в пределах
реализации или может варьироваться от одного пути к другому. Например,
Файловые системы или каталоги могут иметь разные характеристики.
Определение одной из символических констант в следующем списке
должен быть пропущен из заголовка <limits.h>
на определенных
реализации, где соответствующее значение равно или больше
чем установленный минимум, но где значение может варьироваться в зависимости от
файл, к которому он применяется. Фактическое значение, поддерживаемое для конкретного
путь должен предоставляться функцией pathconf()
.
Опять же: "определение ... должно быть опущено ... где значение может варьироваться".
Код AWS ошибочно предполагает, что NAME_MAX
должен быть #define
'd.
Я просто жестко закодировал значение 255
, чтобы обойти эту точку, хотя лучше использовать что-то вроде _POSIX_NAME_MAX
или _XOPEN_NAME_MAX
.
7
Файл aws-sdk-cpp / ws-cpp-sdk-core-tests / http / HttpClientTest.cpp , по-видимому, неправильно, предполагая, что std::shared_ptr
будет 8 байтов. Этот вопрос и ответ дает хороший пример того, как это неправильно.
Я просто проигнорировал эту ошибку, так как это всего лишь тест, и продолжил с gmake -i
, который успешно завершился вне этой одной ошибки.