| #!@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__ |