%% -*- tab-width: 4;erlang-indent-level: 4;indent-tabs-mode: nil -*-
%% ex: ft=erlang ts=4 sw=4 et

%% Licensed under the Apache License, Version 2.0 (the "License"); you may not
%% use this file except in compliance with the License. You may obtain a copy of
%% the License at
%%
%%   http://www.apache.org/licenses/LICENSE-2.0
%%
%% Unless required by applicable law or agreed to in writing, software
%% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
%% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
%% License for the specific language governing permissions and limitations under
%% the License.

Arch = erlang:system_info(system_architecture),

ICUConfig = fun(Args) ->
    {0, Value} = eunit_lib:command("icu-config " ++ Args),
    [C||C <- Value, C =/= $\n]
end,

GetFlag = fun(Name, Args) ->
        case os:getenv(Name) of
            false -> ICUConfig(Args);
            Val -> Val
        end
    end,

GetFlag1 = fun(Name, Default) ->
        case os:getenv(Name) of
            false -> Default;
            Val -> Val
        end
    end,

BuildStatic = os:getenv("COUCHDB_STATIC") =:= "1" andalso
                os:getenv("USE_STATIC_ICU") =:= "1",


IsDarwin = case os:type() of
    {unix, darwin} -> true;
    _ -> false
end,

UseSystemIcu = IsDarwin andalso os:getenv("USE_STATIC_ICU") /= "1",

PortEnv = case {UseSystemIcu, BuildStatic} of
    {true, _} ->
        CFLAGS = GetFlag1("ICU_CFLAGS",
                         "-Iplatform/osx/icu -I/usr/include -fPIC"),
        LDFLAGS = GetFlag1("ICU_LDFLAGS",
                          "-lpthread -lm  -licucore -lstdc++ -L/usr/lib " ++
                          "$DRV_LDFLAGS -fPIC"),
        [
            {"CFLAGS", "$DRV_CFLAGS " ++ CFLAGS},
            {"LDFLAGS", LDFLAGS}
        ];

    {_, true} ->
        CFLAGS = GetFlag1("ICU_CFLAGS", "-I.libs/icu/include"),
        LDFLAGS = GetFlag1("ICU_LDFLAGS", "-lstdc++ -fPIC " ++
                                         ".libs/icu/lib/libicui18n.a " ++
                                         ".libs/icu/lib/libicuuc.a " ++
                                         ".libs/icu/lib/libicudata.a"),
        [
            {"DRV_CFLAGS", "$DRV_CFLAGS " ++ CFLAGS ++ " -D BSD_SOURCE"},
            {"DRV_LDFLAGS", "$DRV_LDFLAGS " ++ LDFLAGS}
        ];
    {_, false} ->
        ICUCFLAGS = GetFlag("ICU_CFLAGS", "--cflags"),
        ICUCXXFLAGS = GetFlag("ICU_CXXFLAGS", "--cxxflags"),
        ICULDFLAGS = GetFlag("ICU_LDFLAGS", "--ldflags"),
        ICUINCPATH = GetFlag("ICU_INCPATH", "--cppflags-searchpath"),

        [
            {"CFLAGS",  ICUCFLAGS ++  " $CFLAGS " ++ ICUINCPATH},
            {"CXXFLAGS", ICUCXXFLAGS ++ " $CXXFLAGS " ++ ICUINCPATH},
            {"LDFLAGS",  ICULDFLAGS ++ " $LDFLAGS"}
        ]
end,

PortInfo = [{port_env, PortEnv},
            {port_specs, [
                {filename:join(["priv", Arch, "couch_collate.so"]),
                    ["c_src/*.c"]}]},
            {pre_hooks, [{compile, "./build_icu.sh"}]},
            {post_hooks, [{clean, "./build_icu.sh clean"}]}],

lists:keymerge(1,lists:keysort(1, PortInfo), lists:keysort(1, CONFIG)).
