From 3128c4b9761b1b56f7ae5a862c835ac03d1e58ff Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Sun, 16 Oct 2016 00:34:23 +0200 Subject: [PATCH] Prepare for 0.1 release: gnu-build-system. * configure: New file. * make/install.make: New file. * .gitignore: Ignore generated files. * build-aux/gitlog-to-changelog: New file. --- .gitignore | 6 + GNUmakefile | 44 ++- build-aux/gitlog-to-changelog | 499 ++++++++++++++++++++++++++++++++++ configure | 206 ++++++++++++++ make/install.make | 47 ++++ 5 files changed, 799 insertions(+), 3 deletions(-) create mode 100755 build-aux/gitlog-to-changelog create mode 100755 configure create mode 100644 make/install.make diff --git a/.gitignore b/.gitignore index cd8891a5..4653093b 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ *.go *.o *~ +/.config.make /a.out /mes /mes.h @@ -10,3 +11,8 @@ /*.cat ? ?.mes +/out +/.tarball-version +/ChangeLog +.#* +\#*# diff --git a/GNUmakefile b/GNUmakefile index 2c979c8e..548d4b4e 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -1,10 +1,19 @@ -.PHONY: all check clean default -#CFLAGS:=-std=c99 -O0 +.PHONY: all check clean default distclean help install release +default: all + +.config.make: configure GNUmakefile + ./configure + +OUT:=out CFLAGS:=-std=c99 -O3 -finline-functions +#CFLAGS:=-std=c99 -O0 #CFLAGS:=-pg -std=c99 -O0 #CFLAGS:=-std=c99 -O0 -g -default: all +include .config.make +-include .local.make +include make/install.make + all: mes @@ -13,6 +22,9 @@ mes: mes.c mes.h clean: rm -f mes environment.i symbol.i mes.h *.cat a.out +distclean: clean + rm -f .config.make + mes.h: mes.c GNUmakefile ( echo '#if MES_C'; echo '#if MES_FULL' 1>&2;\ grep -E '^(scm [*])*[a-z0-9_]+ \(.*\)( {|$$)' $< | grep -Ev '\(.*(char |bool |int )' | sed -e 's,^scm [*],,' | sort |\ @@ -80,3 +92,29 @@ guile-mescc: mescc.cat cat doc/examples/main.c | guile -s $^ > a.out chmod +x a.out ./a.out + +help: help-top + +install: all + +release: all + +help: + @echo + +define HELP_TOP +Usage: make [OPTION]... [TARGET]... + +Targets: + all update everything + check run unit tests + clean remove all generated stuff + dist create tarball in $(TARBALL) + distclean also clean configuration + mescc compile cc/main.c to a.out + install install in $$(PREFIX) [$(PREFIX)] + release make a release +endef +export HELP_TOP +help-top: + @echo "$$HELP_TOP" diff --git a/build-aux/gitlog-to-changelog b/build-aux/gitlog-to-changelog new file mode 100755 index 00000000..9ed1cc0e --- /dev/null +++ b/build-aux/gitlog-to-changelog @@ -0,0 +1,499 @@ +eval '(exit $?0)' && eval 'exec perl -wS "$0" "$@"' + & eval 'exec perl -wS "$0" $argv:q' + if 0; +# Convert git log output to ChangeLog format. + +my $VERSION = '2016-10-16 06:30'; # UTC +# The definition above must lie within the first 8 lines in order +# for the Emacs time-stamp write hook (at end) to update it. +# If you change this file with Emacs, please let the write hook +# do its job. Otherwise, update this string manually. + +# Copyright (C) 2008-2016 Free Software Foundation, Inc. + +# 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 . + +# Written by Jim Meyering + +use strict; +use warnings; +use Getopt::Long; +use POSIX qw(strftime); + +(my $ME = $0) =~ s|.*/||; + +# use File::Coda; # http://meyering.net/code/Coda/ +END { + defined fileno STDOUT or return; + close STDOUT and return; + warn "$ME: failed to close standard output: $!\n"; + $? ||= 1; +} + +sub usage ($) +{ + my ($exit_code) = @_; + my $STREAM = ($exit_code == 0 ? *STDOUT : *STDERR); + if ($exit_code != 0) + { + print $STREAM "Try '$ME --help' for more information.\n"; + } + else + { + print $STREAM < ChangeLog + $ME -- -n 5 foo > last-5-commits-to-branch-foo + +SPECIAL SYNTAX: + +The following types of strings are interpreted specially when they appear +at the beginning of a log message line. They are not copied to the output. + + Copyright-paperwork-exempt: Yes + Append the "(tiny change)" notation to the usual "date name email" + ChangeLog header to mark a change that does not require a copyright + assignment. + Co-authored-by: Joe User + List the specified name and email address on a second + ChangeLog header, denoting a co-author. + Signed-off-by: Joe User + These lines are simply elided. + +In a FILE specified via --amend, comment lines (starting with "#") are ignored. +FILE must consist of pairs where SHA is a 40-byte SHA1 (alone on +a line) referring to a commit in the current project, and CODE refers to one +or more consecutive lines of Perl code. Pairs must be separated by one or +more blank line. + +Here is sample input for use with --amend=FILE, from coreutils: + +3a169f4c5d9159283548178668d2fae6fced3030 +# fix typo in title: +s/all tile types/all file types/ + +1379ed974f1fa39b12e2ffab18b3f7a607082202 +# Due to a bug in vc-dwim, I mis-attributed a patch by Paul to myself. +# Change the author to be Paul. Note the escaped "@": +s,Jim .*>,Paul Eggert , + +EOF + } + exit $exit_code; +} + +# If the string $S is a well-behaved file name, simply return it. +# If it contains white space, quotes, etc., quote it, and return the new string. +sub shell_quote($) +{ + my ($s) = @_; + if ($s =~ m![^\w+/.,-]!) + { + # Convert each single quote to '\'' + $s =~ s/\'/\'\\\'\'/g; + # Then single quote the string. + $s = "'$s'"; + } + return $s; +} + +sub quoted_cmd(@) +{ + return join (' ', map {shell_quote $_} @_); +} + +# Parse file F. +# Comment lines (starting with "#") are ignored. +# F must consist of pairs where SHA is a 40-byte SHA1 +# (alone on a line) referring to a commit in the current project, and +# CODE refers to one or more consecutive lines of Perl code. +# Pairs must be separated by one or more blank line. +sub parse_amend_file($) +{ + my ($f) = @_; + + open F, '<', $f + or die "$ME: $f: failed to open for reading: $!\n"; + + my $fail; + my $h = {}; + my $in_code = 0; + my $sha; + while (defined (my $line = )) + { + $line =~ /^\#/ + and next; + chomp $line; + $line eq '' + and $in_code = 0, next; + + if (!$in_code) + { + $line =~ /^([0-9a-fA-F]{40})$/ + or (warn "$ME: $f:$.: invalid line; expected an SHA1\n"), + $fail = 1, next; + $sha = lc $1; + $in_code = 1; + exists $h->{$sha} + and (warn "$ME: $f:$.: duplicate SHA1\n"), + $fail = 1, next; + } + else + { + $h->{$sha} ||= ''; + $h->{$sha} .= "$line\n"; + } + } + close F; + + $fail + and exit 1; + + return $h; +} + +# git_dir_option $SRCDIR +# +# From $SRCDIR, the --git-dir option to pass to git (none if $SRCDIR +# is undef). Return as a list (0 or 1 element). +sub git_dir_option($) +{ + my ($srcdir) = @_; + my @res = (); + if (defined $srcdir) + { + my $qdir = shell_quote $srcdir; + my $cmd = "cd $qdir && git rev-parse --show-toplevel"; + my $qcmd = shell_quote $cmd; + my $git_dir = qx($cmd); + defined $git_dir + or die "$ME: cannot run $qcmd: $!\n"; + $? == 0 + or die "$ME: $qcmd had unexpected exit code or signal ($?)\n"; + chomp $git_dir; + push @res, "--git-dir=$git_dir/.git"; + } + @res; +} + +{ + my $since_date; + my $until_date; + my $format_string = '%s%n%b%n'; + my $amend_file; + my $append_dot = 0; + my $cluster = 1; + my $ignore_matching; + my $ignore_line; + my $strip_tab = 0; + my $strip_cherry_pick = 0; + my $srcdir; + GetOptions + ( + help => sub { usage 0 }, + version => sub { print "$ME version $VERSION\n"; exit }, + 'since=s' => \$since_date, + 'until=s' => \$until_date, + 'format=s' => \$format_string, + 'amend=s' => \$amend_file, + 'append-dot' => \$append_dot, + 'cluster!' => \$cluster, + 'ignore-matching=s' => \$ignore_matching, + 'ignore-line=s' => \$ignore_line, + 'strip-tab' => \$strip_tab, + 'strip-cherry-pick' => \$strip_cherry_pick, + 'srcdir=s' => \$srcdir, + ) or usage 1; + + defined $since_date + and unshift @ARGV, "--since=$since_date"; + defined $until_date + and unshift @ARGV, "--until=$until_date"; + + # This is a hash that maps an SHA1 to perl code (i.e., s/old/new/) + # that makes a correction in the log or attribution of that commit. + my $amend_code = defined $amend_file ? parse_amend_file $amend_file : {}; + + my @cmd = ('git', + git_dir_option $srcdir, + qw(log --log-size), + '--pretty=format:%H:%ct %an <%ae>%n%n'.$format_string, @ARGV); + open PIPE, '-|', @cmd + or die ("$ME: failed to run '". quoted_cmd (@cmd) ."': $!\n" + . "(Is your Git too old? Version 1.5.1 or later is required.)\n"); + + my $prev_multi_paragraph; + my $prev_date_line = ''; + my @prev_coauthors = (); + my @skipshas = (); + while (1) + { + defined (my $in = ) + or last; + $in =~ /^log size (\d+)$/ + or die "$ME:$.: Invalid line (expected log size):\n$in"; + my $log_nbytes = $1; + + my $log; + my $n_read = read PIPE, $log, $log_nbytes; + $n_read == $log_nbytes + or die "$ME:$.: unexpected EOF\n"; + + # Extract leading hash. + my ($sha, $rest) = split ':', $log, 2; + defined $sha + or die "$ME:$.: malformed log entry\n"; + $sha =~ /^[0-9a-fA-F]{40}$/ + or die "$ME:$.: invalid SHA1: $sha\n"; + + my $skipflag = 0; + if (@skipshas) + { + foreach(@skipshas) + { + if ($sha =~ /^$_/) + { + $skipflag = $_; + last; + } + } + } + + # If this commit's log requires any transformation, do it now. + my $code = $amend_code->{$sha}; + if (defined $code) + { + eval 'use Safe'; + my $s = new Safe; + # Put the unpreprocessed entry into "$_". + $_ = $rest; + + # Let $code operate on it, safely. + my $r = $s->reval("$code") + or die "$ME:$.:$sha: failed to eval \"$code\":\n$@\n"; + + # Note that we've used this entry. + delete $amend_code->{$sha}; + + # Update $rest upon success. + $rest = $_; + } + + # Remove lines inserted by "git cherry-pick". + if ($strip_cherry_pick) + { + $rest =~ s/^\s*Conflicts:\n.*//sm; + $rest =~ s/^\s*\(cherry picked from commit [\da-f]+\)\n//m; + } + + my @line = split /[ \t]*\n/, $rest; + my $author_line = shift @line; + defined $author_line + or die "$ME:$.: unexpected EOF\n"; + $author_line =~ /^(\d+) (.*>)$/ + or die "$ME:$.: Invalid line " + . "(expected date/author/email):\n$author_line\n"; + + # Format 'Copyright-paperwork-exempt: Yes' as a standard ChangeLog + # `(tiny change)' annotation. + my $tiny = (grep (/^(?:Copyright-paperwork-exempt|Tiny-change):\s+[Yy]es$/, @line) + ? ' (tiny change)' : ''); + + my $date_line = sprintf "%s %s$tiny\n", + strftime ("%Y-%m-%d", localtime ($1)), $2; + + my @coauthors = grep /^Co-authored-by:.*$/, @line; + # Omit meta-data lines we've already interpreted. + @line = grep !/^(?:Signed-off-by:[ ].*>$ + |Co-authored-by:[ ] + |Copyright-paperwork-exempt:[ ] + |Tiny-change:[ ] + )/x, @line; + + # Remove leading and trailing blank lines. + if (@line) + { + while ($line[0] =~ /^\s*$/) { shift @line; } + while ($line[$#line] =~ /^\s*$/) { pop @line; } + } + + # Handle Emacs gitmerge.el "skipped" commits. + # Yes, this should be controlled by an option. So sue me. + if ( grep /^(; )?Merge from /, @line ) + { + my $found = 0; + foreach (@line) + { + if (grep /^The following commit.*skipped:$/, $_) + { + $found = 1; + ## Reset at each merge to reduce chance of false matches. + @skipshas = (); + next; + } + if ($found && $_ =~ /^([0-9a-fA-F]{7,}) [^ ]/) + { + push ( @skipshas, $1 ); + } + } + } + + # Ignore commits that match the --ignore-matching pattern, if specified. + if (defined $ignore_matching && @line && $line[0] =~ /$ignore_matching/) + { + $skipflag = 1; + } + elsif ($skipflag) + { + ## Perhaps only warn if a pattern matches more than once? + warn "$ME: warning: skipping $sha due to $skipflag\n"; + } + + if (! $skipflag) + { + if (defined $ignore_line && @line) + { + @line = grep ! /$ignore_line/, @line; + while ($line[$#line] =~ /^\s*$/) { pop @line; } + } + + # Record whether there are two or more paragraphs. + my $multi_paragraph = grep /^\s*$/, @line; + + # Format 'Co-authored-by: A U Thor ' lines in + # standard multi-author ChangeLog format. + for (@coauthors) + { + s/^Co-authored-by:\s*/\t /; + s/\s*/ + or warn "$ME: warning: missing email address for " + . substr ($_, 5) . "\n"; + } + + # If clustering of commit messages has been disabled, if this header + # would be different from the previous date/name/etc. header, + # or if this or the previous entry consists of two or more paragraphs, + # then print the header. + if ( ! $cluster + || $date_line ne $prev_date_line + || "@coauthors" ne "@prev_coauthors" + || $multi_paragraph + || $prev_multi_paragraph) + { + $prev_date_line eq '' + or print "\n"; + print $date_line; + @coauthors + and print join ("\n", @coauthors), "\n"; + } + $prev_date_line = $date_line; + @prev_coauthors = @coauthors; + $prev_multi_paragraph = $multi_paragraph; + + # If there were any lines + if (@line == 0) + { + warn "$ME: warning: empty commit message:\n $date_line\n"; + } + else + { + if ($append_dot) + { + # If the first line of the message has enough room, then + if (length $line[0] < 72) + { + # append a dot if there is no other punctuation or blank + # at the end. + $line[0] =~ /[[:punct:]\s]$/ + or $line[0] .= '.'; + } + } + + # Remove one additional leading TAB from each line. + $strip_tab + and map { s/^\t// } @line; + + # Prefix each non-empty line with a TAB. + @line = map { length $_ ? "\t$_" : '' } @line; + + print "\n", join ("\n", @line), "\n"; + } + } + + defined ($in = ) + or last; + $in ne "\n" + and die "$ME:$.: unexpected line:\n$in"; + } + + close PIPE + or die "$ME: error closing pipe from " . quoted_cmd (@cmd) . "\n"; + # FIXME-someday: include $PROCESS_STATUS in the diagnostic + + # Complain about any unused entry in the --amend=F specified file. + my $fail = 0; + foreach my $sha (keys %$amend_code) + { + warn "$ME:$amend_file: unused entry: $sha\n"; + $fail = 1; + } + + exit $fail; +} + +# Local Variables: +# mode: perl +# indent-tabs-mode: nil +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "my $VERSION = '" +# time-stamp-format: "%:y-%02m-%02d %02H:%02M" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "'; # UTC" +# End: diff --git a/configure b/configure new file mode 100755 index 00000000..c389175a --- /dev/null +++ b/configure @@ -0,0 +1,206 @@ +#! /bin/sh +# -*- scheme -*- +unset LANG LC_ALL +echo -n "checking for guile..." +GUILE=$(type -p ${GUILE-guile} 2>/dev/null|tail -n 1|sed 's,^.* ,,') +export GUILE +if [ -x "$GUILE" ]; then + echo " $GUILE" +else + pm=$({ guix --help || dpkg --help; }|head -n 1|sed 's,.*Usage: \([^ ]*\).*,\1,g') +#-paredit:'})( + case "$pm" in dpkg) message="sudo apt-get install guile-2.0";; *) message="guix package -i guile";; esac + cat < +;;; +;;; configure: This file is part of Mes. +;;; +;;; Mes 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. +;;; +;;; Mes 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 Mes. If not, see . + + +(define-module (configure) + #:use-module (ice-9 and-let-star) + #:use-module (ice-9 curried-definitions) + #:use-module (ice-9 getopt-long) + #:use-module (ice-9 match) + #:use-module (ice-9 optargs) + #:use-module (ice-9 popen) + #:use-module (ice-9 rdelim)) + +(define *shell* "sh") +(define PACKAGE "mes") +(define VERSION "0.0") +(define PREFIX "/usr/local") +(define GUILE_EV (effective-version)) +(define CC (or (getenv "CC") "gcc")) +(define GUILE (or (getenv "guile") "guile")) +(define SYSCONFDIR "$(PREFIX)/etc") + +;;; Utility +(define (gulp-pipe command) + (let* ((port (open-pipe* OPEN_READ *shell* "-c" command)) + (output (read-string port))) + (close-port port) + (string-trim-right output #\newline))) + +(define (logf port string . rest) + (apply format (cons* port string rest)) + (force-output port) + #t) + +(define (stderr string . rest) + (apply logf (cons* (current-error-port) string rest))) + +(define (stdout string . rest) + (apply logf (cons* (current-output-port) string rest))) + +(define* ((->string #:optional (infix "")) h . t) + (let ((o (if (pair? t) (cons h t) h))) + (match o + ((? char?) (make-string 1 o)) + ((? number?) (number->string o)) + ((? string?) o) + ((? symbol?) (symbol->string o)) + ((h ... t) (string-join (map (->string) o) ((->string) infix))) + (_ "")))) + +(define (tuple< a b) + (cond + ((and (null? a) (null? b)) #t) + ((null? a) (not (null? b))) + ((null? b) #f) + ((and (not (< (car a) (car b))) + (not (< (car b) (car a)))) + (tuple< (cdr a) (cdr b))) + (else (< (car a) (car b))))) + +(define (tuple<= a b) + (or (equal? a b) (tuple< a b))) + +;;; Configure +(define (version->string version) + ((->string '.) version)) + +(define (string->version string) + (and-let* ((version (string-tokenize string + (char-set-adjoin char-set:digit #\.))) + ((pair? version)) + (version (car version)) + (version (string-tokenize version + (char-set-complement (char-set #\.))))) + (map string->number version))) + +(define required '()) +(define* (check-version command expected + #:optional + (deb #f) + (version-option '--version) + (compare tuple<=)) + (stderr "checking for ~a~a..." command + (if (null? expected) "" + (format #f " [~a]" (version->string expected)))) + (let* ((actual (gulp-pipe (format #f "~a ~a 2>&1" command version-option))) + (actual (string->version actual)) + (pass? (and actual (compare expected actual)))) + (stderr "~a ~a\n" (if pass? (if (pair? actual) "" " yes") + (if actual " no, found" "")) (version->string actual)) + (if (not pass?) + (set! required (cons (or deb command) required))) + pass?)) + +(define* (check-pkg-config package expected #:optional (deb #f)) + (check-version (format #f "pkg-config --modversion ~a" package) expected deb)) + +(define (check-compile-header-c++ header) + (and (= 0 (system (format #f "echo '#include \"~a\"' | gcc --language=c++ --std=c++11 -E - > /dev/null 2>&1" header))) + 'yes)) + +(define* (check-header-c++ header deb #:optional (check check-compile-header-c++)) + (stderr "checking for ~a..." header) + (let ((result (check header))) + (stderr " ~a\n" (if result result "no")) + (if (not result) + (set! required (cons deb required))))) + +(define guix? + (system "guix --version &>/dev/null")) +;;; + +(define (parse-opts args) + (let* ((option-spec + '((build (value #t)) + (help (single-char #\h)) + (prefix (value #t)) + (sysconfdir (value #t)) + ;;ignore + (enable-fast-install))) + (options (getopt-long args option-spec)) + (help? (option-ref options 'help #f)) + (files (option-ref options '() '())) + (prefix (option-ref options '() PREFIX)) + (usage? (and (not help?) #f))) + (if (pair? files) + (stderr "ignoring files: ~a\n" files)) + (or (and (or help? usage?) + ((or (and usage? stderr) stdout) "\ +Usage: ./configure [OPTION]... + -h, --help display this help + --prefix=DIR install in PREFIX [~a] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] +" PREFIX) + (exit (or (and usage? 2) 0))) + options))) + +(define BUILD_TRIPLET (gulp-pipe "gcc -dumpmachine 2>/dev/null")) + +(define (main args) + (let* ((options (parse-opts args)) + (build-triplet (option-ref options 'build BUILD_TRIPLET)) + (prefix (option-ref options 'prefix PREFIX)) + (sysconfdir (option-ref options 'sysconfdir SYSCONFDIR))) + (check-version 'bash '(4 0)) + (check-version 'gcc '(4 8)) + (check-version 'guile '(2 0)) + (check-version 'make '(4 0)) + (check-version 'perl '(5)) + + (when (pair? required) + (stderr "\nMissing dependencies, run\n\n") + (if guix? + (stderr " guix environment -l guix.scm\n") + (stderr " sudo apt-get install ~a\n" ((->string " ") required))) + (exit 1)) + (with-output-to-file ".config.make" + (lambda () + (stdout "CC:=~a\n" CC) + (stdout "GUILE:=~a\n" GUILE) + (stdout "GUILE_EV:=~a\n" GUILE_EV) + (stdout "PACKAGE:=~a\n" PACKAGE) + (stdout "VERSION:=~a\n" VERSION) + (stdout "PREFIX:=~a\n" prefix) + (stdout "SYSCONFDIR:=~a\n" sysconfdir))) + (stdout "\nRun: + make to build mes + make help for help on other targets\n"))) diff --git a/make/install.make b/make/install.make new file mode 100644 index 00000000..88bb32e5 --- /dev/null +++ b/make/install.make @@ -0,0 +1,47 @@ +COMMIT:=$(shell test -d .git && (git show 2>/dev/null | head -1 | cut -d' ' -f 2) || cat .tarball-version) +TARBALL_DIR:=$(PACKAGE)-$(VERSION) +TARBALL:=$(OUT)/$(TARBALL_DIR).tar.gz + +OPT_CLEAN:=$(OPT_CLEAN) $(TARBALL) .tarball-version + +GIT_ARCHIVE_HEAD:=git archive HEAD -- +GIT_LS_FILES:=git ls-files +ifeq ($(wildcard .git),) +GIT_ARCHIVE_HEAD:=tar -cf- +GIT_LS_FILES:=find +endif + +.tarball-version: + echo $(COMMIT) > $@ + +dist: $(TARBALL) + +tree-clean-p: + test ! -d .git || git diff --exit-code > /dev/null + test ! -d .git || git diff --cached --exit-code > /dev/null + @echo commit:$(COMMIT) + +$(TARBALL): tree-clean-p .tarball-version ChangeLog + mkdir -p $(OUT) + ($(GIT_LS_FILES) --exclude=$(OUT);\ + echo $^ | tr ' ' '\n' | grep -Ev 'tree-clean-p')\ + | tar --transform=s,^,$(TARBALL_DIR)/,S -T- -czf $@ + +ChangeLog: tree-clean-p + build-aux/gitlog-to-changelog > $@ + +install: + mkdir -p $(DESTDIR)$(PREFIX)/bin + install mes $(DESTDIR)$(PREFIX)/bin/mes + install scripts/elf.mes $(DESTDIR)$(PREFIX)/bin/elf.mes + install scripts/mescc.mes $(DESTDIR)$(PREFIX)/bin/mescc.mes + install scripts/repl.mes $(DESTDIR)$(PREFIX)/bin/repl.mes + install scripts/paren.mes $(DESTDIR)$(PREFIX)/bin/paren.mes + mkdir -p $(DESTDIR)$(PREFIX)/share/mes + $(GIT_ARCHIVE_HEAD) module\ + | tar -C $(DESTDIR)$(PREFIX)/share/mes -xf- + +release: tree-clean-p check dist + git tag v$(VERSION) + git push --tags origin master + git push origin master