diff --git a/Makefile.rules b/Makefile.rules index 6692c73fd83..a066a56fb85 100644 --- a/Makefile.rules +++ b/Makefile.rules @@ -234,17 +234,17 @@ else C.Flags += -DNDEBUG endif -CXX.Flags += $(CXXFLAGS) -C.Flags += $(CFLAGS) -CPP.Flags += $(CPPFLAGS) -LD.Flags += $(LDFLAGS) -AR.Flags := cru +CXX.Flags += $(CXXFLAGS) +C.Flags += $(CFLAGS) +CPP.BaseFlags += $(CPPFLAGS) +LD.Flags += $(LDFLAGS) +AR.Flags := cru LibTool.Flags := --tag=CXX #Make Floating point ieee complient on alpha ifeq ($(ARCH),Alpha) - CXX.Flags += -mieee - CPP.Flags += -mieee + CXX.Flags += -mieee + CPP.BaseFlags += -mieee endif #-------------------------------------------------------------------- @@ -360,13 +360,15 @@ ifeq ($(OS),HP-UX) CompileCommonOpts := -D_REENTRANT -D_HPUX_SOURCE endif -LD.Flags += -L$(LibDir) -L$(LLVMLibDir) -CPP.Flags += -I$(PROJ_OBJ_DIR) -I$(PROJ_SRC_DIR) \ - -I$(PROJ_OBJ_ROOT)/include \ - -I$(PROJ_SRC_ROOT)/include \ - -I$(LLVM_OBJ_ROOT)/include \ - -I$(LLVM_SRC_ROOT)/include \ - -D_GNU_SOURCE -D__STDC_LIMIT_MACROS +LD.Flags += -L$(LibDir) -L$(LLVMLibDir) +CPP.BaseFlags += -D_GNU_SOURCE -D__STDC_LIMIT_MACROS +# All -I flags should go here, so that they don't confuse llvm-config. +CPP.Flags += -I$(PROJ_OBJ_DIR) -I$(PROJ_SRC_DIR) \ + -I$(PROJ_OBJ_ROOT)/include \ + -I$(PROJ_SRC_ROOT)/include \ + -I$(LLVM_OBJ_ROOT)/include \ + -I$(LLVM_SRC_ROOT)/include \ + $(CPP.BaseFlags) Compile.C = $(CC) $(CPP.Flags) $(CompileCommonOpts) -c $(C.Flags) LTCompile.C = $(LIBTOOL) $(LibTool.Flags) --mode=compile $(Compile.C) @@ -386,6 +388,7 @@ Relink = $(LIBTOOL) $(LibTool.Flags) --mode=link $(CXX) $(CPP.Flags) \ LTInstall = $(LIBTOOL) $(LibTool.Flags) --mode=install $(INSTALL) \ $(Install.Flags) ProgInstall = $(INSTALL) $(Install.StripFlag) -m 0755 +ScriptInstall = $(INSTALL) -m 0755 DataInstall = $(INSTALL) -m 0644 Burg = $(BURG) -I $(PROJ_SRC_DIR) TableGen = $(TBLGEN) -I $(PROJ_SRC_DIR) -I$(PROJ_SRC_ROOT)/include @@ -635,6 +638,9 @@ endif ifeq ($(ARCH),Alpha) USEDLIBS := $(subst LLVMCore, LLVMCore.a, $(USEDLIBS)) LLVMLIBS := $(subst LLVMCore, LLVMCore.a, $(LLVMLIBS)) +CORE_IS_ARCHIVE := 1 +else +CORE_IS_ARCHIVE := 0 endif ProjLibsOptions := $(patsubst %.a.o, -l%, $(addsuffix .o, $(USEDLIBS))) diff --git a/autoconf/configure.ac b/autoconf/configure.ac index 531f72b1c55..42d38c8dff3 100644 --- a/autoconf/configure.ac +++ b/autoconf/configure.ac @@ -659,6 +659,9 @@ AC_CONFIG_FILES([Makefile.config]) dnl Configure doxygen's configuration file AC_CONFIG_FILES([docs/doxygen.cfg]) +dnl Do the first stage of configuration for llvm-config.in. +AC_CONFIG_FILES([utils/llvm-config/llvm-config.in]) + dnl Do special configuration of Makefiles AC_CONFIG_COMMANDS([setup],,[llvm_src="${srcdir}"]) AC_CONFIG_MAKEFILE(Makefile) diff --git a/configure b/configure index ec46bd3db4e..421a5fd37db 100755 --- a/configure +++ b/configure @@ -8376,7 +8376,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < conftest.$ac_ext + echo '#line 10370 "configure"' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? @@ -10852,7 +10852,7 @@ fi # Provide some information about the compiler. -echo "$as_me:10856:" \ +echo "$as_me:10855:" \ "checking for Fortran 77 compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 @@ -11909,11 +11909,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:11913: $lt_compile\"" >&5) + (eval echo "\"\$as_me:11912: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:11917: \$? = $ac_status" >&5 + echo "$as_me:11916: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -12152,11 +12152,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:12156: $lt_compile\"" >&5) + (eval echo "\"\$as_me:12155: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:12160: \$? = $ac_status" >&5 + echo "$as_me:12159: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -12212,11 +12212,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:12216: $lt_compile\"" >&5) + (eval echo "\"\$as_me:12215: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:12220: \$? = $ac_status" >&5 + echo "$as_me:12219: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -14397,7 +14397,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < conftest.$ac_ext <&5) + (eval echo "\"\$as_me:16691: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:16696: \$? = $ac_status" >&5 + echo "$as_me:16695: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -16748,11 +16748,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:16752: $lt_compile\"" >&5) + (eval echo "\"\$as_me:16751: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:16756: \$? = $ac_status" >&5 + echo "$as_me:16755: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -18109,7 +18109,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < conftest.$ac_ext <&5) + (eval echo "\"\$as_me:19047: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:19052: \$? = $ac_status" >&5 + echo "$as_me:19051: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -19104,11 +19104,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:19108: $lt_compile\"" >&5) + (eval echo "\"\$as_me:19107: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:19112: \$? = $ac_status" >&5 + echo "$as_me:19111: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -21143,11 +21143,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:21147: $lt_compile\"" >&5) + (eval echo "\"\$as_me:21146: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:21151: \$? = $ac_status" >&5 + echo "$as_me:21150: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -21386,11 +21386,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:21390: $lt_compile\"" >&5) + (eval echo "\"\$as_me:21389: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:21394: \$? = $ac_status" >&5 + echo "$as_me:21393: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -21446,11 +21446,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:21450: $lt_compile\"" >&5) + (eval echo "\"\$as_me:21449: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:21454: \$? = $ac_status" >&5 + echo "$as_me:21453: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -23631,7 +23631,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < conftest.$ac_ext < LibDeps.txt + +# Find all the cyclic dependencies between various LLVM libraries, so we +# don't have to process them at runtime. +FinalLibDeps.txt: find-cycles.pl # LibDeps.txt deliberately omitted. + $(Echo) "Finding cyclic dependencies between LLVM libraries." + $(Verb) $< < $(PROJ_SRC_DIR)/LibDeps.txt > $@ + +# Rerun our configure substitutions as needed. +llvm-config.in: llvm-config.in.in $(ConfigStatusScript) + $(Verb) cd $(PROJ_OBJ_ROOT) ; \ + $(ConfigStatusScript) utils/llvm-config/llvm-config.in + +# Build our final script. +llvm-config: llvm-config.in FinalLibDeps.txt + $(Echo) "Building llvm-config script." + $(Verb) $(ECHO) 's,@LLVM_CXXFLAGS@,$(SUB_CXXFLAGS),' > temp.sed + $(Verb) $(ECHO) 's,@LLVM_LDFLAGS@,$(SUB_LDFLAGS),' >> temp.sed + $(Verb) $(ECHO) 's,@CORE_IS_ARCHIVE@,$(CORE_IS_ARCHIVE),' >> temp.sed + $(Verb) $(SED) -f temp.sed < $< > $@ + $(Verb) $(RM) temp.sed + $(Verb) cat FinalLibDeps.txt >> $@ + $(Verb) chmod +x llvm-config + +# Hook into the standard Makefile rules. +all-local:: llvm-config +clean-local:: + $(Verb) $(RM) -f FinalLibDeps.txt llvm-config llvm-config.in +install-local:: all-local + $(Echo) Installing llvm-config + $(Verb) $(MKDIR) $(PROJ_bindir) + $(Verb) $(ScriptInstall) llvm-config $(PROJ_bindir) diff --git a/tools/llvm-config/find-cycles.pl b/tools/llvm-config/find-cycles.pl new file mode 100755 index 00000000000..b6609556bf4 --- /dev/null +++ b/tools/llvm-config/find-cycles.pl @@ -0,0 +1,162 @@ +#!/usr/bin/perl +# +# Program: find-cycles.pl +# +# Synopsis: Given a list of possibly cyclic dependencies, merge all the +# cycles. This makes it possible to topologically sort the +# dependencies between different parts of LLVM. +# +# Syntax: find-cycles.pl < LibDeps.txt > FinalLibDeps.txt +# +# Input: cycmem1: cycmem2 dep1 dep2 +# cycmem2: cycmem1 dep3 dep4 +# boring: dep4 +# +# Output: cycmem1 cycmem2: dep1 dep2 dep3 dep4 +# boring: dep4 +# +# This file was written by Eric Kidd, and is placed into the public domain. +# + +use strict; +use warnings; + +my %DEPS; +my @CYCLES; +sub find_all_cycles; + +# Read our dependency information. +while (<>) { + chomp; + my ($module, $dependency_str) = /^([^:]*): ?(.*)$/; + die "Malformed data: $_" unless defined $dependency_str; + my @dependencies = split(/ /, $dependency_str); + $DEPS{$module} = \@dependencies; +} + +# Partition our raw dependencies into sets of cyclically-connected nodes. +find_all_cycles(); + +# Print out the finished cycles, with their dependencies. +my @output; +foreach my $cycle (@CYCLES) { + my @modules = sort keys %{$cycle}; + + # Merge the dependencies of all modules in this cycle. + my %dependencies; + foreach my $module (@modules) { + @dependencies{@{$DEPS{$module}}} = 1; + } + + # Prune the known cyclic dependencies. + foreach my $module (@modules) { + delete $dependencies{$module}; + } + + # Warn about possible linker problems. + my @archives = grep(/\.a$/, @modules); + if (@archives > 1) { + print STDERR "find-cycles.pl: Circular dependency between *.a files:\n"; + print STDERR "find-cycles.pl: ", join(' ', @archives), "\n"; + print STDERR "find-cycles.pl: Some linkers may have problems.\n"; + push @modules, @archives; # WORKAROUND: Duplicate *.a files. Ick. + } + + # Add to our output. (@modules is already as sorted as we need it to be.) + push @output, (join(' ', @modules) . ': ' . + join(' ', sort keys %dependencies) . "\n"); +} +print sort @output; + + +#========================================================================== +# Depedency Cycle Support +#========================================================================== +# For now, we have cycles in our dependency graph. Ideally, each cycle +# would be collapsed down to a single *.a file, saving us all this work. +# +# To understand this code, you'll need a working knowledge of Perl 5, +# and possibly some quality time with 'man perlref'. + +my %SEEN; +my %CYCLES; +sub find_cycles ($@); +sub found_cycles ($@); + +sub find_all_cycles { + # Find all multi-item cycles. + my @modules = sort keys %DEPS; + foreach my $module (@modules) { find_cycles($module); } + + # Build fake one-item "cycles" for the remaining modules, so we can + # treat them uniformly. + foreach my $module (@modules) { + unless (defined $CYCLES{$module}) { + my %cycle = ($module, 1); + $CYCLES{$module} = \%cycle; + } + } + + # Find all our unique cycles. We have to do this the hard way because + # we apparently can't store hash references as hash keys without making + # 'strict refs' sad. + my %seen; + foreach my $cycle (values %CYCLES) { + unless ($seen{$cycle}) { + $seen{$cycle} = 1; + push @CYCLES, $cycle; + } + } +} + +# Walk through our graph depth-first (keeping a trail in @path), and report +# any cycles we find. +sub find_cycles ($@) { + my ($module, @path) = @_; + if (str_in_list($module, @path)) { + found_cycle($module, @path); + } else { + return if defined $SEEN{$module}; + $SEEN{$module} = 1; + foreach my $dep (@{$DEPS{$module}}) { + find_cycles($dep, @path, $module); + } + } +} + +# Give a cycle, attempt to merge it with pre-existing cycle data. +sub found_cycle ($@) { + my ($module, @path) = @_; + + # Pop any modules which aren't part of our cycle. + while ($path[0] ne $module) { shift @path; } + #print join("->", @path, $module) . "\n"; + + # Collect the modules in our cycle into a hash. + my %cycle; + foreach my $item (@path) { + $cycle{$item} = 1; + if (defined $CYCLES{$item}) { + # Looks like we intersect with an existing cycle, so merge + # all those in, too. + foreach my $old_item (keys %{$CYCLES{$item}}) { + $cycle{$old_item} = 1; + } + } + } + + # Update our global cycle table. + my $cycle_ref = \%cycle; + foreach my $item (keys %cycle) { + $CYCLES{$item} = $cycle_ref; + } + #print join(":", sort keys %cycle) . "\n"; +} + +sub str_in_list ($@) { + my ($str, @list) = @_; + foreach my $item (@list) { + return 1 if ($item eq $str); + } + return 0; +} diff --git a/tools/llvm-config/llvm-config.in.in b/tools/llvm-config/llvm-config.in.in new file mode 100644 index 00000000000..6f1533cb219 --- /dev/null +++ b/tools/llvm-config/llvm-config.in.in @@ -0,0 +1,364 @@ +#!/usr/bin/perl +# +# Program: llvm-config +# +# Synopsis: Prints out compiler options needed to build against an installed +# copy of LLVM. +# +# Syntax: lllvm-config OPTIONS... [COMPONENTS...] +# +# This file was written by Eric Kidd, and is placed into the public domain. +# + +use strict; +use warnings; + +#---- begin autoconf values ---- +my $VERSION = q{@PACKAGE_VERSION@}; +my $PREFIX = q{@LLVM_PREFIX@}; +my $BINDIR = q{@LLVM_BINDIR@}; +my $INCLUDEDIR = q{@LLVM_INCLUDEDIR@}; +my $LIBDIR = q{@LLVM_LIBDIR@}; +my $ARCH = lc(q{@ARCH@}); +my @TARGETS_BUILT = map { lc($_) } qw{@TARGETS_TO_BUILD@}; +#---- end autoconf values ---- + +#---- begin Makefile values ---- +my $CXXFLAGS = q{@LLVM_CXXFLAGS@}; +my $LDFLAGS = q{@LLVM_LDFLAGS@}; +my $CORE_IS_ARCHIVE = q{@CORE_IS_ARCHIVE@}; +#---- end Makefile values ---- + +sub usage; +sub fix_library_names (@); +sub expand_dependecies (@); +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_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 "--cxxflags") { + $has_opt = 1; print "-I$INCLUDEDIR $CXXFLAGS\n"; + } elsif ($arg eq "--ldflags") { + $has_opt = 1; print "-L$LIBDIR $LDFLAGS\n"; + } elsif ($arg eq "--libs") { + $has_opt = 1; $want_libs = 1; + } elsif ($arg eq "--libnames") { + $has_opt = 1; $want_libnames = 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"; + } 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'; +} + +# Handle any arguments which require building our dependency graph. +if ($want_libs || $want_libnames) { + my @libs = expand_dependecies(@components); + if ($want_libs) { + print join(' ', fix_library_names(@libs)), "\n"; + } + if ($want_libnames) { + print join(' ', @libs), "\n"; + } +} + +exit 0; + +#========================================================================== +# Support Routines +#========================================================================== + +sub usage { + print STDERR <<__EOD__; +Usage: llvm-config