#!@PERL@
##===- tools/llvm-config ---------------------------------------*- perl -*-===##
# 
#                     The LLVM Compiler Infrastructure
#
# This file is distributed under the University of Illinois Open Source
# License. See LICENSE.TXT for details.
# 
##===----------------------------------------------------------------------===##
#
# Synopsis: Prints out compiler options needed to build against an installed
#           copy of LLVM.
#
# Syntax:   llvm-config OPTIONS... [COMPONENTS...]
# 
##===----------------------------------------------------------------------===##

use 5.006;
use strict;
use warnings;
use Cwd 'abs_path';

#---- begin autoconf values ----
my $PACKAGE_NAME        = q{@PACKAGE_NAME@};
my $VERSION             = q{@PACKAGE_VERSION@};
my $PREFIX              = q{@LLVM_PREFIX@};
my $LLVM_CONFIGTIME     = q{@LLVM_CONFIGTIME@};
my $LLVM_SRC_ROOT       = q{@abs_top_srcdir@};
my $LLVM_OBJ_ROOT       = q{@abs_top_builddir@};
my $ARCH                = lc(q{@ARCH@});
my $TARGET_TRIPLE       = q{@target@};
my $TARGETS_TO_BUILD    = q{@TARGETS_TO_BUILD@};
my $TARGET_HAS_JIT      = q{@TARGET_HAS_JIT@};
my @TARGETS_BUILT       = map { lc($_) } qw{@TARGETS_TO_BUILD@};
#---- end autoconf values ----

# Must pretend x86_64 architecture is really x86, otherwise the native backend
# won't get linked in.
$ARCH = "x86" if $ARCH eq "x86_64";

#---- begin Makefile values ----
my $CPPFLAGS            = q{@LLVM_CPPFLAGS@};
my $CFLAGS              = q{@LLVM_CFLAGS@};
my $CXXFLAGS            = q{@LLVM_CXXFLAGS@};
my $LDFLAGS             = q{@LLVM_LDFLAGS@};
my $SYSTEM_LIBS         = q{@LIBS@};
my $LLVM_BUILDMODE      = q{@LLVM_BUILDMODE@};
#---- end Makefile values ----

# Figure out where llvm-config is being run from.  Primarily, we care if it has
# been installed, or is running from the build directory, which changes the
# locations of some files.

# Convert the current executable name into its directory (e.g. ".").
my ($RUN_DIR) = ($0 =~ /^(.*)\/.*$/);

# Turn the directory into an absolute directory on the file system, also pop up
# from "bin" into the build or prefix dir.
my $ABS_RUN_DIR = abs_path("$RUN_DIR/..");
chomp($ABS_RUN_DIR);

# Compute the absolute object directory build, e.g. "foo/llvm/Debug".
my $ABS_OBJ_ROOT = "$LLVM_OBJ_ROOT/$LLVM_BUILDMODE";
$ABS_OBJ_ROOT = abs_path("$ABS_OBJ_ROOT") if (-d $ABS_OBJ_ROOT);
chomp($ABS_OBJ_ROOT);

my $INCLUDEDIR = "$ABS_RUN_DIR/include";
my $INCLUDEOPTION = "-I$INCLUDEDIR";
my $LIBDIR     = "$ABS_RUN_DIR/lib";
my $BINDIR     = "$ABS_RUN_DIR/bin";
if ($ABS_RUN_DIR eq $ABS_OBJ_ROOT) {
  # If we are running out of the build directory, the include dir is in the
  # srcdir.
  $INCLUDEDIR = "$LLVM_SRC_ROOT/include";
  # We need include files from both the srcdir and objdir.
  $INCLUDEOPTION = "-I$INCLUDEDIR -I$LLVM_OBJ_ROOT/include"
} else {
  # If installed, ignore the prefix the tree was configured with, use the
  # current prefix.
  $PREFIX = $ABS_RUN_DIR;
}

sub usage;
sub fix_library_names (@);
sub fix_library_files (@);
sub expand_dependencies (@);
sub name_map_entries;

