#!/usr/bin/env escript
%% -*- erlang -*-
%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 2008-2009. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
%% compliance with the License. You should have received a copy of the
%% Erlang Public License along with this software. If not, it can be
%% retrieved online at http://www.erlang.org/.
%%
%% Software distributed under the License is distributed on an "AS IS"
%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
%% the License for the specific language governing rights and limitations
%% under the License.
%%
%% %CopyrightEnd%
%%
%% Install wx to an erlang distribution.
%%
-module('install_es'). %% Temp workaround for buggy escript
-mode(compile).
usage() ->
io:format("install [Opts] [InstallDir]~n",[]),
io:format(" -v verbose~n",[]),
io:format(" -q quiet and direct no questions~n",[]),
io:format(" --create_release To create a release~n~n",[]),
ok.
main([]) ->
IDir = filename:join(code:root_dir(),"lib"),
install(IDir),
ok;
main(Opts) ->
IDir = options(Opts),
install(IDir),
ok.
install_files() ->
[{[], {files, ["README","TODO", "Notes", "license.terms"]}},
{[src], {list, "*.?rl"}},
{[include], {list, "*.hrl"}},
{[src,gen], {list, "*.?rl"}},
{[test], {list, "*.?rl"}},
{[test], {list, "*.bmp"}},
{[test], {files, ["wxt", "Readme"]}},
{[samples], {files, ["sample.xpm"]}},
{[samples,menu], {files, ["copy.xpm"]}},
{[samples,'*'], {list, "*.?rl"}},
{[demos,'*'], {list, "*.?rl"}},
{[demos,xrc,rc], {list, "*"}},
{[doc,html], {files, ["edoc-info", "erlang.png", "stylesheet.css"]}}
].
built_files(SrcDir, Type) ->
Dirs = [{[doc], {list, "*.html"}},
{[ebin], {list, "*"}},
{[test], {list, "*.beam"}},
{[demos,'*'], {list, "*.beam"}},
{[samples,'*'], {list, "*.beam"}}],
case Type of
install ->
[{[priv,'*'], {list, "*"}}|Dirs];
_ -> %% Create Rel
Win32 = [{[priv,win32], {list, "*"}}| Dirs],
case filelib:wildcard("i386-apple*",
filename:join(SrcDir, "priv")) of
[Mac] ->
[{[priv,list_to_atom(Mac)], {list, "*"}}|Win32];
[] ->
io:format("WARNING: Missing Mac driver!~n",[]),
Win32
end
end.
release_files() ->
[{[], {files, ["configure.in","Makefile","wxwin.m4", "config.mk.in", "vsn.mk"]}},
{[], {files, ["configure", "install.es"]}},
{[autoconf], {files, ["config.guess","config.sub","install-sh"]}},
{[src], {files, ["Makefile"]}},
{[c_src], {files, ["Makefile.in"]}},
{[c_src], {list, "*.c*"}},
{[c_src], {list, "*.h"}},
{[c_src,gen], {list, "*.cpp"}},
{[c_src,gen], {list, "*.h"}},
{[doc], {files, ["overview.edoc"]}},
{[doc,src], {files, ["Makefile"]}},
{[test], {files, ["Makefile"]}},
%% {[demos], {files, ["Makefile"]}},
%% {[demos,'*'], {files, ["Makefile"]}},
%% {[samples], {files, ["Makefile"]}},
%% {[samples,'*'], {files, ["Makefile"]}},
{[api_gen], {list, "*.?rl"}},
{[api_gen], {list, "*.conf"}},
{[api_gen], {files, ["Makefile", "README"]}},
{[api_gen, wx_extra], {list, "*"}}
].
options(["-v"|Os]) ->
put(verbose,true),
options(Os);
options(["-q"|Os]) ->
put(quiet,true),
options(Os);
options(["--help"|_]) ->
usage(),
halt(0);
options(["-h"|_]) ->
usage(),
halt(0);
options(["--create_release"|Os]) ->
put(create_release,true),
options(Os);
options(["-" ++_ |_Os]) ->
usage(),
halt(1);
options([Dir]) -> Dir;
options([]) ->
filename:join(code:root_dir(),"lib").
install(Dir) ->
try
case get(create_release) of
true -> create_release();
_ -> install2(Dir)
end
catch E:R ->
io:format("Error ~p:~p in ~n ~p~n",[E,R, erlang:get_stacktrace()])
end.
install2(IDir) ->
SrcD = get_src_dir(),
Ver = get_version(SrcD),
case get(quiet) of
true ->
copy_files(SrcD, filename:append(IDir,Ver)),
ok;
_ ->
io:format("Installing ~p~n From ~p to ~p ~n",[Ver,SrcD,IDir]),
case is_ok('ok [y|n]? ',[y,n]) of
y ->
copy_files(SrcD, filename:append(IDir,Ver)),
io:format("Install complete~n",[]),
ok;
n ->
usage(),
halt(1)
end
end.
copy_files(FromD, ToD) ->
Fs = install_files() ++ built_files(FromD, install),
Copy = fun(File, From, To, Acc) ->
ensure_dir(To),
case file:copy(filename:join(From,File),
filename:join(To,File)) of
{ok, _Bytes} ->
[File|Acc];
{error,_} ->
io:format("ERROR Could not install file: ~p in~n ~p~n",
[filename:join(From,File),
filename:join(To,File)]),
Acc
end
end,
[expand_dirs(Dir,Files,FromD,ToD,Copy,[]) || {Dir,Files} <- Fs].
expand_dirs(['*'|Ds],Fs,From,To,Fun,Acc) ->
All = filelib:wildcard("[A-Za-z]*", From),
Filter = fun(F) -> filelib:is_dir(filename:join(From,F)) end,
Dirs = lists:filter(Filter, All),
lists:foldl(fun(Dir,Nacc) ->
expand_dirs([Dir|Ds],Fs,From,To,Fun,Nacc)
end,
Acc, Dirs);
expand_dirs([Dir|Ds],Fs,From,To,Fun,Acc) ->
expand_dirs(Ds,Fs,filename:join(From,Dir),filename:join(To,Dir),Fun,Acc);
expand_dirs([],Fs,From,To,Fun,Acc) ->
expand_files(Fs,From,To,Fun,Acc).
expand_files({files,Fs},From,To,Fun,Acc) ->
case get(verbose) of
true -> io:format(" Check dir ~p to ~p~n", [From,To]);
_ -> ok
end,
expand_files2(Fs,From,To,Fun,Acc);
expand_files({list,WildCard},From,To,Fun,Acc) ->
All = filelib:wildcard(WildCard, From),
Filter = fun(F) -> filelib:is_regular(filename:join(From,F)) end,
Fs = lists:filter(Filter, All),
case get(verbose) of
true -> io:format(" Check dir ~p to ~p~n", [From,To]);
_ -> ok
end,
expand_files2(Fs,From,To,Fun,Acc).
expand_files2(Fs,From,To,Fun,PrevAcc) ->
lists:foldl(fun(File, Acc) -> Fun(File, From, To, Acc) end, PrevAcc, Fs).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
create_release() ->
All = release_files() ++ install_files(),
SrcD = get_src_dir(),
Ver = "wx-" ++ get_version(SrcD),
io:format("Create release ~p~n From ~p ~n",[Ver,SrcD]),
case is_ok('ok [y|n]? ',[y,n]) of
y ->
List = fun(File, From, To, Acc) ->
case filelib:is_regular(filename:join(From,File)) of
true ->
[{filename:join(To, File),
filename:join(From,File)}|Acc];
false ->
io:format("Warning: File ~s/~s is missing~n",[From,File]),
Acc
end
end,
Expand = fun({Dir,Fs},Acc) ->
expand_dirs(Dir,Fs,SrcD,Ver,List,Acc)
end,
Files = lists:foldl(Expand,[], All),
ok = erl_tar:create(Ver ++ ".src.tar.gz", Files, [compressed]),
BuiltDir = built_files(SrcD, create_release),
BuiltFs = lists:foldl(Expand,[], BuiltDir),
ok = erl_tar:create(Ver ++ ".built.tar.gz",
Files ++ BuiltFs,
[compressed]),
ok;
n ->
usage()
end.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
is_ok(Str, Answers) ->
{ok, [Ans]} = io:fread(Str, "~a"),
case lists:member(Ans, Answers) of
true -> Ans;
false ->
io:format("Please answer ~p~n",[Answers]),
is_ok(Str,Answers)
end.
ensure_dir(To) ->
case filelib:ensure_dir(filename:join(To, "dummy")) of
ok -> ok;
Error ->
io:format("Error ~p in ~p ~n",[Error, To]),
halt(1)
end.
get_version(Dir) ->
%% Have we installed this from a release
%% get the directory name
DateVariant =
fun() ->
{_,Month,Day} = erlang:date(),
Date = io_lib:format("~.2.0w~.2.0w",[Month,Day]),
{ok, Bin} = file:read_file("vsn.mk"),
Opt = [{capture, all_but_first, list}],
case re:run(Bin, "WX_VSN\s*=\s*(.*)", Opt) of
{match, [Ver]} ->
lists:flatten([Ver,"."|Date]);
_ ->
lists:flatten(["wx-0.98."|Date])
end
end,
case Dir of
"." ->
%% Installing from src without a release
DateVariant();
Dir ->
Base = filename:basename(Dir),
case string:tokens(Base, "-.") of
["wx", Ma, Mi|_]
when is_integer(Ma),is_integer(Mi) ->
Base;
_ ->
DateVariant()
end
end.
%% Get src dir of installation
get_src_dir() ->
Escript = escript:script_name(),
Abs = filename:dirname(filename:absname(Escript)),
Test = filename:join(Abs, "README"),
case file:read_file(Test) of
{ok, _} -> ok;
{error, enoent} ->
io:format("Error couldn't read ~s ~n",[Test]),
halt(1)
end,
Abs.