r12253: Automatically build seperate binaries without -rpath to install when
authorJelmer Vernooij <jelmer@samba.org>
Thu, 15 Dec 2005 15:59:10 +0000 (15:59 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:47:24 +0000 (13:47 -0500)
using shared libraries and developer mode is enabled.

source/build/smb_build/TODO
source/build/smb_build/input.pm
source/build/smb_build/main.pl
source/build/smb_build/makefile.pm
source/build/smb_build/output.pm
source/main.mk

index 8fe11bfc855bb2a82c214b4dd4da1d63eba11523..190940fadb3170dea405630d1fff011e51a7570d 100644 (file)
@@ -3,8 +3,6 @@
    - get rid of include/structs.h
 - install Samba-specific headers in $INCLUDEDIR/samba-4.0. talloc.h, tdb.h and 
        ldb.h belong in $INCLUDEDIR
-- never install -rpath binaries / libraries, always relink before install
- - keep files without -rpath in bin/install
 - init functions may be called more then once as different libraries 
  (in Samba or other projects) can use the same (3rd) library.
 - add register function to smbtorture
index ebc91a9107cadf70881cb39a45bb38668e2fad47..de558e709a2f7af15b7e7b644eee7b8bda4f8c95 100644 (file)
@@ -8,11 +8,6 @@
 use strict;
 package smb_build::input;
 
-use vars qw($library_output_type $subsystem_output_type $module_output_type);
-
-$library_output_type = "OBJ_LIST";
-$subsystem_output_type = "OBJ_LIST";
-$module_output_type = "OBJ_LIST";
 my $srcdir = ".";
 
 sub strtrim($)
@@ -34,22 +29,22 @@ sub str2array($)
        return split /[ \t\n]/;
 }
 
-sub check_subsystem($$)
+sub check_subsystem($$$)
 {
-       my ($INPUT, $subsys) = @_;
+       my ($INPUT, $subsys, $default_ot) = @_;
        if ($subsys->{ENABLE} ne "YES") {
                printf("Subsystem `%s' disabled\n",$subsys->{NAME});
                return;
        }
        
        unless(defined($subsys->{OUTPUT_TYPE})) {
-               $subsys->{OUTPUT_TYPE} = $subsystem_output_type;
+               $subsys->{OUTPUT_TYPE} = $default_ot;
        }
 }
 
-sub check_module($$)
+sub check_module($$$)
 {
-       my ($INPUT, $mod) = @_;
+       my ($INPUT, $mod, $default_ot) = @_;
 
        die("Module $mod->{NAME} does not have a SUBSYSTEM set") if not defined($mod->{SUBSYSTEM});
 
@@ -70,7 +65,7 @@ sub check_module($$)
        {
                $mod->{OUTPUT_TYPE} = $mod->{CHOSEN_BUILD};
        } else {
-               $mod->{OUTPUT_TYPE} = $module_output_type;
+               $mod->{OUTPUT_TYPE} = $default_ot;
        }
 
        if ($mod->{OUTPUT_TYPE} eq "SHARED_LIBRARY" or 
@@ -82,17 +77,16 @@ sub check_module($$)
        }
 }
 
-sub check_library($$)
+sub check_library($$$)
 {
-       my ($INPUT, $lib) = @_;
+       my ($INPUT, $lib, $default_ot) = @_;
 
        if ($lib->{ENABLE} ne "YES") {
                printf("Library `%s' disabled\n",$lib->{NAME});
                return;
        }
 
-
-       $lib->{OUTPUT_TYPE} = $library_output_type;
+       $lib->{OUTPUT_TYPE} = $default_ot;
 
        unless (defined($lib->{MAJOR_VERSION})) {
                print "$lib->{NAME}: Please specify MAJOR_VERSION\n";
@@ -133,16 +127,9 @@ sub calc_unique_deps($$)
        }
 }
 
