blob: 1f75728c46f27c03d83be9c6a9a8cf5dd7dfdf18 (
plain) (
tree)
2c5ea01d ^
//: Everything this project/binary supports.
//: This should give you a sense for what to look forward to in later layers.
:(before "End Commandline Parsing")
if (argc <= 1 || is_equal(argv[1], "--help")) {
//: this is the functionality later layers will provide
// currently no automated tests for commandline arg parsing
if (argc <= 1) {
cerr << "Please provide a Mu program to run.\n"
<< "\n";
}
cerr << "Usage:\n"
<< " mu [options] [test] [files]\n"
<< "or:\n"
<< " mu [options] [test] [files] -- [ingredients for function/recipe 'main']\n"
<< "Square brackets surround optional arguments.\n"
<< "\n"
<< "Examples:\n"
<< " To load files and run 'main':\n"
<< " mu file1.mu file2.mu ...\n"
<< " To run 'main' and dump a trace of all operations at the end:\n"
<< " mu --trace file1.mu file2.mu ...\n"
<< " To run all tests:\n"
<< " mu test\n"
<< " To load files and then run all tests:\n"
<< " mu test file1.mu file2.mu ...\n"
<< " To run a single Mu scenario:\n"
<< " mu test file1.mu file2.mu ... scenario\n"
<< " To run a single Mu scenario and dump a trace at the end:\n"
<< " mu --trace test file1.mu file2.mu ... scenario\n"
<< " To load files and run only the tests in explicitly loaded files (for apps):\n"
<< " mu --test-only-app test file1.mu file2.mu ...\n"
<< " To load all files with a numeric prefix in a directory:\n"
<< " mu directory1 directory2 ...\n"
<< " You can test directories just like files.\n"
<< " mu test directory1 directory2 ...\n"
<< " To pass ingredients to a mu program, provide them after '--':\n"
<< " mu file_or_dir1 file_or_dir2 ... -- ingredient1 ingredient2 ...\n"
<< " To see where a mu program is spending its time:\n"
<< " mu --profile file_or_dir1 file_or_dir2 ...\n"
<< " this slices and dices time spent in various profile.* output files\n"
<< " To print out the trace to stderr:\n"
<< " mu --dump file1.mu file2.mu ...\n"
<< " this is handy when you want to see sandboxed traces alongside the main one\n"
<< "\n"
<< " To browse a trace generated by a previous run:\n"
<< " mu browse-trace file\n"
;
return 0;
}
//: Support for option parsing.
//: Options always begin with '--' and are always the first arguments. An
//: option will never follow a non-option.
:(before "End Commandline Parsing")
char** arg = &argv[1];
while (argc > 1 && starts_with(*arg, "--")) {
if (false)
; // no-op branch just so any further additions can consistently always start with 'else'
// End Commandline Options(*arg)
else
cerr << "skipping unknown option " << *arg << '\n';
--argc; ++argv; ++arg;
}
//:: Helper function used by the above fragment of code (and later layers too,
//:: who knows?).
//: The :(code) directive appends function definitions to the end of the
//: project. Regardless of where functions are defined, we can call them
//: anywhere we like as long as we format the function header in a specific
//: way: put it all on a single line without indent, end the line with ') {'
//: and no trailing whitespace. As long as functions uniformly start this
//: way, our 'build*' scripts contain a little command to automatically
//: generate declarations for them.
:(code)
bool is_equal(char* s, const char* lit) {
return strncmp(s, lit, strlen(lit)) == 0;
}
bool starts_withpre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */# Copyright (C) 2009, 2010 Roman Zimbelmann <romanz@lavabit.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
NAME = ranger
VERSION = 1.0.4
PYTHON ?= python
DOCDIR ?= doc/pydoc
PREFIX ?= /usr
MANPREFIX ?= /share/man
PYOPTIMIZE ?= 1
PYTHON_SITE_DEST ?= $(shell $(PYTHON) -c 'import sys; sys.stdout.write( \
[p for p in sys.path if "site" in p][0])' 2> /dev/null)
BMCOUNT ?= 5 # how often to run the benchmarks?
CWD = $(shell pwd)
default: compile
@echo 'Run `make options` for a list of all options'
options: help
@echo
@echo 'Options:'
@echo 'PYTHON = $(PYTHON)'
@echo 'PYOPTIMIZE = $(PYOPTIMIZE)'
@echo 'PYTHON_SITE_DEST = $(PYTHON_SITE_DEST)'
@echo 'PREFIX = $(PREFIX)'
@echo 'MANPREFIX = $(MANPREFIX)'
@echo 'DOCDIR = $(DOCDIR)'
help:
@echo 'make: Compile $(NAME)'
@echo 'make doc: Create the pydoc documentation'
@echo 'make install: Install ranger'
@echo 'make clean: Remove the compiled files (*.pyc, *.pyo)'
@echo 'make cleandoc: Remove the pydoc documentation'
@echo 'make uninstall: Uninstall ranger'
@echo 'make snapshot: Create a tar.gz of the current git revision'
@echo 'make test: Run all unittests.'
all: test compile install
install:
@if [ '$(PYTHON_SITE_DEST)' == '' ]; then \
echo -n 'Cannot find a suitable destination for the files.'; \
echo ' Please install $(NAME) manually.'; \
false; \
fi
@echo "Installing $(NAME) version $(VERSION)..."
@mkdir -p $(PREFIX)/bin
cp -f ranger.py $(PREFIX)/bin/ranger
@mkdir -p $(PYTHON_SITE_DEST)
cp -fruT ranger $(PYTHON_SITE_DEST)/ranger
@chmod 755 $(PREFIX)/bin/ranger
@chmod -R +rX $(PYTHON_SITE_DEST)/ranger
@mkdir -p $(PREFIX)$(MANPREFIX)/man1
cp -f doc/ranger.1 $(PREFIX)$(MANPREFIX)/man1/ranger.1
@chmod 644 $(PREFIX)$(MANPREFIX)/man1/ranger.1
uninstall:
rm -f $(PREFIX)/bin/ranger
rm -f '$(PREFIX)$(MANPREFIX)/man1/ranger.1'
@if [ '$(PYTHON_SITE_DEST)' == '' ]; then \
echo 'Cannot find a possible location of rangers library files'; \
false; \
fi
rm -rf '$(PYTHON_SITE_DEST)/ranger/*'
@echo 'NOTE: By default, configuration files are stored at "~/.ranger".'
@echo 'This script will not delete those.'
compile: clean
@echo 'Compiling...'
PYTHONOPTIMIZE=$(PYOPTIMIZE) python -m compileall -q ranger
clean:
@echo 'Cleaning...'
find . -regex .\*.py[co]\$$ -exec rm -f -- {} \;
doc: cleandoc
@echo 'Creating pydoc html documentation...'
mkdir -p $(DOCDIR)
cd $(DOCDIR); \
$(PYTHON) -c 'import pydoc, sys; \
sys.path[0] = "$(CWD)"; \
pydoc.writedocs("$(CWD)")'
cleandoc:
@echo 'Removing pydoc html documentation...'
test -d $(DOCDIR) && rm -f -- $(DOCDIR)/*.html
test:
@./all_tests.py 1
bm:
@./all_benchmarks.py $(BMCOUNT)
snapshot:
git archive HEAD | gzip > $(NAME)-$(VERSION)-$(shell git rev-parse HEAD | cut -b 1-8).tar.gz
.PHONY: default options all compile clean doc cleandoc test bm \
install uninstall snapshot
|