# Chrome-External Builds Work is ongoing to make PartitionAlloc a standalone library. The standalone repository for PartitionAlloc is hosted [here][standalone-PA-repo]. ## GN Args External clients should examine the args described in `build_overrides/partition_alloc.gni` and add them in their own source tree. PartitionAlloc's build will expect them at `//build_overrides/partition_alloc.gni`. In addition, something must provide `build_with_chromium = false` to the PA build system. ## `use_partition_alloc` The `use_partition_alloc` GN arg, described in [`build_config.md`](./build_config.md), provides a GN-level seam that embedders 1. can set in their GN args and 2. should observe in their GN recipes to conditionally pull in PartitionAlloc. I.E. if you have any reason to disable PartitionAlloc, you should do so with this GN arg. Avoid pulling in PartitionAlloc headers when the corresponding buildflag is false. Setting `use_partition_alloc` false will also implicitly disable other features, e.g. nixing the compilation of BackupRefPtr as the implementation of `raw_ptr`. ## Periodic Memory Reduction Routines PartitionAlloc provides APIs to * reclaim memory (see `memory_reclaimer.h`) and * purge thread caches (see `thread_cache.h`). Both of these must be called by the embedder external to PartitionAlloc. PA provides neither an event loop nor timers of its own, delegating this to its clients. ## Build Considerations External clients create constraints on PartitionAlloc's implementation. ### C++17 PartitionAlloc targets C++17. This is aligned with our first external client, PDFium, and may be further constrained by other clients. These impositions prevent us from moving in lockstep with Chrome's target C++ version. We do not even have guarantees of backported future features, e.g. C++20's designated initializers. Therefore, these cannot ship with PartitionAlloc. ### MSVC Support PDFium supports MSVC. PartitionAlloc will have to match it. ### MSVC Constraint: No Inline Assembly MSVC's syntax for `asm` blocks differs from the one widely adopted in parts of Chrome. But more generally, [MSVC doesn't support inline assembly on ARM and x64 processors][msvc-inline-assembly]. Assembly blocks should be gated behind compiler-specific flags and replaced with intrinsics in the presence of `COMPILER_MSVC` (absent `__clang__`). [standalone-PA-repo]: https://chromium.googlesource.com/chromium/src/base/allocator/partition_allocator.git [msvc-inline-assembly]: https://docs.microsoft.com/en-us/cpp/assembler/inline/inline-assembler?view=msvc-170