-###########################################################
-# This function checks the input from the configure script 
-#
-# check_input($INPUT)
-#
-# $INPUT -     the global INPUT context
-# $enabled - list of enabled subsystems/libs
-sub check($$)
+sub check($$$$$)
 {
-       my ($INPUT, $enabled) = @_;
+       my ($INPUT, $enabled, $subsys_ot, $lib_ot, $module_ot) = @_;
 
        foreach my $part (values %$INPUT) {
                if (defined($enabled->{$part->{NAME}})) { 
@@ -158,9 +145,9 @@ sub check($$)
        foreach my $k (keys %$INPUT) {
                my $part = $INPUT->{$k};
 
-               check_subsystem($INPUT, $part) if ($part->{TYPE} eq "SUBSYSTEM");
-               check_module($INPUT, $part) if ($part->{TYPE} eq "MODULE");
-               check_library($INPUT, $part) if ($part->{TYPE} eq "LIBRARY");
+               check_subsystem($INPUT, $part, $subsys_ot) if ($part->{TYPE} eq "SUBSYSTEM");
+               check_module($INPUT, $part, $module_ot) if ($part->{TYPE} eq "MODULE");
+               check_library($INPUT, $part, $lib_ot) if ($part->{TYPE} eq "LIBRARY");
                check_binary($INPUT, $part) if ($part->{TYPE} eq "BINARY");
        }
 
index 0c027facc303fc35f4d0fd82a9a2fed9f1adbe38..cb25fca4ac5b6fee615cb9217eba408355b0ffbb 100644 (file)
@@ -18,34 +18,48 @@ my $INPUT = {};
 
 my $mkfile = smb_build::config_mk::run_config_mk($INPUT, "main.mk");
 
+my $subsystem_output_type;
+
 if (defined($ENV{"SUBSYSTEM_OUTPUT_TYPE"})) {
-       $smb_build::input::subsystem_output_type = $ENV{SUBSYSTEM_OUTPUT_TYPE};
+       $subsystem_output_type = $ENV{SUBSYSTEM_OUTPUT_TYPE};
 } elsif ($config::config{BLDMERGED} eq "true") {
-       $smb_build::input::subsystem_output_type = "MERGEDOBJ";
+       $subsystem_output_type = "MERGEDOBJ";
+} else {
+       $subsystem_output_type = "OBJ_LIST";
 }
 
+my $library_output_type;
 if (defined($ENV{"LIBRARY_OUTPUT_TYPE"})) {
-       $smb_build::input::library_output_type = $ENV{LIBRARY_OUTPUT_TYPE};
+       $library_output_type = $ENV{LIBRARY_OUTPUT_TYPE};
 } elsif ($config::config{BLDSHARED} eq "true") {
        #FIXME: This should eventually become SHARED_LIBRARY 
        # rather then MERGEDOBJ once I'm certain it works ok -- jelmer
-       $smb_build::input::library_output_type = "MERGEDOBJ";
+       $library_output_type = "MERGEDOBJ";
 } elsif ($config::config{BLDMERGED} eq "true") {
-       $smb_build::input::library_output_type = "MERGEDOBJ";
+       $library_output_type = "MERGEDOBJ";
+} else {
+       $library_output_type = "OBJ_LIST";
 }
 
+my $module_output_type;
 if (defined($ENV{"MODULE_OUTPUT_TYPE"})) {
-       $smb_build::input::module_output_type = $ENV{MODULE_OUTPUT_TYPE};
+       $module_output_type = $ENV{MODULE_OUTPUT_TYPE};
 } elsif ($config::config{BLDSHARED} eq "true") {
        #FIXME: This should eventually become SHARED_LIBRARY 
        # rather then MERGEDOBJ once I'm certain it works ok -- jelmer
-       $smb_build::input::module_output_type = "MERGEDOBJ";
+       $module_output_type = "MERGEDOBJ";
 } elsif ($config::config{BLDMERGED} eq "true") {
-       $smb_build::input::module_output_type = "MERGEDOBJ";
+       $module_output_type = "MERGEDOBJ";
+} else {
+       $module_output_type = "OBJ_LIST";
 }
 
-my $DEPEND = smb_build::input::check($INPUT, \%config::enabled);
+my $DEPEND = smb_build::input::check($INPUT, \%config::enabled, 
+       $subsystem_output_type, $library_output_type, $module_output_type);
 my $OUTPUT = output::create_output($DEPEND);
+$config::config{SUBSYSTEM_OUTPUT_TYPE} = $subsystem_output_type;
+$config::config{LIBRARY_OUTPUT_TYPE} = $library_output_type;
+$config::config{MODULE_OUTPUT_TYPE} = $module_output_type;
 my $mkenv = new smb_build::makefile(\%config::config, $mkfile);
 
 foreach my $key (values %$OUTPUT) {
index d5ac6de6f9bc320745114679c201344a6625b218..986d1aa2135882f4bac77168e8f39fa9b795462d 100644 (file)
@@ -89,9 +89,16 @@ sub _prepare_compiler_linker($)
 {
        my ($self) = @_;
 
-       my $devld = "";
-       if ($self->{developer}) {
-               $devld = " \$(DEVEL_LDFLAGS)";
+       my $devld_local = "";
+       my $devld_install = "";
+
+       $self->{duplicate_build} = 0;
+       if ($self->{config}->{LIBRARY_OUTPUT_TYPE} eq "SHARED_LIBRARY") {
+               if ($self->{developer}) {
+                       $self->{duplicate_build} = 1;
+                       $devld_local = " -Wl,-rpath,\$(builddir)/bin";
+               }
+               $devld_install = " -Wl,-rpath-link,\$(builddir)/bin";
        }
 
        $self->output(<< "__EOD__"
@@ -107,15 +114,16 @@ CFLAGS=-I\$(srcdir)/include -I\$(srcdir) -I\$(srcdir)/lib -D_SAMBA_BUILD_ -DHAVE
 PICFLAG=$self->{config}->{PICFLAG}
 HOSTCC=$self->{config}->{HOSTCC}
 
-DEVEL_LDFLAGS=-Wl,-rpath,bin/
 LD=$self->{config}->{LD} 
-LDFLAGS=$self->{config}->{LDFLAGS} -Lbin/$devld
+LDFLAGS=$self->{config}->{LDFLAGS} -L\$(builddir)/bin
+LOCAL_LINK_FLAGS=$devld_local
+INSTALL_LINK_FLAGS=$devld_install
 
 STLD=$self->{config}->{AR}
-STLD_FLAGS=-rc -Lbin/
+STLD_FLAGS=-rc -L\$(builddir)/bin
 
 SHLD=$self->{config}->{CC}
-SHLD_FLAGS=$self->{config}->{LDSHFLAGS} -Lbin/$devld
+SHLD_FLAGS=$self->{config}->{LDSHFLAGS} -L\$(builddir)/bin
 SONAMEFLAG=$self->{config}->{SONAMEFLAG}
 SHLIBEXT=$self->{config}->{SHLIBEXT}
 
@@ -241,7 +249,7 @@ sub SharedLibrary($$)
        $self->output(<< "__EOD__"
 #
 
-$ctx->{TARGET}: \$($ctx->{TYPE}_$ctx->{NAME}_DEPEND_LIST) \$($ctx->{TYPE}_$ctx->{NAME}_OBJ_LIST) bin/.dummy
+bin/$ctx->{LIBRARY_REALNAME}: \$($ctx->{TYPE}_$ctx->{NAME}_DEPEND_LIST) \$($ctx->{TYPE}_$ctx->{NAME}_OBJ_LIST) bin/.dummy
        \@echo Linking \$\@
        \@\$(SHLD) \$(SHLD_FLAGS) -o \$\@ \\
                \$($ctx->{TYPE}_$ctx->{NAME}_LINK_FLAGS) \\
@@ -263,8 +271,6 @@ bin/$ctx->{LIBRARY_NAME}: bin/$ctx->{LIBRARY_SONAME} bin/.dummy
 __EOD__
 );
        }
-
-       $self->output("library_$ctx->{NAME}: basics bin/lib$ctx->{LIBRARY_NAME}\n");
 }
 
 sub MergedObj($$)
@@ -318,8 +324,6 @@ $ctx->{TARGET}: \$($ctx->{TYPE}_$ctx->{NAME}_DEPEND_LIST) \$($ctx->{TYPE}_$ctx->
        \@\$(STLD) \$(STLD_FLAGS) \$@ \\
                \$($ctx->{TYPE}_$ctx->{NAME}_LINK_LIST)
 
-library_$ctx->{NAME}: basics $ctx->{TARGET}
-
 __EOD__
 );
 }
@@ -337,28 +341,48 @@ sub Binary($$)
 {
        my ($self,$ctx) = @_;
 
+       my $installdir;
+       
+       if ($self->{duplicate_build}) {
+               $installdir = "bin/install";
+       } else {
+               $installdir = "bin";
+       }
+
        unless (defined($ctx->{INSTALLDIR})) {
        } elsif ($ctx->{INSTALLDIR} eq "SBINDIR") {
-               push (@{$self->{sbin_progs}}, $ctx->{TARGET});
+               push (@{$self->{sbin_progs}}, "$installdir/$ctx->{BINARY}");
        } elsif ($ctx->{INSTALLDIR} eq "BINDIR") {
-               push (@{$self->{bin_progs}}, $ctx->{TARGET});
+               push (@{$self->{bin_progs}}, "$installdir/$ctx->{BINARY}");
        }
 
+       push (@{$self->{binaries}}, "bin/$ctx->{BINARY}");
+
        $self->_prepare_list($ctx, "OBJ_LIST");
        $self->_prepare_list($ctx, "CFLAGS");
        $self->_prepare_list($ctx, "DEPEND_LIST");
        $self->_prepare_list($ctx, "LINK_LIST");
        $self->_prepare_list($ctx, "LINK_FLAGS");
 
+       if ($self->{duplicate_build}) {
        $self->output(<< "__EOD__"
 #
-#
 bin/$ctx->{BINARY}: bin/.dummy \$($ctx->{TYPE}_$ctx->{NAME}_DEPEND_LIST) \$($ctx->{TYPE}_$ctx->{NAME}_OBJ_LIST)
        \@echo Linking \$\@
-       \@\$(CC) \$(LDFLAGS) -o \$\@ \\
+       \@\$(CC) \$(LDFLAGS) -o \$\@ \$(LOCAL_LINK_FLAGS) \\
                \$\($ctx->{TYPE}_$ctx->{NAME}_LINK_LIST) \\
                \$\($ctx->{TYPE}_$ctx->{NAME}_LINK_FLAGS)
-binary_$ctx->{BINARY}: basics bin/$ctx->{BINARY}
+
+__EOD__
+);
+       }
+
+$self->output(<< "__EOD__"
+$installdir/$ctx->{BINARY}: \$($ctx->{TYPE}_$ctx->{NAME}_DEPEND_LIST) \$($ctx->{TYPE}_$ctx->{NAME}_OBJ_LIST)
+       \@echo Linking \$\@
+       \@\$(CC) \$(LDFLAGS) -o \$\@ \$(INSTALL_LINK_FLAGS) \\
+               \$\($ctx->{TYPE}_$ctx->{NAME}_LINK_LIST) \\
+               \$\($ctx->{TYPE}_$ctx->{NAME}_LINK_FLAGS) 
 
 __EOD__
 );
@@ -412,6 +436,7 @@ sub write($$)
        $self->output("MANPAGES = ".array2oneperline($self->{manpages})."\n");
        $self->output("BIN_PROGS = " . array2oneperline($self->{bin_progs}) . "\n");
        $self->output("SBIN_PROGS = " . array2oneperline($self->{sbin_progs}) . "\n");
+       $self->output("BINARIES = " . array2oneperline($self->{binaries}) . "\n");
        $self->output("STATIC_LIBS = " . array2oneperline($self->{static_libs}) . "\n");
        $self->output("SHARED_LIBS = " . array2oneperline($self->{shared_libs}) . "\n");
        $self->output("PUBLIC_HEADERS = " . array2oneperline($self->{headers}) . "\n");
index b7a9653b2b42127ced03415c89c73247d745d31d..d39ff62101f9f3b318416c941c55e02b59d0582e 100644 (file)
@@ -51,7 +51,7 @@ sub generate_shared_library($)
        $link_name =~ s/^LIB//;
        $link_name = lc($link_name);
 
-       $lib->{LIBRARY_NAME} = "lib$link_name.\$(SHLIBEXT)";
+       $lib->{LIBRARY_REALNAME} = $lib->{LIBRARY_NAME} = "lib$link_name.\$(SHLIBEXT)";
        $lib->{TARGET} = "bin/$lib->{LIBRARY_NAME}";
        if (defined($lib->{MAJOR_VERSION})) {
                $lib->{LIBRARY_SONAME} = $lib->{LIBRARY_NAME}.".$lib->{MAJOR_VERSION}";
index 1f8838a49529980aa45a9fdfcbc2390b8fb207dc..74d33c8f3246be38d5be10ebdfbca6e359ef6e8d 100644 (file)
@@ -1,4 +1,4 @@
-all: binary_asn1_compile binary_compile_et binaries
+all: basics bin/asn1_compile bin/compile_et binaries
 
 include heimdal_build/config.mk
 include config.mk
@@ -30,7 +30,7 @@ include libcli/config.mk
 include scripting/config.mk
 include kdc/config.mk
 
-binaries: $(BIN_PROGS) $(SBIN_PROGS)
+binaries: $(BINARIES)
 libraries: $(STATIC_LIBS) $(SHARED_LIBS)
 headers: $(PUBLIC_HEADERS)
 manpages: $(MANPAGES)
@@ -53,7 +53,7 @@ showlayout:
 showflags:
        @echo "Samba will be compiled with flags:"
        @echo "  CFLAGS = $(CFLAGS)"
-       @echo "  LD_FLAGS = $(LD_FLAGS)"
+       @echo "  LDFLAGS = $(LDFLAGS)"
        @echo "  STLD_FLAGS = $(STLD_FLAGS)"
        @echo "  SHLD_FLAGS = $(SHLD_FLAGS)"
        @echo "  LIBS = $(LIBS)"
@@ -88,7 +88,7 @@ install: showlayout installbin installdat installswat installmisc installlib \
 installdirs:
        @$(SHELL) $(srcdir)/script/installdirs.sh $(DESTDIR)$(BASEDIR) $(DESTDIR)$(BINDIR) $(DESTDIR)$(SBINDIR) $(DESTDIR)$(LIBDIR) $(DESTDIR)$(VARDIR) $(DESTDIR)$(PRIVATEDIR) $(DESTDIR)$(PIDDIR) $(DESTDIR)$(LOCKDIR) $(DESTDIR)$(PRIVATEDIR)/tls $(DESTDIR)$(INCLUDEDIR)
 
-installbin: binaries installdirs
+installbin: $(SBIN_PROGS) $(BIN_PROGS) installdirs
        @$(SHELL) $(srcdir)/script/installbin.sh $(INSTALLPERMS) $(DESTDIR)$(BASEDIR) $(DESTDIR)$(SBINDIR) $(DESTDIR)$(LIBDIR) $(DESTDIR)$(VARDIR) $(SBIN_PROGS)
        @$(SHELL) $(srcdir)/script/installbin.sh $(INSTALLPERMS) $(DESTDIR)$(BASEDIR) $(DESTDIR)$(BINDIR) $(DESTDIR)$(LIBDIR) $(DESTDIR)$(VARDIR) $(BIN_PROGS)
 
@@ -200,7 +200,7 @@ clean: heimdal_clean
        @-rm -f lib/registry/regf.h lib/registry/tdr_regf*
 
 distclean: clean
-       -rm -f bin/.dummy
+       -rm -f bin/.dummy 
        -rm -f include/config.h include/smb_build.h
        -rm -f Makefile 
        -rm -f config.status