# Parse our command-line arguments.
usage if @ARGV == 0;
my @components;
my $has_opt = 0;
my $want_libs = 0;
my $want_libnames = 0;
my $want_libfiles = 0;
my $want_components = 0;
foreach my $arg (@ARGV) {
    if ($arg =~ /^-/) {
        if ($arg eq "--version") {
            $has_opt = 1; print "$VERSION\n";
        } elsif ($arg eq "--prefix") {
            $has_opt = 1; print "$PREFIX\n";
        } elsif ($arg eq "--bindir") {
            $has_opt = 1; print "$BINDIR\n";
        } elsif ($arg eq "--includedir") {
            $has_opt = 1; print "$INCLUDEDIR\n";
        } elsif ($arg eq "--libdir") {
            $has_opt = 1; print "$LIBDIR\n";
        } elsif ($arg eq "--cppflags") {
            $has_opt = 1; print "$INCLUDEOPTION $CPPFLAGS\n";
        } elsif ($arg eq "--cflags") {
            $has_opt = 1; print "$INCLUDEOPTION $CFLAGS\n";
        } elsif ($arg eq "--cxxflags") {
            $has_opt = 1; print "$INCLUDEOPTION $CXXFLAGS\n";
        } elsif ($arg eq "--ldflags") {
            $has_opt = 1; print "-L$LIBDIR $LDFLAGS $SYSTEM_LIBS\n";
        } elsif ($arg eq "--libs") {
            $has_opt = 1; $want_libs = 1;
        } elsif ($arg eq "--libnames") {
            $has_opt = 1; $want_libnames = 1;
        } elsif ($arg eq "--libfiles") {
            $has_opt = 1; $want_libfiles = 1;
        } elsif ($arg eq "--components") {
            $has_opt = 1; print join(' ', name_map_entries), "\n";
        } elsif ($arg eq "--targets-built") {
            $has_opt = 1; print join(' ', @TARGETS_BUILT), "\n";
        } elsif ($arg eq "--host-target") {
            $has_opt = 1; print "$TARGET_TRIPLE\n";
        } elsif ($arg eq "--build-mode") {
            $has_opt = 1; print "$LLVM_BUILDMODE\n";
        } elsif ($arg eq "--obj-root") {
            $has_opt = 1; print abs_path("$LLVM_OBJ_ROOT/");
        } elsif ($arg eq "--src-root") {
            $has_opt = 1; print abs_path("$LLVM_SRC_ROOT/");
        } else {
            usage();
        }
    } else {
        push @components, $arg;
    }
}

# If no options were specified, fail.
usage unless $has_opt;

# If no components were specified, default to 'all'.
if (@components == 0) {
    push @components, 'all';
}

# Force component names to lower case.
@components = map lc, @components;

# Handle any arguments which require building our dependency graph.
if ($want_libs || $want_libnames || $want_libfiles) {
    my @libs = expand_dependencies(@components);
    print join(' ', fix_library_names(@libs)), "\n" if ($want_libs);
    print join(' ',  @libs), "\n" if ($want_libnames);
    print join(' ', fix_library_files(@libs)), "\n" if ($want_libfiles);
}

exit 0;

#==========================================================================
#  Support Routines
#==========================================================================

sub usage {
    print STDERR <<__EOD__;
Usage: llvm-config <OPTION>... [<COMPONENT>...]

Get various configuration information needed to compile programs which use
LLVM.  Typically called from 'configure' scripts.  Examples:
  llvm-config --cxxflags
  llvm-config --ldflags
  llvm-config --libs engine bcreader scalaropts

Options:
  --version          Print LLVM version.
  --prefix           Print the installation prefix.
  --src-root         Print the source root LLVM was built from.
  --obj-root         Print the object root used to build LLVM.
  --bindir           Directory containing LLVM executables.
  --includedir       Directory containing LLVM headers.
  --libdir           Directory containing LLVM libraries.
  --cppflags         C preprocessor flags for files that include LLVM headers.
  --cflags           C compiler flags for files that include LLVM headers.
  --cxxflags         C++ compiler flags for files that include LLVM headers.
  --ldflags          Print Linker flags.
  --libs             Libraries needed to link against LLVM components.
  --libnames         Bare library names for in-tree builds.
  --libfiles         Fully qualified library filenames for makefile depends.
  --components       List of all possible components.
  --targets-built    List of all targets currently built.
  --host-target      Target triple used to configure LLVM.
  --build-mode       Print build mode of LLVM tree (e.g. Debug or Release).
Typical components:
  all                All LLVM libraries (default).
  backend            Either a native backend or the C backend.
  engine             Either a native JIT or a bitcode interpreter.
__EOD__
    exit(1);
}

