binaries: $(BINARIES)
sysbinaries: FORCE binaries
- sh -x bin/locate initdb postgres pg_ctl mysqld
+ bin/locate initdb postgres pg_ctl mysqld
ls -la bin.sys
# Compile and link the programs:
$(CC) $(CFLAGS) $(LDFLAGS) -o bin/showids $(SRC)/showids.c
bin/locate: $(SRC)/locate.sh Makefile
- cp $(SRC)/locate.sh bin/locate
+ cp $(SRC)/locate.pl bin/locate
chmod 0755 bin/locate
clean:; rm -rf $(BINARIES) bin.sys
--- /dev/null
+#!/usr/bin/env perl
+use strict;
+use warnings;
+use File::Find;
+use Cwd;
+
+my @dirs = grep { /^\// && -d } split(/:/, $ENV{PATH}), qw(
+ /bin
+ /usr/bin
+ /usr/sbin
+ /usr/libexec
+ /usr/local/bin
+ /usr/local/sbin
+ /usr/local
+ /opt
+);
+
+my %path = map { $_ => locate($_, @dirs) } @ARGV;
+
+mkdir 'bin.sys'
+ or die "bin.sys: $!"
+ if not -d 'bin.sys';
+
+foreach my $tool (keys %path) {
+ next if not defined $path{$tool};
+ print "$tool $path{$tool}\n";
+
+ unlink "bin.sys/$tool";
+ symlink $path{$tool}, "bin.sys/$tool"
+ or warn "bin.sys/$tool -> $path{$tool}: $!\n";
+}
+
+sub locate {
+ my ($tool, @dirs) = @_;
+
+ # use die to break out of the find as soon
+ # as we found it
+ my $cwd = cwd;
+ eval {
+ find(
+ sub {
+ return unless $tool eq $_ and -x $_ and -f _;
+ die { found => $File::Find::name };
+ },
+ @dirs
+ );
+ };
+ chdir $cwd;
+
+ return (ref $@ eq ref {} and $@->{found}) ? $@->{found} : undef;
+}