{
cmake,
lib,
stdenv,
protobuf,
python3,
src,
version,
enableMalloc,
noPackedStructs,
maxRequiredFields,
field32bit,
noErrmsg,
bufferOnly,
systemHeader,
without64bit,
encodeArraysUnpacked,
convertDoubleFloat,
validateUtf8,
littleEndian8bit,
c99StaticAssert,
noStaticAssert,
}:
stdenv.mkDerivation ({
pname = "nanopb-runtime";
inherit src version;
nativeBuildInputs = [
cmake
protobuf
python3
];
patchPhase =
let
compile_definitions = target: ''
target_compile_definitions(${target}
PUBLIC
${lib.concatStringsSep "\n\t" (
map (x: "PB_${x.flag}") (
builtins.filter (x: x.cond) [
cond = enableMalloc;
flag = "ENABLE_MALLOC=1";
}
cond = noPackedStructs;
flag = "NO_PACKED_STRUCTS=1";
cond = maxRequiredFields != null;
flag = "MAX_REQUIRED_FIELDS=${maxRequiredFields}";
cond = field32bit;
flag = "FIELD_32BIT=1";
cond = noErrmsg;
flag = "NO_ERRMSG=1";
cond = bufferOnly;
flag = "BUFFER_ONLY=1";
cond = systemHeader != null;
flag = "SYSTEM_HEADER=${systemHeader}";
cond = without64bit;
flag = "WITHOUT_64BIT=1";
cond = encodeArraysUnpacked;
flag = "ENCODE_ARRAYS_UNPACKED=1";
cond = convertDoubleFloat;
flag = "CONVERT_DOUBLE_FLOAT=1";
cond = validateUtf8;
flag = "VALIDATE_UTF8=1";
cond = littleEndian8bit;
flag = "LITTLE_ENDIAN_8BIT=1";
cond = c99StaticAssert;
flag = "C99_STATIC_ASSERT=1";
cond = noStaticAssert;
flag = "NO_STATIC_ASSERT=1";
]
)
)}
'';
in
''
cat << EOF >> CMakeLists.txt
${compile_definitions "protobuf-nanopb"}
${compile_definitions "protobuf-nanopb-static"}
EOF
cmakeFlags = [
"-DBUILD_SHARED_LIBS=ON"
"-DBUILD_STATIC_LIBS=ON"
"-Dnanopb_BUILD_GENERATOR=OFF"
"-Dnanopb_BUILD_RUNTIME=ON"
})