Merge remote-tracking branch 'davisp/master'
diff --git a/.travis.yml b/.travis.yml
index 61a6d09..4a827cd 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,19 +1,10 @@
 language: erlang
 
 otp_release:
-   - 21.0
-   - 20.0
+   - 22.2.4
+   - 21.3.8.1
+   - 20.3.8.22
    - 19.3
-   - 19.2
-   - 19.1
-   - 19.0
    - 18.3
-   - 18.2
    - 17.5
-   - 17.4
    - R16B03-1
-   - R16B02
-   - R15B03
-   - R15B02
-   - R14B04
-   - R14B03
diff --git a/rebar.config b/rebar.config
index 396631e..b951b5e 100644
--- a/rebar.config
+++ b/rebar.config
@@ -7,13 +7,15 @@
 ]}.
 
 {port_env, [
-    {"(linux|solaris|freebsd|netbsd|openbsd|dragonfly|darwin|gnu)",
-        "CFLAGS", "$CFLAGS -Ic_src/ -g -Wall -flto -Werror -O3"},
-    {"(linux|solaris|freebsd|netbsd|openbsd|dragonfly|darwin|gnu)",
-        "CXXFLAGS", "$CXXFLAGS -Ic_src/ -g -Wall -flto -Werror -O3"},
+    {".*", "FLTO_FLAG", ""},
 
     {"(linux|solaris|freebsd|netbsd|openbsd|dragonfly|darwin|gnu)",
-        "LDFLAGS", "$LDFLAGS -flto -lstdc++"},
+        "CFLAGS", "$CFLAGS -Ic_src/ -g -Wall $FLTO_FLAG -Werror -O3"},
+    {"(linux|solaris|freebsd|netbsd|openbsd|dragonfly|darwin|gnu)",
+        "CXXFLAGS", "$CXXFLAGS -Ic_src/ -g -Wall $FLTO_FLAG -Werror -O3"},
+
+    {"(linux|solaris|freebsd|netbsd|openbsd|dragonfly|darwin|gnu)",
+        "LDFLAGS", "$LDFLAGS $FLTO_FLAG -lstdc++"},
 
     %% OS X Leopard flags for 64-bit
     {"darwin9.*-64$", "CXXFLAGS", "-m64"},
diff --git a/rebar.config.script b/rebar.config.script
index 42bc6ef..a5da769 100644
--- a/rebar.config.script
+++ b/rebar.config.script
@@ -9,10 +9,31 @@
     [{d, 'HAVE_EQC'}]
 end,
 
-case lists:keyfind(erl_opts, 1, CONFIG) of
+Config1 = case lists:keyfind(erl_opts, 1, CONFIG) of
     {erl_opts, Opts} ->
         NewOpts = {erl_opts, Opts ++ ErlOpts},
         lists:keyreplace(erl_opts, 1, CONFIG, NewOpts);
     false ->
         CONFIG ++ [{erl_opts, ErlOpts}]
+end,
+
+case os:type() of
+    {unix, _} ->
+        CC = case os:getenv("CC") of
+            false -> "cc";
+            Else -> Else
+        end,
+        FLTO_CHECK = "echo 'int main(int argc, char *argv[]) {return 0;}' | "
+                ++ CC ++ " -c -x c -o /dev/null -flto -",
+        case os:cmd(FLTO_CHECK) of
+            [] ->
+                {port_env, PortEnv} = lists:keyfind(port_env, 1, Config1),
+                NewFlag = {".*", "FLTO_FLAG", "-flto"},
+                NewPortEnv = lists:keyreplace("FLTO_FLAG", 2, PortEnv, NewFlag),
+                lists:keyreplace(port_env, 1, Config1, {port_env, NewPortEnv});
+            _ ->
+                Config1
+        end;
+    _ ->
+        Config1
 end.