|
54 | 54 | prune => boolean(), |
55 | 55 | start_module => module() | undefined, |
56 | 56 | application_module => module() | undefined, |
57 | | - include_lines => boolean() |
| 57 | + include_lines => boolean(), |
| 58 | + arch => atom() |
58 | 59 | }. |
59 | 60 |
|
60 | 61 | -export_type([ |
|
68 | 69 | prune => false, |
69 | 70 | start_module => undefined, |
70 | 71 | application_module => undefined, |
71 | | - include_lines => true |
| 72 | + include_lines => true, |
| 73 | + arch => undefined, |
| 74 | + platform => generic_unix |
72 | 75 | }). |
73 | 76 |
|
74 | 77 | %% |
|
88 | 91 | %% prune => false, |
89 | 92 | %% start_module => undefined, |
90 | 93 | %% application_module => undefined, |
91 | | -%% include_lines => false |
| 94 | +%% include_lines => false, |
| 95 | +%% arch => undefined, |
| 96 | +%% platform => generic_unix |
92 | 97 | %% }' |
93 | 98 | %% |
94 | 99 | %% @end |
@@ -122,15 +127,21 @@ create(OutputPath, InputPaths, Options) -> |
122 | 127 | prune := Prune, |
123 | 128 | start_module := StartModule, |
124 | 129 | application_module := ApplicationModule, |
125 | | - include_lines := IncludeLines |
| 130 | + include_lines := IncludeLines, |
| 131 | + arch := Arch, |
| 132 | + platform := Platform |
126 | 133 | } = maps:merge(?DEFAULT_OPTIONS, Options), |
127 | | - ParsedFiles = parse_files(InputPaths, StartModule, IncludeLines), |
| 134 | + Files0 = parse_files(InputPaths, StartModule, IncludeLines), |
| 135 | + Files1 = filter_arch_modules(Files0, Arch), |
| 136 | + Files2 = filter_platform_modules(Files1, Arch), |
| 137 | + Files3 = |
| 138 | + if |
| 139 | + Prune -> prune(Files2, ApplicationModule); |
| 140 | + true -> Files2 |
| 141 | + end, |
128 | 142 | write_packbeam( |
129 | 143 | OutputPath, |
130 | | - case Prune of |
131 | | - true -> prune(ParsedFiles, ApplicationModule); |
132 | | - _ -> ParsedFiles |
133 | | - end |
| 144 | + Files2 |
134 | 145 | ). |
135 | 146 |
|
136 | 147 | %%----------------------------------------------------------------------------- |
@@ -782,9 +793,14 @@ ends_with(String, Suffix) -> |
782 | 793 |
|
783 | 794 | %% @private |
784 | 795 | filter_chunks(Chunks, IncludeLines) -> |
785 | | - AllowedChunks = allowed_chunks(IncludeLines), |
| 796 | + AllowedChunks0 = allowed_chunks(IncludeLines), |
| 797 | + AllowedChunks1 = |
| 798 | + case lists:keymember("avmN", 1, Chunks) of |
| 799 | + true -> AllowedChunks0 -- ["Code", "Type"]; |
| 800 | + false -> AllowedChunks0 -- ["avmN"] |
| 801 | + end, |
786 | 802 | lists:filter( |
787 | | - fun({Tag, _Data}) -> lists:member(Tag, AllowedChunks) end, |
| 803 | + fun({Tag, _Data}) -> lists:member(Tag, AllowedChunks1) end, |
788 | 804 | Chunks |
789 | 805 | ). |
790 | 806 |
|
@@ -853,3 +869,90 @@ deduplicate([]) -> |
853 | 869 | []; |
854 | 870 | deduplicate([H | T]) -> |
855 | 871 | [H | [X || X <- deduplicate(T), X /= H]]. |
| 872 | + |
| 873 | +% Some modules may be for several platforms, so keep list of modules we can |
| 874 | +% filter out. |
| 875 | +-define(PLATFORM_MODULES_FILTER, #{ |
| 876 | + generic_unix => [ |
| 877 | + "pico.beam", |
| 878 | + "i2c.beam", |
| 879 | + "gpio.beam", |
| 880 | + "esp_adc.beam", |
| 881 | + "esp.beam", |
| 882 | + "emscripten.beam", |
| 883 | + "jit_stream_flash.beam" |
| 884 | + ], |
| 885 | + esp32 => [ |
| 886 | + "pico.beam", |
| 887 | + "emscripten.beam", |
| 888 | + "jit_stream_mmap.beam" |
| 889 | + ], |
| 890 | + stm32 => [ |
| 891 | + "pico.beam", |
| 892 | + "esp_adc.beam", |
| 893 | + "esp.beam", |
| 894 | + "emscripten.beam", |
| 895 | + "jit_stream_mmap.beam" |
| 896 | + ], |
| 897 | + rp2 => [ |
| 898 | + "esp_adc.beam", |
| 899 | + "esp.beam", |
| 900 | + "emscripten.beam", |
| 901 | + "jit_stream_mmap.beam" |
| 902 | + ], |
| 903 | + emscripten => [ |
| 904 | + "pico.beam", |
| 905 | + "i2c.beam", |
| 906 | + "gpio.beam", |
| 907 | + "esp_adc.beam", |
| 908 | + "esp.beam", |
| 909 | + "emscripten.beam", |
| 910 | + "jit_stream_flash.beam", |
| 911 | + "jit_stream_mmap.beam" |
| 912 | + ] |
| 913 | +}). |
| 914 | + |
| 915 | +filter_platform_modules(Files, Platform) when is_map_key(Platform, ?PLATFORM_MODULES_FILTER) -> |
| 916 | + lists:subtract(Files, map_get(Platform, ?PLATFORM_MODULES_FILTER)); |
| 917 | +filter_platform_modules(Files, _) -> |
| 918 | + Files. |
| 919 | + |
| 920 | +-define(ARCH_MODULES_FILTER, #{ |
| 921 | + aarch64 => [ |
| 922 | + "jit_armv6m.beam", |
| 923 | + "jit_armv6m_asm.beam", |
| 924 | + "jit_riscv32.beam", |
| 925 | + "jit_riscv32_asm.beam", |
| 926 | + "jit_x86_64.beam", |
| 927 | + "jit_x86_64_asm.beam" |
| 928 | + ], |
| 929 | + armv6m => [ |
| 930 | + "jit_aarch64.beam", |
| 931 | + "jit_aarch64_asm.beam", |
| 932 | + "jit_riscv32.beam", |
| 933 | + "jit_riscv32_asm.beam", |
| 934 | + "jit_x86_64.beam", |
| 935 | + "jit_x86_64_asm.beam" |
| 936 | + ], |
| 937 | + riscv32 => [ |
| 938 | + "jit_aarch64.beam", |
| 939 | + "jit_aarch64_asm.beam", |
| 940 | + "jit_armv6m.beam", |
| 941 | + "jit_armv6m_asm.beam", |
| 942 | + "jit_x86_64.beam", |
| 943 | + "jit_x86_64_asm.beam" |
| 944 | + ], |
| 945 | + x86_64 => [ |
| 946 | + "jit_aarch64.beam", |
| 947 | + "jit_aarch64_asm.beam", |
| 948 | + "jit_armv6m.beam", |
| 949 | + "jit_armv6m_asm.beam", |
| 950 | + "jit_riscv32.beam", |
| 951 | + "jit_riscv32_asm.beam", |
| 952 | + ] |
| 953 | +}). |
| 954 | + |
| 955 | +filter_arch_modules(Files, Platform) when is_map_key(Platform, ?ARCH_MODULES_FILTER) -> |
| 956 | + lists:subtract(Files, map_get(Platform, ?ARCH_MODULES_FILTER)); |
| 957 | +filter_arch_modules(Files, _) -> |
| 958 | + Files. |
0 commit comments