| %% -*- erlang-indent-level: 4;indent-tabs-mode: nil -*- |
| %% ex: ts=4 sw=4 et |
| %% ------------------------------------------------------------------- |
| %% |
| %% rebar: Erlang Build Tools |
| %% |
| %% Copyright (c) 2009 Dave Smith (dizzyd@dizzyd.com) |
| %% |
| %% Permission is hereby granted, free of charge, to any person obtaining a copy |
| %% of this software and associated documentation files (the "Software"), to deal |
| %% in the Software without restriction, including without limitation the rights |
| %% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
| %% copies of the Software, and to permit persons to whom the Software is |
| %% furnished to do so, subject to the following conditions: |
| %% |
| %% The above copyright notice and this permission notice shall be included in |
| %% all copies or substantial portions of the Software. |
| %% |
| %% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| %% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| %% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
| %% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| %% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| %% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
| %% THE SOFTWARE. |
| %% |
| %% ------------------------------------------------------------------- |
| |
| -module(rebar_require_vsn). |
| |
| -include("rebar.hrl"). |
| |
| -export([compile/2, |
| eunit/2]). |
| |
| %% for internal use only |
| -export([info/2, |
| version_tuple/3]). |
| |
| %% =================================================================== |
| %% Public API |
| %% =================================================================== |
| |
| compile(Config, _) -> |
| check_versions(Config). |
| |
| eunit(Config, _) -> |
| check_versions(Config). |
| |
| %% ==================================================================== |
| %% Internal functions |
| %% ==================================================================== |
| |
| info(help, compile) -> |
| info_help(); |
| info(help, eunit) -> |
| info_help(). |
| |
| info_help() -> |
| ?CONSOLE( |
| "Check required ERTS or OTP release version.~n" |
| "~n" |
| "Valid rebar.config options:~n" |
| " ~p~n" |
| " ~p~n" |
| " ~p~n", |
| [ |
| {require_erts_vsn, ".*"}, |
| {require_otp_vsn, ".*"}, |
| {require_min_otp_vsn, ".*"} |
| ]). |
| |
| check_versions(Config) -> |
| ShouldAbort = case rebar_config:get_xconf(Config, keep_going, false) of |
| true -> keep_going; |
| false -> abort |
| end, |
| ErtsRegex = rebar_config:get(Config, require_erts_vsn, ".*"), |
| ReOpts = [{capture, none}], |
| case re:run(erlang:system_info(version), ErtsRegex, ReOpts) of |
| match -> |
| ?DEBUG("Matched required ERTS version: ~s -> ~s\n", |
| [erlang:system_info(version), ErtsRegex]); |
| nomatch -> |
| maybe_abort( |
| ShouldAbort, |
| "ERTS version ~s does not match required regex ~s\n", |
| [erlang:system_info(version), ErtsRegex]) |
| end, |
| |
| OtpRegex = rebar_config:get(Config, require_otp_vsn, ".*"), |
| case re:run(erlang:system_info(otp_release), OtpRegex, ReOpts) of |
| match -> |
| ?DEBUG("Matched required OTP release: ~s -> ~s\n", |
| [erlang:system_info(otp_release), OtpRegex]); |
| nomatch -> |
| maybe_abort( |
| ShouldAbort, |
| "OTP release ~s does not match required regex ~s\n", |
| [erlang:system_info(otp_release), OtpRegex]) |
| end, |
| |
| case rebar_config:get(Config, require_min_otp_vsn, undefined) of |
| undefined -> ?DEBUG("Min OTP version unconfigured~n", []); |
| MinOtpVsn -> |
| {MinMaj, MinMin} = version_tuple(ShouldAbort, MinOtpVsn, |
| "configured"), |
| {OtpMaj, OtpMin} = version_tuple(ShouldAbort, |
| erlang:system_info(otp_release), |
| "OTP Release"), |
| case {OtpMaj, OtpMin} >= {MinMaj, MinMin} of |
| true -> |
| ?DEBUG("~s satisfies the requirement for vsn ~s~n", |
| [erlang:system_info(otp_release), |
| MinOtpVsn]); |
| false -> |
| maybe_abort( |
| ShouldAbort, |
| "OTP release ~s or later is required, you have: ~s~n", |
| [MinOtpVsn, |
| erlang:system_info(otp_release)]) |
| end |
| end. |
| |
| version_tuple(ShouldAbort, OtpRelease, Type) -> |
| case re:run(OtpRelease, "R?(\\d+)B?-?(\\d+)?", [{capture, all, list}]) of |
| {match, [_Full, Maj, Min]} -> |
| {list_to_integer(Maj), list_to_integer(Min)}; |
| {match, [_Full, Maj]} -> |
| {list_to_integer(Maj), 0}; |
| nomatch -> |
| maybe_abort(ShouldAbort, |
| "Cannot parse ~s version string: ~s~n", |
| [Type, OtpRelease]) |
| end. |
| |
| maybe_abort(abort, Format, Data) -> |
| ?ABORT(Format, Data); |
| maybe_abort(keep_going, Format, Data) -> |
| ?ERROR(Format, Data). |