summary refs log tree commit diff
path: root/pkgs/development/libraries/aws-sdk-cpp/default.nix
blob: c72347a2b7d1eda18d025172589d28fb496c7bd8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
{ lib
, stdenv
, fetchFromGitHub
, fetchpatch
, cmake
, curl
, openssl
, s2n-tls
, zlib
, aws-crt-cpp
, aws-c-cal
, aws-c-common
, aws-c-event-stream
, aws-c-io
, aws-checksums
, CoreAudio
, AudioToolbox
, # Allow building a limited set of APIs, e.g. ["s3" "ec2"].
  apis ? ["*"]
, # Whether to enable AWS' custom memory management.
  customMemoryManagement ? true
}:

let
  host_os = if stdenv.hostPlatform.isDarwin then "APPLE"
       else if stdenv.hostPlatform.isAndroid then "ANDROID"
       else if stdenv.hostPlatform.isWindows then "WINDOWS"
       else if stdenv.hostPlatform.isLinux then "LINUX"
       else throw "Unknown host OS";
in

stdenv.mkDerivation rec {
  pname = "aws-sdk-cpp";
  version = "1.9.294";

  src = fetchFromGitHub {
    owner = "aws";
    repo = "aws-sdk-cpp";
    rev = version;
    sha256 = "sha256-Z1eRKW+8nVD53GkNyYlZjCcT74MqFqqRMeMc33eIQ9g=";
  };

  patches = [
    ./cmake-dirs.patch
  ];

  postPatch = ''
    # Avoid blanket -Werror to evade build failures on less
    # tested compilers.
    substituteInPlace cmake/compiler_settings.cmake \
      --replace '"-Werror"' ' '

    # Missing includes for GCC11
    sed '5i#include <thread>' -i \
      aws-cpp-sdk-cloudfront-integration-tests/CloudfrontOperationTest.cpp \
      aws-cpp-sdk-cognitoidentity-integration-tests/IdentityPoolOperationTest.cpp \
      aws-cpp-sdk-dynamodb-integration-tests/TableOperationTest.cpp \
      aws-cpp-sdk-elasticfilesystem-integration-tests/ElasticFileSystemTest.cpp \
      aws-cpp-sdk-lambda-integration-tests/FunctionTest.cpp \
      aws-cpp-sdk-mediastore-data-integration-tests/MediaStoreDataTest.cpp \
      aws-cpp-sdk-queues/source/sqs/SQSQueue.cpp \
      aws-cpp-sdk-redshift-integration-tests/RedshiftClientTest.cpp \
      aws-cpp-sdk-s3-crt-integration-tests/BucketAndObjectOperationTest.cpp \
      aws-cpp-sdk-s3-integration-tests/BucketAndObjectOperationTest.cpp \
      aws-cpp-sdk-s3control-integration-tests/S3ControlTest.cpp \
      aws-cpp-sdk-sqs-integration-tests/QueueOperationTest.cpp \
      aws-cpp-sdk-transfer-tests/TransferTests.cpp
    # Flaky on Hydra
    rm aws-cpp-sdk-core-tests/aws/auth/AWSCredentialsProviderTest.cpp
    # Includes aws-c-auth private headers, so only works with submodule build
    rm aws-cpp-sdk-core-tests/aws/auth/AWSAuthSignerTest.cpp
    # TestRandomURLMultiThreaded fails
    rm aws-cpp-sdk-core-tests/http/HttpClientTest.cpp
  '' + lib.optionalString stdenv.isi686 ''
    # EPSILON is exceeded
    rm aws-cpp-sdk-core-tests/aws/client/AdaptiveRetryStrategyTest.cpp
  '';

  # FIXME: might be nice to put different APIs in different outputs
  # (e.g. libaws-cpp-sdk-s3.so in output "s3").
  outputs = [ "out" "dev" ];

  nativeBuildInputs = [ cmake curl ];

  buildInputs = [
    curl openssl zlib
  ] ++ lib.optionals (stdenv.isDarwin &&
                        ((builtins.elem "text-to-speech" apis) ||
                         (builtins.elem "*" apis)))
         [ CoreAudio AudioToolbox ];

  # propagation is needed for Security.framework to be available when linking
  propagatedBuildInputs = [ aws-crt-cpp ];
  # Ensure the linker is using atomic when compiling for RISC-V, otherwise fails
  LDFLAGS = lib.optionalString stdenv.hostPlatform.isRiscV "-latomic";

  cmakeFlags = [
    "-DBUILD_DEPS=OFF"
  ] ++ lib.optional (!customMemoryManagement) "-DCUSTOM_MEMORY_MANAGEMENT=0"
  ++ lib.optionals (stdenv.buildPlatform != stdenv.hostPlatform) [
    "-DENABLE_TESTING=OFF"
    "-DCURL_HAS_H2=1"
    "-DCURL_HAS_TLS_PROXY=1"
    "-DTARGET_ARCH=${host_os}"
  ] ++ lib.optional (apis != ["*"])
    "-DBUILD_ONLY=${lib.concatStringsSep ";" apis}";

  NIX_CFLAGS_COMPILE = toString [
    # openssl 3 generates several deprecation warnings
    "-Wno-error=deprecated-declarations"
  ];

  # aws-cpp-sdk-core-tests/aws/client/AWSClientTest.cpp
  # seem to have a datarace
  enableParallelChecking = false;

  postFixupHooks = [
    # This bodge is necessary so that the file that the generated -config.cmake file
    # points to an existing directory.
    "mkdir -p $out/include"
  ];

  __darwinAllowLocalNetworking = true;

  # Builds in 2+h with 2 cores, and ~10m with a big-parallel builder.
  requiredSystemFeatures = [ "big-parallel" ];

  meta = with lib; {
    description = "A C++ interface for Amazon Web Services";
    homepage = "https://github.com/aws/aws-sdk-cpp";
    license = licenses.asl20;
    platforms = platforms.unix;
    maintainers = with maintainers; [ eelco orivej ];
    # building ec2 runs out of memory: cc1plus: out of memory allocating 33554372 bytes after a total of 74424320 bytes
    broken = stdenv.buildPlatform.is32bit && ((builtins.elem "ec2" apis) || (builtins.elem "*" apis));
  };
}