1# Copyright 2023 The Pigweed Authors 2# 3# Licensed under the Apache License, Version 2.0 (the "License"); you may not 4# use this file except in compliance with the License. You may obtain a copy of 5# the License at 6# 7# https://www.apache.org/licenses/LICENSE-2.0 8# 9# Unless required by applicable law or agreed to in writing, software 10# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 11# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 12# License for the specific language governing permissions and limitations under 13# the License. 14 15include($ENV{PW_ROOT}/pw_build/pigweed.cmake) 16 17# Module configuration 18 19pw_add_module_config(pw_allocator_CONFIG) 20 21pw_add_library(pw_allocator.config INTERFACE 22 HEADERS 23 public/pw_allocator/config.h 24 PUBLIC_INCLUDES 25 public 26 PUBLIC_DEPS 27 ${pw_allocator_CONFIG} 28) 29 30pw_add_library(pw_allocator.test_config INTERFACE 31 PUBLIC_DEFINES 32 PW_ALLOCATOR_STRICT_VALIDATION=1 33 PW_ALLOCATOR_BLOCK_POISON_INTERVAL=4 34) 35 36# Libraries 37 38pw_add_library(pw_allocator.allocator STATIC 39 HEADERS 40 public/pw_allocator/allocator.h 41 PUBLIC_INCLUDES 42 public 43 PUBLIC_DEPS 44 pw_allocator.deallocator 45 pw_result 46 SOURCES 47 allocator.cc 48) 49 50pw_add_library(pw_allocator.allocator_as_pool STATIC 51 HEADERS 52 public/pw_allocator/allocator_as_pool.h 53 PUBLIC_INCLUDES 54 public 55 PUBLIC_DEPS 56 pw_allocator.allocator 57 pw_allocator.pool 58 pw_status 59 SOURCES 60 allocator_as_pool.cc 61) 62 63pw_add_library(pw_allocator.best_fit INTERFACE 64 HEADERS 65 public/pw_allocator/best_fit.h 66 PUBLIC_INCLUDES 67 public 68 PUBLIC_DEPS 69 pw_allocator.block_allocator 70 pw_allocator.block.detailed_block 71 pw_allocator.bucket.sorted 72 pw_allocator.bucket.fast_sorted 73 pw_allocator.config 74) 75 76pw_add_library(pw_allocator.best_fit_block_allocator INTERFACE 77 HEADERS 78 public/pw_allocator/best_fit_block_allocator.h 79 PUBLIC_INCLUDES 80 public 81 PUBLIC_DEPS 82 pw_allocator.best_fit 83 pw_allocator.config 84) 85 86# TODO(b/376730645): Deprecated; use pw_allocator.block.detailed_block or 87# similar instead. 88pw_add_library(pw_allocator.block INTERFACE 89 PUBLIC_DEPS 90 pw_allocator.block.detailed_block 91) 92 93pw_add_library(pw_allocator.block_allocator STATIC 94 HEADERS 95 public/pw_allocator/block_allocator.h 96 PUBLIC_INCLUDES 97 public 98 PUBLIC_DEPS 99 pw_allocator.allocator 100 pw_allocator.block.allocatable 101 pw_allocator.block.basic 102 pw_allocator.block.iterable 103 pw_allocator.block.poisonable 104 pw_allocator.block.with_layout 105 pw_allocator.fragmentation 106 pw_bytes.alignment 107 pw_result 108 pw_status 109 PRIVATE_DEPS 110 pw_assert 111 SOURCES 112 block_allocator.cc 113) 114 115pw_add_library(pw_allocator.bucket_allocator INTERFACE 116 HEADERS 117 public/pw_allocator/bucket_allocator.h 118 PUBLIC_INCLUDES 119 public 120 PUBLIC_DEPS 121 pw_allocator.block_allocator 122 pw_allocator.block.detailed_block 123 pw_allocator.bucket.unordered 124 pw_status 125) 126 127# TODO(b/376730645): Remove deprecated interfaces. 128pw_add_library(pw_allocator.bucket_block_allocator INTERFACE 129 PUBLIC_DEPS 130 pw_allocator.bucket_allocator 131) 132 133pw_add_library(pw_allocator.buddy_allocator STATIC 134 HEADERS 135 public/pw_allocator/buddy_allocator.h 136 PUBLIC_INCLUDES 137 public 138 PUBLIC_DEPS 139 pw_allocator.allocator 140 pw_allocator.block.basic 141 pw_allocator.bucket.unordered 142 pw_bytes 143 pw_containers.vector 144 pw_status 145 PRIVATE_DEPS 146 pw_assert 147 pw_third_party.fuchsia.stdcompat 148 SOURCES 149 buddy_allocator.cc 150) 151 152pw_add_library(pw_allocator.buffer INTERFACE 153 HEADERS 154 public/pw_allocator/buffer.h 155 PUBLIC_INCLUDES 156 public 157 PUBLIC_DEPS 158 pw_bytes 159 pw_result 160) 161 162pw_add_library(pw_allocator.bump_allocator STATIC 163 HEADERS 164 public/pw_allocator/bump_allocator.h 165 PUBLIC_INCLUDES 166 public 167 PUBLIC_DEPS 168 pw_allocator.allocator 169 pw_bytes 170 PRIVATE_DEPS 171 pw_allocator.buffer 172 pw_bytes.alignment 173 SOURCES 174 bump_allocator.cc 175) 176 177pw_add_library(pw_allocator.chunk_pool STATIC 178 HEADERS 179 public/pw_allocator/chunk_pool.h 180 PUBLIC_INCLUDES 181 public 182 PUBLIC_DEPS 183 pw_allocator.pool 184 pw_bytes 185 pw_result 186 PRIVATE_DEPS 187 pw_allocator.buffer 188 pw_bytes.alignment 189 pw_assert.check 190 pw_third_party.fuchsia.stdcompat 191 SOURCES 192 chunk_pool.cc 193) 194 195pw_add_library(pw_allocator.deallocator STATIC 196 SOURCES 197 unique_ptr.cc 198 HEADERS 199 public/pw_allocator/capability.h 200 public/pw_allocator/layout.h 201 public/pw_allocator/deallocator.h 202 public/pw_allocator/unique_ptr.h 203 PUBLIC_INCLUDES 204 public 205 PUBLIC_DEPS 206 pw_assert 207 pw_preprocessor 208 pw_result 209 pw_status 210) 211 212# TODO(b/376730645): Remove deprecated interfaces. 213pw_add_library(pw_allocator.dual_first_fit_block_allocator INTERFACE 214 HEADERS 215 public/pw_allocator/dual_first_fit_block_allocator.h 216 PUBLIC_INCLUDES 217 public 218 PUBLIC_DEPS 219 pw_allocator.first_fit 220) 221 222pw_add_library(pw_allocator.fallback_allocator STATIC 223 SOURCES 224 fallback_allocator.cc 225 HEADERS 226 public/pw_allocator/fallback_allocator.h 227 PUBLIC_INCLUDES 228 public 229 PUBLIC_DEPS 230 pw_allocator.allocator 231 pw_allocator.deallocator 232 pw_result 233 pw_status 234 PRIVATE_DEPS 235 pw_assert.check 236) 237 238pw_add_library(pw_allocator.first_fit INTERFACE 239 HEADERS 240 public/pw_allocator/first_fit.h 241 PUBLIC_INCLUDES 242 public 243 PUBLIC_DEPS 244 pw_allocator.block_allocator 245 pw_allocator.config 246 pw_allocator.block.detailed_block 247 pw_allocator.bucket.sequenced 248) 249 250# TODO(b/376730645): Remove deprecated interfaces. 251pw_add_library(pw_allocator.first_fit_block_allocator INTERFACE 252 HEADERS 253 public/pw_allocator/first_fit_block_allocator.h 254 PUBLIC_INCLUDES 255 public 256 PUBLIC_DEPS 257 pw_allocator.first_fit 258) 259 260pw_add_library(pw_allocator.fragmentation STATIC 261 HEADERS 262 public/pw_allocator/fragmentation.h 263 PUBLIC_INCLUDES 264 public 265 SOURCES 266 fragmentation.cc 267) 268 269pw_add_library(pw_allocator.freelist_heap INTERFACE 270 HEADERS 271 public/pw_allocator/freelist_heap.h 272 PUBLIC_INCLUDES 273 public 274 PUBLIC_DEPS 275 pw_allocator.bucket_allocator 276 pw_assert 277 pw_bytes 278 pw_preprocessor 279) 280 281# TODO(b/376730645): Remove deprecated interfaces. 282pw_add_library(pw_allocator.last_fit_block_allocator INTERFACE 283 HEADERS 284 public/pw_allocator/last_fit_block_allocator.h 285 PUBLIC_INCLUDES 286 public 287 PUBLIC_DEPS 288 pw_allocator.first_fit 289) 290 291pw_add_library(pw_allocator.libc_allocator STATIC 292 SOURCES 293 libc_allocator.cc 294 HEADERS 295 public/pw_allocator/libc_allocator.h 296 PUBLIC_INCLUDES 297 public 298 PUBLIC_DEPS 299 pw_allocator.allocator 300) 301 302pw_add_library(pw_allocator.null_allocator STATIC 303 SOURCES 304 null_allocator.cc 305 HEADERS 306 public/pw_allocator/null_allocator.h 307 PUBLIC_INCLUDES 308 public 309 PUBLIC_DEPS 310 pw_allocator.allocator 311) 312 313pw_add_library(pw_allocator.pmr_allocator STATIC 314 HEADERS 315 public/pw_allocator/pmr_allocator.h 316 PUBLIC_INCLUDES 317 public 318 PUBLIC_DEPS 319 pw_allocator.allocator 320 SOURCES 321 pmr_allocator.cc 322) 323 324pw_add_library(pw_allocator.pool INTERFACE 325 HEADERS 326 public/pw_allocator/pool.h 327 PUBLIC_INCLUDES 328 public 329 PUBLIC_DEPS 330 pw_allocator.deallocator 331 pw_bytes 332 pw_result 333) 334 335pw_add_library(pw_allocator.synchronized_allocator INTERFACE 336 HEADERS 337 public/pw_allocator/synchronized_allocator.h 338 PUBLIC_INCLUDES 339 public 340 PUBLIC_DEPS 341 pw_allocator.allocator 342 pw_sync.borrow 343) 344 345pw_add_library(pw_allocator.tracking_allocator INTERFACE 346 HEADERS 347 public/pw_allocator/metrics.h 348 public/pw_allocator/tracking_allocator.h 349 PUBLIC_INCLUDES 350 public 351 PUBLIC_DEPS 352 pw_allocator.allocator 353 pw_metric 354 pw_status 355) 356 357pw_add_library(pw_allocator.typed_pool INTERFACE 358 HEADERS 359 public/pw_allocator/typed_pool.h 360 PUBLIC_INCLUDES 361 public 362 PUBLIC_DEPS 363 pw_allocator.allocator 364 pw_allocator.chunk_pool 365 pw_bytes 366 pw_result 367) 368 369pw_add_library(pw_allocator.worst_fit INTERFACE 370 HEADERS 371 public/pw_allocator/worst_fit.h 372 PUBLIC_INCLUDES 373 public 374 PUBLIC_DEPS 375 pw_allocator.block_allocator 376 pw_allocator.block.detailed_block 377 pw_allocator.bucket.sorted 378 pw_allocator.bucket.fast_sorted 379 pw_allocator.config 380) 381 382pw_add_library(pw_allocator.worst_fit_block_allocator INTERFACE 383 HEADERS 384 public/pw_allocator/worst_fit_block_allocator.h 385 PUBLIC_INCLUDES 386 public 387 PUBLIC_DEPS 388 pw_allocator.worst_fit 389 pw_allocator.config 390) 391 392 393# Test support 394 395pw_add_library(pw_allocator.testing INTERFACE 396 HEADERS 397 public/pw_allocator/testing.h 398 PUBLIC_INCLUDES 399 public 400 PUBLIC_DEPS 401 pw_allocator.allocator 402 pw_allocator.buffer 403 pw_allocator.first_fit 404 pw_allocator.test_config 405 pw_allocator.tracking_allocator 406 pw_bytes 407 pw_result 408 pw_status 409 pw_sync.interrupt_spin_lock 410 pw_unit_test 411 PRIVATE_DEPS 412 pw_assert 413) 414 415pw_add_library(pw_allocator.block_allocator_testing STATIC 416 HEADERS 417 public/pw_allocator/block_allocator_testing.h 418 PUBLIC_INCLUDES 419 public 420 PUBLIC_DEPS 421 pw_allocator.block.testing 422 pw_allocator.block_allocator 423 pw_allocator.block.detailed_block 424 pw_unit_test 425 PRIVATE_DEPS 426 pw_assert 427 pw_bytes.alignment 428 pw_status 429 pw_third_party.fuchsia.stdcompat 430 SOURCES 431 block_allocator_testing.cc 432) 433 434pw_add_library(pw_allocator.test_harness STATIC 435 HEADERS 436 public/pw_allocator/test_harness.h 437 PUBLIC_INCLUDES 438 public 439 PUBLIC_DEPS 440 pw_allocator.allocator 441 pw_containers 442 pw_random 443 PRIVATE_DEPS 444 pw_assert 445 pw_third_party.fuchsia.stdcompat 446 SOURCES 447 test_harness.cc 448) 449 450pw_add_library(pw_allocator.fuzzing STATIC 451 HEADERS 452 public/pw_allocator/fuzzing.h 453 PUBLIC_INCLUDES 454 public 455 PUBLIC_DEPS 456 pw_allocator.test_harness 457 pw_fuzzer.fuzztest 458 SOURCES 459 fuzzing.cc 460) 461 462# Tests 463 464pw_add_test(pw_allocator.allocator_as_pool_test 465 SOURCES 466 allocator_as_pool_test.cc 467 PRIVATE_DEPS 468 pw_allocator.allocator_as_pool 469 pw_allocator.testing 470 GROUPS 471 modules 472 pw_allocator 473) 474 475pw_add_test(pw_allocator.allocator_test 476 SOURCES 477 allocator_test.cc 478 PRIVATE_DEPS 479 pw_allocator.allocator 480 pw_allocator.testing 481 GROUPS 482 modules 483 pw_allocator 484) 485 486pw_add_test(pw_allocator.best_fit_test 487 SOURCES 488 best_fit_test.cc 489 PRIVATE_DEPS 490 pw_allocator.best_fit 491 pw_allocator.best_fit_block_allocator 492 pw_allocator.block_allocator_testing 493 GROUPS 494 modules 495 pw_allocator 496) 497 498pw_add_test(pw_allocator.bucket_allocator_test 499 SOURCES 500 bucket_allocator_test.cc 501 PRIVATE_DEPS 502 pw_allocator.block_allocator_testing 503 pw_allocator.bucket_allocator 504 pw_allocator.bucket_block_allocator 505 GROUPS 506 modules 507 pw_allocator 508) 509 510pw_add_test(pw_allocator.buddy_allocator_test 511 SOURCES 512 buddy_allocator_test.cc 513 PRIVATE_DEPS 514 pw_allocator.buddy_allocator 515 pw_allocator.testing 516 GROUPS 517 modules 518 pw_allocator 519) 520 521pw_add_test(pw_allocator.buffer_test 522 SOURCES 523 buffer_test.cc 524 PRIVATE_DEPS 525 pw_allocator.buffer 526 pw_allocator.testing 527 pw_bytes 528 pw_result 529 pw_third_party.fuchsia.stdcompat 530 GROUPS 531 modules 532 pw_allocator 533) 534 535pw_add_test(pw_allocator.bump_allocator_test 536 SOURCES 537 bump_allocator_test.cc 538 PRIVATE_DEPS 539 pw_allocator.bump_allocator 540 pw_allocator.testing 541 pw_third_party.fuchsia.stdcompat 542 GROUPS 543 modules 544 pw_allocator 545) 546 547pw_add_test(pw_allocator.chunk_pool_test 548 SOURCES 549 chunk_pool_test.cc 550 PRIVATE_DEPS 551 pw_allocator.chunk_pool 552 pw_allocator.testing 553 GROUPS 554 modules 555 pw_allocator 556) 557 558pw_add_test(pw_allocator.fallback_allocator_test 559 PRIVATE_DEPS 560 pw_allocator.testing 561 pw_allocator.fallback_allocator 562 pw_status 563 SOURCES 564 fallback_allocator_test.cc 565 GROUPS 566 modules 567 pw_allocator 568) 569 570pw_add_test(pw_allocator.first_fit_test 571 SOURCES 572 first_fit_test.cc 573 PRIVATE_DEPS 574 pw_allocator.block_allocator_testing 575 pw_allocator.buffer 576 pw_allocator.dual_first_fit_block_allocator 577 pw_allocator.first_fit 578 pw_allocator.first_fit_block_allocator 579 pw_allocator.last_fit_block_allocator 580 pw_third_party.fuchsia.stdcompat 581 GROUPS 582 modules 583 pw_allocator 584) 585 586pw_add_test(pw_allocator.fragmentation_test 587 SOURCES 588 fragmentation_test.cc 589 PRIVATE_DEPS 590 pw_allocator.fragmentation 591 pw_allocator.testing 592 GROUPS 593 modules 594 pw_allocator 595) 596 597pw_add_test(pw_allocator.freelist_heap_test 598 SOURCES 599 freelist_heap_test.cc 600 PRIVATE_DEPS 601 pw_allocator.block.testing 602 pw_allocator.freelist_heap 603 pw_allocator.testing 604 pw_bytes.alignment 605 pw_third_party.fuchsia.stdcompat 606 GROUPS 607 modules 608 pw_allocator 609) 610 611pw_add_test(pw_allocator.layout_test 612 SOURCES 613 layout_test.cc 614 PRIVATE_DEPS 615 pw_allocator.deallocator 616 pw_allocator.testing 617 GROUPS 618 modules 619 pw_allocator 620) 621 622pw_add_test(pw_allocator.libc_allocator_test 623 SOURCES 624 libc_allocator_test.cc 625 PRIVATE_DEPS 626 pw_allocator.libc_allocator 627 pw_allocator.testing 628 pw_unit_test 629 GROUPS 630 modules 631 pw_allocator 632) 633 634pw_add_test(pw_allocator.null_allocator_test 635 SOURCES 636 null_allocator_test.cc 637 PRIVATE_DEPS 638 pw_allocator.null_allocator 639 pw_allocator.testing 640 pw_unit_test 641 GROUPS 642 modules 643 pw_allocator 644) 645 646pw_add_test(pw_allocator.pmr_allocator_test 647 SOURCES 648 pmr_allocator_test.cc 649 PRIVATE_DEPS 650 pw_allocator.pmr_allocator 651 pw_allocator.testing 652 pw_unit_test 653 GROUPS 654 modules 655 pw_allocator 656) 657 658pw_add_test(pw_allocator.synchronized_allocator_test 659 SOURCES 660 synchronized_allocator_test.cc 661 PRIVATE_DEPS 662 pw_allocator.testing 663 pw_allocator.test_harness 664 pw_allocator.synchronized_allocator 665 pw_sync.binary_semaphore 666 pw_sync.interrupt_spin_lock 667 pw_sync.mutex 668 pw_thread.test_thread_context 669 pw_thread.thread 670 pw_thread.thread_core 671 pw_thread.yield 672 pw_random 673 GROUPS 674 modules 675 pw_allocator 676) 677 678pw_add_test(pw_allocator.tracking_allocator_test 679 SOURCES 680 tracking_allocator_test.cc 681 PRIVATE_DEPS 682 pw_allocator.testing 683 pw_allocator.tracking_allocator 684 GROUPS 685 modules 686 pw_allocator 687) 688 689pw_add_test(pw_allocator.typed_pool_test 690 SOURCES 691 typed_pool_test.cc 692 PRIVATE_DEPS 693 pw_allocator.testing 694 pw_allocator.typed_pool 695 pw_bytes.alignment 696 pw_unit_test 697 GROUPS 698 modules 699 pw_allocator 700) 701 702pw_add_test(pw_allocator.unique_ptr_test 703 SOURCES 704 unique_ptr_test.cc 705 PRIVATE_DEPS 706 pw_allocator.allocator 707 pw_allocator.testing 708 GROUPS 709 modules 710 pw_allocator 711) 712 713pw_add_test(pw_allocator.worst_fit_test 714 SOURCES 715 worst_fit_test.cc 716 PRIVATE_DEPS 717 pw_allocator.block_allocator_testing 718 pw_allocator.worst_fit 719 pw_allocator.worst_fit_block_allocator 720 GROUPS 721 modules 722 pw_allocator 723) 724 725add_subdirectory(benchmarks) 726add_subdirectory(block) 727add_subdirectory(bucket) 728add_subdirectory(examples) 729