Skip to content

Improving/simplifying cfg attributes for target features #18

Open
@tarcieri

Description

@tarcieri

After many issues using crate features for controlling usage of target features, we've largely migrated to using cfg attributes instead.

Here are some of the cfg attributes we've defined:

  • aes_force_soft: use the software AES backend
  • aes_armv8: enable ARMv8 AES intrinsics (nightly-only)
  • chacha20_force_avx2: force the use of the AVX2 backend for ChaCha20
  • chacha20_force_sse2: force the use of the SSE2 backend for ChaCha20
  • chacha20_force_soft: force the use of the software-only backend for ChaCha20
  • polyval_force_soft: use the software POLYVAL backend
  • polyval_armv8: enable ARMv8 PMULL intrinsics (nightly-only)

First off, these all are selecting one of many options and are mutually exclusive at a crate level. cfg attributes make that possible in ways crate features don.t Alternatively we could have:

  • aes_backend="armv8", aes_backend="soft"
  • chacha20_backend="avx2", chacha20_backend="sse2", chacha20_backend="soft",
  • polyval_backend="armv8", polyval_backend="soft"

This would both be consistent across crates and simplify the logic in regard to conflicting attributes.

However, it would also be nice to have some way of enabling e.g. ARMv8 support without having to know about every subcomponent crate and whether or not it has ARMv8-specific features.

For example, right now to have fully hardware accelerated AES-GCM on ARMv8, an aes-gcm crate user needs to enable the aes_armv8 and polyval_armv8 cfg attributes.

It would be nice if there were a single cfg attribute that could be used to enable this across the whole project, e.g.

rustcrypto_target_arch="armv8"

To make this a bit easier to implement, we can continue to use the crate-specific attributes as the canonical cfg attributes, and use a build script to propagate the "global" cfg attributes.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions