From 10c183d9ae941f0ef143b2d50aebfcaf550c72b3 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 27 Dec 2005 20:29:19 +0000 Subject: r12520: Add support for --help to mkproto.pl Allow the use of {PRIVATE,PUBLIC}_PROTO_HEADER for [SUBSYSTEM] and [LIBRARY] sections in .mk files. Public functions can be marked by adding _PUBLIC_ between their return type and function name. This should eventually make include/proto.h and include/structs.h obsolete. (This used to be commit cdfd20fa17c5c4655689e8611e0106d5716b6995) --- source4/build/smb_build/config_mk.pm | 8 +++++++- source4/build/smb_build/input.pm | 5 +++++ source4/build/smb_build/main.pl | 2 ++ source4/build/smb_build/makefile.pm | 23 ++++++++++++++++++----- source4/main.mk | 5 ++++- source4/script/mkproto.pl | 35 ++++++++++++++++++++++++++++------- 6 files changed, 64 insertions(+), 14 deletions(-) (limited to 'source4') diff --git a/source4/build/smb_build/config_mk.pm b/source4/build/smb_build/config_mk.pm index ddc928c8e2..4435258c2c 100644 --- a/source4/build/smb_build/config_mk.pm +++ b/source4/build/smb_build/config_mk.pm @@ -29,6 +29,9 @@ my $section_types = { "NOPROTO" => "bool", "MANPAGE" => "string", + + "PUBLIC_PROTO_HEADER" => "string", + "PRIVATE_PROTO_HEADER" => "string" }, "MODULE" => { "SUBSYSTEM" => "string", @@ -71,7 +74,10 @@ my $section_types = { "MANPAGE" => "string", - "PUBLIC_HEADERS" => "list" + "PUBLIC_HEADERS" => "list", + + "PUBLIC_PROTO_HEADER" => "string", + "PRIVATE_PROTO_HEADER" => "string" } }; diff --git a/source4/build/smb_build/input.pm b/source4/build/smb_build/input.pm index bbf7efd8a0..53cd0f218e 100644 --- a/source4/build/smb_build/input.pm +++ b/source4/build/smb_build/input.pm @@ -140,6 +140,11 @@ sub check($$$$$) $part->{NOPROTO} = "NO"; } + if (defined($part->{PRIVATE_PROTO_HEADER}) or + defined($part->{PUBLIC_PROTO_HEADER})) { + $part->{NOPROTO} = "YES"; + } + if (defined($enabled->{$part->{NAME}})) { $part->{ENABLE} = $enabled->{$part->{NAME}}; next; diff --git a/source4/build/smb_build/main.pl b/source4/build/smb_build/main.pl index 22b316a108..80f2e5fe9a 100644 --- a/source4/build/smb_build/main.pl +++ b/source4/build/smb_build/main.pl @@ -74,6 +74,8 @@ foreach my $key (values %$OUTPUT) { $mkenv->Binary($key) if $key->{OUTPUT_TYPE} eq "BINARY"; $mkenv->Manpage($key) if defined($key->{MANPAGE}); $mkenv->Header($key) if defined($key->{PUBLIC_HEADERS}); + $mkenv->ProtoHeader($key) if defined($key->{PRIVATE_PROTO_HEADER}); + } $mkenv->write("Makefile"); diff --git a/source4/build/smb_build/makefile.pm b/source4/build/smb_build/makefile.pm index 598aaaba44..bae6fd5b93 100644 --- a/source4/build/smb_build/makefile.pm +++ b/source4/build/smb_build/makefile.pm @@ -425,8 +425,8 @@ sub Manpage($$) my ($self,$ctx) = @_; my $dir = $ctx->{BASEDIR}; - - $dir =~ s/^\.\///g; + + $ctx->{BASEDIR} =~ s/^\.\///g; push (@{$self->{manpages}}, "$dir/$ctx->{MANPAGE}"); } @@ -463,7 +463,21 @@ sub ProtoHeader($$) { my ($self,$ctx) = @_; - $self->_prepare_list($ctx, "OBJ_LIST"); + my $dir = $ctx->{BASEDIR}; + $ctx->{BASEDIR} =~ s/^\.\///g; + + my $comment = ""; + my $target = "$dir/$ctx->{PRIVATE_PROTO_HEADER}"; + if (defined($ctx->{PUBLIC_PROTO_HEADER})) { + $comment.= " and $dir/$ctx->{PRIVATE_PROTO_HEADER}"; + } else { + $ctx->{PUBLIC_PROTO_HEADER} = $ctx->{PRIVATE_PROTO_HEADER}; + } + + $self->output("$target: \$($ctx->{TYPE}_$ctx->{NAME}_OBJ_LIST:.o=.c)\n"); + $self->output("\t\@echo \"Creating $dir/$ctx->{PRIVATE_PROTO_HEADER}$comment\"\n"); + + $self->output("\t\@\$(PERL) \${srcdir}/script/mkproto.pl --private=$dir/$ctx->{PRIVATE_PROTO_HEADER} --public=$dir/$ctx->{PUBLIC_PROTO_HEADER} \$($ctx->{TYPE}_$ctx->{NAME}_OBJ_LIST)\n\n"); } sub write($$) @@ -479,8 +493,7 @@ sub write($$) $self->output("PUBLIC_HEADERS = " . array2oneperline($self->{headers}) . "\n"); $self->output("PC_FILES = " . array2oneperline($self->{pc_files}) . "\n"); $self->output("ALL_OBJS = " . array2oneperline($self->{all_objs}) . "\n"); - $self->output("PROTO_OBJS = " . array2oneperline($self->{proto_objs}) . "\n"); - + $self->output("PROTO_OBJS = " . array2oneperline($self->{proto_objs}) . "\n"); $self->_prepare_mk_files(); diff --git a/source4/main.mk b/source4/main.mk index b6fba87cc5..2bafa588d6 100644 --- a/source4/main.mk +++ b/source4/main.mk @@ -198,18 +198,21 @@ include/config.h: @/bin/false include/proto.h: $(PROTO_OBJS:.o=.c) - @-rm -f include/includes.h.gch @echo "Creating include/proto.h" @$(PERL) script/mkproto.pl --public-define=_PROTO_H_ \ --public=include/proto.h --private=include/proto.h \ $(PROTO_OBJS) proto: include/proto.h + pch: include/config.h \ include/proto.h \ idl \ include/includes.h.gch +clean_pch: + -rm -f include/includes.h.gch + basics: include/config.h \ include/proto.h \ idl \ diff --git a/source4/script/mkproto.pl b/source4/script/mkproto.pl index 7d80c63f99..479d53da32 100755 --- a/source4/script/mkproto.pl +++ b/source4/script/mkproto.pl @@ -15,6 +15,19 @@ my $private_define = undef; my $public_fd = \*STDOUT; my $private_fd = \*STDOUT; +sub usage() +{ + print "Usage: mkproto.pl [options] [c files]\n"; + print "OPTIONS:\n"; + print " --public=FILE Write prototypes for public functions to FILE\n"; + print " --private=FILE Write prototypes for private functions to FILE\n"; + print " --define=DEF Use DEF to check whether header was already included\n"; + print " --public-define=DEF Same as --define, but just for public header\n"; + print " --private-define=DEF Same as --define, but just for private header\n"; + print " --help Print this help message\n\n"; + exit 0; +} + GetOptions( 'public=s' => sub { my ($f,$v) = @_; $public_file = $v; }, 'private=s' => sub { my ($f,$v) = @_; $private_file = $v; }, @@ -24,18 +37,19 @@ GetOptions( $private_define = "$v\_PRIVATE"; }, 'public-define=s' => \$public_define, - 'private-define=s' => \$private_define -); + 'private-define=s' => \$private_define, + 'help' => \&usage +) or exit(1); if (not defined($public_define) and defined($public_file)) { - $public_define = $public_file; + $public_define = ".." . uc($public_file) . "__"; $public_define =~ tr{./}{__}; } elsif (not defined($public_define)) { $public_define = '_PROTO_H_'; } if (not defined($private_define) and defined($private_file)) { - $private_define = $private_file; + $private_define = "__" . uc($private_file) . "__"; $private_define =~ tr{./}{__}; } elsif (not defined($public_define)) { $public_define = '_PROTO_H_'; @@ -48,7 +62,7 @@ if (defined($public_file)) { if ($private_file eq $public_file) { $private_fd = $public_fd; -} elsif (not defined($private_file)) { +} elsif (defined($private_file)) { open PRIVATE, ">$private_file"; $private_fd = \*PRIVATE; } @@ -58,7 +72,7 @@ sub print_header($$) my ($file, $header_name) = @_; print $file "#ifndef $header_name\n"; print $file "#define $header_name\n\n"; - print $file "/* This file is automatically generated with \"make proto\". DO NOT EDIT */\n\n"; + print $file "/* This file was automatically generated by mkproto.pl. DO NOT EDIT */\n\n"; } sub print_footer($$) @@ -153,10 +167,17 @@ sub process_file($$$) close(FH); } +print_header($public_fd, $public_define); if ($public_file ne $private_file) { print_header($private_fd, $private_define); + + print $private_fd "/* this file contains prototypes for functions that " . + "are private \n * to this subsystem or library. These functions " . + "should not be \n * used outside this particular subsystem! */\n\n"; + + print $public_fd "/* this file contains prototypes for functions that " . + "are part of \n * the public API of this subsystem or library. */\n\n"; } -print_header($public_fd, $public_define); process_file($public_fd, $private_fd, $_) foreach (@ARGV); print_footer($public_fd, $public_define); if ($public_file ne $private_file) { -- cgit