# Use -lfoo instead of libfoo.a whenever possible, and add directories to
# files which can't be found using -L.
sub fix_library_names (@) {
    my @libs = @_;
    my @result;
    foreach my $lib (@libs) {
        # Transform the bare library name appropriately.
        my ($basename) = ($lib =~ /^lib([^.]*)\.a/);
        if (defined $basename) {
            push @result, "-l$basename";
        } else {
            push @result, "$LIBDIR/$lib";
        }
    }
    return @result;
}

# Turn the list of libraries into a list of files.
sub fix_library_files(@) {
    my @libs = @_;
    my @result;
    foreach my $lib (@libs) {
        # Transform the bare library name into a filename.
        push @result, "$LIBDIR/$lib";
    }
    return @result;
}

#==========================================================================
#  Library Dependency Analysis
#==========================================================================
#  Given a few human-readable library names, find all their dependencies
#  and sort them into an order which the linker will like.  If we packed
#  our libraries into fewer archives, we could make the linker do much
#  of this work for us.
#
#  Libraries have two different types of names in this code: Human-friendly
#  "component" names entered on the command-line, and the raw file names
#  we use internally (and ultimately pass to the linker).
#
#  To understand this code, you'll need a working knowledge of Perl 5,
#  and possibly some quality time with 'man perlref'.

sub load_dependencies;
sub build_name_map;
sub have_native_backend;
sub find_best_engine;
sub expand_names (@);
sub find_all_required_sets (@);
sub find_all_required_sets_helper ($$@);

# Each "set" contains one or more libraries which must be included as a
# group (due to cyclic dependencies).  Sets are represented as a Perl array
# reference pointing to a list of internal library names.
my @SETS;

# Various mapping tables.
my %LIB_TO_SET_MAP; # Maps internal library names to their sets.
my %SET_DEPS;       # Maps sets to a list of libraries they depend on.
my %NAME_MAP;       # Maps human-entered names to internal names.

# Have our dependencies been loaded yet?
my $DEPENDENCIES_LOADED = 0;

# Given a list of human-friendly component names, translate them into a
# complete set of linker arguments.
sub expand_dependencies (@) {
    my @libs = @_;
    load_dependencies;
    my @required_sets = find_all_required_sets(expand_names(@libs));
    my @sorted_sets = topologically_sort_sets(@required_sets);

    # Expand the library sets into libraries.
    my @result;
    foreach my $set (@sorted_sets) { push @result, @{$set}; }
    return @result;
}

# Load in the raw dependency data stored at the end of this file.
sub load_dependencies {
    return if $DEPENDENCIES_LOADED;
    $DEPENDENCIES_LOADED = 1;
    while (<DATA>) {
        # Parse our line.
        my ($libs, $deps) = /^\s*([^:]+):\s*(.*)\s*$/;
        die "Malformed dependency data" unless defined $deps;
        my @libs = split(' ', $libs);
        my @deps = split(' ', $deps);

        # Record our dependency data.
        my $set = \@libs;
        push @SETS, $set;
        foreach my $lib (@libs) { $LIB_TO_SET_MAP{$lib} = $set; }
        $SET_DEPS{$set} = \@deps;
    }
    build_name_map;
}

# Build a map converting human-friendly component names into internal
# library names.
sub build_name_map {
    # Add entries for all the actual libraries.
    foreach my $set (@SETS) {
        foreach my $lib (sort @$set) {
            my $short_name = $lib;
            $short_name =~ s/^(lib)?LLVM([^.]*)\..*$/$2/;
            $short_name =~ tr/A-Z/a-z/;
            $NAME_MAP{$short_name} = [$lib];
        }
    }

    # Add target-specific entries
    foreach my $target (@TARGETS_BUILT) {
        # FIXME: Temporary, until we don't switch all targets
        if (defined $NAME_MAP{$target.'asmprinter'}) {
            $NAME_MAP{$target} = [$target.'info',
                                  $target.'asmprinter', 
                                  $target.'codegen']
        } elsif (defined $NAME_MAP{$target.'codegen'}) {
          $NAME_MAP{$target} = [$target.'info',
                                $target.'codegen']
        } else {
            $NAME_MAP{$target} = [$target.'info',
                                  $NAME_MAP{$target}[0]]
        }

        if (defined $NAME_MAP{$target.'asmparser'}) {
            push @{$NAME_MAP{$target}},$target.'asmparser'
        }

        if (defined $NAME_MAP{$target.'disassembler'}) {
            push @{$NAME_MAP{$target}},$target.'disassembler'
        }
    }

    # Add virtual entries.
    $NAME_MAP{'native'}  = have_native_backend() ? [$ARCH] : [];
    $NAME_MAP{'nativecodegen'} = have_native_backend() ? [$ARCH.'codegen'] : [];
    $NAME_MAP{'backend'} = have_native_backend() ? ['native'] : ['cbackend'];
    $NAME_MAP{'engine'}  = find_best_engine;
    $NAME_MAP{'all'}     = [name_map_entries];   # Must be last.
}

