#!/usr/bin/env escript %% -*- erlang -*- main(Args) -> %% Get a string repr of build time Built = build_time(), %% Check for force=1 flag to force a rebuild case lists:member("force=1", Args) of true -> [] = os:cmd("rm -rf ebin/*.beam"), ok; false -> ok end, %% Compile all src/*.erl to ebin case make:files(filelib:wildcard("src/*.erl"), [{outdir, "ebin"}, {i, "include"}, {d, 'BUILD_TIME', Built}]) of up_to_date -> ok; error -> io:format("Failed to compile rebar files!\n"), halt(1) end, %% Make sure file:consult can parse the .app file case file:consult("ebin/rebar.app") of {ok, _} -> ok; {error, Reason} -> io:format("Invalid syntax in ebin/rebar.app: ~p\n", [Reason]), halt(1) end, %% Add ebin/ to our path true = code:add_path("ebin"), %% Run rebar to do proper .app validation and such rebar:main(["compile"] ++ Args), %% Construct the archive of everything in ebin/ dir -- put it on the %% top-level of the zip file so that code loading works properly. Files = filelib:wildcard("*", "ebin"), case zip:create("mem", Files, [{cwd, "ebin"}, memory]) of {ok, {"mem", ZipBin}} -> %% Archive was successfully created. Prefix that binary with our %% header and write to "rebar" file Script = <<"#!/usr/bin/env escript\n", ZipBin/binary>>, case file:write_file("rebar", Script) of ok -> ok; {error, WriteError} -> io:format("Failed to write rebar script: ~p\n", [WriteError]), halt(1) end; {error, ZipError} -> io:format("Failed to construct rebar script archive: ~p\n", [ZipError]), halt(1) end, %% Finally, update executable perms for our script [] = os:cmd("chmod u+x rebar"), %% Add a helpful message io:format("Congratulations! You now have a self-contained script called \"rebar\" in\n" "your current working directory. Place this script anywhere in your path\n" "and you can use rebar to build OTP-compliant apps.\n"). build_time() -> {{Y, M, D}, {H, Min, S}} = calendar:now_to_universal_time(now()), lists:flatten(io_lib:format("~4..0w~2..0w~2..0w_~2..0w~2..0w~2..0w", [Y, M, D, H, Min, S])).