如何在Solaris上构建AWS C ++ SDK?

时间:2019-06-28 21:49:05

标签: amazon-s3 aws-sdk solaris

我正在尝试在Solaris上构建AWS C ++ SDK,但无法成功完成。

我在AWS C ++ SDK页面上发现this个未解决的问题,它说有可能,但是没有任何指导,希望这里的人能为您提供帮助。

这是我用来构建它的命令:

$ 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 个答案:

答案 0 :(得分:2)

我已经在Solaris 11.4的库存安装上成功完成了AWS C ++ SDK的编译,并发现了可能导致上述问题的几个问题。

从干净的源代码树开始。

删除-Werror

要做的第一件事是删除-Werror编译器选项。默认情况下,Solaris 11.4上安装的OpenSSL版本具有许多不赞成使用的功能,并且-Werror选项会导致在遇到不赞成使用的版本时使构建失败。我使用了从AWS开发工具包源树的最顶层目录运行的find命令来删除所有-Werror选项:

vi `find . | xargs grep -l Werror`

您将获得大约三个或四个文件,其中只有两个实际上将-Werror设置为编译器选项。只需从这些文件中删除"-Werror"字符串即可。

修复POSIX定义

然后在最顶层的目录中运行cmake .。它将失败,因为它下载的cmake文件将具有不正确的POSIX命令行选项--D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=500500是错误的。 _POSIX_C_SOURCE=200809L对应于_XOPEN_SOURCE=700_XOPEN_SOURCE=500SUSv2, circa 1997。用C99编译SUSv2应用程序是不合适的。

2.2.1 Strictly Conforming POSIX Application, paragraph 8

  
      
  1. 对于C编程语言,应在包含任何标头之前将_POSIX_C_SOURCE定义为200809L
  2.   

2.2.4 Strictly Conforming XSI Application, paragraph 8

  
      
  1. 对于C编程语言,应在包含任何标头之前将_XOPEN_SOURCE定义为700
  2.   

the 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

file aws-sdk-cpp/aws-cpp-sdk-core/source/platform/linux-shared/OSVersionInfo.cpp具有以下错误代码:

Aws::String ComputeOSVersionString()
{
    utsname name;
    int32_t success = uname(&name);

Per POSIX,正确的类型是struct utsname,而不仅仅是utsname

 int uname(struct utsname *name);

AWS代码必须为:

Aws::String ComputeOSVersionString()
{
    struct utsname name;
    int success = uname(&name);

不,在给定this, umm, laugher的情况下,我绝对不会对AWS代码的质量印象深刻:

 while (!feof(outputStream))

是的,一个实际的while (!feof())循环...

2

文件aws-sdk-cpp/aws-cpp-sdk-mediaconvert/include/aws/mediaconvert/model/M2tsSegmentationMarkers.h使用的枚举值为EBP,该枚举与the EBP register #define in /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创建与the ES register #define in /usr/include/sys/regset.h冲突的枚举值ES。我刚刚添加

#ifdef ES
#undef ES
#endif 

,编译继续。我不知道#undef是否可以破坏任何东西。

4

文件aws-sdk-cpp/aws-cpp-sdk-waf/include/aws/waf/model/GeoMatchConstraintValue.hESGSSS枚举值与the ES, GS, and SS register #define's in /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-regional/include/aws/waf-regional/model/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值。每个the POSIX Pathname Variable Values standard(正在轰动我):

  

路径名变量值

     

以下列表中的值可以是   的实现,也可能因一个路径名而异。例如,   文件系统或目录可能具有不同的特征。

     

以下列表中一个符号常量的定义   在特定的<limits.h>标头中应省略   对应值等于或大于等于的实现   低于规定的最小值,但该值会根据   应用到的文件。特定值支持的实际值   路径名应由pathconf()函数提供。

再次:“定义... 应省略 ...其中的值可以变化”。

AWS代码错误地假设NAME_MAX#define的。

尽管只是使用255_POSIX_NAME_MAX之类的方法,我只是硬编码了_XOPEN_NAME_MAX的值来克服这一点。

7

假设std::shared_ptr为8个字节,文件aws-sdk-cpp/ws-cpp-sdk-core-tests/http/HttpClientTest.cpp似乎是错误的。 This question and answer提供了一个很好的例子说明这是怎么回事。

我只是忽略了该错误,因为它只是一个测试,并继续执行gmake -i,该错误已成功完成。