├── .github └── workflows │ ├── commit.yml │ ├── publish.yml │ └── tag.yml ├── .gitignore ├── .travis.yml ├── LICENSE ├── Makefile ├── README.md ├── gen ├── include └── otp_vsn.hrl ├── rebar.config.script ├── rebar.lock ├── src └── otp_vsn.app.src └── test ├── has_maps_tests.erl ├── has_st_matching_tests.erl └── otp_vsn_tests.erl /.github/workflows/commit.yml: -------------------------------------------------------------------------------- 1 | name: Commit new OTP releases 2 | on: 3 | schedule: 4 | - cron: 0 13 * * * 5 | jobs: 6 | commit: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - uses: actions/checkout@v2 10 | 11 | - id: commit 12 | run: | 13 | if ! make gen; then 14 | echo New changes to commit: 15 | git --no-pager diff -- include/otp_vsn.hrl 16 | 17 | git config --global user.name ${GITHUB_ACTOR} 18 | git config --global user.email ${GITHUB_ACTOR}@github.com 19 | git add include/otp_vsn.hrl 20 | git commit -m 'make gen' 21 | 22 | echo ::set-output name=committed::yes 23 | fi 24 | 25 | - name: Push commit 26 | uses: ad-m/github-push-action@master 27 | if: steps.commit.outputs.committed == 'yes' 28 | with: 29 | github_token: ${{ secrets.TAGGING_TOKEN }} # Triggers a workflow 30 | -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: Publish to hex.pm 2 | on: {push: {tags: ['*']}} 3 | jobs: 4 | publish: 5 | runs-on: ubuntu-latest 6 | steps: 7 | - uses: actions/checkout@v2 8 | 9 | - run: | 10 | mkdir -p ~/.config/rebar3 11 | echo '{plugins, [rebar3_hex]}.' >~/.config/rebar3/rebar.config 12 | wget -nc https://s3.amazonaws.com/rebar3/rebar3 13 | chmod +x rebar3 14 | 15 | - run: ./rebar3 hex publish 16 | env: 17 | DEBUG: '1' 18 | HEX_API_KEY: ${{ secrets.HEX_PUBLISH_KEY }} 19 | -------------------------------------------------------------------------------- /.github/workflows/tag.yml: -------------------------------------------------------------------------------- 1 | name: Tag syncs 2 | on: 3 | push: {branches: [master]} 4 | jobs: 5 | tag: 6 | runs-on: ubuntu-latest 7 | steps: 8 | - uses: actions/checkout@v2 9 | 10 | - name: Bump version and push tag 11 | uses: mathieudutour/github-tag-action@v4 12 | if: contains(github.event.head_commit.message, 'make gen') 13 | with: 14 | github_token: ${{ secrets.TAGGING_TOKEN }} # Triggers a workflow 15 | default_bump: minor 16 | tag_prefix: '' 17 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .rebar3 2 | _* 3 | .eunit 4 | *.o 5 | *.beam 6 | *.plt 7 | *.swp 8 | *.swo 9 | .erlang.cookie 10 | ebin 11 | log 12 | erl_crash.dump 13 | .rebar 14 | logs 15 | _build 16 | .idea 17 | *.iml 18 | 19 | kerl 20 | releases.txt 21 | include/internal_otp_vsn.hrl 22 | /otp_vsn_testing 23 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: erlang 2 | matrix: 3 | fast_finish: true 4 | include: # More reliable mapping than what docker/erlang:* provides 5 | - otp_release: 22.0 6 | env: _OTP_VSN=22.0.0 _OTP_VSN_M=22 _OTP_VSN_m=0 _OTP_VSN_P=0 7 | - otp_release: 20.3.7 8 | env: _OTP_VSN=20.3.7 _OTP_VSN_M=20 _OTP_VSN_m=3 _OTP_VSN_P=7 9 | - otp_release: 20.0 10 | env: _OTP_VSN=20.0.5 _OTP_VSN_M=20 _OTP_VSN_m=0 _OTP_VSN_P=5 11 | - otp_release: 19.3 12 | env: _OTP_VSN=19.3 _OTP_VSN_M=19 _OTP_VSN_m=3 _OTP_VSN_P=6 13 | - otp_release: 18.3 14 | env: _OTP_VSN=18.3.4 _OTP_VSN_M=18 _OTP_VSN_m=3 _OTP_VSN_P=4 15 | - otp_release: 18.2.1 16 | env: _OTP_VSN=18.2.1 _OTP_VSN_M=18 _OTP_VSN_m=2 _OTP_VSN_P=1 17 | - otp_release: 17.5 18 | env: _OTP_VSN=17.5.0 _OTP_VSN_M=17 _OTP_VSN_m=5 _OTP_VSN_P=0 19 | before_script: 20 | - curl -#fSLo ./rebar3 https://s3.amazonaws.com/rebar3/rebar3 21 | - chmod +x ./rebar3 22 | - ./rebar3 version 23 | script: 24 | - DEBUG=1 ./rebar3 eunit 25 | - | 26 | git clone --depth=1 https://github.com/fenollp/otp_vsn_testing.git 27 | cd otp_vsn_testing 28 | ./rebar3 do eunit,release 29 | ! [ -f include/internal_otp_vsn.hrl ] 30 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | Copyright 2018, Pierre Fenoll . 179 | 180 | Licensed under the Apache License, Version 2.0 (the "License"); 181 | you may not use this file except in compliance with the License. 182 | You may obtain a copy of the License at 183 | 184 | http://www.apache.org/licenses/LICENSE-2.0 185 | 186 | Unless required by applicable law or agreed to in writing, software 187 | distributed under the License is distributed on an "AS IS" BASIS, 188 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 189 | See the License for the specific language governing permissions and 190 | limitations under the License. 191 | 192 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | REBAR3 ?= rebar3 2 | RELEASES_TXT ?= releases.txt 3 | KERL = ./kerl 4 | GEN = ./gen 5 | KERL_URL ?= https://raw.githubusercontent.com/kerl/kerl/master/kerl 6 | TESTING = otp_vsn_testing 7 | 8 | .PHONY: gen clean fmt test 9 | all: gen 10 | $(REBAR3) eunit 11 | 12 | test: 13 | $(if $(wildcard $(TESTING)),,git clone --depth=1 https://github.com/fenollp/otp_vsn_testing.git $(TESTING)) 14 | cd otp_vsn_testing && $(REBAR3) do eunit,release 15 | 16 | $(KERL): 17 | curl -#fSLo $@ $(KERL_URL) && chmod +x $@ 18 | 19 | gen: $(KERL) 20 | KERL_BUILD_BACKEND=git $(KERL) update releases >$(RELEASES_TXT) 21 | $(GEN) $(RELEASES_TXT) 22 | @git status --porcelain 23 | @[ '0' = "$$(git status --porcelain | grep -F include/otp_vsn.hrl | wc -l)" ] 24 | 25 | clean: 26 | $(if $(wildcard $(KERL)),rm $(KERL)) 27 | $(if $(wildcard $(RELEASES_TXT)),rm $(RELEASES_TXT)) 28 | $(if $(wildcard _build/),rm -r _build/) 29 | 30 | FMT = _build/erlang-formatter-master/fmt.sh 31 | $(FMT): 32 | mkdir -p _build/ 33 | curl -f#SL 'https://codeload.github.com/fenollp/erlang-formatter/tar.gz/master' | tar xvz -C _build/ 34 | fmt: TO_FMT ?= . 35 | fmt: $(FMT) 36 | $(if $(TO_FMT), $(FMT) $(TO_FMT)) 37 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ARCHIVED: since it is not possible to auto publish new versions to hex.pm (with CI) I am no longer maintaining this project. 2 | If you want to continue it on: contact me for the publishing rights. 3 | 4 | # [otp_vsn](https://github.com/fenollp/otp_vsn) [![CircleCI](https://circleci.com/gh/fenollp/otp_vsn/tree/master.svg?style=svg)](https://circleci.com/gh/fenollp/otp_vsn/tree/master) [![TravisCI build status](https://travis-ci.org/fenollp/otp_vsn.svg?branch=master)](https://travis-ci.org/fenollp/otp_vsn) [![Hex pm](http://img.shields.io/hexpm/v/otp_vsn.svg?style=flat)](https://hex.pm/packages/otp_vsn) 5 | 6 | Macros defined per Erlang/OTP version so you don't have to. 7 | 8 | This saves you the copy/pasting/tweaking of [`erl_opts`'s `platform_define`](https://www.rebar3.org/docs/configuration#section-compilation). 9 | 10 | Header-only, no dependencies. Supports releases from `R16B01` to latest. 11 | 12 | Note: no need to include `otp_vsn` in your apps or releases. This should only be a compile-time dependency! 13 | 14 | ```erlang 15 | {deps, [{otp_vsn, "~>1.0"}]}. 16 | ``` 17 | 18 | ```erlang 19 | ... 20 | -include_lib("otp_vsn/include/otp_vsn.hrl"). 21 | ... 22 | -ifdef(OTP_VSN_HAS_MAPS). 23 | -ifndef(OTP_VSN_19_AND_ABOVE). 24 | ... something using maps and specific to OTP 17 or 18 but not 19 nor above ... 25 | -endif. 26 | -endif. 27 | ... 28 | ``` 29 | 30 | ## Macros 31 | 32 | Note: all macros introduced by `otp_vsn` are prefixed with `OTP_VSN` and in full caps. 33 | 34 | * **`?OTP_VSN`**: OTP version string in `MAJOR.MINOR.PATCH` format 35 | * Zeros are added where needed (e.g. `"16.1.0"` for R16B01) 36 | * Note on release candidates: 21.0-rc1 is expressed as `"21.0.0"`, same for 21.0-rc2 37 | * `?OTP_VSN_MAJOR`: above `MAJOR` part as an integer 38 | * `?OTP_VSN_MINOR`: above `MINOR` part as an integer 39 | * `?OTP_VSN_PATCH`: above `PATCH` part as an integer 40 | * `?OTP_VSN_MAJOR_STRING`: `?OTP_VSN_MAJOR` as a string 41 | * `?OTP_VSN_MINOR_STRING`: `?OTP_VSN_MINOR` as a string 42 | * `?OTP_VSN_PATCH_STRING`: `?OTP_VSN_PATCH` as a string 43 | * **`?OTP_VSN_{{MAJOR}}_AND_ABOVE`**: defined & set to `true` for `?OTP_VSN = "MAJOR.0.0"` and all later versions 44 | * e.g. for OTP 19.0 `?OTP_VSN_19_AND_ABOVE = true` 45 | * but on OTP 18.3 it is not defined 46 | * but on OTP 20.3 it is defined as well as `OTP_VSN_20_AND_ABOVE` 47 | * **`?OTP_VSN_HAS_MAPS`**: defined for releases which have maps (i.e. all since OTP 17.0) 48 | * **`?OTP_VSN_STACKTRACE`**, **`?OTP_VSN_HAS_ST_MATCHING`**, **`?OTP_VSN_IF_HAS_ST_MATCHING`**: see [stacktrace matching macros](#on-st-matching) 49 | 50 | If you'd like to see more macros you are welcome to 51 | * open an issue at https://github.com/fenollp/otp_vsn/issues 52 | * open a pull request at https://github.com/fenollp/otp_vsn/pulls 53 | 54 | 55 | ### On ST matching 56 | 57 | Since OTP 21 calls to `erlang:get_stacktrace/0` (`ST`) generate a compilation warning 58 | and `try...end` blocks have a new syntax to extract the same information: 59 | 60 | ```erlang 61 | try ... 62 | catch E:T:ST -> ... 63 | end 64 | ``` 65 | 66 | In order to compile without these warnings and be backwards compatible we introduce a couple macros: 67 | * **`?OTP_VSN_STACKTRACE(T,E,ST)`**: defined for all releases. The least annoying workaround by far IMO. 68 | * **`?OTP_VSN_IF_HAS_ST_MATCHING(Y)`**, **`?OTP_VSN_IF_HAS_ST_MATCHING(Y,N)`**: see below and [`test/has_st_matching_tests.erl`](/test/has_st_matching_tests.erl) 69 | * **`?OTP_VSN_HAS_ST_MATCHING`**: defined for releases which have that syntax (i.e. all since OTP 21.0) 70 | 71 | ```erlang 72 | catch 73 | %% Probably the one macro you're interested in: 74 | ?OTP_VSN_STACKTRACE(error, _, ST) 75 | begin f(ST), X end; 76 | %% Its equivalent: 77 | %% ?OTP_VSN_IF_HAS_ST_MATCHING( 78 | %% error:_:ST -> begin f(ST), X end; 79 | %% ,error:_ -> begin f(erlang:get_stacktrace()), X end; 80 | %% ) 81 | ?OTP_VSN_IF_HAS_ST_MATCHING(throw:only_matching:ST -> f(X,ST);) 82 | ?OTP_VSN_IF_HAS_ST_MATCHING(throw:b:ST -> f(X,ST);, throw:b -> f(X,erlang:get_stacktrace());) 83 | ?OTP_VSN_IF_HAS_ST_MATCHING(_:_:ST -> f(X, ST), 84 | _:_ -> f(X, erlang:get_stacktrace())) 85 | end 86 | ``` 87 | -------------------------------------------------------------------------------- /gen: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | # Generate include/otp_vsn.hrl from list of OTP releases 4 | # Usage: $0 releases_list.txt 5 | 6 | import re 7 | import sys 8 | 9 | if len(sys.argv) != 2: 10 | print('Usage:', sys.argv[0], 'releases_list.txt', file=sys.stderr) 11 | sys.exit(1) 12 | 13 | MIN_REL = 16 14 | COPYR = '''%% Copyright © 2018 Pierre Fenoll ‹pierrefenoll@gmail.com› 15 | %% See LICENSE for licensing information. 16 | %% -*- coding: utf-8 -*- 17 | %% Auto-generated file. See https://github.com/fenollp/otp_vsn 18 | ''' 19 | 20 | def unR(rel): 21 | if rel == 'R16B': 22 | return ('16', '0', '0') 23 | if rel == 'R16B01': 24 | return ('16', '1', '0') 25 | if rel == 'R16B02': 26 | return ('16', '2', '0') 27 | if rel == 'R16B03': 28 | return ('16', '3', '0') 29 | if rel == 'R16B03-1': 30 | return ('16', '3', '1') 31 | two_or_three = rel.split('.') 32 | if len(two_or_three) == 2: 33 | if '-' in two_or_three[1]: 34 | minor, _ = two_or_three[1].split('-') 35 | return (two_or_three[0], minor, '0') 36 | return tuple(two_or_three + ['0']) 37 | return tuple(two_or_three) 38 | 39 | regexp = re.compile(r'^(\d\d\.\d\d?(\.\d\d?|-rc\d)?|R16B(\d\d)?(\-\d)?)\n') 40 | with open(sys.argv[1], 'r') as fd: 41 | lines = fd.readlines() 42 | releases_set = set([unR(line.strip()) for line in lines if re.match(regexp, line)]) 43 | releases = sorted(list(releases_set)) 44 | print('Found', len(releases), 'releases') 45 | for (x,y,z) in releases: 46 | print(x, y, z) 47 | 48 | with open('./include/otp_vsn.hrl', 'w') as fd: 49 | fd.write(COPYR) 50 | fd.write('''-ifndef(_OTP_VSN_HRL). 51 | -define(_OTP_VSN_HRL, true). 52 | -include_lib("otp_vsn/include/internal_otp_vsn.hrl"). 53 | ''') 54 | for (x,y,z) in releases: 55 | fd.writelines( 56 | [''' 57 | -ifdef(_internal_otp_vsn_{x}_{y}_{z}). 58 | -define(OTP_VSN, "{x}.{y}.{z}"). 59 | -define(OTP_VSN_MAJOR, {x}). 60 | -define(OTP_VSN_MINOR, {y}). 61 | -define(OTP_VSN_PATCH, {z}). 62 | '''.format(x=x, y=y, z=z) 63 | ] + ['-define(OTP_VSN_{x}_AND_ABOVE, true).\n'.format(x=X) 64 | for X in reversed(range(MIN_REL, 1+int(x))) 65 | ] + ['''-endif. 66 | ''']) 67 | fd.write(''' 68 | %% integer_to_list(Literal) resolves at compile time. 69 | -define(OTP_VSN_MAJOR_STRING, integer_to_list(?OTP_VSN_MAJOR)). 70 | -define(OTP_VSN_MINOR_STRING, integer_to_list(?OTP_VSN_MINOR)). 71 | -define(OTP_VSN_PATCH_STRING, integer_to_list(?OTP_VSN_PATCH)). 72 | 73 | -ifdef(OTP_VSN_17_AND_ABOVE). 74 | -define(OTP_VSN_HAS_MAPS, true). 75 | -endif. 76 | 77 | -ifdef(OTP_VSN_21_AND_ABOVE). 78 | -define(OTP_VSN_HAS_ST_MATCHING, true). 79 | -define(OTP_VSN_IF_HAS_ST_MATCHING(Yes), Yes). 80 | -define(OTP_VSN_IF_HAS_ST_MATCHING(Yes, No), Yes). 81 | -define(OTP_VSN_STACKTRACE(Type, Error, ST), Type:Error:ST ->). 82 | -else. 83 | -define(OTP_VSN_IF_HAS_ST_MATCHING(Yes), ). 84 | -define(OTP_VSN_IF_HAS_ST_MATCHING(Yes, No), No). 85 | -define(OTP_VSN_STACKTRACE(Type, Error, ST), Type:Error -> ST = erlang:get_stacktrace(),). 86 | -endif. 87 | 88 | -endif. 89 | ''') 90 | -------------------------------------------------------------------------------- /include/otp_vsn.hrl: -------------------------------------------------------------------------------- 1 | %% Copyright © 2018 Pierre Fenoll ‹pierrefenoll@gmail.com› 2 | %% See LICENSE for licensing information. 3 | %% -*- coding: utf-8 -*- 4 | %% Auto-generated file. See https://github.com/fenollp/otp_vsn 5 | -ifndef(_OTP_VSN_HRL). 6 | -define(_OTP_VSN_HRL, true). 7 | -include_lib("otp_vsn/include/internal_otp_vsn.hrl"). 8 | 9 | -ifdef(_internal_otp_vsn_16_0_0). 10 | -define(OTP_VSN, "16.0.0"). 11 | -define(OTP_VSN_MAJOR, 16). 12 | -define(OTP_VSN_MINOR, 0). 13 | -define(OTP_VSN_PATCH, 0). 14 | -define(OTP_VSN_16_AND_ABOVE, true). 15 | -endif. 16 | 17 | -ifdef(_internal_otp_vsn_16_1_0). 18 | -define(OTP_VSN, "16.1.0"). 19 | -define(OTP_VSN_MAJOR, 16). 20 | -define(OTP_VSN_MINOR, 1). 21 | -define(OTP_VSN_PATCH, 0). 22 | -define(OTP_VSN_16_AND_ABOVE, true). 23 | -endif. 24 | 25 | -ifdef(_internal_otp_vsn_16_2_0). 26 | -define(OTP_VSN, "16.2.0"). 27 | -define(OTP_VSN_MAJOR, 16). 28 | -define(OTP_VSN_MINOR, 2). 29 | -define(OTP_VSN_PATCH, 0). 30 | -define(OTP_VSN_16_AND_ABOVE, true). 31 | -endif. 32 | 33 | -ifdef(_internal_otp_vsn_16_3_0). 34 | -define(OTP_VSN, "16.3.0"). 35 | -define(OTP_VSN_MAJOR, 16). 36 | -define(OTP_VSN_MINOR, 3). 37 | -define(OTP_VSN_PATCH, 0). 38 | -define(OTP_VSN_16_AND_ABOVE, true). 39 | -endif. 40 | 41 | -ifdef(_internal_otp_vsn_16_3_1). 42 | -define(OTP_VSN, "16.3.1"). 43 | -define(OTP_VSN_MAJOR, 16). 44 | -define(OTP_VSN_MINOR, 3). 45 | -define(OTP_VSN_PATCH, 1). 46 | -define(OTP_VSN_16_AND_ABOVE, true). 47 | -endif. 48 | 49 | -ifdef(_internal_otp_vsn_17_0_0). 50 | -define(OTP_VSN, "17.0.0"). 51 | -define(OTP_VSN_MAJOR, 17). 52 | -define(OTP_VSN_MINOR, 0). 53 | -define(OTP_VSN_PATCH, 0). 54 | -define(OTP_VSN_17_AND_ABOVE, true). 55 | -define(OTP_VSN_16_AND_ABOVE, true). 56 | -endif. 57 | 58 | -ifdef(_internal_otp_vsn_17_0_1). 59 | -define(OTP_VSN, "17.0.1"). 60 | -define(OTP_VSN_MAJOR, 17). 61 | -define(OTP_VSN_MINOR, 0). 62 | -define(OTP_VSN_PATCH, 1). 63 | -define(OTP_VSN_17_AND_ABOVE, true). 64 | -define(OTP_VSN_16_AND_ABOVE, true). 65 | -endif. 66 | 67 | -ifdef(_internal_otp_vsn_17_0_2). 68 | -define(OTP_VSN, "17.0.2"). 69 | -define(OTP_VSN_MAJOR, 17). 70 | -define(OTP_VSN_MINOR, 0). 71 | -define(OTP_VSN_PATCH, 2). 72 | -define(OTP_VSN_17_AND_ABOVE, true). 73 | -define(OTP_VSN_16_AND_ABOVE, true). 74 | -endif. 75 | 76 | -ifdef(_internal_otp_vsn_17_1_0). 77 | -define(OTP_VSN, "17.1.0"). 78 | -define(OTP_VSN_MAJOR, 17). 79 | -define(OTP_VSN_MINOR, 1). 80 | -define(OTP_VSN_PATCH, 0). 81 | -define(OTP_VSN_17_AND_ABOVE, true). 82 | -define(OTP_VSN_16_AND_ABOVE, true). 83 | -endif. 84 | 85 | -ifdef(_internal_otp_vsn_17_1_1). 86 | -define(OTP_VSN, "17.1.1"). 87 | -define(OTP_VSN_MAJOR, 17). 88 | -define(OTP_VSN_MINOR, 1). 89 | -define(OTP_VSN_PATCH, 1). 90 | -define(OTP_VSN_17_AND_ABOVE, true). 91 | -define(OTP_VSN_16_AND_ABOVE, true). 92 | -endif. 93 | 94 | -ifdef(_internal_otp_vsn_17_1_2). 95 | -define(OTP_VSN, "17.1.2"). 96 | -define(OTP_VSN_MAJOR, 17). 97 | -define(OTP_VSN_MINOR, 1). 98 | -define(OTP_VSN_PATCH, 2). 99 | -define(OTP_VSN_17_AND_ABOVE, true). 100 | -define(OTP_VSN_16_AND_ABOVE, true). 101 | -endif. 102 | 103 | -ifdef(_internal_otp_vsn_17_2_0). 104 | -define(OTP_VSN, "17.2.0"). 105 | -define(OTP_VSN_MAJOR, 17). 106 | -define(OTP_VSN_MINOR, 2). 107 | -define(OTP_VSN_PATCH, 0). 108 | -define(OTP_VSN_17_AND_ABOVE, true). 109 | -define(OTP_VSN_16_AND_ABOVE, true). 110 | -endif. 111 | 112 | -ifdef(_internal_otp_vsn_17_2_1). 113 | -define(OTP_VSN, "17.2.1"). 114 | -define(OTP_VSN_MAJOR, 17). 115 | -define(OTP_VSN_MINOR, 2). 116 | -define(OTP_VSN_PATCH, 1). 117 | -define(OTP_VSN_17_AND_ABOVE, true). 118 | -define(OTP_VSN_16_AND_ABOVE, true). 119 | -endif. 120 | 121 | -ifdef(_internal_otp_vsn_17_2_2). 122 | -define(OTP_VSN, "17.2.2"). 123 | -define(OTP_VSN_MAJOR, 17). 124 | -define(OTP_VSN_MINOR, 2). 125 | -define(OTP_VSN_PATCH, 2). 126 | -define(OTP_VSN_17_AND_ABOVE, true). 127 | -define(OTP_VSN_16_AND_ABOVE, true). 128 | -endif. 129 | 130 | -ifdef(_internal_otp_vsn_17_3_0). 131 | -define(OTP_VSN, "17.3.0"). 132 | -define(OTP_VSN_MAJOR, 17). 133 | -define(OTP_VSN_MINOR, 3). 134 | -define(OTP_VSN_PATCH, 0). 135 | -define(OTP_VSN_17_AND_ABOVE, true). 136 | -define(OTP_VSN_16_AND_ABOVE, true). 137 | -endif. 138 | 139 | -ifdef(_internal_otp_vsn_17_3_1). 140 | -define(OTP_VSN, "17.3.1"). 141 | -define(OTP_VSN_MAJOR, 17). 142 | -define(OTP_VSN_MINOR, 3). 143 | -define(OTP_VSN_PATCH, 1). 144 | -define(OTP_VSN_17_AND_ABOVE, true). 145 | -define(OTP_VSN_16_AND_ABOVE, true). 146 | -endif. 147 | 148 | -ifdef(_internal_otp_vsn_17_3_2). 149 | -define(OTP_VSN, "17.3.2"). 150 | -define(OTP_VSN_MAJOR, 17). 151 | -define(OTP_VSN_MINOR, 3). 152 | -define(OTP_VSN_PATCH, 2). 153 | -define(OTP_VSN_17_AND_ABOVE, true). 154 | -define(OTP_VSN_16_AND_ABOVE, true). 155 | -endif. 156 | 157 | -ifdef(_internal_otp_vsn_17_3_3). 158 | -define(OTP_VSN, "17.3.3"). 159 | -define(OTP_VSN_MAJOR, 17). 160 | -define(OTP_VSN_MINOR, 3). 161 | -define(OTP_VSN_PATCH, 3). 162 | -define(OTP_VSN_17_AND_ABOVE, true). 163 | -define(OTP_VSN_16_AND_ABOVE, true). 164 | -endif. 165 | 166 | -ifdef(_internal_otp_vsn_17_3_4). 167 | -define(OTP_VSN, "17.3.4"). 168 | -define(OTP_VSN_MAJOR, 17). 169 | -define(OTP_VSN_MINOR, 3). 170 | -define(OTP_VSN_PATCH, 4). 171 | -define(OTP_VSN_17_AND_ABOVE, true). 172 | -define(OTP_VSN_16_AND_ABOVE, true). 173 | -endif. 174 | 175 | -ifdef(_internal_otp_vsn_17_4_0). 176 | -define(OTP_VSN, "17.4.0"). 177 | -define(OTP_VSN_MAJOR, 17). 178 | -define(OTP_VSN_MINOR, 4). 179 | -define(OTP_VSN_PATCH, 0). 180 | -define(OTP_VSN_17_AND_ABOVE, true). 181 | -define(OTP_VSN_16_AND_ABOVE, true). 182 | -endif. 183 | 184 | -ifdef(_internal_otp_vsn_17_4_1). 185 | -define(OTP_VSN, "17.4.1"). 186 | -define(OTP_VSN_MAJOR, 17). 187 | -define(OTP_VSN_MINOR, 4). 188 | -define(OTP_VSN_PATCH, 1). 189 | -define(OTP_VSN_17_AND_ABOVE, true). 190 | -define(OTP_VSN_16_AND_ABOVE, true). 191 | -endif. 192 | 193 | -ifdef(_internal_otp_vsn_17_5_0). 194 | -define(OTP_VSN, "17.5.0"). 195 | -define(OTP_VSN_MAJOR, 17). 196 | -define(OTP_VSN_MINOR, 5). 197 | -define(OTP_VSN_PATCH, 0). 198 | -define(OTP_VSN_17_AND_ABOVE, true). 199 | -define(OTP_VSN_16_AND_ABOVE, true). 200 | -endif. 201 | 202 | -ifdef(_internal_otp_vsn_17_5_1). 203 | -define(OTP_VSN, "17.5.1"). 204 | -define(OTP_VSN_MAJOR, 17). 205 | -define(OTP_VSN_MINOR, 5). 206 | -define(OTP_VSN_PATCH, 1). 207 | -define(OTP_VSN_17_AND_ABOVE, true). 208 | -define(OTP_VSN_16_AND_ABOVE, true). 209 | -endif. 210 | 211 | -ifdef(_internal_otp_vsn_17_5_2). 212 | -define(OTP_VSN, "17.5.2"). 213 | -define(OTP_VSN_MAJOR, 17). 214 | -define(OTP_VSN_MINOR, 5). 215 | -define(OTP_VSN_PATCH, 2). 216 | -define(OTP_VSN_17_AND_ABOVE, true). 217 | -define(OTP_VSN_16_AND_ABOVE, true). 218 | -endif. 219 | 220 | -ifdef(_internal_otp_vsn_17_5_3). 221 | -define(OTP_VSN, "17.5.3"). 222 | -define(OTP_VSN_MAJOR, 17). 223 | -define(OTP_VSN_MINOR, 5). 224 | -define(OTP_VSN_PATCH, 3). 225 | -define(OTP_VSN_17_AND_ABOVE, true). 226 | -define(OTP_VSN_16_AND_ABOVE, true). 227 | -endif. 228 | 229 | -ifdef(_internal_otp_vsn_17_5_4). 230 | -define(OTP_VSN, "17.5.4"). 231 | -define(OTP_VSN_MAJOR, 17). 232 | -define(OTP_VSN_MINOR, 5). 233 | -define(OTP_VSN_PATCH, 4). 234 | -define(OTP_VSN_17_AND_ABOVE, true). 235 | -define(OTP_VSN_16_AND_ABOVE, true). 236 | -endif. 237 | 238 | -ifdef(_internal_otp_vsn_17_5_5). 239 | -define(OTP_VSN, "17.5.5"). 240 | -define(OTP_VSN_MAJOR, 17). 241 | -define(OTP_VSN_MINOR, 5). 242 | -define(OTP_VSN_PATCH, 5). 243 | -define(OTP_VSN_17_AND_ABOVE, true). 244 | -define(OTP_VSN_16_AND_ABOVE, true). 245 | -endif. 246 | 247 | -ifdef(_internal_otp_vsn_17_5_6). 248 | -define(OTP_VSN, "17.5.6"). 249 | -define(OTP_VSN_MAJOR, 17). 250 | -define(OTP_VSN_MINOR, 5). 251 | -define(OTP_VSN_PATCH, 6). 252 | -define(OTP_VSN_17_AND_ABOVE, true). 253 | -define(OTP_VSN_16_AND_ABOVE, true). 254 | -endif. 255 | 256 | -ifdef(_internal_otp_vsn_18_0_0). 257 | -define(OTP_VSN, "18.0.0"). 258 | -define(OTP_VSN_MAJOR, 18). 259 | -define(OTP_VSN_MINOR, 0). 260 | -define(OTP_VSN_PATCH, 0). 261 | -define(OTP_VSN_18_AND_ABOVE, true). 262 | -define(OTP_VSN_17_AND_ABOVE, true). 263 | -define(OTP_VSN_16_AND_ABOVE, true). 264 | -endif. 265 | 266 | -ifdef(_internal_otp_vsn_18_0_1). 267 | -define(OTP_VSN, "18.0.1"). 268 | -define(OTP_VSN_MAJOR, 18). 269 | -define(OTP_VSN_MINOR, 0). 270 | -define(OTP_VSN_PATCH, 1). 271 | -define(OTP_VSN_18_AND_ABOVE, true). 272 | -define(OTP_VSN_17_AND_ABOVE, true). 273 | -define(OTP_VSN_16_AND_ABOVE, true). 274 | -endif. 275 | 276 | -ifdef(_internal_otp_vsn_18_0_2). 277 | -define(OTP_VSN, "18.0.2"). 278 | -define(OTP_VSN_MAJOR, 18). 279 | -define(OTP_VSN_MINOR, 0). 280 | -define(OTP_VSN_PATCH, 2). 281 | -define(OTP_VSN_18_AND_ABOVE, true). 282 | -define(OTP_VSN_17_AND_ABOVE, true). 283 | -define(OTP_VSN_16_AND_ABOVE, true). 284 | -endif. 285 | 286 | -ifdef(_internal_otp_vsn_18_0_3). 287 | -define(OTP_VSN, "18.0.3"). 288 | -define(OTP_VSN_MAJOR, 18). 289 | -define(OTP_VSN_MINOR, 0). 290 | -define(OTP_VSN_PATCH, 3). 291 | -define(OTP_VSN_18_AND_ABOVE, true). 292 | -define(OTP_VSN_17_AND_ABOVE, true). 293 | -define(OTP_VSN_16_AND_ABOVE, true). 294 | -endif. 295 | 296 | -ifdef(_internal_otp_vsn_18_1_0). 297 | -define(OTP_VSN, "18.1.0"). 298 | -define(OTP_VSN_MAJOR, 18). 299 | -define(OTP_VSN_MINOR, 1). 300 | -define(OTP_VSN_PATCH, 0). 301 | -define(OTP_VSN_18_AND_ABOVE, true). 302 | -define(OTP_VSN_17_AND_ABOVE, true). 303 | -define(OTP_VSN_16_AND_ABOVE, true). 304 | -endif. 305 | 306 | -ifdef(_internal_otp_vsn_18_1_1). 307 | -define(OTP_VSN, "18.1.1"). 308 | -define(OTP_VSN_MAJOR, 18). 309 | -define(OTP_VSN_MINOR, 1). 310 | -define(OTP_VSN_PATCH, 1). 311 | -define(OTP_VSN_18_AND_ABOVE, true). 312 | -define(OTP_VSN_17_AND_ABOVE, true). 313 | -define(OTP_VSN_16_AND_ABOVE, true). 314 | -endif. 315 | 316 | -ifdef(_internal_otp_vsn_18_1_2). 317 | -define(OTP_VSN, "18.1.2"). 318 | -define(OTP_VSN_MAJOR, 18). 319 | -define(OTP_VSN_MINOR, 1). 320 | -define(OTP_VSN_PATCH, 2). 321 | -define(OTP_VSN_18_AND_ABOVE, true). 322 | -define(OTP_VSN_17_AND_ABOVE, true). 323 | -define(OTP_VSN_16_AND_ABOVE, true). 324 | -endif. 325 | 326 | -ifdef(_internal_otp_vsn_18_1_3). 327 | -define(OTP_VSN, "18.1.3"). 328 | -define(OTP_VSN_MAJOR, 18). 329 | -define(OTP_VSN_MINOR, 1). 330 | -define(OTP_VSN_PATCH, 3). 331 | -define(OTP_VSN_18_AND_ABOVE, true). 332 | -define(OTP_VSN_17_AND_ABOVE, true). 333 | -define(OTP_VSN_16_AND_ABOVE, true). 334 | -endif. 335 | 336 | -ifdef(_internal_otp_vsn_18_1_4). 337 | -define(OTP_VSN, "18.1.4"). 338 | -define(OTP_VSN_MAJOR, 18). 339 | -define(OTP_VSN_MINOR, 1). 340 | -define(OTP_VSN_PATCH, 4). 341 | -define(OTP_VSN_18_AND_ABOVE, true). 342 | -define(OTP_VSN_17_AND_ABOVE, true). 343 | -define(OTP_VSN_16_AND_ABOVE, true). 344 | -endif. 345 | 346 | -ifdef(_internal_otp_vsn_18_1_5). 347 | -define(OTP_VSN, "18.1.5"). 348 | -define(OTP_VSN_MAJOR, 18). 349 | -define(OTP_VSN_MINOR, 1). 350 | -define(OTP_VSN_PATCH, 5). 351 | -define(OTP_VSN_18_AND_ABOVE, true). 352 | -define(OTP_VSN_17_AND_ABOVE, true). 353 | -define(OTP_VSN_16_AND_ABOVE, true). 354 | -endif. 355 | 356 | -ifdef(_internal_otp_vsn_18_2_0). 357 | -define(OTP_VSN, "18.2.0"). 358 | -define(OTP_VSN_MAJOR, 18). 359 | -define(OTP_VSN_MINOR, 2). 360 | -define(OTP_VSN_PATCH, 0). 361 | -define(OTP_VSN_18_AND_ABOVE, true). 362 | -define(OTP_VSN_17_AND_ABOVE, true). 363 | -define(OTP_VSN_16_AND_ABOVE, true). 364 | -endif. 365 | 366 | -ifdef(_internal_otp_vsn_18_2_1). 367 | -define(OTP_VSN, "18.2.1"). 368 | -define(OTP_VSN_MAJOR, 18). 369 | -define(OTP_VSN_MINOR, 2). 370 | -define(OTP_VSN_PATCH, 1). 371 | -define(OTP_VSN_18_AND_ABOVE, true). 372 | -define(OTP_VSN_17_AND_ABOVE, true). 373 | -define(OTP_VSN_16_AND_ABOVE, true). 374 | -endif. 375 | 376 | -ifdef(_internal_otp_vsn_18_2_2). 377 | -define(OTP_VSN, "18.2.2"). 378 | -define(OTP_VSN_MAJOR, 18). 379 | -define(OTP_VSN_MINOR, 2). 380 | -define(OTP_VSN_PATCH, 2). 381 | -define(OTP_VSN_18_AND_ABOVE, true). 382 | -define(OTP_VSN_17_AND_ABOVE, true). 383 | -define(OTP_VSN_16_AND_ABOVE, true). 384 | -endif. 385 | 386 | -ifdef(_internal_otp_vsn_18_2_3). 387 | -define(OTP_VSN, "18.2.3"). 388 | -define(OTP_VSN_MAJOR, 18). 389 | -define(OTP_VSN_MINOR, 2). 390 | -define(OTP_VSN_PATCH, 3). 391 | -define(OTP_VSN_18_AND_ABOVE, true). 392 | -define(OTP_VSN_17_AND_ABOVE, true). 393 | -define(OTP_VSN_16_AND_ABOVE, true). 394 | -endif. 395 | 396 | -ifdef(_internal_otp_vsn_18_2_4). 397 | -define(OTP_VSN, "18.2.4"). 398 | -define(OTP_VSN_MAJOR, 18). 399 | -define(OTP_VSN_MINOR, 2). 400 | -define(OTP_VSN_PATCH, 4). 401 | -define(OTP_VSN_18_AND_ABOVE, true). 402 | -define(OTP_VSN_17_AND_ABOVE, true). 403 | -define(OTP_VSN_16_AND_ABOVE, true). 404 | -endif. 405 | 406 | -ifdef(_internal_otp_vsn_18_3_0). 407 | -define(OTP_VSN, "18.3.0"). 408 | -define(OTP_VSN_MAJOR, 18). 409 | -define(OTP_VSN_MINOR, 3). 410 | -define(OTP_VSN_PATCH, 0). 411 | -define(OTP_VSN_18_AND_ABOVE, true). 412 | -define(OTP_VSN_17_AND_ABOVE, true). 413 | -define(OTP_VSN_16_AND_ABOVE, true). 414 | -endif. 415 | 416 | -ifdef(_internal_otp_vsn_18_3_1). 417 | -define(OTP_VSN, "18.3.1"). 418 | -define(OTP_VSN_MAJOR, 18). 419 | -define(OTP_VSN_MINOR, 3). 420 | -define(OTP_VSN_PATCH, 1). 421 | -define(OTP_VSN_18_AND_ABOVE, true). 422 | -define(OTP_VSN_17_AND_ABOVE, true). 423 | -define(OTP_VSN_16_AND_ABOVE, true). 424 | -endif. 425 | 426 | -ifdef(_internal_otp_vsn_18_3_2). 427 | -define(OTP_VSN, "18.3.2"). 428 | -define(OTP_VSN_MAJOR, 18). 429 | -define(OTP_VSN_MINOR, 3). 430 | -define(OTP_VSN_PATCH, 2). 431 | -define(OTP_VSN_18_AND_ABOVE, true). 432 | -define(OTP_VSN_17_AND_ABOVE, true). 433 | -define(OTP_VSN_16_AND_ABOVE, true). 434 | -endif. 435 | 436 | -ifdef(_internal_otp_vsn_18_3_3). 437 | -define(OTP_VSN, "18.3.3"). 438 | -define(OTP_VSN_MAJOR, 18). 439 | -define(OTP_VSN_MINOR, 3). 440 | -define(OTP_VSN_PATCH, 3). 441 | -define(OTP_VSN_18_AND_ABOVE, true). 442 | -define(OTP_VSN_17_AND_ABOVE, true). 443 | -define(OTP_VSN_16_AND_ABOVE, true). 444 | -endif. 445 | 446 | -ifdef(_internal_otp_vsn_18_3_4). 447 | -define(OTP_VSN, "18.3.4"). 448 | -define(OTP_VSN_MAJOR, 18). 449 | -define(OTP_VSN_MINOR, 3). 450 | -define(OTP_VSN_PATCH, 4). 451 | -define(OTP_VSN_18_AND_ABOVE, true). 452 | -define(OTP_VSN_17_AND_ABOVE, true). 453 | -define(OTP_VSN_16_AND_ABOVE, true). 454 | -endif. 455 | 456 | -ifdef(_internal_otp_vsn_19_0_0). 457 | -define(OTP_VSN, "19.0.0"). 458 | -define(OTP_VSN_MAJOR, 19). 459 | -define(OTP_VSN_MINOR, 0). 460 | -define(OTP_VSN_PATCH, 0). 461 | -define(OTP_VSN_19_AND_ABOVE, true). 462 | -define(OTP_VSN_18_AND_ABOVE, true). 463 | -define(OTP_VSN_17_AND_ABOVE, true). 464 | -define(OTP_VSN_16_AND_ABOVE, true). 465 | -endif. 466 | 467 | -ifdef(_internal_otp_vsn_19_0_1). 468 | -define(OTP_VSN, "19.0.1"). 469 | -define(OTP_VSN_MAJOR, 19). 470 | -define(OTP_VSN_MINOR, 0). 471 | -define(OTP_VSN_PATCH, 1). 472 | -define(OTP_VSN_19_AND_ABOVE, true). 473 | -define(OTP_VSN_18_AND_ABOVE, true). 474 | -define(OTP_VSN_17_AND_ABOVE, true). 475 | -define(OTP_VSN_16_AND_ABOVE, true). 476 | -endif. 477 | 478 | -ifdef(_internal_otp_vsn_19_0_2). 479 | -define(OTP_VSN, "19.0.2"). 480 | -define(OTP_VSN_MAJOR, 19). 481 | -define(OTP_VSN_MINOR, 0). 482 | -define(OTP_VSN_PATCH, 2). 483 | -define(OTP_VSN_19_AND_ABOVE, true). 484 | -define(OTP_VSN_18_AND_ABOVE, true). 485 | -define(OTP_VSN_17_AND_ABOVE, true). 486 | -define(OTP_VSN_16_AND_ABOVE, true). 487 | -endif. 488 | 489 | -ifdef(_internal_otp_vsn_19_0_3). 490 | -define(OTP_VSN, "19.0.3"). 491 | -define(OTP_VSN_MAJOR, 19). 492 | -define(OTP_VSN_MINOR, 0). 493 | -define(OTP_VSN_PATCH, 3). 494 | -define(OTP_VSN_19_AND_ABOVE, true). 495 | -define(OTP_VSN_18_AND_ABOVE, true). 496 | -define(OTP_VSN_17_AND_ABOVE, true). 497 | -define(OTP_VSN_16_AND_ABOVE, true). 498 | -endif. 499 | 500 | -ifdef(_internal_otp_vsn_19_0_4). 501 | -define(OTP_VSN, "19.0.4"). 502 | -define(OTP_VSN_MAJOR, 19). 503 | -define(OTP_VSN_MINOR, 0). 504 | -define(OTP_VSN_PATCH, 4). 505 | -define(OTP_VSN_19_AND_ABOVE, true). 506 | -define(OTP_VSN_18_AND_ABOVE, true). 507 | -define(OTP_VSN_17_AND_ABOVE, true). 508 | -define(OTP_VSN_16_AND_ABOVE, true). 509 | -endif. 510 | 511 | -ifdef(_internal_otp_vsn_19_0_5). 512 | -define(OTP_VSN, "19.0.5"). 513 | -define(OTP_VSN_MAJOR, 19). 514 | -define(OTP_VSN_MINOR, 0). 515 | -define(OTP_VSN_PATCH, 5). 516 | -define(OTP_VSN_19_AND_ABOVE, true). 517 | -define(OTP_VSN_18_AND_ABOVE, true). 518 | -define(OTP_VSN_17_AND_ABOVE, true). 519 | -define(OTP_VSN_16_AND_ABOVE, true). 520 | -endif. 521 | 522 | -ifdef(_internal_otp_vsn_19_0_6). 523 | -define(OTP_VSN, "19.0.6"). 524 | -define(OTP_VSN_MAJOR, 19). 525 | -define(OTP_VSN_MINOR, 0). 526 | -define(OTP_VSN_PATCH, 6). 527 | -define(OTP_VSN_19_AND_ABOVE, true). 528 | -define(OTP_VSN_18_AND_ABOVE, true). 529 | -define(OTP_VSN_17_AND_ABOVE, true). 530 | -define(OTP_VSN_16_AND_ABOVE, true). 531 | -endif. 532 | 533 | -ifdef(_internal_otp_vsn_19_0_7). 534 | -define(OTP_VSN, "19.0.7"). 535 | -define(OTP_VSN_MAJOR, 19). 536 | -define(OTP_VSN_MINOR, 0). 537 | -define(OTP_VSN_PATCH, 7). 538 | -define(OTP_VSN_19_AND_ABOVE, true). 539 | -define(OTP_VSN_18_AND_ABOVE, true). 540 | -define(OTP_VSN_17_AND_ABOVE, true). 541 | -define(OTP_VSN_16_AND_ABOVE, true). 542 | -endif. 543 | 544 | -ifdef(_internal_otp_vsn_19_1_0). 545 | -define(OTP_VSN, "19.1.0"). 546 | -define(OTP_VSN_MAJOR, 19). 547 | -define(OTP_VSN_MINOR, 1). 548 | -define(OTP_VSN_PATCH, 0). 549 | -define(OTP_VSN_19_AND_ABOVE, true). 550 | -define(OTP_VSN_18_AND_ABOVE, true). 551 | -define(OTP_VSN_17_AND_ABOVE, true). 552 | -define(OTP_VSN_16_AND_ABOVE, true). 553 | -endif. 554 | 555 | -ifdef(_internal_otp_vsn_19_1_1). 556 | -define(OTP_VSN, "19.1.1"). 557 | -define(OTP_VSN_MAJOR, 19). 558 | -define(OTP_VSN_MINOR, 1). 559 | -define(OTP_VSN_PATCH, 1). 560 | -define(OTP_VSN_19_AND_ABOVE, true). 561 | -define(OTP_VSN_18_AND_ABOVE, true). 562 | -define(OTP_VSN_17_AND_ABOVE, true). 563 | -define(OTP_VSN_16_AND_ABOVE, true). 564 | -endif. 565 | 566 | -ifdef(_internal_otp_vsn_19_1_2). 567 | -define(OTP_VSN, "19.1.2"). 568 | -define(OTP_VSN_MAJOR, 19). 569 | -define(OTP_VSN_MINOR, 1). 570 | -define(OTP_VSN_PATCH, 2). 571 | -define(OTP_VSN_19_AND_ABOVE, true). 572 | -define(OTP_VSN_18_AND_ABOVE, true). 573 | -define(OTP_VSN_17_AND_ABOVE, true). 574 | -define(OTP_VSN_16_AND_ABOVE, true). 575 | -endif. 576 | 577 | -ifdef(_internal_otp_vsn_19_1_3). 578 | -define(OTP_VSN, "19.1.3"). 579 | -define(OTP_VSN_MAJOR, 19). 580 | -define(OTP_VSN_MINOR, 1). 581 | -define(OTP_VSN_PATCH, 3). 582 | -define(OTP_VSN_19_AND_ABOVE, true). 583 | -define(OTP_VSN_18_AND_ABOVE, true). 584 | -define(OTP_VSN_17_AND_ABOVE, true). 585 | -define(OTP_VSN_16_AND_ABOVE, true). 586 | -endif. 587 | 588 | -ifdef(_internal_otp_vsn_19_1_4). 589 | -define(OTP_VSN, "19.1.4"). 590 | -define(OTP_VSN_MAJOR, 19). 591 | -define(OTP_VSN_MINOR, 1). 592 | -define(OTP_VSN_PATCH, 4). 593 | -define(OTP_VSN_19_AND_ABOVE, true). 594 | -define(OTP_VSN_18_AND_ABOVE, true). 595 | -define(OTP_VSN_17_AND_ABOVE, true). 596 | -define(OTP_VSN_16_AND_ABOVE, true). 597 | -endif. 598 | 599 | -ifdef(_internal_otp_vsn_19_1_5). 600 | -define(OTP_VSN, "19.1.5"). 601 | -define(OTP_VSN_MAJOR, 19). 602 | -define(OTP_VSN_MINOR, 1). 603 | -define(OTP_VSN_PATCH, 5). 604 | -define(OTP_VSN_19_AND_ABOVE, true). 605 | -define(OTP_VSN_18_AND_ABOVE, true). 606 | -define(OTP_VSN_17_AND_ABOVE, true). 607 | -define(OTP_VSN_16_AND_ABOVE, true). 608 | -endif. 609 | 610 | -ifdef(_internal_otp_vsn_19_1_6). 611 | -define(OTP_VSN, "19.1.6"). 612 | -define(OTP_VSN_MAJOR, 19). 613 | -define(OTP_VSN_MINOR, 1). 614 | -define(OTP_VSN_PATCH, 6). 615 | -define(OTP_VSN_19_AND_ABOVE, true). 616 | -define(OTP_VSN_18_AND_ABOVE, true). 617 | -define(OTP_VSN_17_AND_ABOVE, true). 618 | -define(OTP_VSN_16_AND_ABOVE, true). 619 | -endif. 620 | 621 | -ifdef(_internal_otp_vsn_19_2_0). 622 | -define(OTP_VSN, "19.2.0"). 623 | -define(OTP_VSN_MAJOR, 19). 624 | -define(OTP_VSN_MINOR, 2). 625 | -define(OTP_VSN_PATCH, 0). 626 | -define(OTP_VSN_19_AND_ABOVE, true). 627 | -define(OTP_VSN_18_AND_ABOVE, true). 628 | -define(OTP_VSN_17_AND_ABOVE, true). 629 | -define(OTP_VSN_16_AND_ABOVE, true). 630 | -endif. 631 | 632 | -ifdef(_internal_otp_vsn_19_2_1). 633 | -define(OTP_VSN, "19.2.1"). 634 | -define(OTP_VSN_MAJOR, 19). 635 | -define(OTP_VSN_MINOR, 2). 636 | -define(OTP_VSN_PATCH, 1). 637 | -define(OTP_VSN_19_AND_ABOVE, true). 638 | -define(OTP_VSN_18_AND_ABOVE, true). 639 | -define(OTP_VSN_17_AND_ABOVE, true). 640 | -define(OTP_VSN_16_AND_ABOVE, true). 641 | -endif. 642 | 643 | -ifdef(_internal_otp_vsn_19_2_2). 644 | -define(OTP_VSN, "19.2.2"). 645 | -define(OTP_VSN_MAJOR, 19). 646 | -define(OTP_VSN_MINOR, 2). 647 | -define(OTP_VSN_PATCH, 2). 648 | -define(OTP_VSN_19_AND_ABOVE, true). 649 | -define(OTP_VSN_18_AND_ABOVE, true). 650 | -define(OTP_VSN_17_AND_ABOVE, true). 651 | -define(OTP_VSN_16_AND_ABOVE, true). 652 | -endif. 653 | 654 | -ifdef(_internal_otp_vsn_19_2_3). 655 | -define(OTP_VSN, "19.2.3"). 656 | -define(OTP_VSN_MAJOR, 19). 657 | -define(OTP_VSN_MINOR, 2). 658 | -define(OTP_VSN_PATCH, 3). 659 | -define(OTP_VSN_19_AND_ABOVE, true). 660 | -define(OTP_VSN_18_AND_ABOVE, true). 661 | -define(OTP_VSN_17_AND_ABOVE, true). 662 | -define(OTP_VSN_16_AND_ABOVE, true). 663 | -endif. 664 | 665 | -ifdef(_internal_otp_vsn_19_3_0). 666 | -define(OTP_VSN, "19.3.0"). 667 | -define(OTP_VSN_MAJOR, 19). 668 | -define(OTP_VSN_MINOR, 3). 669 | -define(OTP_VSN_PATCH, 0). 670 | -define(OTP_VSN_19_AND_ABOVE, true). 671 | -define(OTP_VSN_18_AND_ABOVE, true). 672 | -define(OTP_VSN_17_AND_ABOVE, true). 673 | -define(OTP_VSN_16_AND_ABOVE, true). 674 | -endif. 675 | 676 | -ifdef(_internal_otp_vsn_19_3_1). 677 | -define(OTP_VSN, "19.3.1"). 678 | -define(OTP_VSN_MAJOR, 19). 679 | -define(OTP_VSN_MINOR, 3). 680 | -define(OTP_VSN_PATCH, 1). 681 | -define(OTP_VSN_19_AND_ABOVE, true). 682 | -define(OTP_VSN_18_AND_ABOVE, true). 683 | -define(OTP_VSN_17_AND_ABOVE, true). 684 | -define(OTP_VSN_16_AND_ABOVE, true). 685 | -endif. 686 | 687 | -ifdef(_internal_otp_vsn_19_3_2). 688 | -define(OTP_VSN, "19.3.2"). 689 | -define(OTP_VSN_MAJOR, 19). 690 | -define(OTP_VSN_MINOR, 3). 691 | -define(OTP_VSN_PATCH, 2). 692 | -define(OTP_VSN_19_AND_ABOVE, true). 693 | -define(OTP_VSN_18_AND_ABOVE, true). 694 | -define(OTP_VSN_17_AND_ABOVE, true). 695 | -define(OTP_VSN_16_AND_ABOVE, true). 696 | -endif. 697 | 698 | -ifdef(_internal_otp_vsn_19_3_3). 699 | -define(OTP_VSN, "19.3.3"). 700 | -define(OTP_VSN_MAJOR, 19). 701 | -define(OTP_VSN_MINOR, 3). 702 | -define(OTP_VSN_PATCH, 3). 703 | -define(OTP_VSN_19_AND_ABOVE, true). 704 | -define(OTP_VSN_18_AND_ABOVE, true). 705 | -define(OTP_VSN_17_AND_ABOVE, true). 706 | -define(OTP_VSN_16_AND_ABOVE, true). 707 | -endif. 708 | 709 | -ifdef(_internal_otp_vsn_19_3_4). 710 | -define(OTP_VSN, "19.3.4"). 711 | -define(OTP_VSN_MAJOR, 19). 712 | -define(OTP_VSN_MINOR, 3). 713 | -define(OTP_VSN_PATCH, 4). 714 | -define(OTP_VSN_19_AND_ABOVE, true). 715 | -define(OTP_VSN_18_AND_ABOVE, true). 716 | -define(OTP_VSN_17_AND_ABOVE, true). 717 | -define(OTP_VSN_16_AND_ABOVE, true). 718 | -endif. 719 | 720 | -ifdef(_internal_otp_vsn_19_3_5). 721 | -define(OTP_VSN, "19.3.5"). 722 | -define(OTP_VSN_MAJOR, 19). 723 | -define(OTP_VSN_MINOR, 3). 724 | -define(OTP_VSN_PATCH, 5). 725 | -define(OTP_VSN_19_AND_ABOVE, true). 726 | -define(OTP_VSN_18_AND_ABOVE, true). 727 | -define(OTP_VSN_17_AND_ABOVE, true). 728 | -define(OTP_VSN_16_AND_ABOVE, true). 729 | -endif. 730 | 731 | -ifdef(_internal_otp_vsn_19_3_6). 732 | -define(OTP_VSN, "19.3.6"). 733 | -define(OTP_VSN_MAJOR, 19). 734 | -define(OTP_VSN_MINOR, 3). 735 | -define(OTP_VSN_PATCH, 6). 736 | -define(OTP_VSN_19_AND_ABOVE, true). 737 | -define(OTP_VSN_18_AND_ABOVE, true). 738 | -define(OTP_VSN_17_AND_ABOVE, true). 739 | -define(OTP_VSN_16_AND_ABOVE, true). 740 | -endif. 741 | 742 | -ifdef(_internal_otp_vsn_20_0_0). 743 | -define(OTP_VSN, "20.0.0"). 744 | -define(OTP_VSN_MAJOR, 20). 745 | -define(OTP_VSN_MINOR, 0). 746 | -define(OTP_VSN_PATCH, 0). 747 | -define(OTP_VSN_20_AND_ABOVE, true). 748 | -define(OTP_VSN_19_AND_ABOVE, true). 749 | -define(OTP_VSN_18_AND_ABOVE, true). 750 | -define(OTP_VSN_17_AND_ABOVE, true). 751 | -define(OTP_VSN_16_AND_ABOVE, true). 752 | -endif. 753 | 754 | -ifdef(_internal_otp_vsn_20_0_1). 755 | -define(OTP_VSN, "20.0.1"). 756 | -define(OTP_VSN_MAJOR, 20). 757 | -define(OTP_VSN_MINOR, 0). 758 | -define(OTP_VSN_PATCH, 1). 759 | -define(OTP_VSN_20_AND_ABOVE, true). 760 | -define(OTP_VSN_19_AND_ABOVE, true). 761 | -define(OTP_VSN_18_AND_ABOVE, true). 762 | -define(OTP_VSN_17_AND_ABOVE, true). 763 | -define(OTP_VSN_16_AND_ABOVE, true). 764 | -endif. 765 | 766 | -ifdef(_internal_otp_vsn_20_0_2). 767 | -define(OTP_VSN, "20.0.2"). 768 | -define(OTP_VSN_MAJOR, 20). 769 | -define(OTP_VSN_MINOR, 0). 770 | -define(OTP_VSN_PATCH, 2). 771 | -define(OTP_VSN_20_AND_ABOVE, true). 772 | -define(OTP_VSN_19_AND_ABOVE, true). 773 | -define(OTP_VSN_18_AND_ABOVE, true). 774 | -define(OTP_VSN_17_AND_ABOVE, true). 775 | -define(OTP_VSN_16_AND_ABOVE, true). 776 | -endif. 777 | 778 | -ifdef(_internal_otp_vsn_20_0_3). 779 | -define(OTP_VSN, "20.0.3"). 780 | -define(OTP_VSN_MAJOR, 20). 781 | -define(OTP_VSN_MINOR, 0). 782 | -define(OTP_VSN_PATCH, 3). 783 | -define(OTP_VSN_20_AND_ABOVE, true). 784 | -define(OTP_VSN_19_AND_ABOVE, true). 785 | -define(OTP_VSN_18_AND_ABOVE, true). 786 | -define(OTP_VSN_17_AND_ABOVE, true). 787 | -define(OTP_VSN_16_AND_ABOVE, true). 788 | -endif. 789 | 790 | -ifdef(_internal_otp_vsn_20_0_4). 791 | -define(OTP_VSN, "20.0.4"). 792 | -define(OTP_VSN_MAJOR, 20). 793 | -define(OTP_VSN_MINOR, 0). 794 | -define(OTP_VSN_PATCH, 4). 795 | -define(OTP_VSN_20_AND_ABOVE, true). 796 | -define(OTP_VSN_19_AND_ABOVE, true). 797 | -define(OTP_VSN_18_AND_ABOVE, true). 798 | -define(OTP_VSN_17_AND_ABOVE, true). 799 | -define(OTP_VSN_16_AND_ABOVE, true). 800 | -endif. 801 | 802 | -ifdef(_internal_otp_vsn_20_0_5). 803 | -define(OTP_VSN, "20.0.5"). 804 | -define(OTP_VSN_MAJOR, 20). 805 | -define(OTP_VSN_MINOR, 0). 806 | -define(OTP_VSN_PATCH, 5). 807 | -define(OTP_VSN_20_AND_ABOVE, true). 808 | -define(OTP_VSN_19_AND_ABOVE, true). 809 | -define(OTP_VSN_18_AND_ABOVE, true). 810 | -define(OTP_VSN_17_AND_ABOVE, true). 811 | -define(OTP_VSN_16_AND_ABOVE, true). 812 | -endif. 813 | 814 | -ifdef(_internal_otp_vsn_20_1_0). 815 | -define(OTP_VSN, "20.1.0"). 816 | -define(OTP_VSN_MAJOR, 20). 817 | -define(OTP_VSN_MINOR, 1). 818 | -define(OTP_VSN_PATCH, 0). 819 | -define(OTP_VSN_20_AND_ABOVE, true). 820 | -define(OTP_VSN_19_AND_ABOVE, true). 821 | -define(OTP_VSN_18_AND_ABOVE, true). 822 | -define(OTP_VSN_17_AND_ABOVE, true). 823 | -define(OTP_VSN_16_AND_ABOVE, true). 824 | -endif. 825 | 826 | -ifdef(_internal_otp_vsn_20_1_1). 827 | -define(OTP_VSN, "20.1.1"). 828 | -define(OTP_VSN_MAJOR, 20). 829 | -define(OTP_VSN_MINOR, 1). 830 | -define(OTP_VSN_PATCH, 1). 831 | -define(OTP_VSN_20_AND_ABOVE, true). 832 | -define(OTP_VSN_19_AND_ABOVE, true). 833 | -define(OTP_VSN_18_AND_ABOVE, true). 834 | -define(OTP_VSN_17_AND_ABOVE, true). 835 | -define(OTP_VSN_16_AND_ABOVE, true). 836 | -endif. 837 | 838 | -ifdef(_internal_otp_vsn_20_1_2). 839 | -define(OTP_VSN, "20.1.2"). 840 | -define(OTP_VSN_MAJOR, 20). 841 | -define(OTP_VSN_MINOR, 1). 842 | -define(OTP_VSN_PATCH, 2). 843 | -define(OTP_VSN_20_AND_ABOVE, true). 844 | -define(OTP_VSN_19_AND_ABOVE, true). 845 | -define(OTP_VSN_18_AND_ABOVE, true). 846 | -define(OTP_VSN_17_AND_ABOVE, true). 847 | -define(OTP_VSN_16_AND_ABOVE, true). 848 | -endif. 849 | 850 | -ifdef(_internal_otp_vsn_20_1_3). 851 | -define(OTP_VSN, "20.1.3"). 852 | -define(OTP_VSN_MAJOR, 20). 853 | -define(OTP_VSN_MINOR, 1). 854 | -define(OTP_VSN_PATCH, 3). 855 | -define(OTP_VSN_20_AND_ABOVE, true). 856 | -define(OTP_VSN_19_AND_ABOVE, true). 857 | -define(OTP_VSN_18_AND_ABOVE, true). 858 | -define(OTP_VSN_17_AND_ABOVE, true). 859 | -define(OTP_VSN_16_AND_ABOVE, true). 860 | -endif. 861 | 862 | -ifdef(_internal_otp_vsn_20_1_4). 863 | -define(OTP_VSN, "20.1.4"). 864 | -define(OTP_VSN_MAJOR, 20). 865 | -define(OTP_VSN_MINOR, 1). 866 | -define(OTP_VSN_PATCH, 4). 867 | -define(OTP_VSN_20_AND_ABOVE, true). 868 | -define(OTP_VSN_19_AND_ABOVE, true). 869 | -define(OTP_VSN_18_AND_ABOVE, true). 870 | -define(OTP_VSN_17_AND_ABOVE, true). 871 | -define(OTP_VSN_16_AND_ABOVE, true). 872 | -endif. 873 | 874 | -ifdef(_internal_otp_vsn_20_1_5). 875 | -define(OTP_VSN, "20.1.5"). 876 | -define(OTP_VSN_MAJOR, 20). 877 | -define(OTP_VSN_MINOR, 1). 878 | -define(OTP_VSN_PATCH, 5). 879 | -define(OTP_VSN_20_AND_ABOVE, true). 880 | -define(OTP_VSN_19_AND_ABOVE, true). 881 | -define(OTP_VSN_18_AND_ABOVE, true). 882 | -define(OTP_VSN_17_AND_ABOVE, true). 883 | -define(OTP_VSN_16_AND_ABOVE, true). 884 | -endif. 885 | 886 | -ifdef(_internal_otp_vsn_20_1_6). 887 | -define(OTP_VSN, "20.1.6"). 888 | -define(OTP_VSN_MAJOR, 20). 889 | -define(OTP_VSN_MINOR, 1). 890 | -define(OTP_VSN_PATCH, 6). 891 | -define(OTP_VSN_20_AND_ABOVE, true). 892 | -define(OTP_VSN_19_AND_ABOVE, true). 893 | -define(OTP_VSN_18_AND_ABOVE, true). 894 | -define(OTP_VSN_17_AND_ABOVE, true). 895 | -define(OTP_VSN_16_AND_ABOVE, true). 896 | -endif. 897 | 898 | -ifdef(_internal_otp_vsn_20_1_7). 899 | -define(OTP_VSN, "20.1.7"). 900 | -define(OTP_VSN_MAJOR, 20). 901 | -define(OTP_VSN_MINOR, 1). 902 | -define(OTP_VSN_PATCH, 7). 903 | -define(OTP_VSN_20_AND_ABOVE, true). 904 | -define(OTP_VSN_19_AND_ABOVE, true). 905 | -define(OTP_VSN_18_AND_ABOVE, true). 906 | -define(OTP_VSN_17_AND_ABOVE, true). 907 | -define(OTP_VSN_16_AND_ABOVE, true). 908 | -endif. 909 | 910 | -ifdef(_internal_otp_vsn_20_2_0). 911 | -define(OTP_VSN, "20.2.0"). 912 | -define(OTP_VSN_MAJOR, 20). 913 | -define(OTP_VSN_MINOR, 2). 914 | -define(OTP_VSN_PATCH, 0). 915 | -define(OTP_VSN_20_AND_ABOVE, true). 916 | -define(OTP_VSN_19_AND_ABOVE, true). 917 | -define(OTP_VSN_18_AND_ABOVE, true). 918 | -define(OTP_VSN_17_AND_ABOVE, true). 919 | -define(OTP_VSN_16_AND_ABOVE, true). 920 | -endif. 921 | 922 | -ifdef(_internal_otp_vsn_20_2_1). 923 | -define(OTP_VSN, "20.2.1"). 924 | -define(OTP_VSN_MAJOR, 20). 925 | -define(OTP_VSN_MINOR, 2). 926 | -define(OTP_VSN_PATCH, 1). 927 | -define(OTP_VSN_20_AND_ABOVE, true). 928 | -define(OTP_VSN_19_AND_ABOVE, true). 929 | -define(OTP_VSN_18_AND_ABOVE, true). 930 | -define(OTP_VSN_17_AND_ABOVE, true). 931 | -define(OTP_VSN_16_AND_ABOVE, true). 932 | -endif. 933 | 934 | -ifdef(_internal_otp_vsn_20_2_2). 935 | -define(OTP_VSN, "20.2.2"). 936 | -define(OTP_VSN_MAJOR, 20). 937 | -define(OTP_VSN_MINOR, 2). 938 | -define(OTP_VSN_PATCH, 2). 939 | -define(OTP_VSN_20_AND_ABOVE, true). 940 | -define(OTP_VSN_19_AND_ABOVE, true). 941 | -define(OTP_VSN_18_AND_ABOVE, true). 942 | -define(OTP_VSN_17_AND_ABOVE, true). 943 | -define(OTP_VSN_16_AND_ABOVE, true). 944 | -endif. 945 | 946 | -ifdef(_internal_otp_vsn_20_2_3). 947 | -define(OTP_VSN, "20.2.3"). 948 | -define(OTP_VSN_MAJOR, 20). 949 | -define(OTP_VSN_MINOR, 2). 950 | -define(OTP_VSN_PATCH, 3). 951 | -define(OTP_VSN_20_AND_ABOVE, true). 952 | -define(OTP_VSN_19_AND_ABOVE, true). 953 | -define(OTP_VSN_18_AND_ABOVE, true). 954 | -define(OTP_VSN_17_AND_ABOVE, true). 955 | -define(OTP_VSN_16_AND_ABOVE, true). 956 | -endif. 957 | 958 | -ifdef(_internal_otp_vsn_20_2_4). 959 | -define(OTP_VSN, "20.2.4"). 960 | -define(OTP_VSN_MAJOR, 20). 961 | -define(OTP_VSN_MINOR, 2). 962 | -define(OTP_VSN_PATCH, 4). 963 | -define(OTP_VSN_20_AND_ABOVE, true). 964 | -define(OTP_VSN_19_AND_ABOVE, true). 965 | -define(OTP_VSN_18_AND_ABOVE, true). 966 | -define(OTP_VSN_17_AND_ABOVE, true). 967 | -define(OTP_VSN_16_AND_ABOVE, true). 968 | -endif. 969 | 970 | -ifdef(_internal_otp_vsn_20_3_0). 971 | -define(OTP_VSN, "20.3.0"). 972 | -define(OTP_VSN_MAJOR, 20). 973 | -define(OTP_VSN_MINOR, 3). 974 | -define(OTP_VSN_PATCH, 0). 975 | -define(OTP_VSN_20_AND_ABOVE, true). 976 | -define(OTP_VSN_19_AND_ABOVE, true). 977 | -define(OTP_VSN_18_AND_ABOVE, true). 978 | -define(OTP_VSN_17_AND_ABOVE, true). 979 | -define(OTP_VSN_16_AND_ABOVE, true). 980 | -endif. 981 | 982 | -ifdef(_internal_otp_vsn_20_3_1). 983 | -define(OTP_VSN, "20.3.1"). 984 | -define(OTP_VSN_MAJOR, 20). 985 | -define(OTP_VSN_MINOR, 3). 986 | -define(OTP_VSN_PATCH, 1). 987 | -define(OTP_VSN_20_AND_ABOVE, true). 988 | -define(OTP_VSN_19_AND_ABOVE, true). 989 | -define(OTP_VSN_18_AND_ABOVE, true). 990 | -define(OTP_VSN_17_AND_ABOVE, true). 991 | -define(OTP_VSN_16_AND_ABOVE, true). 992 | -endif. 993 | 994 | -ifdef(_internal_otp_vsn_20_3_2). 995 | -define(OTP_VSN, "20.3.2"). 996 | -define(OTP_VSN_MAJOR, 20). 997 | -define(OTP_VSN_MINOR, 3). 998 | -define(OTP_VSN_PATCH, 2). 999 | -define(OTP_VSN_20_AND_ABOVE, true). 1000 | -define(OTP_VSN_19_AND_ABOVE, true). 1001 | -define(OTP_VSN_18_AND_ABOVE, true). 1002 | -define(OTP_VSN_17_AND_ABOVE, true). 1003 | -define(OTP_VSN_16_AND_ABOVE, true). 1004 | -endif. 1005 | 1006 | -ifdef(_internal_otp_vsn_20_3_3). 1007 | -define(OTP_VSN, "20.3.3"). 1008 | -define(OTP_VSN_MAJOR, 20). 1009 | -define(OTP_VSN_MINOR, 3). 1010 | -define(OTP_VSN_PATCH, 3). 1011 | -define(OTP_VSN_20_AND_ABOVE, true). 1012 | -define(OTP_VSN_19_AND_ABOVE, true). 1013 | -define(OTP_VSN_18_AND_ABOVE, true). 1014 | -define(OTP_VSN_17_AND_ABOVE, true). 1015 | -define(OTP_VSN_16_AND_ABOVE, true). 1016 | -endif. 1017 | 1018 | -ifdef(_internal_otp_vsn_20_3_4). 1019 | -define(OTP_VSN, "20.3.4"). 1020 | -define(OTP_VSN_MAJOR, 20). 1021 | -define(OTP_VSN_MINOR, 3). 1022 | -define(OTP_VSN_PATCH, 4). 1023 | -define(OTP_VSN_20_AND_ABOVE, true). 1024 | -define(OTP_VSN_19_AND_ABOVE, true). 1025 | -define(OTP_VSN_18_AND_ABOVE, true). 1026 | -define(OTP_VSN_17_AND_ABOVE, true). 1027 | -define(OTP_VSN_16_AND_ABOVE, true). 1028 | -endif. 1029 | 1030 | -ifdef(_internal_otp_vsn_20_3_5). 1031 | -define(OTP_VSN, "20.3.5"). 1032 | -define(OTP_VSN_MAJOR, 20). 1033 | -define(OTP_VSN_MINOR, 3). 1034 | -define(OTP_VSN_PATCH, 5). 1035 | -define(OTP_VSN_20_AND_ABOVE, true). 1036 | -define(OTP_VSN_19_AND_ABOVE, true). 1037 | -define(OTP_VSN_18_AND_ABOVE, true). 1038 | -define(OTP_VSN_17_AND_ABOVE, true). 1039 | -define(OTP_VSN_16_AND_ABOVE, true). 1040 | -endif. 1041 | 1042 | -ifdef(_internal_otp_vsn_20_3_6). 1043 | -define(OTP_VSN, "20.3.6"). 1044 | -define(OTP_VSN_MAJOR, 20). 1045 | -define(OTP_VSN_MINOR, 3). 1046 | -define(OTP_VSN_PATCH, 6). 1047 | -define(OTP_VSN_20_AND_ABOVE, true). 1048 | -define(OTP_VSN_19_AND_ABOVE, true). 1049 | -define(OTP_VSN_18_AND_ABOVE, true). 1050 | -define(OTP_VSN_17_AND_ABOVE, true). 1051 | -define(OTP_VSN_16_AND_ABOVE, true). 1052 | -endif. 1053 | 1054 | -ifdef(_internal_otp_vsn_20_3_7). 1055 | -define(OTP_VSN, "20.3.7"). 1056 | -define(OTP_VSN_MAJOR, 20). 1057 | -define(OTP_VSN_MINOR, 3). 1058 | -define(OTP_VSN_PATCH, 7). 1059 | -define(OTP_VSN_20_AND_ABOVE, true). 1060 | -define(OTP_VSN_19_AND_ABOVE, true). 1061 | -define(OTP_VSN_18_AND_ABOVE, true). 1062 | -define(OTP_VSN_17_AND_ABOVE, true). 1063 | -define(OTP_VSN_16_AND_ABOVE, true). 1064 | -endif. 1065 | 1066 | -ifdef(_internal_otp_vsn_20_3_8). 1067 | -define(OTP_VSN, "20.3.8"). 1068 | -define(OTP_VSN_MAJOR, 20). 1069 | -define(OTP_VSN_MINOR, 3). 1070 | -define(OTP_VSN_PATCH, 8). 1071 | -define(OTP_VSN_20_AND_ABOVE, true). 1072 | -define(OTP_VSN_19_AND_ABOVE, true). 1073 | -define(OTP_VSN_18_AND_ABOVE, true). 1074 | -define(OTP_VSN_17_AND_ABOVE, true). 1075 | -define(OTP_VSN_16_AND_ABOVE, true). 1076 | -endif. 1077 | 1078 | -ifdef(_internal_otp_vsn_21_0_0). 1079 | -define(OTP_VSN, "21.0.0"). 1080 | -define(OTP_VSN_MAJOR, 21). 1081 | -define(OTP_VSN_MINOR, 0). 1082 | -define(OTP_VSN_PATCH, 0). 1083 | -define(OTP_VSN_21_AND_ABOVE, true). 1084 | -define(OTP_VSN_20_AND_ABOVE, true). 1085 | -define(OTP_VSN_19_AND_ABOVE, true). 1086 | -define(OTP_VSN_18_AND_ABOVE, true). 1087 | -define(OTP_VSN_17_AND_ABOVE, true). 1088 | -define(OTP_VSN_16_AND_ABOVE, true). 1089 | -endif. 1090 | 1091 | -ifdef(_internal_otp_vsn_21_0_1). 1092 | -define(OTP_VSN, "21.0.1"). 1093 | -define(OTP_VSN_MAJOR, 21). 1094 | -define(OTP_VSN_MINOR, 0). 1095 | -define(OTP_VSN_PATCH, 1). 1096 | -define(OTP_VSN_21_AND_ABOVE, true). 1097 | -define(OTP_VSN_20_AND_ABOVE, true). 1098 | -define(OTP_VSN_19_AND_ABOVE, true). 1099 | -define(OTP_VSN_18_AND_ABOVE, true). 1100 | -define(OTP_VSN_17_AND_ABOVE, true). 1101 | -define(OTP_VSN_16_AND_ABOVE, true). 1102 | -endif. 1103 | 1104 | -ifdef(_internal_otp_vsn_21_0_2). 1105 | -define(OTP_VSN, "21.0.2"). 1106 | -define(OTP_VSN_MAJOR, 21). 1107 | -define(OTP_VSN_MINOR, 0). 1108 | -define(OTP_VSN_PATCH, 2). 1109 | -define(OTP_VSN_21_AND_ABOVE, true). 1110 | -define(OTP_VSN_20_AND_ABOVE, true). 1111 | -define(OTP_VSN_19_AND_ABOVE, true). 1112 | -define(OTP_VSN_18_AND_ABOVE, true). 1113 | -define(OTP_VSN_17_AND_ABOVE, true). 1114 | -define(OTP_VSN_16_AND_ABOVE, true). 1115 | -endif. 1116 | 1117 | -ifdef(_internal_otp_vsn_21_0_3). 1118 | -define(OTP_VSN, "21.0.3"). 1119 | -define(OTP_VSN_MAJOR, 21). 1120 | -define(OTP_VSN_MINOR, 0). 1121 | -define(OTP_VSN_PATCH, 3). 1122 | -define(OTP_VSN_21_AND_ABOVE, true). 1123 | -define(OTP_VSN_20_AND_ABOVE, true). 1124 | -define(OTP_VSN_19_AND_ABOVE, true). 1125 | -define(OTP_VSN_18_AND_ABOVE, true). 1126 | -define(OTP_VSN_17_AND_ABOVE, true). 1127 | -define(OTP_VSN_16_AND_ABOVE, true). 1128 | -endif. 1129 | 1130 | -ifdef(_internal_otp_vsn_21_0_4). 1131 | -define(OTP_VSN, "21.0.4"). 1132 | -define(OTP_VSN_MAJOR, 21). 1133 | -define(OTP_VSN_MINOR, 0). 1134 | -define(OTP_VSN_PATCH, 4). 1135 | -define(OTP_VSN_21_AND_ABOVE, true). 1136 | -define(OTP_VSN_20_AND_ABOVE, true). 1137 | -define(OTP_VSN_19_AND_ABOVE, true). 1138 | -define(OTP_VSN_18_AND_ABOVE, true). 1139 | -define(OTP_VSN_17_AND_ABOVE, true). 1140 | -define(OTP_VSN_16_AND_ABOVE, true). 1141 | -endif. 1142 | 1143 | -ifdef(_internal_otp_vsn_21_0_5). 1144 | -define(OTP_VSN, "21.0.5"). 1145 | -define(OTP_VSN_MAJOR, 21). 1146 | -define(OTP_VSN_MINOR, 0). 1147 | -define(OTP_VSN_PATCH, 5). 1148 | -define(OTP_VSN_21_AND_ABOVE, true). 1149 | -define(OTP_VSN_20_AND_ABOVE, true). 1150 | -define(OTP_VSN_19_AND_ABOVE, true). 1151 | -define(OTP_VSN_18_AND_ABOVE, true). 1152 | -define(OTP_VSN_17_AND_ABOVE, true). 1153 | -define(OTP_VSN_16_AND_ABOVE, true). 1154 | -endif. 1155 | 1156 | -ifdef(_internal_otp_vsn_21_0_6). 1157 | -define(OTP_VSN, "21.0.6"). 1158 | -define(OTP_VSN_MAJOR, 21). 1159 | -define(OTP_VSN_MINOR, 0). 1160 | -define(OTP_VSN_PATCH, 6). 1161 | -define(OTP_VSN_21_AND_ABOVE, true). 1162 | -define(OTP_VSN_20_AND_ABOVE, true). 1163 | -define(OTP_VSN_19_AND_ABOVE, true). 1164 | -define(OTP_VSN_18_AND_ABOVE, true). 1165 | -define(OTP_VSN_17_AND_ABOVE, true). 1166 | -define(OTP_VSN_16_AND_ABOVE, true). 1167 | -endif. 1168 | 1169 | -ifdef(_internal_otp_vsn_21_0_7). 1170 | -define(OTP_VSN, "21.0.7"). 1171 | -define(OTP_VSN_MAJOR, 21). 1172 | -define(OTP_VSN_MINOR, 0). 1173 | -define(OTP_VSN_PATCH, 7). 1174 | -define(OTP_VSN_21_AND_ABOVE, true). 1175 | -define(OTP_VSN_20_AND_ABOVE, true). 1176 | -define(OTP_VSN_19_AND_ABOVE, true). 1177 | -define(OTP_VSN_18_AND_ABOVE, true). 1178 | -define(OTP_VSN_17_AND_ABOVE, true). 1179 | -define(OTP_VSN_16_AND_ABOVE, true). 1180 | -endif. 1181 | 1182 | -ifdef(_internal_otp_vsn_21_0_8). 1183 | -define(OTP_VSN, "21.0.8"). 1184 | -define(OTP_VSN_MAJOR, 21). 1185 | -define(OTP_VSN_MINOR, 0). 1186 | -define(OTP_VSN_PATCH, 8). 1187 | -define(OTP_VSN_21_AND_ABOVE, true). 1188 | -define(OTP_VSN_20_AND_ABOVE, true). 1189 | -define(OTP_VSN_19_AND_ABOVE, true). 1190 | -define(OTP_VSN_18_AND_ABOVE, true). 1191 | -define(OTP_VSN_17_AND_ABOVE, true). 1192 | -define(OTP_VSN_16_AND_ABOVE, true). 1193 | -endif. 1194 | 1195 | -ifdef(_internal_otp_vsn_21_0_9). 1196 | -define(OTP_VSN, "21.0.9"). 1197 | -define(OTP_VSN_MAJOR, 21). 1198 | -define(OTP_VSN_MINOR, 0). 1199 | -define(OTP_VSN_PATCH, 9). 1200 | -define(OTP_VSN_21_AND_ABOVE, true). 1201 | -define(OTP_VSN_20_AND_ABOVE, true). 1202 | -define(OTP_VSN_19_AND_ABOVE, true). 1203 | -define(OTP_VSN_18_AND_ABOVE, true). 1204 | -define(OTP_VSN_17_AND_ABOVE, true). 1205 | -define(OTP_VSN_16_AND_ABOVE, true). 1206 | -endif. 1207 | 1208 | -ifdef(_internal_otp_vsn_21_1_0). 1209 | -define(OTP_VSN, "21.1.0"). 1210 | -define(OTP_VSN_MAJOR, 21). 1211 | -define(OTP_VSN_MINOR, 1). 1212 | -define(OTP_VSN_PATCH, 0). 1213 | -define(OTP_VSN_21_AND_ABOVE, true). 1214 | -define(OTP_VSN_20_AND_ABOVE, true). 1215 | -define(OTP_VSN_19_AND_ABOVE, true). 1216 | -define(OTP_VSN_18_AND_ABOVE, true). 1217 | -define(OTP_VSN_17_AND_ABOVE, true). 1218 | -define(OTP_VSN_16_AND_ABOVE, true). 1219 | -endif. 1220 | 1221 | -ifdef(_internal_otp_vsn_21_1_1). 1222 | -define(OTP_VSN, "21.1.1"). 1223 | -define(OTP_VSN_MAJOR, 21). 1224 | -define(OTP_VSN_MINOR, 1). 1225 | -define(OTP_VSN_PATCH, 1). 1226 | -define(OTP_VSN_21_AND_ABOVE, true). 1227 | -define(OTP_VSN_20_AND_ABOVE, true). 1228 | -define(OTP_VSN_19_AND_ABOVE, true). 1229 | -define(OTP_VSN_18_AND_ABOVE, true). 1230 | -define(OTP_VSN_17_AND_ABOVE, true). 1231 | -define(OTP_VSN_16_AND_ABOVE, true). 1232 | -endif. 1233 | 1234 | -ifdef(_internal_otp_vsn_21_1_2). 1235 | -define(OTP_VSN, "21.1.2"). 1236 | -define(OTP_VSN_MAJOR, 21). 1237 | -define(OTP_VSN_MINOR, 1). 1238 | -define(OTP_VSN_PATCH, 2). 1239 | -define(OTP_VSN_21_AND_ABOVE, true). 1240 | -define(OTP_VSN_20_AND_ABOVE, true). 1241 | -define(OTP_VSN_19_AND_ABOVE, true). 1242 | -define(OTP_VSN_18_AND_ABOVE, true). 1243 | -define(OTP_VSN_17_AND_ABOVE, true). 1244 | -define(OTP_VSN_16_AND_ABOVE, true). 1245 | -endif. 1246 | 1247 | -ifdef(_internal_otp_vsn_21_1_3). 1248 | -define(OTP_VSN, "21.1.3"). 1249 | -define(OTP_VSN_MAJOR, 21). 1250 | -define(OTP_VSN_MINOR, 1). 1251 | -define(OTP_VSN_PATCH, 3). 1252 | -define(OTP_VSN_21_AND_ABOVE, true). 1253 | -define(OTP_VSN_20_AND_ABOVE, true). 1254 | -define(OTP_VSN_19_AND_ABOVE, true). 1255 | -define(OTP_VSN_18_AND_ABOVE, true). 1256 | -define(OTP_VSN_17_AND_ABOVE, true). 1257 | -define(OTP_VSN_16_AND_ABOVE, true). 1258 | -endif. 1259 | 1260 | -ifdef(_internal_otp_vsn_21_1_4). 1261 | -define(OTP_VSN, "21.1.4"). 1262 | -define(OTP_VSN_MAJOR, 21). 1263 | -define(OTP_VSN_MINOR, 1). 1264 | -define(OTP_VSN_PATCH, 4). 1265 | -define(OTP_VSN_21_AND_ABOVE, true). 1266 | -define(OTP_VSN_20_AND_ABOVE, true). 1267 | -define(OTP_VSN_19_AND_ABOVE, true). 1268 | -define(OTP_VSN_18_AND_ABOVE, true). 1269 | -define(OTP_VSN_17_AND_ABOVE, true). 1270 | -define(OTP_VSN_16_AND_ABOVE, true). 1271 | -endif. 1272 | 1273 | -ifdef(_internal_otp_vsn_21_2_0). 1274 | -define(OTP_VSN, "21.2.0"). 1275 | -define(OTP_VSN_MAJOR, 21). 1276 | -define(OTP_VSN_MINOR, 2). 1277 | -define(OTP_VSN_PATCH, 0). 1278 | -define(OTP_VSN_21_AND_ABOVE, true). 1279 | -define(OTP_VSN_20_AND_ABOVE, true). 1280 | -define(OTP_VSN_19_AND_ABOVE, true). 1281 | -define(OTP_VSN_18_AND_ABOVE, true). 1282 | -define(OTP_VSN_17_AND_ABOVE, true). 1283 | -define(OTP_VSN_16_AND_ABOVE, true). 1284 | -endif. 1285 | 1286 | -ifdef(_internal_otp_vsn_21_2_1). 1287 | -define(OTP_VSN, "21.2.1"). 1288 | -define(OTP_VSN_MAJOR, 21). 1289 | -define(OTP_VSN_MINOR, 2). 1290 | -define(OTP_VSN_PATCH, 1). 1291 | -define(OTP_VSN_21_AND_ABOVE, true). 1292 | -define(OTP_VSN_20_AND_ABOVE, true). 1293 | -define(OTP_VSN_19_AND_ABOVE, true). 1294 | -define(OTP_VSN_18_AND_ABOVE, true). 1295 | -define(OTP_VSN_17_AND_ABOVE, true). 1296 | -define(OTP_VSN_16_AND_ABOVE, true). 1297 | -endif. 1298 | 1299 | -ifdef(_internal_otp_vsn_21_2_2). 1300 | -define(OTP_VSN, "21.2.2"). 1301 | -define(OTP_VSN_MAJOR, 21). 1302 | -define(OTP_VSN_MINOR, 2). 1303 | -define(OTP_VSN_PATCH, 2). 1304 | -define(OTP_VSN_21_AND_ABOVE, true). 1305 | -define(OTP_VSN_20_AND_ABOVE, true). 1306 | -define(OTP_VSN_19_AND_ABOVE, true). 1307 | -define(OTP_VSN_18_AND_ABOVE, true). 1308 | -define(OTP_VSN_17_AND_ABOVE, true). 1309 | -define(OTP_VSN_16_AND_ABOVE, true). 1310 | -endif. 1311 | 1312 | -ifdef(_internal_otp_vsn_21_2_3). 1313 | -define(OTP_VSN, "21.2.3"). 1314 | -define(OTP_VSN_MAJOR, 21). 1315 | -define(OTP_VSN_MINOR, 2). 1316 | -define(OTP_VSN_PATCH, 3). 1317 | -define(OTP_VSN_21_AND_ABOVE, true). 1318 | -define(OTP_VSN_20_AND_ABOVE, true). 1319 | -define(OTP_VSN_19_AND_ABOVE, true). 1320 | -define(OTP_VSN_18_AND_ABOVE, true). 1321 | -define(OTP_VSN_17_AND_ABOVE, true). 1322 | -define(OTP_VSN_16_AND_ABOVE, true). 1323 | -endif. 1324 | 1325 | -ifdef(_internal_otp_vsn_21_2_4). 1326 | -define(OTP_VSN, "21.2.4"). 1327 | -define(OTP_VSN_MAJOR, 21). 1328 | -define(OTP_VSN_MINOR, 2). 1329 | -define(OTP_VSN_PATCH, 4). 1330 | -define(OTP_VSN_21_AND_ABOVE, true). 1331 | -define(OTP_VSN_20_AND_ABOVE, true). 1332 | -define(OTP_VSN_19_AND_ABOVE, true). 1333 | -define(OTP_VSN_18_AND_ABOVE, true). 1334 | -define(OTP_VSN_17_AND_ABOVE, true). 1335 | -define(OTP_VSN_16_AND_ABOVE, true). 1336 | -endif. 1337 | 1338 | -ifdef(_internal_otp_vsn_21_2_5). 1339 | -define(OTP_VSN, "21.2.5"). 1340 | -define(OTP_VSN_MAJOR, 21). 1341 | -define(OTP_VSN_MINOR, 2). 1342 | -define(OTP_VSN_PATCH, 5). 1343 | -define(OTP_VSN_21_AND_ABOVE, true). 1344 | -define(OTP_VSN_20_AND_ABOVE, true). 1345 | -define(OTP_VSN_19_AND_ABOVE, true). 1346 | -define(OTP_VSN_18_AND_ABOVE, true). 1347 | -define(OTP_VSN_17_AND_ABOVE, true). 1348 | -define(OTP_VSN_16_AND_ABOVE, true). 1349 | -endif. 1350 | 1351 | -ifdef(_internal_otp_vsn_21_2_6). 1352 | -define(OTP_VSN, "21.2.6"). 1353 | -define(OTP_VSN_MAJOR, 21). 1354 | -define(OTP_VSN_MINOR, 2). 1355 | -define(OTP_VSN_PATCH, 6). 1356 | -define(OTP_VSN_21_AND_ABOVE, true). 1357 | -define(OTP_VSN_20_AND_ABOVE, true). 1358 | -define(OTP_VSN_19_AND_ABOVE, true). 1359 | -define(OTP_VSN_18_AND_ABOVE, true). 1360 | -define(OTP_VSN_17_AND_ABOVE, true). 1361 | -define(OTP_VSN_16_AND_ABOVE, true). 1362 | -endif. 1363 | 1364 | -ifdef(_internal_otp_vsn_21_2_7). 1365 | -define(OTP_VSN, "21.2.7"). 1366 | -define(OTP_VSN_MAJOR, 21). 1367 | -define(OTP_VSN_MINOR, 2). 1368 | -define(OTP_VSN_PATCH, 7). 1369 | -define(OTP_VSN_21_AND_ABOVE, true). 1370 | -define(OTP_VSN_20_AND_ABOVE, true). 1371 | -define(OTP_VSN_19_AND_ABOVE, true). 1372 | -define(OTP_VSN_18_AND_ABOVE, true). 1373 | -define(OTP_VSN_17_AND_ABOVE, true). 1374 | -define(OTP_VSN_16_AND_ABOVE, true). 1375 | -endif. 1376 | 1377 | -ifdef(_internal_otp_vsn_21_3_0). 1378 | -define(OTP_VSN, "21.3.0"). 1379 | -define(OTP_VSN_MAJOR, 21). 1380 | -define(OTP_VSN_MINOR, 3). 1381 | -define(OTP_VSN_PATCH, 0). 1382 | -define(OTP_VSN_21_AND_ABOVE, true). 1383 | -define(OTP_VSN_20_AND_ABOVE, true). 1384 | -define(OTP_VSN_19_AND_ABOVE, true). 1385 | -define(OTP_VSN_18_AND_ABOVE, true). 1386 | -define(OTP_VSN_17_AND_ABOVE, true). 1387 | -define(OTP_VSN_16_AND_ABOVE, true). 1388 | -endif. 1389 | 1390 | -ifdef(_internal_otp_vsn_21_3_1). 1391 | -define(OTP_VSN, "21.3.1"). 1392 | -define(OTP_VSN_MAJOR, 21). 1393 | -define(OTP_VSN_MINOR, 3). 1394 | -define(OTP_VSN_PATCH, 1). 1395 | -define(OTP_VSN_21_AND_ABOVE, true). 1396 | -define(OTP_VSN_20_AND_ABOVE, true). 1397 | -define(OTP_VSN_19_AND_ABOVE, true). 1398 | -define(OTP_VSN_18_AND_ABOVE, true). 1399 | -define(OTP_VSN_17_AND_ABOVE, true). 1400 | -define(OTP_VSN_16_AND_ABOVE, true). 1401 | -endif. 1402 | 1403 | -ifdef(_internal_otp_vsn_21_3_2). 1404 | -define(OTP_VSN, "21.3.2"). 1405 | -define(OTP_VSN_MAJOR, 21). 1406 | -define(OTP_VSN_MINOR, 3). 1407 | -define(OTP_VSN_PATCH, 2). 1408 | -define(OTP_VSN_21_AND_ABOVE, true). 1409 | -define(OTP_VSN_20_AND_ABOVE, true). 1410 | -define(OTP_VSN_19_AND_ABOVE, true). 1411 | -define(OTP_VSN_18_AND_ABOVE, true). 1412 | -define(OTP_VSN_17_AND_ABOVE, true). 1413 | -define(OTP_VSN_16_AND_ABOVE, true). 1414 | -endif. 1415 | 1416 | -ifdef(_internal_otp_vsn_21_3_3). 1417 | -define(OTP_VSN, "21.3.3"). 1418 | -define(OTP_VSN_MAJOR, 21). 1419 | -define(OTP_VSN_MINOR, 3). 1420 | -define(OTP_VSN_PATCH, 3). 1421 | -define(OTP_VSN_21_AND_ABOVE, true). 1422 | -define(OTP_VSN_20_AND_ABOVE, true). 1423 | -define(OTP_VSN_19_AND_ABOVE, true). 1424 | -define(OTP_VSN_18_AND_ABOVE, true). 1425 | -define(OTP_VSN_17_AND_ABOVE, true). 1426 | -define(OTP_VSN_16_AND_ABOVE, true). 1427 | -endif. 1428 | 1429 | -ifdef(_internal_otp_vsn_21_3_4). 1430 | -define(OTP_VSN, "21.3.4"). 1431 | -define(OTP_VSN_MAJOR, 21). 1432 | -define(OTP_VSN_MINOR, 3). 1433 | -define(OTP_VSN_PATCH, 4). 1434 | -define(OTP_VSN_21_AND_ABOVE, true). 1435 | -define(OTP_VSN_20_AND_ABOVE, true). 1436 | -define(OTP_VSN_19_AND_ABOVE, true). 1437 | -define(OTP_VSN_18_AND_ABOVE, true). 1438 | -define(OTP_VSN_17_AND_ABOVE, true). 1439 | -define(OTP_VSN_16_AND_ABOVE, true). 1440 | -endif. 1441 | 1442 | -ifdef(_internal_otp_vsn_21_3_5). 1443 | -define(OTP_VSN, "21.3.5"). 1444 | -define(OTP_VSN_MAJOR, 21). 1445 | -define(OTP_VSN_MINOR, 3). 1446 | -define(OTP_VSN_PATCH, 5). 1447 | -define(OTP_VSN_21_AND_ABOVE, true). 1448 | -define(OTP_VSN_20_AND_ABOVE, true). 1449 | -define(OTP_VSN_19_AND_ABOVE, true). 1450 | -define(OTP_VSN_18_AND_ABOVE, true). 1451 | -define(OTP_VSN_17_AND_ABOVE, true). 1452 | -define(OTP_VSN_16_AND_ABOVE, true). 1453 | -endif. 1454 | 1455 | -ifdef(_internal_otp_vsn_21_3_6). 1456 | -define(OTP_VSN, "21.3.6"). 1457 | -define(OTP_VSN_MAJOR, 21). 1458 | -define(OTP_VSN_MINOR, 3). 1459 | -define(OTP_VSN_PATCH, 6). 1460 | -define(OTP_VSN_21_AND_ABOVE, true). 1461 | -define(OTP_VSN_20_AND_ABOVE, true). 1462 | -define(OTP_VSN_19_AND_ABOVE, true). 1463 | -define(OTP_VSN_18_AND_ABOVE, true). 1464 | -define(OTP_VSN_17_AND_ABOVE, true). 1465 | -define(OTP_VSN_16_AND_ABOVE, true). 1466 | -endif. 1467 | 1468 | -ifdef(_internal_otp_vsn_21_3_7). 1469 | -define(OTP_VSN, "21.3.7"). 1470 | -define(OTP_VSN_MAJOR, 21). 1471 | -define(OTP_VSN_MINOR, 3). 1472 | -define(OTP_VSN_PATCH, 7). 1473 | -define(OTP_VSN_21_AND_ABOVE, true). 1474 | -define(OTP_VSN_20_AND_ABOVE, true). 1475 | -define(OTP_VSN_19_AND_ABOVE, true). 1476 | -define(OTP_VSN_18_AND_ABOVE, true). 1477 | -define(OTP_VSN_17_AND_ABOVE, true). 1478 | -define(OTP_VSN_16_AND_ABOVE, true). 1479 | -endif. 1480 | 1481 | -ifdef(_internal_otp_vsn_21_3_8). 1482 | -define(OTP_VSN, "21.3.8"). 1483 | -define(OTP_VSN_MAJOR, 21). 1484 | -define(OTP_VSN_MINOR, 3). 1485 | -define(OTP_VSN_PATCH, 8). 1486 | -define(OTP_VSN_21_AND_ABOVE, true). 1487 | -define(OTP_VSN_20_AND_ABOVE, true). 1488 | -define(OTP_VSN_19_AND_ABOVE, true). 1489 | -define(OTP_VSN_18_AND_ABOVE, true). 1490 | -define(OTP_VSN_17_AND_ABOVE, true). 1491 | -define(OTP_VSN_16_AND_ABOVE, true). 1492 | -endif. 1493 | 1494 | -ifdef(_internal_otp_vsn_22_0_0). 1495 | -define(OTP_VSN, "22.0.0"). 1496 | -define(OTP_VSN_MAJOR, 22). 1497 | -define(OTP_VSN_MINOR, 0). 1498 | -define(OTP_VSN_PATCH, 0). 1499 | -define(OTP_VSN_22_AND_ABOVE, true). 1500 | -define(OTP_VSN_21_AND_ABOVE, true). 1501 | -define(OTP_VSN_20_AND_ABOVE, true). 1502 | -define(OTP_VSN_19_AND_ABOVE, true). 1503 | -define(OTP_VSN_18_AND_ABOVE, true). 1504 | -define(OTP_VSN_17_AND_ABOVE, true). 1505 | -define(OTP_VSN_16_AND_ABOVE, true). 1506 | -endif. 1507 | 1508 | -ifdef(_internal_otp_vsn_22_0_1). 1509 | -define(OTP_VSN, "22.0.1"). 1510 | -define(OTP_VSN_MAJOR, 22). 1511 | -define(OTP_VSN_MINOR, 0). 1512 | -define(OTP_VSN_PATCH, 1). 1513 | -define(OTP_VSN_22_AND_ABOVE, true). 1514 | -define(OTP_VSN_21_AND_ABOVE, true). 1515 | -define(OTP_VSN_20_AND_ABOVE, true). 1516 | -define(OTP_VSN_19_AND_ABOVE, true). 1517 | -define(OTP_VSN_18_AND_ABOVE, true). 1518 | -define(OTP_VSN_17_AND_ABOVE, true). 1519 | -define(OTP_VSN_16_AND_ABOVE, true). 1520 | -endif. 1521 | 1522 | -ifdef(_internal_otp_vsn_22_0_2). 1523 | -define(OTP_VSN, "22.0.2"). 1524 | -define(OTP_VSN_MAJOR, 22). 1525 | -define(OTP_VSN_MINOR, 0). 1526 | -define(OTP_VSN_PATCH, 2). 1527 | -define(OTP_VSN_22_AND_ABOVE, true). 1528 | -define(OTP_VSN_21_AND_ABOVE, true). 1529 | -define(OTP_VSN_20_AND_ABOVE, true). 1530 | -define(OTP_VSN_19_AND_ABOVE, true). 1531 | -define(OTP_VSN_18_AND_ABOVE, true). 1532 | -define(OTP_VSN_17_AND_ABOVE, true). 1533 | -define(OTP_VSN_16_AND_ABOVE, true). 1534 | -endif. 1535 | 1536 | -ifdef(_internal_otp_vsn_22_0_3). 1537 | -define(OTP_VSN, "22.0.3"). 1538 | -define(OTP_VSN_MAJOR, 22). 1539 | -define(OTP_VSN_MINOR, 0). 1540 | -define(OTP_VSN_PATCH, 3). 1541 | -define(OTP_VSN_22_AND_ABOVE, true). 1542 | -define(OTP_VSN_21_AND_ABOVE, true). 1543 | -define(OTP_VSN_20_AND_ABOVE, true). 1544 | -define(OTP_VSN_19_AND_ABOVE, true). 1545 | -define(OTP_VSN_18_AND_ABOVE, true). 1546 | -define(OTP_VSN_17_AND_ABOVE, true). 1547 | -define(OTP_VSN_16_AND_ABOVE, true). 1548 | -endif. 1549 | 1550 | -ifdef(_internal_otp_vsn_22_0_4). 1551 | -define(OTP_VSN, "22.0.4"). 1552 | -define(OTP_VSN_MAJOR, 22). 1553 | -define(OTP_VSN_MINOR, 0). 1554 | -define(OTP_VSN_PATCH, 4). 1555 | -define(OTP_VSN_22_AND_ABOVE, true). 1556 | -define(OTP_VSN_21_AND_ABOVE, true). 1557 | -define(OTP_VSN_20_AND_ABOVE, true). 1558 | -define(OTP_VSN_19_AND_ABOVE, true). 1559 | -define(OTP_VSN_18_AND_ABOVE, true). 1560 | -define(OTP_VSN_17_AND_ABOVE, true). 1561 | -define(OTP_VSN_16_AND_ABOVE, true). 1562 | -endif. 1563 | 1564 | -ifdef(_internal_otp_vsn_22_0_5). 1565 | -define(OTP_VSN, "22.0.5"). 1566 | -define(OTP_VSN_MAJOR, 22). 1567 | -define(OTP_VSN_MINOR, 0). 1568 | -define(OTP_VSN_PATCH, 5). 1569 | -define(OTP_VSN_22_AND_ABOVE, true). 1570 | -define(OTP_VSN_21_AND_ABOVE, true). 1571 | -define(OTP_VSN_20_AND_ABOVE, true). 1572 | -define(OTP_VSN_19_AND_ABOVE, true). 1573 | -define(OTP_VSN_18_AND_ABOVE, true). 1574 | -define(OTP_VSN_17_AND_ABOVE, true). 1575 | -define(OTP_VSN_16_AND_ABOVE, true). 1576 | -endif. 1577 | 1578 | -ifdef(_internal_otp_vsn_22_0_6). 1579 | -define(OTP_VSN, "22.0.6"). 1580 | -define(OTP_VSN_MAJOR, 22). 1581 | -define(OTP_VSN_MINOR, 0). 1582 | -define(OTP_VSN_PATCH, 6). 1583 | -define(OTP_VSN_22_AND_ABOVE, true). 1584 | -define(OTP_VSN_21_AND_ABOVE, true). 1585 | -define(OTP_VSN_20_AND_ABOVE, true). 1586 | -define(OTP_VSN_19_AND_ABOVE, true). 1587 | -define(OTP_VSN_18_AND_ABOVE, true). 1588 | -define(OTP_VSN_17_AND_ABOVE, true). 1589 | -define(OTP_VSN_16_AND_ABOVE, true). 1590 | -endif. 1591 | 1592 | -ifdef(_internal_otp_vsn_22_0_7). 1593 | -define(OTP_VSN, "22.0.7"). 1594 | -define(OTP_VSN_MAJOR, 22). 1595 | -define(OTP_VSN_MINOR, 0). 1596 | -define(OTP_VSN_PATCH, 7). 1597 | -define(OTP_VSN_22_AND_ABOVE, true). 1598 | -define(OTP_VSN_21_AND_ABOVE, true). 1599 | -define(OTP_VSN_20_AND_ABOVE, true). 1600 | -define(OTP_VSN_19_AND_ABOVE, true). 1601 | -define(OTP_VSN_18_AND_ABOVE, true). 1602 | -define(OTP_VSN_17_AND_ABOVE, true). 1603 | -define(OTP_VSN_16_AND_ABOVE, true). 1604 | -endif. 1605 | 1606 | -ifdef(_internal_otp_vsn_22_1_0). 1607 | -define(OTP_VSN, "22.1.0"). 1608 | -define(OTP_VSN_MAJOR, 22). 1609 | -define(OTP_VSN_MINOR, 1). 1610 | -define(OTP_VSN_PATCH, 0). 1611 | -define(OTP_VSN_22_AND_ABOVE, true). 1612 | -define(OTP_VSN_21_AND_ABOVE, true). 1613 | -define(OTP_VSN_20_AND_ABOVE, true). 1614 | -define(OTP_VSN_19_AND_ABOVE, true). 1615 | -define(OTP_VSN_18_AND_ABOVE, true). 1616 | -define(OTP_VSN_17_AND_ABOVE, true). 1617 | -define(OTP_VSN_16_AND_ABOVE, true). 1618 | -endif. 1619 | 1620 | -ifdef(_internal_otp_vsn_22_1_1). 1621 | -define(OTP_VSN, "22.1.1"). 1622 | -define(OTP_VSN_MAJOR, 22). 1623 | -define(OTP_VSN_MINOR, 1). 1624 | -define(OTP_VSN_PATCH, 1). 1625 | -define(OTP_VSN_22_AND_ABOVE, true). 1626 | -define(OTP_VSN_21_AND_ABOVE, true). 1627 | -define(OTP_VSN_20_AND_ABOVE, true). 1628 | -define(OTP_VSN_19_AND_ABOVE, true). 1629 | -define(OTP_VSN_18_AND_ABOVE, true). 1630 | -define(OTP_VSN_17_AND_ABOVE, true). 1631 | -define(OTP_VSN_16_AND_ABOVE, true). 1632 | -endif. 1633 | 1634 | -ifdef(_internal_otp_vsn_22_1_2). 1635 | -define(OTP_VSN, "22.1.2"). 1636 | -define(OTP_VSN_MAJOR, 22). 1637 | -define(OTP_VSN_MINOR, 1). 1638 | -define(OTP_VSN_PATCH, 2). 1639 | -define(OTP_VSN_22_AND_ABOVE, true). 1640 | -define(OTP_VSN_21_AND_ABOVE, true). 1641 | -define(OTP_VSN_20_AND_ABOVE, true). 1642 | -define(OTP_VSN_19_AND_ABOVE, true). 1643 | -define(OTP_VSN_18_AND_ABOVE, true). 1644 | -define(OTP_VSN_17_AND_ABOVE, true). 1645 | -define(OTP_VSN_16_AND_ABOVE, true). 1646 | -endif. 1647 | 1648 | -ifdef(_internal_otp_vsn_22_1_3). 1649 | -define(OTP_VSN, "22.1.3"). 1650 | -define(OTP_VSN_MAJOR, 22). 1651 | -define(OTP_VSN_MINOR, 1). 1652 | -define(OTP_VSN_PATCH, 3). 1653 | -define(OTP_VSN_22_AND_ABOVE, true). 1654 | -define(OTP_VSN_21_AND_ABOVE, true). 1655 | -define(OTP_VSN_20_AND_ABOVE, true). 1656 | -define(OTP_VSN_19_AND_ABOVE, true). 1657 | -define(OTP_VSN_18_AND_ABOVE, true). 1658 | -define(OTP_VSN_17_AND_ABOVE, true). 1659 | -define(OTP_VSN_16_AND_ABOVE, true). 1660 | -endif. 1661 | 1662 | -ifdef(_internal_otp_vsn_22_1_4). 1663 | -define(OTP_VSN, "22.1.4"). 1664 | -define(OTP_VSN_MAJOR, 22). 1665 | -define(OTP_VSN_MINOR, 1). 1666 | -define(OTP_VSN_PATCH, 4). 1667 | -define(OTP_VSN_22_AND_ABOVE, true). 1668 | -define(OTP_VSN_21_AND_ABOVE, true). 1669 | -define(OTP_VSN_20_AND_ABOVE, true). 1670 | -define(OTP_VSN_19_AND_ABOVE, true). 1671 | -define(OTP_VSN_18_AND_ABOVE, true). 1672 | -define(OTP_VSN_17_AND_ABOVE, true). 1673 | -define(OTP_VSN_16_AND_ABOVE, true). 1674 | -endif. 1675 | 1676 | -ifdef(_internal_otp_vsn_22_1_5). 1677 | -define(OTP_VSN, "22.1.5"). 1678 | -define(OTP_VSN_MAJOR, 22). 1679 | -define(OTP_VSN_MINOR, 1). 1680 | -define(OTP_VSN_PATCH, 5). 1681 | -define(OTP_VSN_22_AND_ABOVE, true). 1682 | -define(OTP_VSN_21_AND_ABOVE, true). 1683 | -define(OTP_VSN_20_AND_ABOVE, true). 1684 | -define(OTP_VSN_19_AND_ABOVE, true). 1685 | -define(OTP_VSN_18_AND_ABOVE, true). 1686 | -define(OTP_VSN_17_AND_ABOVE, true). 1687 | -define(OTP_VSN_16_AND_ABOVE, true). 1688 | -endif. 1689 | 1690 | -ifdef(_internal_otp_vsn_22_1_6). 1691 | -define(OTP_VSN, "22.1.6"). 1692 | -define(OTP_VSN_MAJOR, 22). 1693 | -define(OTP_VSN_MINOR, 1). 1694 | -define(OTP_VSN_PATCH, 6). 1695 | -define(OTP_VSN_22_AND_ABOVE, true). 1696 | -define(OTP_VSN_21_AND_ABOVE, true). 1697 | -define(OTP_VSN_20_AND_ABOVE, true). 1698 | -define(OTP_VSN_19_AND_ABOVE, true). 1699 | -define(OTP_VSN_18_AND_ABOVE, true). 1700 | -define(OTP_VSN_17_AND_ABOVE, true). 1701 | -define(OTP_VSN_16_AND_ABOVE, true). 1702 | -endif. 1703 | 1704 | -ifdef(_internal_otp_vsn_22_1_7). 1705 | -define(OTP_VSN, "22.1.7"). 1706 | -define(OTP_VSN_MAJOR, 22). 1707 | -define(OTP_VSN_MINOR, 1). 1708 | -define(OTP_VSN_PATCH, 7). 1709 | -define(OTP_VSN_22_AND_ABOVE, true). 1710 | -define(OTP_VSN_21_AND_ABOVE, true). 1711 | -define(OTP_VSN_20_AND_ABOVE, true). 1712 | -define(OTP_VSN_19_AND_ABOVE, true). 1713 | -define(OTP_VSN_18_AND_ABOVE, true). 1714 | -define(OTP_VSN_17_AND_ABOVE, true). 1715 | -define(OTP_VSN_16_AND_ABOVE, true). 1716 | -endif. 1717 | 1718 | -ifdef(_internal_otp_vsn_22_1_8). 1719 | -define(OTP_VSN, "22.1.8"). 1720 | -define(OTP_VSN_MAJOR, 22). 1721 | -define(OTP_VSN_MINOR, 1). 1722 | -define(OTP_VSN_PATCH, 8). 1723 | -define(OTP_VSN_22_AND_ABOVE, true). 1724 | -define(OTP_VSN_21_AND_ABOVE, true). 1725 | -define(OTP_VSN_20_AND_ABOVE, true). 1726 | -define(OTP_VSN_19_AND_ABOVE, true). 1727 | -define(OTP_VSN_18_AND_ABOVE, true). 1728 | -define(OTP_VSN_17_AND_ABOVE, true). 1729 | -define(OTP_VSN_16_AND_ABOVE, true). 1730 | -endif. 1731 | 1732 | -ifdef(_internal_otp_vsn_22_2_0). 1733 | -define(OTP_VSN, "22.2.0"). 1734 | -define(OTP_VSN_MAJOR, 22). 1735 | -define(OTP_VSN_MINOR, 2). 1736 | -define(OTP_VSN_PATCH, 0). 1737 | -define(OTP_VSN_22_AND_ABOVE, true). 1738 | -define(OTP_VSN_21_AND_ABOVE, true). 1739 | -define(OTP_VSN_20_AND_ABOVE, true). 1740 | -define(OTP_VSN_19_AND_ABOVE, true). 1741 | -define(OTP_VSN_18_AND_ABOVE, true). 1742 | -define(OTP_VSN_17_AND_ABOVE, true). 1743 | -define(OTP_VSN_16_AND_ABOVE, true). 1744 | -endif. 1745 | 1746 | -ifdef(_internal_otp_vsn_22_2_1). 1747 | -define(OTP_VSN, "22.2.1"). 1748 | -define(OTP_VSN_MAJOR, 22). 1749 | -define(OTP_VSN_MINOR, 2). 1750 | -define(OTP_VSN_PATCH, 1). 1751 | -define(OTP_VSN_22_AND_ABOVE, true). 1752 | -define(OTP_VSN_21_AND_ABOVE, true). 1753 | -define(OTP_VSN_20_AND_ABOVE, true). 1754 | -define(OTP_VSN_19_AND_ABOVE, true). 1755 | -define(OTP_VSN_18_AND_ABOVE, true). 1756 | -define(OTP_VSN_17_AND_ABOVE, true). 1757 | -define(OTP_VSN_16_AND_ABOVE, true). 1758 | -endif. 1759 | 1760 | -ifdef(_internal_otp_vsn_22_2_2). 1761 | -define(OTP_VSN, "22.2.2"). 1762 | -define(OTP_VSN_MAJOR, 22). 1763 | -define(OTP_VSN_MINOR, 2). 1764 | -define(OTP_VSN_PATCH, 2). 1765 | -define(OTP_VSN_22_AND_ABOVE, true). 1766 | -define(OTP_VSN_21_AND_ABOVE, true). 1767 | -define(OTP_VSN_20_AND_ABOVE, true). 1768 | -define(OTP_VSN_19_AND_ABOVE, true). 1769 | -define(OTP_VSN_18_AND_ABOVE, true). 1770 | -define(OTP_VSN_17_AND_ABOVE, true). 1771 | -define(OTP_VSN_16_AND_ABOVE, true). 1772 | -endif. 1773 | 1774 | -ifdef(_internal_otp_vsn_22_2_3). 1775 | -define(OTP_VSN, "22.2.3"). 1776 | -define(OTP_VSN_MAJOR, 22). 1777 | -define(OTP_VSN_MINOR, 2). 1778 | -define(OTP_VSN_PATCH, 3). 1779 | -define(OTP_VSN_22_AND_ABOVE, true). 1780 | -define(OTP_VSN_21_AND_ABOVE, true). 1781 | -define(OTP_VSN_20_AND_ABOVE, true). 1782 | -define(OTP_VSN_19_AND_ABOVE, true). 1783 | -define(OTP_VSN_18_AND_ABOVE, true). 1784 | -define(OTP_VSN_17_AND_ABOVE, true). 1785 | -define(OTP_VSN_16_AND_ABOVE, true). 1786 | -endif. 1787 | 1788 | -ifdef(_internal_otp_vsn_22_2_4). 1789 | -define(OTP_VSN, "22.2.4"). 1790 | -define(OTP_VSN_MAJOR, 22). 1791 | -define(OTP_VSN_MINOR, 2). 1792 | -define(OTP_VSN_PATCH, 4). 1793 | -define(OTP_VSN_22_AND_ABOVE, true). 1794 | -define(OTP_VSN_21_AND_ABOVE, true). 1795 | -define(OTP_VSN_20_AND_ABOVE, true). 1796 | -define(OTP_VSN_19_AND_ABOVE, true). 1797 | -define(OTP_VSN_18_AND_ABOVE, true). 1798 | -define(OTP_VSN_17_AND_ABOVE, true). 1799 | -define(OTP_VSN_16_AND_ABOVE, true). 1800 | -endif. 1801 | 1802 | -ifdef(_internal_otp_vsn_22_2_5). 1803 | -define(OTP_VSN, "22.2.5"). 1804 | -define(OTP_VSN_MAJOR, 22). 1805 | -define(OTP_VSN_MINOR, 2). 1806 | -define(OTP_VSN_PATCH, 5). 1807 | -define(OTP_VSN_22_AND_ABOVE, true). 1808 | -define(OTP_VSN_21_AND_ABOVE, true). 1809 | -define(OTP_VSN_20_AND_ABOVE, true). 1810 | -define(OTP_VSN_19_AND_ABOVE, true). 1811 | -define(OTP_VSN_18_AND_ABOVE, true). 1812 | -define(OTP_VSN_17_AND_ABOVE, true). 1813 | -define(OTP_VSN_16_AND_ABOVE, true). 1814 | -endif. 1815 | 1816 | -ifdef(_internal_otp_vsn_22_2_6). 1817 | -define(OTP_VSN, "22.2.6"). 1818 | -define(OTP_VSN_MAJOR, 22). 1819 | -define(OTP_VSN_MINOR, 2). 1820 | -define(OTP_VSN_PATCH, 6). 1821 | -define(OTP_VSN_22_AND_ABOVE, true). 1822 | -define(OTP_VSN_21_AND_ABOVE, true). 1823 | -define(OTP_VSN_20_AND_ABOVE, true). 1824 | -define(OTP_VSN_19_AND_ABOVE, true). 1825 | -define(OTP_VSN_18_AND_ABOVE, true). 1826 | -define(OTP_VSN_17_AND_ABOVE, true). 1827 | -define(OTP_VSN_16_AND_ABOVE, true). 1828 | -endif. 1829 | 1830 | -ifdef(_internal_otp_vsn_22_2_7). 1831 | -define(OTP_VSN, "22.2.7"). 1832 | -define(OTP_VSN_MAJOR, 22). 1833 | -define(OTP_VSN_MINOR, 2). 1834 | -define(OTP_VSN_PATCH, 7). 1835 | -define(OTP_VSN_22_AND_ABOVE, true). 1836 | -define(OTP_VSN_21_AND_ABOVE, true). 1837 | -define(OTP_VSN_20_AND_ABOVE, true). 1838 | -define(OTP_VSN_19_AND_ABOVE, true). 1839 | -define(OTP_VSN_18_AND_ABOVE, true). 1840 | -define(OTP_VSN_17_AND_ABOVE, true). 1841 | -define(OTP_VSN_16_AND_ABOVE, true). 1842 | -endif. 1843 | 1844 | -ifdef(_internal_otp_vsn_22_2_8). 1845 | -define(OTP_VSN, "22.2.8"). 1846 | -define(OTP_VSN_MAJOR, 22). 1847 | -define(OTP_VSN_MINOR, 2). 1848 | -define(OTP_VSN_PATCH, 8). 1849 | -define(OTP_VSN_22_AND_ABOVE, true). 1850 | -define(OTP_VSN_21_AND_ABOVE, true). 1851 | -define(OTP_VSN_20_AND_ABOVE, true). 1852 | -define(OTP_VSN_19_AND_ABOVE, true). 1853 | -define(OTP_VSN_18_AND_ABOVE, true). 1854 | -define(OTP_VSN_17_AND_ABOVE, true). 1855 | -define(OTP_VSN_16_AND_ABOVE, true). 1856 | -endif. 1857 | 1858 | -ifdef(_internal_otp_vsn_22_3_0). 1859 | -define(OTP_VSN, "22.3.0"). 1860 | -define(OTP_VSN_MAJOR, 22). 1861 | -define(OTP_VSN_MINOR, 3). 1862 | -define(OTP_VSN_PATCH, 0). 1863 | -define(OTP_VSN_22_AND_ABOVE, true). 1864 | -define(OTP_VSN_21_AND_ABOVE, true). 1865 | -define(OTP_VSN_20_AND_ABOVE, true). 1866 | -define(OTP_VSN_19_AND_ABOVE, true). 1867 | -define(OTP_VSN_18_AND_ABOVE, true). 1868 | -define(OTP_VSN_17_AND_ABOVE, true). 1869 | -define(OTP_VSN_16_AND_ABOVE, true). 1870 | -endif. 1871 | 1872 | -ifdef(_internal_otp_vsn_22_3_1). 1873 | -define(OTP_VSN, "22.3.1"). 1874 | -define(OTP_VSN_MAJOR, 22). 1875 | -define(OTP_VSN_MINOR, 3). 1876 | -define(OTP_VSN_PATCH, 1). 1877 | -define(OTP_VSN_22_AND_ABOVE, true). 1878 | -define(OTP_VSN_21_AND_ABOVE, true). 1879 | -define(OTP_VSN_20_AND_ABOVE, true). 1880 | -define(OTP_VSN_19_AND_ABOVE, true). 1881 | -define(OTP_VSN_18_AND_ABOVE, true). 1882 | -define(OTP_VSN_17_AND_ABOVE, true). 1883 | -define(OTP_VSN_16_AND_ABOVE, true). 1884 | -endif. 1885 | 1886 | -ifdef(_internal_otp_vsn_22_3_2). 1887 | -define(OTP_VSN, "22.3.2"). 1888 | -define(OTP_VSN_MAJOR, 22). 1889 | -define(OTP_VSN_MINOR, 3). 1890 | -define(OTP_VSN_PATCH, 2). 1891 | -define(OTP_VSN_22_AND_ABOVE, true). 1892 | -define(OTP_VSN_21_AND_ABOVE, true). 1893 | -define(OTP_VSN_20_AND_ABOVE, true). 1894 | -define(OTP_VSN_19_AND_ABOVE, true). 1895 | -define(OTP_VSN_18_AND_ABOVE, true). 1896 | -define(OTP_VSN_17_AND_ABOVE, true). 1897 | -define(OTP_VSN_16_AND_ABOVE, true). 1898 | -endif. 1899 | 1900 | -ifdef(_internal_otp_vsn_23_0_0). 1901 | -define(OTP_VSN, "23.0.0"). 1902 | -define(OTP_VSN_MAJOR, 23). 1903 | -define(OTP_VSN_MINOR, 0). 1904 | -define(OTP_VSN_PATCH, 0). 1905 | -define(OTP_VSN_23_AND_ABOVE, true). 1906 | -define(OTP_VSN_22_AND_ABOVE, true). 1907 | -define(OTP_VSN_21_AND_ABOVE, true). 1908 | -define(OTP_VSN_20_AND_ABOVE, true). 1909 | -define(OTP_VSN_19_AND_ABOVE, true). 1910 | -define(OTP_VSN_18_AND_ABOVE, true). 1911 | -define(OTP_VSN_17_AND_ABOVE, true). 1912 | -define(OTP_VSN_16_AND_ABOVE, true). 1913 | -endif. 1914 | 1915 | %% integer_to_list(Literal) resolves at compile time. 1916 | -define(OTP_VSN_MAJOR_STRING, integer_to_list(?OTP_VSN_MAJOR)). 1917 | -define(OTP_VSN_MINOR_STRING, integer_to_list(?OTP_VSN_MINOR)). 1918 | -define(OTP_VSN_PATCH_STRING, integer_to_list(?OTP_VSN_PATCH)). 1919 | 1920 | -ifdef(OTP_VSN_17_AND_ABOVE). 1921 | -define(OTP_VSN_HAS_MAPS, true). 1922 | -endif. 1923 | 1924 | -ifdef(OTP_VSN_21_AND_ABOVE). 1925 | -define(OTP_VSN_HAS_ST_MATCHING, true). 1926 | -define(OTP_VSN_IF_HAS_ST_MATCHING(Yes), Yes). 1927 | -define(OTP_VSN_IF_HAS_ST_MATCHING(Yes, No), Yes). 1928 | -define(OTP_VSN_STACKTRACE(Type, Error, ST), Type:Error:ST ->). 1929 | -else. 1930 | -define(OTP_VSN_IF_HAS_ST_MATCHING(Yes), ). 1931 | -define(OTP_VSN_IF_HAS_ST_MATCHING(Yes, No), No). 1932 | -define(OTP_VSN_STACKTRACE(Type, Error, ST), Type:Error -> ST = erlang:get_stacktrace(),). 1933 | -endif. 1934 | 1935 | -endif. 1936 | -------------------------------------------------------------------------------- /rebar.config.script: -------------------------------------------------------------------------------- 1 | %% Copyright © 2018 Pierre Fenoll ‹pierrefenoll@gmail.com› 2 | %% See LICENSE for licensing information. 3 | %% -*- coding: utf-8 -*- 4 | begin 5 | %% From https://github.com/erlang/rebar3/blob/c48435a/src/rebar_utils.erl#L489-L526 6 | OTP_VSN = {X,Y,Z} = 7 | case erlang:system_info(otp_release) of 8 | %% If OTP <= R16, otp_release is already what we want. 9 | "R16B01" -> {"16", "1", "0"}; 10 | "R16B02" -> {"16", "2", "0"}; 11 | "R16B03" -> {"16", "3", "0"}; 12 | "R16B03-1" -> {"16", "3", "1"}; 13 | 14 | %% If OTP >= 17.x, erlang:system_info(otp_release) returns just the 15 | %% major version number, we have to read the full version from 16 | %% a file. See http://www.erlang.org/doc/system_principles/versions.html 17 | %% Read vsn string from the 'OTP_VERSION' file and return as list without 18 | %% the "\n". 19 | Rel -> 20 | Split = fun (Bin) -> binary:split(Bin, [<<$.>>,<<$->>], [global]) end, 21 | ToXYZ = fun ([X,Y]) -> {X, Y, "0"}; 22 | ([X,Y,<<"rc",_/binary>>]) -> {X, Y, "0"}; 23 | ([X,Y,Z|_]) -> {X, Y, Z} 24 | end, 25 | 26 | File = filename:join([code:root_dir(), "releases", Rel, "OTP_VERSION"]), 27 | {ok,Vsn} = file:read_file(File), 28 | Size = byte_size(Vsn), 29 | %% The shortest vsn string consists of at least two digits 30 | %% followed by "\n". Therefore, it's safe to assume Size >= 3. 31 | {SizeMinus1,SizeMinus3} = {Size - 1, Size - 3}, 32 | case Vsn of 33 | <> -> 34 | %% The OTP documentation mentions that a system patched 35 | %% using the otp_patch_apply tool available to licensed 36 | %% customers will leave a '**' suffix in the version as a 37 | %% flag saying the system consists of application versions 38 | %% from multiple OTP versions. We ignore this flag and 39 | %% drop the suffix, given for all intents and purposes, we 40 | %% cannot obtain relevant information from it as far as 41 | %% tooling is concerned. 42 | ToXYZ(Split(VSN)); 43 | <> -> 44 | ToXYZ(Split(VSN)) 45 | end 46 | end, 47 | 48 | Data = ["-define(_internal_otp_vsn_", X,$_,Y,$_,Z, ", true).", $\n], 49 | 50 | DefaultBuildLibDir = "_build/default/lib", 51 | 52 | %% get all possible otp_vsn lib dirs 53 | %% _build/default/lib/otp_vsn --> if no REBAR_LIB_DEPS env specified, or 54 | %% no custom rebar.config.script specified 55 | %% REBAR_LIB_DEPS --> if env exists 56 | DepsDirs = case os:getenv("REBAR_LIB_DEPS") of 57 | false -> [DefaultBuildLibDir]; 58 | [] -> [DefaultBuildLibDir]; 59 | Dir -> [Dir,DefaultBuildLibDir] 60 | end, 61 | 62 | %% generate internal_otp_vsn.hrl at all possible dirs 63 | Dsts = case filelib:is_regular(filename:join("src","otp_vsn.app.src")) of 64 | false -> 65 | [ filename:join( 66 | [LibDir,"otp_vsn","include","internal_otp_vsn.hrl"]) 67 | || LibDir <- DepsDirs 68 | ]; 69 | true -> 70 | %% Current app is this app itself 71 | [filename:join("include", "internal_otp_vsn.hrl")] 72 | end, 73 | %ok = file:write_file(Dst, Data), 74 | %% ignore write_file error if dir is not exist 75 | [ file:write_file(Dst,Data) || Dst <- Dsts ] , 76 | 77 | CONFIG 78 | end. 79 | -------------------------------------------------------------------------------- /rebar.lock: -------------------------------------------------------------------------------- 1 | []. 2 | -------------------------------------------------------------------------------- /src/otp_vsn.app.src: -------------------------------------------------------------------------------- 1 | {application,otp_vsn, 2 | [{description,"Macros defined per Erlang/OTP version so you don't have to."}, 3 | {vsn,"git"}, 4 | {registered,[]}, 5 | {applications,[kernel,stdlib]}, 6 | {env,[]}, 7 | {modules,[]}, 8 | {licenses,["Apache 2.0"]}, 9 | {links,[{"Github","https://github.com/fenollp/otp_vsn"}]}, 10 | {files,["include/otp_vsn.hrl","rebar.config.script", 11 | "rebar.lock","src/otp_vsn.app.src","LICENSE*", 12 | "README*"]}]}. 13 | -------------------------------------------------------------------------------- /test/has_maps_tests.erl: -------------------------------------------------------------------------------- 1 | %% Copyright © 2018 Pierre Fenoll ‹pierrefenoll@gmail.com› 2 | %% See LICENSE for licensing information. 3 | %% -*- coding: utf-8 -*- 4 | -module(has_maps_tests). 5 | 6 | -include_lib("eunit/include/eunit.hrl"). 7 | -include_lib("otp_vsn/include/otp_vsn.hrl"). 8 | 9 | -ifdef(OTP_VSN_HAS_MAPS). 10 | has_maps() -> true. 11 | -else. 12 | has_maps() -> false. 13 | -endif. 14 | 15 | has_maps_test() -> 16 | ?assertEqual(has_maps(), {module,maps} =:= code:ensure_loaded(maps)). 17 | -------------------------------------------------------------------------------- /test/has_st_matching_tests.erl: -------------------------------------------------------------------------------- 1 | %% Copyright © 2018 Pierre Fenoll ‹pierrefenoll@gmail.com› 2 | %% See LICENSE for licensing information. 3 | %% -*- coding: utf-8 -*- 4 | -module(has_st_matching_tests). 5 | 6 | -include_lib("eunit/include/eunit.hrl"). 7 | -include_lib("otp_vsn/include/otp_vsn.hrl"). 8 | 9 | do_test_() -> 10 | lists:flatten( 11 | [[?_assertEqual(X, try_compact(X)) 12 | ,?_assertEqual(X, try_not_DRY(X)) 13 | ,?_assertEqual(X, really_DRY(X)) 14 | ] 15 | || X <- [a,b,c] 16 | ]). 17 | 18 | really_DRY(X) -> 19 | try explode(X) 20 | catch 21 | ?OTP_VSN_STACKTRACE(error, _, ST) 22 | begin f(ST), X end; 23 | ?OTP_VSN_STACKTRACE(throw, only_matching, ST) f(X,ST); 24 | ?OTP_VSN_STACKTRACE(throw, b, ST) f(X,ST); 25 | ?OTP_VSN_STACKTRACE(_, _, ST) 26 | f(X, ST) 27 | end. 28 | 29 | try_compact(X) -> 30 | try explode(X) 31 | catch 32 | ?OTP_VSN_IF_HAS_ST_MATCHING( 33 | error:_:ST -> begin f(ST), X end; 34 | ,error:_ -> begin f(erlang:get_stacktrace()), X end; 35 | ) 36 | ?OTP_VSN_IF_HAS_ST_MATCHING(throw:only_matching:ST -> f(X,ST);) 37 | ?OTP_VSN_IF_HAS_ST_MATCHING(throw:b:ST -> f(X,ST);, throw:b -> f(X,erlang:get_stacktrace());) 38 | ?OTP_VSN_IF_HAS_ST_MATCHING(_:_:ST -> f(X, ST), 39 | _:_ -> f(X, erlang:get_stacktrace())) 40 | end. 41 | 42 | -ifdef(OTP_VSN_HAS_ST_MATCHING). 43 | try_not_DRY(X) -> 44 | try explode(X) 45 | catch 46 | error:_:ST -> begin f(ST), X end; 47 | throw:only_matching:ST -> f(X,ST); 48 | throw:b:ST -> f(X,ST); 49 | _:_:ST -> f(X, ST) 50 | end. 51 | -else. 52 | try_not_DRY(X) -> 53 | try explode(X) 54 | catch 55 | error:_ -> begin f(erlang:get_stacktrace()), X end; 56 | throw:b -> f(X,erlang:get_stacktrace()); 57 | _:_ -> f(X, erlang:get_stacktrace()) 58 | end. 59 | -endif. 60 | 61 | explode(a) -> error(a); 62 | explode(b) -> throw(b); 63 | explode(c) -> throw(c). 64 | 65 | f(X, ST) -> 66 | f(ST), 67 | X. 68 | 69 | f([_|_]) -> ok. 70 | -------------------------------------------------------------------------------- /test/otp_vsn_tests.erl: -------------------------------------------------------------------------------- 1 | %% Copyright © 2018 Pierre Fenoll ‹pierrefenoll@gmail.com› 2 | %% See LICENSE for licensing information. 3 | %% -*- coding: utf-8 -*- 4 | -module(otp_vsn_tests). 5 | 6 | -include_lib("eunit/include/eunit.hrl"). 7 | -include_lib("otp_vsn/include/otp_vsn.hrl"). 8 | 9 | do_test_() -> 10 | [?_assertMatch([_|_], ?OTP_VSN) 11 | 12 | ,?_assert(is_integer(?OTP_VSN_MAJOR) andalso ?OTP_VSN_MAJOR > 0) 13 | ,?_assert(is_integer(?OTP_VSN_MINOR) andalso ?OTP_VSN_MINOR >= 0) 14 | ,?_assert(is_integer(?OTP_VSN_PATCH) andalso ?OTP_VSN_PATCH >= 0) 15 | 16 | ,?_assertMatch([_|_], ?OTP_VSN_MAJOR_STRING) 17 | ,?_assertMatch([_|_], ?OTP_VSN_MINOR_STRING) 18 | ,?_assertMatch([_|_], ?OTP_VSN_PATCH_STRING) 19 | ]. 20 | 21 | 'ci-only_test_'() -> 22 | lists:flatten( 23 | [[?_assertMatch([_|_], OTP_VSN) 24 | ,?_assertEqual(OTP_VSN, ?OTP_VSN) 25 | ,?_assertNotEqual(nomatch, re:run(<>, <<"^[0-9]+\\.[0-9]+\\.[0-9]+\$">>)) 26 | 27 | ,?_assertMatch([_|_], OTP_VSN_M) 28 | ,?_assertMatch([_|_], OTP_VSN_m) 29 | ,?_assertMatch([_|_], OTP_VSN_P) 30 | ,?_assertEqual(list_to_integer(OTP_VSN_M), ?OTP_VSN_MAJOR) 31 | ,?_assertEqual(list_to_integer(OTP_VSN_m), ?OTP_VSN_MINOR) 32 | ,?_assertEqual(list_to_integer(OTP_VSN_P), ?OTP_VSN_PATCH) 33 | 34 | ,?_assertEqual(OTP_VSN_M, ?OTP_VSN_MAJOR_STRING) 35 | ,?_assertEqual(OTP_VSN_m, ?OTP_VSN_MINOR_STRING) 36 | ,?_assertEqual(OTP_VSN_P, ?OTP_VSN_PATCH_STRING) 37 | ] 38 | || os:getenv("CI") =:= "true", 39 | {OTP_VSN 40 | ,OTP_VSN_M 41 | ,OTP_VSN_m 42 | ,OTP_VSN_P 43 | } <- [{os:getenv("_OTP_VSN") 44 | ,os:getenv("_OTP_VSN_M") 45 | ,os:getenv("_OTP_VSN_m") 46 | ,os:getenv("_OTP_VSN_P") 47 | }] 48 | ]). 49 | --------------------------------------------------------------------------------