From ecf0dd6bafaa95692c3ece94b6f71446cd54ebdc Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Thu, 16 Mar 2006 20:02:31 +0000 Subject: [PATCH] r14488: Install more headers. Generate different #include lines in pidl depending on whether we're building inside or outside of the Samba tree (useful for 3rd-party projects). (This used to be commit 0c188833154c1fe565cb1735909e408a4a1a6049) --- source4/build/smb_build/TODO | 6 +-- source4/headermap.txt | 4 ++ source4/lib/charset/charset.h | 5 +++ source4/lib/charset/config.mk | 3 +- source4/librpc/config.mk | 4 +- source4/librpc/ndr/libndr.h | 2 + source4/librpc/rpc/dcerpc.h | 1 + source4/pidl/lib/Parse/Pidl/Samba4.pm | 32 +++++++++++++++ .../pidl/lib/Parse/Pidl/Samba4/COM/Header.pm | 17 ++++---- .../pidl/lib/Parse/Pidl/Samba4/COM/Proxy.pm | 18 +++++---- source4/pidl/lib/Parse/Pidl/Samba4/Header.pm | 5 +++ .../pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm | 31 +++++++++++--- source4/pidl/pidl | 40 ++++++------------- 13 files changed, 114 insertions(+), 54 deletions(-) create mode 100644 source4/pidl/lib/Parse/Pidl/Samba4.pm diff --git a/source4/build/smb_build/TODO b/source4/build/smb_build/TODO index b37515aeb4..dae3fc6cfa 100644 --- a/source4/build/smb_build/TODO +++ b/source4/build/smb_build/TODO @@ -1,12 +1,10 @@ -- saner names for some of the .pc files +- saner names for some of the .pc files (reduce the amount of .pc files?) - plugin loading support in ldb - proper #include dependencies: for each subsystem: - include line in Makefile - rule in Makefile -- improve include paths and how they are handled -- install autogenerated headers (seperate directory) -- subdir handler for install headers into a specific directory +- generate headermap.txt set of test scripts that check the code: - configure_check_unused.pl diff --git a/source4/headermap.txt b/source4/headermap.txt index ddf37c5d8c..c761272abe 100644 --- a/source4/headermap.txt +++ b/source4/headermap.txt @@ -40,6 +40,8 @@ lib/samba3/samba3.h: samba3.h include/core.h: core.h librpc/gen_ndr/dcerpc.h: gen_ndr/dcerpc.h librpc/gen_ndr/netlogon.h: gen_ndr/netlogon.h +librpc/gen_ndr/ndr_misc.h: gen_ndr/ndr_misc.h +librpc/gen_ndr/ndr_dcerpc.h: gen_ndr/ndr_dcerpc.h librpc/gen_ndr/misc.h: gen_ndr/misc.h librpc/gen_ndr/lsa.h: gen_ndr/lsa.h librpc/gen_ndr/samr.h: gen_ndr/samr.h @@ -56,3 +58,5 @@ auth/auth_proto.h: auth/proto.h auth/gensec/spnego.h: gensec/spnego.h auth/gensec/gensec_proto.h: gensec/proto.h libcli/auth/credentials.h: domain_credentials.h +lib/charset/charset.h: charset.h +lib/charset/charset_proto.h: charset/proto.h diff --git a/source4/lib/charset/charset.h b/source4/lib/charset/charset.h index 5ad2f431bf..df67aebb55 100644 --- a/source4/lib/charset/charset.h +++ b/source4/lib/charset/charset.h @@ -19,6 +19,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#ifndef __CHARSET_H__ +#define __CHARSET_H__ + /* this defines the charset types used in samba */ typedef enum {CH_UTF16=0, CH_UNIX=1, CH_DISPLAY=2, CH_DOS=3, CH_UTF8=4, CH_UTF16BE=5} charset_t; @@ -67,3 +70,5 @@ typedef struct { #define STR_LEN_NOTERM 256 /* the length field is the unterminated length */ #include "lib/charset/charset_proto.h" + +#endif /* __CHARSET_H__ */ diff --git a/source4/lib/charset/config.mk b/source4/lib/charset/config.mk index a69bee1ec3..5f423b3ba6 100644 --- a/source4/lib/charset/config.mk +++ b/source4/lib/charset/config.mk @@ -4,7 +4,8 @@ OBJ_FILES = \ iconv.o \ charcnv.o -PRIVATE_PROTO_HEADER = charset_proto.h +PUBLIC_HEADERS = charset.h +PUBLIC_PROTO_HEADER = charset_proto.h REQUIRED_SUBSYSTEMS = EXT_LIB_ICONV # End SUBSYSTEM CHARSET ################################################ diff --git a/source4/librpc/config.mk b/source4/librpc/config.mk index 6680bd484a..83ac97821b 100644 --- a/source4/librpc/config.mk +++ b/source4/librpc/config.mk @@ -102,7 +102,7 @@ VERSION = 0.0.1 SO_VERSION = 0.0.1 DESCRIPTION = OBJ_FILES = gen_ndr/ndr_misc.o -PUBLIC_HEADERS = gen_ndr/misc.h +PUBLIC_HEADERS = gen_ndr/misc.h gen_ndr/ndr_misc.h REQUIRED_SUBSYSTEMS = LIBNDR [LIBRARY::NDR_ROT] @@ -705,7 +705,7 @@ REQUIRED_SUBSYSTEMS = dcerpc NDR_KEYSVC [SUBSYSTEM::NDR_DCERPC] OBJ_FILES = gen_ndr/ndr_dcerpc.o REQUIRED_SUBSYSTEMS = LIBNDR NDR_MISC -PUBLIC_HEADERS = gen_ndr/dcerpc.h +PUBLIC_HEADERS = gen_ndr/dcerpc.h gen_ndr/ndr_dcerpc.h ################################################ # Start SUBSYSTEM dcerpc diff --git a/source4/librpc/ndr/libndr.h b/source4/librpc/ndr/libndr.h index d3ff7c5e42..4b6d128ec4 100644 --- a/source4/librpc/ndr/libndr.h +++ b/source4/librpc/ndr/libndr.h @@ -23,6 +23,8 @@ #include "core.h" #include "lib/talloc/talloc.h" +#include "lib/util/util.h" /* for discard_const */ +#include "lib/charset/charset.h" /* this provides definitions for the libcli/rpc/ MSRPC library diff --git a/source4/librpc/rpc/dcerpc.h b/source4/librpc/rpc/dcerpc.h index 517df4bf7e..24f8df7d8b 100644 --- a/source4/librpc/rpc/dcerpc.h +++ b/source4/librpc/rpc/dcerpc.h @@ -24,6 +24,7 @@ #ifndef __DCERPC_H__ #define __DCERPC_H__ +#include "core.h" #include "librpc/gen_ndr/dcerpc.h" enum dcerpc_transport_t { diff --git a/source4/pidl/lib/Parse/Pidl/Samba4.pm b/source4/pidl/lib/Parse/Pidl/Samba4.pm new file mode 100644 index 0000000000..0a284aa85b --- /dev/null +++ b/source4/pidl/lib/Parse/Pidl/Samba4.pm @@ -0,0 +1,32 @@ +################################################### +# Common Samba4 functions +# Copyright jelmer@samba.org 2006 +# released under the GNU GPL + +package Parse::Pidl::Samba4; + +require Exporter; +@ISA = qw(Exporter); +@EXPORT = qw(is_intree choose_header); + +use Parse::Pidl::Util qw(has_property); +use strict; + +use vars qw($VERSION); +$VERSION = '0.01'; + +sub is_intree() +{ + return -f "include/smb.h"; +} + +# Return an #include line depending on whether this build is an in-tree +# build or not. +sub choose_header($$) +{ + my ($in,$out) = @_; + return "#include \"$in\"" if (is_intree()); + return "#include <$out>"; +} + +1; diff --git a/source4/pidl/lib/Parse/Pidl/Samba4/COM/Header.pm b/source4/pidl/lib/Parse/Pidl/Samba4/COM/Header.pm index 83df9afe88..85dab37246 100644 --- a/source4/pidl/lib/Parse/Pidl/Samba4/COM/Header.pm +++ b/source4/pidl/lib/Parse/Pidl/Samba4/COM/Header.pm @@ -117,19 +117,22 @@ sub ParseCoClass($) return $res; } -sub Parse($) +sub Parse($$) { - my $idl = shift; + my ($idl,$ndr_header) = @_; my $res = ""; - foreach my $x (@{$idl}) + $res .= "#include \"librpc/gen_ndr/orpc.h\"\n" . + "#include \"$ndr_header\"\n\n"; + + foreach (@{$idl}) { - if ($x->{TYPE} eq "INTERFACE" && has_property($x, "object")) { - $res.=ParseInterface($x); + if ($_->{TYPE} eq "INTERFACE" && has_property($_, "object")) { + $res.=ParseInterface($_); } - if ($x->{TYPE} eq "COCLASS") { - $res.=ParseCoClass($x); + if ($_->{TYPE} eq "COCLASS") { + $res.=ParseCoClass($_); } } diff --git a/source4/pidl/lib/Parse/Pidl/Samba4/COM/Proxy.pm b/source4/pidl/lib/Parse/Pidl/Samba4/COM/Proxy.pm index c0d460fe09..e6366f0f3d 100644 --- a/source4/pidl/lib/Parse/Pidl/Samba4/COM/Proxy.pm +++ b/source4/pidl/lib/Parse/Pidl/Samba4/COM/Proxy.pm @@ -196,17 +196,21 @@ sub RegistrationFunction($$) return $res; } -sub Parse($) +sub Parse($$) { - my $pidl = shift; + my ($pidl,$comh_filename) = @_; my $res = ""; - foreach my $x (@{$pidl}) { - next if ($x->{TYPE} ne "INTERFACE"); - next if has_property($x, "local"); - next unless has_property($x, "object"); + $res .= "#include \"includes.h\"\n" . + "#include \"lib/com/dcom/dcom.h\"\n" . + "#include \"$comh_filename\"\n"; - $res .= ParseInterface($x); + foreach (@{$pidl}) { + next if ($_->{TYPE} ne "INTERFACE"); + next if has_property($_, "local"); + next unless has_property($_, "object"); + + $res .= ParseInterface($_); } return $res; diff --git a/source4/pidl/lib/Parse/Pidl/Samba4/Header.pm b/source4/pidl/lib/Parse/Pidl/Samba4/Header.pm index 46caba731a..54e410f716 100644 --- a/source4/pidl/lib/Parse/Pidl/Samba4/Header.pm +++ b/source4/pidl/lib/Parse/Pidl/Samba4/Header.pm @@ -10,6 +10,7 @@ use strict; use Parse::Pidl::Typelist qw(mapType); use Parse::Pidl::Util qw(has_property is_constant); use Parse::Pidl::NDR qw(GetNextLevel GetPrevLevel); +use Parse::Pidl::Samba4 qw(is_intree); use vars qw($VERSION); $VERSION = '0.01'; @@ -349,6 +350,10 @@ sub Parse($) $res = ""; %headerstructs = (); pidl "/* header auto-generated by pidl */\n\n"; + if (!is_intree()) { + pidl "#include "; + } + foreach (@{$idl}) { ($_->{TYPE} eq "INTERFACE") && HeaderInterface($_); } diff --git a/source4/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm b/source4/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm index 972368195b..f4672e93e9 100644 --- a/source4/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm +++ b/source4/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm @@ -11,6 +11,7 @@ use strict; use Parse::Pidl::Typelist qw(hasType getType mapType); use Parse::Pidl::Util qw(has_property ParseExpr print_uuid); use Parse::Pidl::NDR qw(GetPrevLevel GetNextLevel ContainsDeferred); +use Parse::Pidl::Samba4 qw(is_intree choose_header); use vars qw($VERSION); $VERSION = '0.01'; @@ -2237,16 +2238,16 @@ sub HeaderInterface($) my $count = 0; - pidl_hdr "#include \"librpc/ndr/libndr.h\""; + pidl_hdr choose_header("librpc/ndr/libndr.h", "ndr.h"); if (has_property($interface, "object")) { - pidl "#include \"librpc/gen_ndr/ndr_orpc.h\""; + pidl choose_header("librpc/gen_ndr/ndr_orpc.h", "ndr/orpc.h"); } if (defined $interface->{PROPERTIES}->{depends}) { my @d = split / /, $interface->{PROPERTIES}->{depends}; foreach my $i (@d) { - pidl "#include \"librpc/gen_ndr/ndr_$i\.h\""; + pidl choose_header("librpc/gen_ndr/ndr_$i\.h", "gen_ndr/ndr_$i.h"); } } @@ -2311,7 +2312,7 @@ sub ParseInterface($$) pidl_hdr ""; if ($needed->{"compression"}) { - pidl "#include \"librpc/ndr/ndr_compression.h\""; + pidl choose_header("librpc/ndr/ndr_compression.h", "ndr/compression.h"); } HeaderInterface($interface); @@ -2347,9 +2348,9 @@ sub ParseInterface($$) ##################################################################### # parse a parsed IDL structure back into an IDL file -sub Parse($$) +sub Parse($$$) { - my($ndr,$basename) = @_; + my($ndr,$gen_header,$ndr_header) = @_; $tabs = ""; $res = ""; @@ -2357,9 +2358,27 @@ sub Parse($$) $res_hdr = ""; pidl_hdr "/* header auto-generated by pidl */"; pidl_hdr ""; + pidl_hdr "#include \"$gen_header\""; + pidl_hdr ""; pidl "/* parser auto-generated by pidl */"; pidl ""; + if (is_intree()) { + pidl "#include \"includes.h\""; + } else { + pidl "#define _GNU_SOURCE"; + pidl "#include "; + pidl "#include "; + pidl "#include "; + pidl "#include "; + pidl "#include "; + } + pidl choose_header("libcli/util/nterr.h", "core/nterr.h"); + pidl choose_header("librpc/gen_ndr/ndr_misc.h", "gen_ndr/ndr_misc.h"); + pidl choose_header("librpc/gen_ndr/ndr_dcerpc.h", "gen_ndr/ndr_dcerpc.h"); + pidl "#include \"$ndr_header\""; + pidl choose_header("librpc/rpc/dcerpc.h", "dcerpc.h"); #FIXME: This shouldn't be here! + pidl ""; my %needed = (); diff --git a/source4/pidl/pidl b/source4/pidl/pidl index 1cfc005c2f..d913e84e7d 100755 --- a/source4/pidl/pidl +++ b/source4/pidl/pidl @@ -613,27 +613,22 @@ sub process_file($) unlink($tempfile); } + + my $comh_filename = ($opt_com_header or "$outputdir/com_$basename.h"); if (defined($opt_com_header)) { require Parse::Pidl::Samba4::COM::Header; - my $res = Parse::Pidl::Samba4::COM::Header::Parse($pidl); + my $res = Parse::Pidl::Samba4::COM::Header::Parse($pidl,"$outputdir/ndr_$basename.h"); if ($res) { - my $comh_filename = ($opt_com_header or "$outputdir/com_$basename.h"); - FileSave($comh_filename, - "#include \"librpc/gen_ndr/ndr_orpc.h\"\n" . - "#include \"$outputdir/ndr_$basename.h\"\n" . - $res); + FileSave($comh_filename, $res); } } if (defined($opt_dcom_proxy)) { require Parse::Pidl::Samba4::COM::Proxy; - my $res = Parse::Pidl::Samba4::COM::Proxy::Parse($pidl); + my $res = Parse::Pidl::Samba4::COM::Proxy::Parse($pidl,$comh_filename); if ($res) { my ($client) = ($opt_dcom_proxy or "$outputdir/$basename\_p.c"); - FileSave($client, - "#include \"includes.h\"\n" . - "#include \"$outputdir/com_$basename.h\"\n" . - "#include \"lib/com/dcom/dcom.h\"\n" .$res); + FileSave($client, $res); } } @@ -690,12 +685,12 @@ sub process_file($) require Parse::Pidl::Samba4::NDR::Server; my $dcom = ""; - foreach my $x (@{$pidl}) { - next if ($x->{TYPE} ne "INTERFACE"); + foreach (@{$pidl}) { + next if ($_->{TYPE} ne "INTERFACE"); - if (Parse::Pidl::Util::has_property($x, "object")) { + if (Parse::Pidl::Util::has_property($_, "object")) { require Parse::Pidl::Samba4::COM::Stub; - $dcom .= Parse::Pidl::Samba4::COM::Stub::ParseInterface($x); + $dcom .= Parse::Pidl::Samba4::COM::Stub::ParseInterface($_); } } @@ -717,25 +712,16 @@ $dcom if (defined($opt_ndr_parser)) { my $parser_fname = ($opt_ndr_parser or "$outputdir/ndr_$basename.c"); require Parse::Pidl::Samba4::NDR::Parser; - my $header_fname = $parser_fname; - $header_fname =~ s/\.c$/\.h/; - my ($header,$parser) = Parse::Pidl::Samba4::NDR::Parser::Parse($ndr, $basename); - - my $baseheader = $h_filename; $baseheader =~ s/\/ndr_/\//; - $header = "#include \"$baseheader\"\n$header"; + my ($header,$parser) = Parse::Pidl::Samba4::NDR::Parser::Parse($ndr, $gen_header, $h_filename); - $parser = "#include \"includes.h\"\n" - . "#include \"librpc/gen_ndr/ndr_misc.h\"\n" - . "#include \"librpc/gen_ndr/ndr_dcerpc.h\"\n" - . "#include \"$header_fname\"\n\n$parser"; FileSave($parser_fname, $parser); - FileSave($header_fname, $header); + FileSave($h_filename, $header); if (defined($opt_swig)) { require Parse::Pidl::Samba4::SWIG; my($filename) = ($opt_swig or "$outputdir/$basename.i"); - Parse::Pidl::Samba4::SWIG::RewriteHeader($pidl, $header_fname, $filename); + Parse::Pidl::Samba4::SWIG::RewriteHeader($pidl, $h_filename, $filename); } } -- 2.34.1