# Return true if we have a native backend to use.
sub have_native_backend {
    my %BUILT;
    foreach my $target (@TARGETS_BUILT) { $BUILT{$target} = 1; }
    return defined $NAME_MAP{$ARCH} && defined $BUILT{$ARCH};
}

# Find a working subclass of ExecutionEngine for this platform.
sub find_best_engine {
    if (have_native_backend && $TARGET_HAS_JIT) {
        return ['jit', 'native'];
    } else {
        return ['interpreter'];
    }
}

# Get all the human-friendly component names.
sub name_map_entries {
    load_dependencies;
    return sort keys %NAME_MAP;
}

# Map human-readable names to internal library names.
sub expand_names (@) {
    my @names = @_;
    my @result;
    foreach my $name (@names) {
        if (defined $LIB_TO_SET_MAP{$name}) {
            # We've hit bottom: An actual library name.
            push @result, $name;
        } elsif (defined $NAME_MAP{$name}) {
            # We've found a short name to expand.
            push @result, expand_names(@{$NAME_MAP{$name}});
        } else {
            print STDERR "llvm-config: unknown component name: $name\n";
            exit(1);
        }
    }
    return @result;
}

# Given a list of internal library names, return all sets of libraries which
# will need to be included by the linker (in no particular order).
sub find_all_required_sets (@) {
    my @libs = @_;
    my %sets_added;
    my @result;
    find_all_required_sets_helper(\%sets_added, \@result, @libs);
    return @result;
}

# Recursive closures are pretty broken in Perl, so we're going to separate
# this function from find_all_required_sets and pass in the state we need
# manually, as references.  Yes, this is fairly unpleasant.
sub find_all_required_sets_helper ($$@) {
    my ($sets_added, $result, @libs) = @_;
    foreach my $lib (@libs) {
        my $set = $LIB_TO_SET_MAP{$lib};
        next if defined $$sets_added{$set};
        $$sets_added{$set} = 1;
        push @$result, $set;
        find_all_required_sets_helper($sets_added, $result, @{$SET_DEPS{$set}});
    }
}

# Print a list of sets, with a label.  Used for debugging.
sub print_sets ($@) {
    my ($label, @sets) = @_;
    my @output;
    foreach my $set (@sets) { push @output, join(',', @$set); }
    print "$label: ", join(';', @output), "\n";
}

# Returns true if $lib is a key in $added.
sub has_lib_been_added ($$) {
    my ($added, $lib) = @_;
    return defined $$added{$LIB_TO_SET_MAP{$lib}};
}

# Returns true if all the dependencies of $set appear in $added.
sub have_all_deps_been_added ($$) {
    my ($added, $set) = @_;
    #print_sets("  Checking", $set);
    #print_sets("     Wants", $SET_DEPS{$set});
    foreach my $lib (@{$SET_DEPS{$set}}) {
        return 0 unless has_lib_been_added($added, $lib);
    }
    return 1;
}

# Given a list of sets, topologically sort them using dependencies.
sub topologically_sort_sets (@) {
    my @sets = @_;
    my %added;
    my @result;
    SCAN: while (@sets) { # We'll delete items from @sets as we go.
        #print_sets("So far", reverse(@result));
        #print_sets("Remaining", @sets);
        for (my $i = 0; $i < @sets; ++$i) {
            my $set = $sets[$i];
            if (have_all_deps_been_added(\%added, $set)) {
                push @result, $set;
                $added{$set} = 1;
                #print "Removing $i.\n";
                splice(@sets, $i, 1);
                next SCAN; # Restart our scan.
            }
        }
        die "Can't find a library with no dependencies";
    }
    return reverse(@result);
}

# Our library dependency data will be added after the '__END__' token, and will
# be read through the magic <DATA> filehandle.
__END__
