- Adds -rpath bin/ so you don't have to install Samba in order to use compiled binaries.
- Writes out pkg-config files when building shared libs
- Supports automatic fallback to MERGEDOBJ (which is the default) or
OBJ_LIST (if ld -r is not supported)
Building with shared libs reduces the size of the Samba binaries from
197 Mb to 60 Mb (including libraries) on my system (GCC4, with debugging).
To build with shared libraries support enabled, run:
LIBRARY_OUTPUT_TYPE=SHARED_LIBRARY ./config.status
init functions don't get called correctly yet when using shared libs, so
you won't be able to actually run anything with success :-)
Once init functions are done, I'll look at support for loading shared
modules once again.
Based on a patch by Peter Novodvorsky (nidd on IRC).
INIT_OBJ_FILES = \
auth_winbind.o
REQUIRED_SUBSYSTEMS = \
- LIB_WINBIND_CLIENT \
+ LIBWINBIND_CLIENT \
NDR_NETLOGON LIBNDR
# End MODULE auth_winbind
#######################
#################################
# Start SUBSYSTEM GENSEC
-[SUBSYSTEM::GENSEC]
+[LIBRARY::GENSEC]
+MAJOR_VERSION = 0
+MINOR_VERSION = 0
+RELEASE_VERSION = 1
INIT_FUNCTION = gensec_init
INIT_OBJ_FILES = gensec.o
REQUIRED_SUBSYSTEMS = \
"OBJ_FILES" => "list",
"REQUIRED_SUBSYSTEMS" => "list",
- "TARGET_DEPS" => "list",
"ENABLE" => "bool",
"NOPROTO" => "bool",
"OBJ_FILES" => "list",
"REQUIRED_SUBSYSTEMS" => "list",
- "TARGET_DEPS" => "list",
"ENABLE" => "bool",
"NOPROTO" => "bool",
"OBJ_FILES" => "list",
"REQUIRED_SUBSYSTEMS" => "list",
- "TARGET_DEPS" => "list",
"ENABLE" => "bool",
"NOPROTO" => "bool",
"MAJOR_VERSION" => "string",
"MINOR_VERSION" => "string",
"RELEASE_VERSION" => "string",
+
+ "INIT_FUNCTION" => "string",
"INIT_OBJ_FILES" => "list",
"ADD_OBJ_FILES" => "list",
"OBJ_FILES" => "list",
+ "DESCRIPTION" => "string",
+
"REQUIRED_SUBSYSTEMS" => "list",
- "TARGET_DEPS" => "list",
"ENABLE" => "bool",
"NOPROTO" => "bool",
}
}
-sub PkgConfig($$$$$$)
+sub PkgConfig($$$$$$$)
{
- my ($self,$path,$name,$libs,$cflags,$version) = @_;
+ my ($self,$path,$name,$libs,$cflags,$version,$desc) = @_;
print __FILE__.": creating $path\n";
__EOF__
print OUT "Name: $name\n";
+ if (defined($desc)) {
+ print OUT "Description: $desc\n";
+ }
print OUT "Version: $version\n";
- print OUT "Libs: $libs\n";
- print OUT "Cflags: $cflags\n";
+ print OUT "Libs: -L\${libdir} $libs\n";
+ print OUT "Cflags: -I\${includedir} $cflags\n";
close(OUT);
}
{
my ($INPUT, $subsys) = @_;
if ($subsys->{ENABLE} ne "YES") {
- printf("Subsystem: %s disabled!\n",$subsys->{NAME});
+ printf("Subsystem `%s' disabled\n",$subsys->{NAME});
return;
}
die("Module $mod->{NAME} does not have a SUBSYSTEM set") if not defined($mod->{SUBSYSTEM});
-
($mod->{DEFAULT_BUILD} = "STATIC") if not defined($mod->{DEFAULT_BUILD});
my $use_default = 0;
if (!(defined($INPUT->{$mod->{SUBSYSTEM}}))) {
$mod->{BUILD} = "NOT";
$mod->{ENABLE} = "NO";
- printf("Module: %s...PARENT SUBSYSTEM ($mod->{SUBSYSTEM}) DISABLED\n",$mod->{NAME});
return;
}
$mod->{OUTPUT_TYPE} = "SHARED_LIBRARY";
$mod->{INSTALLDIR} = "LIBDIR/$mod->{SUBSYSTEM}";
push (@{$mod->{REQUIRED_SUBSYSTEMS}}, $mod->{SUBSYSTEM});
- printf("Module: %s...shared\n",$mod->{NAME});
} elsif ($mod->{CHOSEN_BUILD} eq "STATIC") {
$mod->{ENABLE} = "YES";
push (@{$INPUT->{$mod->{SUBSYSTEM}}{REQUIRED_SUBSYSTEMS}}, $mod->{NAME});
- printf("Module: %s...static\n",$mod->{NAME});
$mod->{OUTPUT_TYPE} = $subsystem_output_type;
} else {
$mod->{ENABLE} = "NO";
- printf("Module: %s...not\n",$mod->{NAME});
+ printf("Module `%s' disabled\n",$mod->{NAME});
return;
}
}
my ($INPUT, $lib) = @_;
if ($lib->{ENABLE} ne "YES") {
- printf("Library: %s...disabled\n",$lib->{NAME});
+ printf("Library `%s' disabled\n",$lib->{NAME});
return;
}
+
$lib->{OUTPUT_TYPE} = $library_output_type;
+ unless (defined($lib->{MAJOR_VERSION})) {
+ print "$lib->{NAME}: Please specify MAJOR_VERSION\n";
+ return;
+ }
+
$lib->{INSTALLDIR} = "LIBDIR";
}
my ($INPUT, $bin) = @_;
if ($bin->{ENABLE} ne "YES") {
- printf("Binary: %s...disabled\n",$bin->{NAME});
+ printf("Binary `%s' disabled\n",$bin->{NAME});
return;
}
foreach my $dep (@{$deps}) {
if (not defined($udeps->{$$dep->{NAME}})) {
- $udeps->{$$dep->{NAME}} = "BUSY";
- calc_unique_deps($$dep->{DEPENDENCIES}, $udeps);
+ if (defined ($$dep->{OUTPUT_TYPE}) && (($$dep->{OUTPUT_TYPE} eq "OBJ_LIST")
+ or ($$dep->{OUTPUT_TYPE} eq "MERGEDOBJ"))) {
+ $udeps->{$$dep->{NAME}} = "BUSY";
+ calc_unique_deps($$dep->{DEPENDENCIES}, $udeps);
+ }
$udeps->{$$dep->{NAME}} = $$dep;
}
}
if (defined($ENV{"LIBRARY_OUTPUT_TYPE"})) {
$smb_build::input::library_output_type = $ENV{LIBRARY_OUTPUT_TYPE};
} elsif ($config::config{BLDSHARED} eq "true") {
- # FIXME: This should really be SHARED_LIBRARY
+ #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";
} elsif ($config::config{BLDMERGED} eq "true") {
$smb_build::input::library_output_type = "MERGEDOBJ";
{
my ($self) = @_;
+ my $devld = "";
+ if ($self->{developer}) {
+ $devld = " \$(DEVEL_LDFLAGS)";
+ }
+
$self->output(<< "__EOD__"
SHELL=$self->{config}->{SHELL}
CPP=$self->{config}->{CPP}
CPPFLAGS=$self->{config}->{CPPFLAGS}
-LD=$self->{config}->{LD}
-LD_FLAGS=$self->{config}->{LDFLAGS}
+DEVEL_LDFLAGS=-Wl,-rpath,bin/
+LD=$self->{config}->{LD}
+LDFLAGS=$self->{config}->{LDFLAGS} -Lbin/$devld
STLD=$self->{config}->{AR}
-STLD_FLAGS=-rc
+STLD_FLAGS=-rc -Lbin/
SHLD=$self->{config}->{CC}
-SHLD_FLAGS=$self->{config}->{LDSHFLAGS}
+SHLD_FLAGS=$self->{config}->{LDSHFLAGS} -Lbin/$devld
SONAMEFLAG=$self->{config}->{SONAMEFLAG}
SHLIBEXT=$self->{config}->{SHLIBEXT}
{
my ($self,$ctx) = @_;
- push (@{$self->{shared_libs}}, $ctx->{OUTPUT});
+ push (@{$self->{shared_libs}}, "bin/$ctx->{LIBRARY_NAME}");
$self->_prepare_obj_list($ctx->{TYPE}, $ctx);
$self->_prepare_cflags($ctx->{TYPE}, $ctx);
#
bin/$ctx->{BINARY}: bin/.dummy \$(BINARY_$ctx->{NAME}_DEPEND_LIST) \$(BINARY_$ctx->{NAME}_OBJS)
\@echo Linking \$\@
- \@\$(CC) \$(LD_FLAGS) -o \$\@ \\
+ \@\$(CC) \$(LDFLAGS) -o \$\@ \\
\$\(BINARY_$ctx->{NAME}_LINK_FLAGS) \\
\$\(BINARY_$ctx->{NAME}_LINK_LIST) \\
\$\(BINARY_$ctx->{NAME}_LINK_FLAGS)
{
my ($self,$ctx) = @_;
- my $path = "$ctx->{BASEDIR}/$ctx->{NAME}.pc";
+ my $link_name = $ctx->{NAME};
+
+ $link_name =~ s/^LIB//g;
+ $link_name = lc($link_name);
+
+ my $path = "$ctx->{BASEDIR}/$link_name.pc";
push (@{$self->{pc_files}}, $path);
- smb_build::env::PkgConfig($self,$path,$ctx->{NAME},"FIXME",join(' ', @{$ctx->{CFLAGS}}), "$ctx->{MAJOR_VERSION}.$ctx->{MINOR_VERSION}.$ctx->{RELEASE_VERSION}");
+ smb_build::env::PkgConfig($self,
+ $path,
+ $link_name,
+ $ctx->{OUTPUT},
+ join(' ', @{$ctx->{CFLAGS}}),
+ "$ctx->{MAJOR_VERSION}.$ctx->{MINOR_VERSION}.$ctx->{RELEASE_VERSION}",
+ $ctx->{DESCRIPTION}
+ );
}
sub ProtoHeader($$)
sub generate_shared_library($)
{
my $lib = shift;
+ my $link_name;
@{$lib->{DEPEND_LIST}} = ();
@{$lib->{LINK_LIST}} = ("\$($lib->{TYPE}_$lib->{NAME}\_OBJS)");
- $lib->{LIBRARY_NAME} = lc($lib->{NAME}).".so";
- $lib->{TARGET} = "bin/lib$lib->{LIBRARY_NAME}";
+
+ $link_name = $lib->{NAME};
+ $link_name =~ s/^LIB//;
+ $link_name = lc($link_name);
+
+ $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}";
$lib->{LIBRARY_REALNAME} = $lib->{LIBRARY_SONAME}.".$lib->{MINOR_VERSION}.$lib->{RELEASE_VERSION}";
- $lib->{TARGET} = "bin/lib$lib->{LIBRARY_REALNAME}";
+ $lib->{TARGET} = "bin/$lib->{LIBRARY_REALNAME}";
@{$lib->{LINK_FLAGS}} = ("\$(SONAMEFLAG)$lib->{LIBRARY_SONAME}");
}
- $lib->{OUTPUT} = "-l".lc($lib->{NAME});
+ $lib->{OUTPUT} = "-l$link_name";
}
sub generate_static_library($)
{
my $lib = shift;
+ my $link_name;
@{$lib->{DEPEND_LIST}} = ();
- $lib->{LIBRARY_NAME} = lc($lib->{NAME}).".a";
+ $link_name = $lib->{NAME};
+ $link_name =~ s/^LIB//;
+
+ $lib->{LIBRARY_NAME} = "lib".lc($link_name).".a";
@{$lib->{LINK_LIST}} = ("\$($lib->{TYPE}_$lib->{NAME}\_OBJS)");
@{$lib->{LINK_FLAGS}} = ();
- $lib->{TARGET} = "bin/lib$lib->{LIBRARY_NAME}";
- $lib->{OUTPUT} = "-l".lc($lib->{NAME});
+ $lib->{TARGET} = "bin/$lib->{LIBRARY_NAME}";
+ $lib->{OUTPUT} = "-l".lc($link_name);
}
sub generate_binary($)
push(@{$part->{LINK_LIST}}, $elem->{OUTPUT}) if defined($elem->{OUTPUT});
push(@{$part->{LINK_FLAGS}}, @{$elem->{LIBS}}) if defined($elem->{LIBS});
push(@{$part->{LINK_FLAGS}},@{$elem->{LDFLAGS}}) if defined($elem->{LDFLAGS});
- push(@{$part->{DEPEND_LIST}}, $elem->{TARGET}) if defined($elem->{TARGET});
-
+ if (defined($elem->{OUTPUT_TYPE}) and ($elem->{OUTPUT_TYPE} eq "SHARED_LIBRARY")) {
+ push(@{$part->{DEPEND_LIST}}, "bin/$elem->{LIBRARY_NAME}");
+ } else {
+ push(@{$part->{DEPEND_LIST}}, $elem->{TARGET}) if defined($elem->{TARGET});
+ }
push(@{$part->{SUBSYSTEM_INIT_FUNCTIONS}}, $elem->{INIT_FUNCTION}) if
$part->{OUTPUT_TYPE} eq "BINARY" and
defined($elem->{INIT_FUNCTION}) and
#define __GTK_SMB_H__
-#ifdef HAVE_GTK
-
#define GTK_DISABLE_DEPRECATED
#include <gtk/gtk.h>
#define GTK_RPC_BINDING_DIALOG_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, gtk_rpc_binding_dialog_class_get_type (), GtkRpcBindingDialogClass)
#define IS_GTK_RPC_BINDING_DIALOG(obj) GTK_CHECK_TYPE (obj, gtk_rpc_binding_dialog_get_type ())
-#endif
-
/* subsystem prototypes */
GtkWidget *create_gtk_samba_about_dialog (const char *appname);
void gtk_show_ntstatus(GtkWidget *win, const char *, NTSTATUS status);
##############################
# Start SUBSYSTEM GTKSMB
-[SUBSYSTEM::GTKSMB]
+[LIBRARY::GTKSMB]
+MAJOR_VERSION = 0
+MINOR_VERSION = 0
+RELEASE_VERSION = 1
NOPROTO = YES
INIT_OBJ_FILES = common/gtk-smb.o
ADD_OBJ_FILES = common/select.o \
#######################
# Start SUBSYSTEM HEIMDAL
-[SUBSYSTEM::HEIMDAL]
+[LIBRARY::HEIMDAL]
NOPROTO = YES
REQUIRED_SUBSYSTEMS = \
HEIMDAL_GSSAPI HEIMDAL_KRB5 \
# End SUBSYSTEM LIBNETIF
##############################
-[SUBSYSTEM::TDR]
+[LIBRARY::TDR]
+MAJOR_VERSION = 0
+MINOR_VERSION = 0
+RELEASE_VERSION = 1
INIT_OBJ_FILES = tdr/tdr.o
##############################
################################################
# Start SUBSYSTEM LIBSAMBA3
-[SUBSYSTEM::LIBSAMBA3]
-ADD_OBJ_FILES = \
- smbpasswd.o \
- tdbsam.o \
- policy.o \
- idmap.o \
- winsdb.o \
- samba3.o \
- group.o \
- registry.o \
- secrets.o \
- share_info.o
+[LIBRARY::LIBSAMBA3]
+MAJOR_VERSION = 0
+MINOR_VERSION = 0
+RELEASE_VERSION = 1
+ADD_OBJ_FILES = smbpasswd.o tdbsam.o policy.o \
+ idmap.o winsdb.o samba3.o group.o \
+ registry.o secrets.o share_info.o
# End SUBSYSTEM LIBSAMBA3
################################################
##############################
# Start SUBSYSTEM SOCKET_WRAPPER
-[SUBSYSTEM::SOCKET_WRAPPER]
+[LIBRARY::SOCKET_WRAPPER]
+MAJOR_VERSION = 0
+MINOR_VERSION = 0
+RELEASE_VERSION = 1
NOPROTO = YES
+PUBLIC_HEADERS = socket_wrapper.h
INIT_OBJ_FILES = socket_wrapper.o
# End SUBSYSTEM SOCKET_WRAPPER
##############################
NOPROTO = YES
MANPAGE = talloc.3
PUBLIC_HEADERS = talloc.h
+DESCRIPTION = A hierarchical pool based memory system with destructors
#
# End LIBRARY LIBTALLOC
################################################
smb_composite/fsinfo.o
REQUIRED_SUBSYSTEMS = LIBCLI_COMPOSITE
-[SUBSYSTEM::LIBCLI_NBT]
+[LIBRARY::LIBCLI_NBT]
+MAJOR_VERSION = 0
+MINOR_VERSION = 0
+RELEASE_VERSION = 1
ADD_OBJ_FILES = \
nbt/nbtname.o \
nbt/nbtsocket.o \
NOPROTO=YES
REQUIRED_SUBSYSTEMS = LIBCLI_NBT
-[SUBSYSTEM::LIBCLI_CLDAP]
+[LIBRARY::LIBCLI_CLDAP]
+MAJOR_VERSION = 0
+MINOR_VERSION = 0
+RELEASE_VERSION = 1
ADD_OBJ_FILES = \
cldap/cldap.o
NOPROTO=YES
REQUIRED_SUBSYSTEMS = LIBCLI_LDAP
-[SUBSYSTEM::LIBCLI_WREPL]
+[LIBRARY::LIBCLI_WREPL]
+MAJOR_VERSION = 0
+MINOR_VERSION = 0
+RELEASE_VERSION = 1
ADD_OBJ_FILES = \
wrepl/winsrepl.o
REQUIRED_SUBSYSTEMS = NDR_WINSREPL SOCKET LIBEVENTS
resolve/host.o
REQUIRED_SUBSYSTEMS = LIBCLI_NBT
-[SUBSYSTEM::LIBCLI]
+[LIBRARY::LIBCLI]
+MAJOR_VERSION = 0
+MINOR_VERSION = 0
+RELEASE_VERSION = 1
REQUIRED_SUBSYSTEMS = LIBCLI_RAW LIBCLI_UTILS LIBCLI_AUTH \
LIBCLI_SMB_COMPOSITE LIBCLI_NBT LIB_SECURITY LIBCLI_RESOLVE \
LIBCLI_DGRAM
#################################
# Start SUBSYSTEM LIBNET
-[SUBSYSTEM::LIBNET]
+[LIBRARY::LIBNET]
+MAJOR_VERSION = 0
+MINOR_VERSION = 0
+RELEASE_VERSION = 1
INIT_OBJ_FILES = \
libnet.o
ADD_OBJ_FILES = \
################################################
# Start SUBSYSTEM LIBNDR
[LIBRARY::LIBNDR]
+MAJOR_VERSION = 0
+MINOR_VERSION = 0
+RELEASE_VERSION = 1
PUBLIC_HEADERS = ndr/libndr.h
INIT_OBJ_FILES = \
ndr/ndr.o
################################################
# Start SUBSYSTEM LIBRPC
[LIBRARY::LIBRPC]
+MAJOR_VERSION = 0
+MINOR_VERSION = 0
+RELEASE_VERSION = 1
PUBLIC_HEADERS = rpc/dcerpc.h
REQUIRED_SUBSYSTEMS = LIBNDR RPC_RAW LIBSMB NDR_MISC NDR_DCERPC NDR_SCHANNEL NDR_LSA NDR_NETLOGON NDR_SAMR NDR_UNIXINFO RPC_NDR_NETLOGON RPC_NDR_EPMAPPER
# End SUBSYSTEM LIBRPC
@-find . -name '*.o' -exec rm -f '{}' \;
@echo Removing binaries
@-rm -f $(BIN_PROGS) $(SBIN_PROGS)
+ @echo Removing libraries
+ @-rm -f bin/*.$(SHLIBEXT).*
@echo Removing dummy targets
@-rm -f bin/.*_*
@echo Removing generated files
#################################
-# Start SUBSYSTEM LIB_WINBIND_CLIENT
-[SUBSYSTEM::LIB_WINBIND_CLIENT]
+# Start SUBSYSTEM LIBWINBIND_CLIENT
+[LIBRARY::LIBWINBIND_CLIENT]
+MAJOR_VERSION = 0
+MINOR_VERSION = 0
+RELEASE_VERSION = 1
ADD_OBJ_FILES = wb_common.o
NOPROTO=YES
-# End SUBSYSTEM LIB_WINBIND_CLIENT
+# End SUBSYSTEM LIBWINBIND_CLIENT
#################################