aboutsummaryrefslogtreecommitdiffstats
path: root/lib/wx/install.es
diff options
context:
space:
mode:
Diffstat (limited to 'lib/wx/install.es')
-rwxr-xr-xlib/wx/install.es302
1 files changed, 302 insertions, 0 deletions
diff --git a/lib/wx/install.es b/lib/wx/install.es
new file mode 100755
index 0000000000..2811c7728c
--- /dev/null
+++ b/lib/wx/install.es
@@ -0,0 +1,302 @@
+#!/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.
+
+