Как собрать AWS C ++ SDK на Solaris? - PullRequest
2 голосов
/ 29 июня 2019

Я пытаюсь собрать AWS C ++ SDK на Solaris, но не могу сделать это успешно.

Я обнаружил эту открытую проблему на странице AWS C ++ SDK, в которой говорится, что это возможно, но руководства по нему нет, и я надеюсь, что кто-то здесь может помочь.

Вот команда, которую я использую для ее построения:

$ cmake ../aws-sdk-cpp/ -DCMAKE_BUILD_TYPE=Debug -DBUILD_ONLY="s3"

Вот вывод:

-- TARGET_ARCH not specified; inferring host OS to be platform compilation target
-- Building AWS libraries as shared objects
-- Generating linux build config
-- Building project version: 1.7.134
-- Configuring done
-- Generating done
-- Build files have been written to: /workspace/dmoini/sdk_build/.deps
gmake: Warning: File 'Makefile' has modification time 267 s in the future
gmake[1]: Warning: File 'CMakeFiles/Makefile2' has modification time 267 s in the future
gmake[2]: Warning: File 'CMakeFiles/AwsCCommon.dir/progress.make' has modification time 267 s in the future
gmake[2]: warning:  Clock skew detected.  Your build may be incomplete.
gmake[2]: Warning: File 'CMakeFiles/AwsCCommon.dir/progress.make' has modification time 267 s in the future
[  4%] Performing build step for 'AwsCCommon'
[  1%] Building C object CMakeFiles/aws-c-common.dir/source/array_list.c.o
In file included from /usr/include/stdio.h:37:0,
                 from /workspace/dmoini/sdk_build/.deps/build/src/AwsCCommon/include/aws/common/common.h:22,
                 from /workspace/dmoini/sdk_build/.deps/build/src/AwsCCommon/include/aws/common/array_list.h:18,
                 from /workspace/dmoini/sdk_build/.deps/build/src/AwsCCommon/source/array_list.c:16:
/opt/gcc-5.1.0/lib/gcc/i386-pc-solaris2.11/5.1.0/include-fixed/sys/feature_tests.h:405:2: error: #error "Compiler or options invalid for pre-UNIX 03 X/Open applications        and pre-2001 POSIX applications"
 #error "Compiler or options invalid for pre-UNIX 03 X/Open applications \
  ^
gmake[5]: *** [CMakeFiles/aws-c-common.dir/build.make:63: CMakeFiles/aws-c-common.dir/source/array_list.c.o] Error 1
gmake[4]: *** [CMakeFiles/Makefile2:484: CMakeFiles/aws-c-common.dir/all] Error 2
gmake[3]: *** [Makefile:139: all] Error 2
gmake[2]: *** [CMakeFiles/AwsCCommon.dir/build.make:112: build/src/AwsCCommon-stamp/AwsCCommon-build] Error 2
gmake[1]: *** [CMakeFiles/Makefile2:68: CMakeFiles/AwsCCommon.dir/all] Error 2
gmake: *** [Makefile:84: all] Error 2
CMake Error at CMakeLists.txt:193 (message):
  Failed to build third-party libraries.

Кроме того, вот моя системная информация:

$ uname -a
SunOS bld-dmoini-01-sv4b 5.11 omnios-r151020-4151d05 i86pc i386 i86pc

Любая и вся помощь / руководство очень ценится.

1 Ответ

2 голосов
/ 29 июня 2019

Я успешно завершил компиляцию 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, который успешно завершился вне этой одной ошибки.

...