The branch master has been updated via cff64af5532d3a1b0e2e9adf88454887efba01b2 (commit) via b0940b33a60cbfab03153287181372d0066410a6 (commit) via df8f116ecd6e25577eb1e47a213df17d64e87b4a (commit) via 829f86bb7b52e58c2db333b8e2eb7ad990724746 (commit) from fbd03b1c5984d1dd42ef99e1a5da70ed587f3380 (commit)
- Log ----------------------------------------------------------------- commit cff64af5532d3a1b0e2e9adf88454887efba01b2 Author: Richard Levitte <levi...@openssl.org> Date: Wed Nov 20 14:58:20 2019 +0100 Configure: make it possible to have generated generators This makes it possible to chain GENERATOR statements, which allows constructs like this: GENERATE[something.html]=something.pod GENERATE[something.pod]=something.pod.in Reviewed-by: Matt Caswell <m...@openssl.org> (Merged from https://github.com/openssl/openssl/pull/6236) commit b0940b33a60cbfab03153287181372d0066410a6 Author: Richard Levitte <levi...@openssl.org> Date: Wed Aug 31 22:57:25 2016 +0200 Adapt *.tmpl to generate docs at build time Reviewed-by: Matt Caswell <m...@openssl.org> (Merged from https://github.com/openssl/openssl/pull/6236) commit df8f116ecd6e25577eb1e47a213df17d64e87b4a Author: Richard Levitte <levi...@openssl.org> Date: Wed Aug 31 22:56:02 2016 +0200 Add doc/build.info to build the documentation This build.info is entirely generated when configuring Reviewed-by: Matt Caswell <m...@openssl.org> (Merged from https://github.com/openssl/openssl/pull/6236) commit 829f86bb7b52e58c2db333b8e2eb7ad990724746 Author: Richard Levitte <levi...@openssl.org> Date: Wed Aug 31 22:54:39 2016 +0200 Add the possibility to generate documentation at build time Reviewed-by: Matt Caswell <m...@openssl.org> (Merged from https://github.com/openssl/openssl/pull/6236) ----------------------------------------------------------------------- Summary of changes: .gitignore | 4 + Configurations/common.tmpl | 35 ++++++- Configurations/descrip.mms.tmpl | 53 ++++++++-- Configurations/unix-Makefile.tmpl | 192 ++++++++++++++++++++++++++++++++--- Configurations/windows-makefile.tmpl | 46 +++++++-- Configure | 52 ++++++++-- INSTALL | 10 +- build.info | 2 +- doc/build.info | 66 ++++++++++++ 9 files changed, 416 insertions(+), 44 deletions(-) create mode 100644 doc/build.info diff --git a/.gitignore b/.gitignore index eb95e48bfe..0d02ecdf8f 100644 --- a/.gitignore +++ b/.gitignore @@ -157,6 +157,10 @@ doc/man1/openssl-x509.pod /test/fips_test_suite.c /test/shatest.c +# Generated docs directories +/doc/html +/doc/man + ##### Generic patterns # Auto generated assembly language source files *.s diff --git a/Configurations/common.tmpl b/Configurations/common.tmpl index a2591da727..5db3471fe2 100644 --- a/Configurations/common.tmpl +++ b/Configurations/common.tmpl @@ -151,10 +151,18 @@ generator_incs => $unified_info{includes}->{$script}, generator_deps => $unified_info{depends}->{$script}, deps => $unified_info{depends}->{$src}, - incs => [ @{$unified_info{includes}->{$obj}}, - @{$unified_info{includes}->{$bin}} ], - defs => [ @{$unified_info{defines}->{$obj}}, - @{$unified_info{defines}->{$bin}} ], + incs => [ defined $obj + ? @{$unified_info{includes}->{$obj}} + : (), + defined $bin + ? @{$unified_info{includes}->{$bin}} + : () ], + defs => [ defined $obj + ? @{$unified_info{defines}->{$obj}} + : (), + defined $bin + ? @{$unified_info{defines}->{$bin}} + : () ], %opts); foreach (@{$unified_info{depends}->{$src}}) { dogenerate($_, $obj, $bin, %opts); @@ -436,6 +444,22 @@ $cache{$dir} = 1; } + # dodocs is responsible for building documentation from .pods. + # It will call generatesrc. + sub dodocs { + my $type = shift; + my $section = shift; + foreach my $doc (@{$unified_info{"${type}docs"}->{$section}}) { + next if $cache{$doc}; + $OUT .= generatesrc(src => $doc, + generator => $unified_info{generate}->{$doc}); + foreach ((@{$unified_info{depends}->{$doc}})) { + dogenerate($_, undef, undef, %opts); + } + $cache{$doc} = 1; + } + } + # Start with populating the cache with all the overrides %cache = map { $_ => 1 } @{$unified_info{overrides}}; @@ -448,6 +472,7 @@ foreach (@{$unified_info{modules}}) { domodule($_); } foreach (@{$unified_info{programs}}) { dobin($_); } foreach (@{$unified_info{scripts}}) { doscript($_); } - + foreach (sort keys %{$unified_info{htmldocs}}) { dodocs('html', $_); } + foreach (sort keys %{$unified_info{mandocs}}) { dodocs('man', $_); } foreach (sort keys %{$unified_info{dirinfo}}) { dodir($_); } -} diff --git a/Configurations/descrip.mms.tmpl b/Configurations/descrip.mms.tmpl index 28e7663a54..cb1fd9c5b5 100644 --- a/Configurations/descrip.mms.tmpl +++ b/Configurations/descrip.mms.tmpl @@ -143,6 +143,10 @@ INSTALL_ENGINES={- join(", ", map { "-\n\t".$_.".EXE" } @install_engines) -} INSTALL_PROGRAMS={- join(", ", map { "-\n\t".$_.".EXE" } @install_programs) -} BIN_SCRIPTS={- join(", ", @install_bin_scripts) -} MISC_SCRIPTS={- join(", ", @install_misc_scripts) -} +HTMLDOCS1={- join(", ", map { "-\n\t".$_ } @{$unified_info{htmldocs}->{man1}}) -} +HTMLDOCS3={- join(", ", map { "-\n\t".$_ } @{$unified_info{htmldocs}->{man3}}) -} +HTMLDOCS5={- join(", ", map { "-\n\t".$_ } @{$unified_info{htmldocs}->{man5}}) -} +HTMLDOCS7={- join(", ", map { "-\n\t".$_ } @{$unified_info{htmldocs}->{man7}}) -} APPS_OPENSSL={- use File::Spec::Functions; catfile("apps","openssl") -} @@ -405,7 +409,7 @@ NODEBUG=@ # The main targets ################################################### -{- dependmagic('all'); -} : build_libs_nodep, build_modules_nodep, build_programs_nodep +{- dependmagic('build_sw'); -} : build_libs_nodep, build_modules_nodep, build_programs_nodep {- dependmagic('build_libs'); -} : build_libs_nodep {- dependmagic('build_modules'); -} : build_modules_nodep {- dependmagic('build_programs'); -} : build_programs_nodep @@ -415,18 +419,23 @@ build_libs_nodep : $(LIBS), $(SHLIBS) build_modules_nodep : $(MODULES) build_programs_nodep : $(PROGRAMS), $(SCRIPTS) +build_docs: build_html_docs +build_html_docs: $(HTMLDOCS1) $(HTMLDOCS3) $(HTMLDOCS5) $(HTMLDOCS7) + # Kept around for backward compatibility build_apps build_tests : build_programs # Convenience target to prebuild all generated files, not just the mandatory # ones -build_all_generated : $(GENERATED_MANDATORY) $(GENERATED) +build_all_generated : $(GENERATED_MANDATORY) $(GENERATED) build_docs @ ! {- output_off() if $disabled{makedepend}; "" -} @ WRITE SYS$OUTPUT "Warning: consider configuring with no-makedepend, because if" @ WRITE SYS$OUTPUT " target system doesn't have $(PERL)," @ WRITE SYS$OUTPUT " then make will fail..." @ ! {- output_on() if $disabled{makedepend}; "" -} +all : build_sw build_docs + test : tests {- dependmagic('tests'); -} : build_programs_nodep, build_modules_nodep @ ! {- output_off() if $disabled{tests}; "" -} @@ -459,7 +468,9 @@ list-tests : @ WRITE SYS$OUTPUT "Tests are not supported with your chosen Configure options" @ ! {- output_on() if !$disabled{tests}; "" -} -install : install_sw install_ssldirs install_docs +install : install_sw install_ssldirs install_docs install_final + +install_final : @ WRITE SYS$OUTPUT "" @ WRITE SYS$OUTPUT "######################################################################" @ WRITE SYS$OUTPUT "" @@ -496,6 +507,10 @@ libclean : {- join("\n\t", map { "- DELETE $_.EXE;*,$_.MAP;*" } @shlibs) || "@ !" -} clean : libclean + {- join("\n\t", map { "- DELETE $_;*" } @{$unified_info{htmldocs}->{man1}}) || "@ !" -} + {- join("\n\t", map { "- DELETE $_;*" } @{$unified_info{htmldocs}->{man3}}) || "@ !" -} + {- join("\n\t", map { "- DELETE $_;*" } @{$unified_info{htmldocs}->{man5}}) || "@ !" -} + {- join("\n\t", map { "- DELETE $_;*" } @{$unified_info{htmldocs}->{man7}}) || "@ !" -} {- join("\n\t", map { "- DELETE $_.EXE;*,$_.OPT;*" } @{$unified_info{programs}}) || "@ !" -} {- join("\n\t", map { "- DELETE $_.EXE;*,$_.OPT;*" } @{$unified_info{modules}}) || "@ !" -} {- join("\n\t", map { "- DELETE $_;*" } @{$unified_info{scripts}}) || "@ !" -} @@ -659,11 +674,21 @@ vmsconfig.pm : configdata.pm WRITE CONFIG "1;" CLOSE CONFIG -install_html_docs : check_INSTALLTOP - sourcedir = F$PARSE("{- $sourcedir -}A.;","[]") - "]A.;" + ".DOC]" - $(PERL) {- sourcefile("util", "process_docs.pl") -} - - --sourcedir='sourcedir' --destdir=ossl_installroot:[HTML] - - --type=html +install_html_docs : check_INSTALLTOP build_html_docs + @ WRITE SYS$OUTPUT "*** Installing HTML docs" + - CREATE/DIR ossl_installroot:[HTML.MAN1] + - CREATE/DIR ossl_installroot:[HTML.MAN3] + - CREATE/DIR ossl_installroot:[HTML.MAN5] + - CREATE/DIR ossl_installroot:[HTML.MAN7] + {- join("\n ", + ( map { "COPY/PROT=W:RE $_ ossl_installroot:[HTML.MAN1]" } + @{$unified_info{htmldocs}->{man1}} ), + ( map { "COPY/PROT=W:RE $_ ossl_installroot:[HTML.MAN3]" } + @{$unified_info{htmldocs}->{man3}} ), + ( map { "COPY/PROT=W:RE $_ ossl_installroot:[HTML.MAN5]" } + @{$unified_info{htmldocs}->{man5}} ), + ( map { "COPY/PROT=W:RE $_ ossl_installroot:[HTML.MAN7]" } + @{$unified_info{htmldocs}->{man7}} )) -} check_INSTALLTOP : @ IF "$(INSTALLTOP)" .EQS. "" THEN - @@ -756,7 +781,17 @@ reconfigure reconf : my $generator_incs = join("", map { ' "-I'.$_.'"' } @{$args{generator_incs}}); my $deps = join(", -\n\t\t", @{$args{generator_deps}}, @{$args{deps}}); - if (platform->isdef($args{src})) { + if ($args{src} =~ /\.html$/) { + my $title = basename($args{src}, ".html"); + return <<"EOF"; +$args{src}: $args{generator}->[0] + pipe pod2html "--podroot=\$(SRCDIR)/doc" --htmldir=.. - + --podpath=man1:man3:man5:man7 "--infile=\$<" - + "--title=$title" - + | \$(PERL) -pe "s|href=""http://man\\.he\\.net/(man\d/[^""]+)(?:\\.html)?""|href=""../\$1.html|g;" - + > \$\@ +EOF + } elsif (platform->isdef($args{src})) { my $target = platform->def($args{src}); my $mkdef = sourcefile('util', 'mkdef.pl'); my $ord_ver = $args{intent} eq 'lib' ? ' --version $(VERSION)' : ''; diff --git a/Configurations/unix-Makefile.tmpl b/Configurations/unix-Makefile.tmpl index 6113ab4a34..c3c83f95cd 100644 --- a/Configurations/unix-Makefile.tmpl +++ b/Configurations/unix-Makefile.tmpl @@ -162,6 +162,38 @@ MISC_SCRIPTS={- && $unified_info{attributes}->{scripts}->{$_}->{misc} } @{$unified_info{scripts}})) -} +HTMLDOCS1={- + join(" \\\n" . ' ' x 10, + fill_lines(" ", $COLUMNS - 10, map { platform->bin($_) } + @{$unified_info{htmldocs}->{man1}})) -} +HTMLDOCS3={- + join(" \\\n" . ' ' x 10, + fill_lines(" ", $COLUMNS - 10, map { platform->bin($_) } + @{$unified_info{htmldocs}->{man3}})) -} +HTMLDOCS5={- + join(" \\\n" . ' ' x 10, + fill_lines(" ", $COLUMNS - 10, map { platform->bin($_) } + @{$unified_info{htmldocs}->{man5}})) -} +HTMLDOCS7={- + join(" \\\n" . ' ' x 10, + fill_lines(" ", $COLUMNS - 10, map { platform->bin($_) } + @{$unified_info{htmldocs}->{man7}})) -} +MANDOCS1={- + join(" \\\n" . ' ' x 9, + fill_lines(" ", $COLUMNS - 9, map { platform->bin($_) } + @{$unified_info{mandocs}->{man1}})) -} +MANDOCS3={- + join(" \\\n" . ' ' x 9, + fill_lines(" ", $COLUMNS - 9, map { platform->bin($_) } + @{$unified_info{mandocs}->{man3}})) -} +MANDOCS5={- + join(" \\\n" . ' ' x 9, + fill_lines(" ", $COLUMNS - 9, map { platform->bin($_) } + @{$unified_info{mandocs}->{man5}})) -} +MANDOCS7={- + join(" \\\n" . ' ' x 9, + fill_lines(" ", $COLUMNS - 9, map { platform->bin($_) } + @{$unified_info{mandocs}->{man7}})) -} APPS_OPENSSL={- use File::Spec::Functions; catfile("apps","openssl") -} @@ -387,11 +419,15 @@ LANG=C # The main targets ################################################### -{- dependmagic('all'); -}: build_libs_nodep build_modules_nodep build_programs_nodep link-utils +{- dependmagic('build_sw'); -}: build_libs_nodep build_modules_nodep build_programs_nodep link-utils {- dependmagic('build_libs'); -}: build_libs_nodep {- dependmagic('build_modules'); -}: build_modules_nodep {- dependmagic('build_programs'); -}: build_programs_nodep +build_docs: build_man_docs build_html_docs +build_man_docs: $(MANDOCS1) $(MANDOCS3) $(MANDOCS5) $(MANDOCS7) +build_html_docs: $(HTMLDOCS1) $(HTMLDOCS3) $(HTMLDOCS5) $(HTMLDOCS7) + build_generated: $(GENERATED_MANDATORY) build_libs_nodep: libcrypto.pc libssl.pc openssl.pc build_modules_nodep: $(MODULES) @@ -402,13 +438,15 @@ build_apps build_tests: build_programs # Convenience target to prebuild all generated files, not just the mandatory # ones -build_all_generated: $(GENERATED_MANDATORY) $(GENERATED) +build_all_generated: $(GENERATED_MANDATORY) $(GENERATED) build_docs @ : {- output_off() if $disabled{makedepend}; "" -} @echo "Warning: consider configuring with no-makedepend, because if" @echo " target system doesn't have $(PERL)," @echo " then make will fail..." @ : {- output_on() if $disabled{makedepend}; "" -} +all: build_sw build_docs + test: tests {- dependmagic('tests'); -}: build_programs_nodep build_modules_nodep link-utils @ : {- output_off() if $disabled{tests}; "" -} @@ -458,6 +496,8 @@ libclean: $(RM) *{- platform->defext() -} clean: libclean + $(RM) $(HTMLDOCS1) $(HTMLDOCS3) $(HTMLDOCS5) $(HTMLDOCS7) + $(RM) $(MANDOCS1) $(MANDOCS3) $(MANDOCS5) $(MANDOCS7) $(RM) $(PROGRAMS) $(TESTPROGS) $(MODULES) $(SCRIPTS) $(RM) $(GENERATED_MANDATORY) $(GENERATED) -$(RM) `find . -name '*{- platform->depext() -}' \! -name '.*' \! -type d -print` @@ -764,29 +804,131 @@ uninstall_runtime_libs: @ : {- output_on() unless windowsdll(); "" -} -install_man_docs: +install_man_docs: build_man_docs @[ -n "$(INSTALLTOP)" ] || (echo INSTALLTOP should not be empty; exit 1) + @$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(MANDIR)/man1 + @$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(MANDIR)/man3 + @$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(MANDIR)/man5 + @$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(MANDIR)/man7 @$(ECHO) "*** Installing manpages" - $(PERL) $(SRCDIR)/util/process_docs.pl \ - --destdir=$(DESTDIR)$(MANDIR) --type=man --suffix=$(MANSUFFIX) + @set -e; for x in dummy $(MANDOCS1); do \ + if [ "$$x" = "dummy" ]; then continue; fi; \ + fn=`basename $$x`; \ + $(ECHO) "install $$x -> $(DESTDIR)$(MANDIR)/man1/$$fn"; \ + cp $$x $(DESTDIR)$(MANDIR)/man1/$$fn$(MANSUFFIX); \ + chmod 755 $(DESTDIR)$(MANDIR)/man1/$$fn$(MANSUFFIX); \ + done + @set -e; for x in dummy $(MANDOCS3); do \ + if [ "$$x" = "dummy" ]; then continue; fi; \ + fn=`basename $$x`; \ + $(ECHO) "install $$x -> $(DESTDIR)$(MANDIR)/man3/$$fn"; \ + cp $$x $(DESTDIR)$(MANDIR)/man3/$$fn$(MANSUFFIX); \ + chmod 755 $(DESTDIR)$(MANDIR)/man3/$$fn$(MANSUFFIX); \ + done + @set -e; for x in dummy $(MANDOCS5); do \ + if [ "$$x" = "dummy" ]; then continue; fi; \ + fn=`basename $$x`; \ + $(ECHO) "install $$x -> $(DESTDIR)$(MANDIR)/man5/$$fn"; \ + cp $$x $(DESTDIR)$(MANDIR)/man5/$$fn$(MANSUFFIX); \ + chmod 755 $(DESTDIR)$(MANDIR)/man5/$$fn$(MANSUFFIX); \ + done + @set -e; for x in dummy $(MANDOCS7); do \ + if [ "$$x" = "dummy" ]; then continue; fi; \ + fn=`basename $$x`; \ + $(ECHO) "install $$x -> $(DESTDIR)$(MANDIR)/man7/$$fn"; \ + cp $$x $(DESTDIR)$(MANDIR)/man7/$$fn$(MANSUFFIX); \ + chmod 755 $(DESTDIR)$(MANDIR)/man7/$$fn$(MANSUFFIX); \ + done uninstall_man_docs: @$(ECHO) "*** Uninstalling manpages" - $(PERL) $(SRCDIR)/util/process_docs.pl \ - --destdir=$(DESTDIR)$(MANDIR) --type=man --suffix=$(MANSUFFIX) \ - --remove + @set -e; for x in dummy $(MANDOCS1); do \ + if [ "$$x" = "dummy" ]; then continue; fi; \ + fn=`basename $$x`; \ + $(ECHO) "$(RM) $(DESTDIR)$(MANDIR)/man1/$$fn"; \ + $(RM) $(DESTDIR)$(MANDIR)/man1/$$fn$(MANSUFFIX); \ + done + @set -e; for x in dummy $(MANDOCS3); do \ + if [ "$$x" = "dummy" ]; then continue; fi; \ + fn=`basename $$x`; \ + $(ECHO) "$(RM) $(DESTDIR)$(MANDIR)/man3/$$fn"; \ + $(RM) $(DESTDIR)$(MANDIR)/man3/$$fn$(MANSUFFIX); \ + done + @set -e; for x in dummy $(MANDOCS5); do \ + if [ "$$x" = "dummy" ]; then continue; fi; \ + fn=`basename $$x`; \ + $(ECHO) "$(RM) $(DESTDIR)$(MANDIR)/man5/$$fn"; \ + $(RM) $(DESTDIR)$(MANDIR)/man5/$$fn$(MANSUFFIX); \ + done + @set -e; for x in dummy $(MANDOCS7); do \ + if [ "$$x" = "dummy" ]; then continue; fi; \ + fn=`basename $$x`; \ + $(ECHO) "$(RM) $(DESTDIR)$(MANDIR)/man7/$$fn"; \ + $(RM) $(DESTDIR)$(MANDIR)/man7/$$fn$(MANSUFFIX); \ + done -install_html_docs: +install_html_docs: build_html_docs @[ -n "$(INSTALLTOP)" ] || (echo INSTALLTOP should not be empty; exit 1) + @$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(HTMLDIR)/man1 + @$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(HTMLDIR)/man3 + @$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(HTMLDIR)/man5 + @$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(HTMLDIR)/man7 @$(ECHO) "*** Installing HTML manpages" - $(PERL) $(SRCDIR)/util/process_docs.pl \ - --destdir=$(DESTDIR)$(HTMLDIR) --type=html + @set -e; for x in dummy $(HTMLDOCS1); do \ + if [ "$$x" = "dummy" ]; then continue; fi; \ + fn=`basename $$x`; \ + $(ECHO) "install $$x -> $(DESTDIR)$(HTMLDIR)/man1/$$fn"; \ + cp $$x $(DESTDIR)$(HTMLDIR)/man1/$$fn; \ + chmod 755 $(DESTDIR)$(HTMLDIR)/man1/$$fn; \ + done + @set -e; for x in dummy $(HTMLDOCS3); do \ + if [ "$$x" = "dummy" ]; then continue; fi; \ + fn=`basename $$x`; \ + $(ECHO) "install $$x -> $(DESTDIR)$(HTMLDIR)/man3/$$fn"; \ + cp $$x $(DESTDIR)$(HTMLDIR)/man3/$$fn; \ + chmod 755 $(DESTDIR)$(HTMLDIR)/man3/$$fn; \ + done + @set -e; for x in dummy $(HTMLDOCS5); do \ + if [ "$$x" = "dummy" ]; then continue; fi; \ + fn=`basename $$x`; \ + $(ECHO) "install $$x -> $(DESTDIR)$(HTMLDIR)/man5/$$fn"; \ + cp $$x $(DESTDIR)$(HTMLDIR)/man5/$$fn; \ + chmod 755 $(DESTDIR)$(HTMLDIR)/man5/$$fn; \ + done + @set -e; for x in dummy $(HTMLDOCS7); do \ + if [ "$$x" = "dummy" ]; then continue; fi; \ + fn=`basename $$x`; \ + $(ECHO) "install $$x -> $(DESTDIR)$(HTMLDIR)/man7/$$fn"; \ + cp $$x $(DESTDIR)$(HTMLDIR)/man7/$$fn; \ + chmod 755 $(DESTDIR)$(HTMLDIR)/man7/$$fn; \ + done uninstall_html_docs: - @$(ECHO) "*** Uninstalling manpages" - $(PERL) $(SRCDIR)/util/process_docs.pl \ - --destdir=$(DESTDIR)$(HTMLDIR) --type=html --remove - + @$(ECHO) "*** Uninstalling HTML manpages" + @set -e; for x in dummy $(HTMLDOCS1); do \ + if [ "$$x" = "dummy" ]; then continue; fi; \ + fn=`basename $$x`; \ + $(ECHO) "$(RM) $(DESTDIR)$(HTMLDIR)/man1/$$fn"; \ + $(RM) $(DESTDIR)$(HTMLDIR)/man1/$$fn; \ + done + @set -e; for x in dummy $(HTMLDOCS3); do \ + if [ "$$x" = "dummy" ]; then continue; fi; \ + fn=`basename $$x`; \ + $(ECHO) "$(RM) $(DESTDIR)$(HTMLDIR)/man3/$$fn"; \ + $(RM) $(DESTDIR)$(HTMLDIR)/man3/$$fn; \ + done + @set -e; for x in dummy $(HTMLDOCS5); do \ + if [ "$$x" = "dummy" ]; then continue; fi; \ + fn=`basename $$x`; \ + $(ECHO) "$(RM) $(DESTDIR)$(HTMLDIR)/man5/$$fn"; \ + $(RM) $(DESTDIR)$(HTMLDIR)/man5/$$fn; \ + done + @set -e; for x in dummy $(HTMLDOCS7); do \ + if [ "$$x" = "dummy" ]; then continue; fi; \ + fn=`basename $$x`; \ + $(ECHO) "$(RM) $(DESTDIR)$(HTMLDIR)/man7/$$fn"; \ + $(RM) $(DESTDIR)$(HTMLDIR)/man7/$$fn; \ + done # Developer targets (note: these are only available on Unix) ######### @@ -1027,7 +1169,25 @@ reconfigure reconf: my $defs = join("", map { " -D".$_ } @{$args{defs}}); my $deps = join(" ", @{$args{generator_deps}}, @{$args{deps}}); - if (platform->isdef($args{src})) { + if ($args{src} =~ /\.html$/) { + my $title = basename($args{src}, ".html"); + return <<"EOF"; +$args{src}: $args{generator}->[0] + pod2html "--podroot=\$(SRCDIR)/doc" --htmldir=.. \\ + --podpath=man1:man3:man5:man7 "--infile=\$<" "--title=$title" \\ + | \$(PERL) -pe 's|href="http://man\\.he\\.net/(man\\d/[^"]+)(?:\\.html)?"|href="../\$1.html|g;' \\ + > \$\@ +EOF + } elsif ($args{src} =~ /\.(\d)$/) { + my $section = $1; + my $name = uc basename($args{src}, ".$section"); + return <<"EOF"; +$args{src}: $args{generator}->[0] + pod2man --name=$name --section=$section --center=OpenSSL \\ + --release=\$(VERSION) \$< \\ + > \$\@ +EOF + } elsif (platform->isdef($args{src})) { my $target = platform->def($args{src}); (my $mkdef_os = $target{shared_target}) =~ s|-shared$||; my $ord_ver = $args{intent} eq 'lib' ? ' --version $(VERSION)' : ''; diff --git a/Configurations/windows-makefile.tmpl b/Configurations/windows-makefile.tmpl index d0bce73664..7bc09df78d 100644 --- a/Configurations/windows-makefile.tmpl +++ b/Configurations/windows-makefile.tmpl @@ -111,6 +111,10 @@ MISC_SCRIPTS={- && $unified_info{attributes}->{scripts}->{$_}->{misc} } @{$unified_info{scripts}}) -} +HTMLDOCS1={- join(" ", @{$unified_info{htmldocs}->{man1}}) -} +HTMLDOCS3={- join(" ", @{$unified_info{htmldocs}->{man3}}) -} +HTMLDOCS5={- join(" ", @{$unified_info{htmldocs}->{man5}}) -} +HTMLDOCS7={- join(" ", @{$unified_info{htmldocs}->{man7}}) -} APPS_OPENSSL={- use File::Spec::Functions; "\"".catfile("apps","openssl")."\"" -} @@ -338,11 +342,14 @@ PROCESSOR= {- $config{processor} -} # The main targets ################################################### -{- dependmagic('all'); -}: build_libs_nodep build_modules_nodep build_programs_nodep +{- dependmagic('build_sw'); -}: build_libs_nodep build_modules_nodep build_programs_nodep {- dependmagic('build_libs'); -}: build_libs_nodep {- dependmagic('build_modules'); -}: build_modules_nodep {- dependmagic('build_programs'); -}: build_programs_nodep +build_docs: build_html_docs +build_html_docs: $(HTMLDOCS1) $(HTMLDOCS3) $(HTMLDOCS5) $(HTMLDOCS7) + build_generated: $(GENERATED_MANDATORY) build_libs_nodep: $(LIBS) {- join(" ",map { platform->sharedlib_import($_) // () } @{$unified_info{libraries}}) -} build_modules_nodep: $(MODULES) @@ -353,13 +360,15 @@ build_apps build_tests: build_programs # Convenience target to prebuild all generated files, not just the mandatory # ones -build_all_generated: $(GENERATED_MANDATORY) $(GENERATED) +build_all_generated: $(GENERATED_MANDATORY) $(GENERATED) build_docs @{- output_off() if $disabled{makedepend}; "" -} @$(ECHO) "Warning: consider configuring with no-makedepend, because if" @$(ECHO) " target system doesn't have $(PERL)," @$(ECHO) " then make will fail..." @{- output_on() if $disabled{makedepend}; "" -} +all: build_sw build_docs + test: tests {- dependmagic('tests'); -}: build_programs_nodep build_modules_nodep @{- output_off() if $disabled{tests}; "" -} @@ -393,6 +402,10 @@ libclean: -del /Q /F $(LIBS) libcrypto.* libssl.* ossl_static.pdb clean: libclean + -rmdir /Q /S $(HTMLDOCS1) + -rmdir /Q /S $(HTMLDOCS3) + -rmdir /Q /S $(HTMLDOCS5) + -rmdir /Q /S $(HTMLDOCS7) {- join("\n\t", map { "-del /Q /F $_" } @PROGRAMS) -} -del /Q /F $(MODULES) -del /Q /F $(SCRIPTS) @@ -496,9 +509,21 @@ install_programs: install_runtime_libs build_programs uninstall_runtime: -install_html_docs: - "$(PERL)" "$(SRCDIR)\util\process_docs.pl" \ - "--destdir=$(INSTALLTOP)\html" --type=html +install_html_docs: build_html_docs + @if "$(INSTALLTOP)"=="" ( echo INSTALLTOP should not be empty & exit 1 ) + @echo *** Installing HTML docs + @"$(PERL)" "$(SRCDIR)\util\mkdir-p.pl" "$(INSTALLTOP)\html\man1" + @"$(PERL)" "$(SRCDIR)\util\mkdir-p.pl" "$(INSTALLTOP)\html\man3" + @"$(PERL)" "$(SRCDIR)\util\mkdir-p.pl" "$(INSTALLTOP)\html\man5" + @"$(PERL)" "$(SRCDIR)\util\mkdir-p.pl" "$(INSTALLTOP)\html\man7" + @"$(PERL)" "$(SRCDIR)\util\copy.pl" $(BLDDIR)\doc\html\man1\*.html \ + "$(INSTALLTOP)\html\man1" + @"$(PERL)" "$(SRCDIR)\util\copy.pl" $(BLDDIR)\doc\html\man3\*.html \ + "$(INSTALLTOP)\html\man3" + @"$(PERL)" "$(SRCDIR)\util\copy.pl" $(BLDDIR)\doc\html\man5\*.html \ + "$(INSTALLTOP)\html\man5" + @"$(PERL)" "$(SRCDIR)\util\copy.pl" $(BLDDIR)\doc\html\man7\*.html \ + "$(INSTALLTOP)\html\man7" uninstall_html_docs: @@ -540,7 +565,16 @@ reconfigure reconf: my $deps = @{$args{deps}} ? '"'.join('" "', @{$args{generator_deps}}, @{$args{deps}}).'"' : ''; - if (platform->isdef($args{src})) { + if ($args{src} =~ /\.html$/) { + my $title = basename($args{src}, ".html"); + return <<"EOF"; +$args{src}: $args{generator}->[0] + pod2html "--podroot=\$(SRCDIR)/doc" --htmldir=.. \\ + --podpath=man1:man3:man5:man7 "--infile=\$<" "--title=$title" \\ + | \$(PERL) -pe "s|href=\\"http://man\\.he\\.net/(man\d/[^\\"]+)(?:\\.html)?\\"|href=\\"../\$1.html|g;" \\ + > \$\@ +EOF + } elsif (platform->isdef($args{src})) { my $target = platform->def($args{src}); my $mkdef = abs2rel(rel2abs(catfile($config{sourcedir}, "util", "mkdef.pl")), diff --git a/Configure b/Configure index 8087da52e6..bad09ed8a3 100755 --- a/Configure +++ b/Configure @@ -1777,6 +1777,8 @@ if ($builder eq "unified") { my %defines = (); my %depends = (); my %generate = (); + my %htmldocs = (); + my %mandocs = (); # Support for $variablename in build.info files. # Embedded perl code is the ultimate master, still. If its output @@ -1837,6 +1839,10 @@ if ($builder eq "unified") { # don't use it if the build tree is different. my $src_configdata = cleanfile($srcdir, "configdata.pm", $blddir); + + if ($buildinfo_debug) { + print STDERR "DEBUG: Reading ",catfile($sourced, $f),"\n"; + } push @{$config{build_infos}}, catfile(abs2rel($sourced, $blddir), $f); my $template = Text::Template->new(TYPE => 'FILE', @@ -1948,7 +1954,14 @@ if ($builder eq "unified") { @s); } }, - + qr/^\s* HTMLDOCS ${index_re} = ${value_re} $/x + => sub { push @{$htmldocs{$expand_variables->($+{INDEX})}}, + tokenize($expand_variables->($+{VALUE})) + if !@skip || $skip[$#skip] > 0 }, + qr/^\s* MANDOCS ${index_re} = ${value_re} $/x + => sub { push @{$mandocs{$expand_variables->($+{INDEX})}}, + tokenize($expand_variables->($+{VALUE})) + if !@skip || $skip[$#skip] > 0 }, qr/^\s* ORDINALS ${index_re} = ${value_re} $/x => sub { push @{$ordinals{$expand_variables->($+{INDEX})}}, tokenize($expand_variables->($+{VALUE})) @@ -2111,10 +2124,18 @@ EOF my $dest = $_; my $ddest = cleanfile($buildd, $_, $blddir); die "more than one generator for $dest: " - ,join(" ", @{$generate{$_}}),"\n" - if scalar @{$generate{$_}} > 1; + ,join(" ", @{$generate{$_}}),"\n" + if scalar @{$generate{$_}} > 1; my @generator = split /\s+/, $generate{$dest}->[0]; - $generator[0] = cleanfile($sourced, $generator[0], $blddir), + my $gen = $generator[0]; + $generator[0] = cleanfile($sourced, $gen, $blddir); + + # If the generator isn't in the source tree, we assume it's + # generated in the build tree + if ($generate{$gen}) { + $generator[0] = cleanfile($buildd, $gen, $blddir); + } + $unified_info{generate}->{$ddest} = [ @generator ]; } @@ -2206,6 +2227,20 @@ EOF } } } + + foreach my $section (keys %htmldocs) { + foreach (@{$htmldocs{$section}}) { + my $htmldocs = cleanfile($buildd, $_, $blddir); + $unified_info{htmldocs}->{$section}->{$htmldocs} = 1; + } + } + + foreach my $section (keys %mandocs) { + foreach (@{$mandocs{$section}}) { + my $mandocs = cleanfile($buildd, $_, $blddir); + $unified_info{mandocs}->{$section}->{$mandocs} = 1; + } + } } my $ordinals_text = join(', ', sort keys %ordinals); @@ -2366,7 +2401,8 @@ EOF $unified_info{$_} = [ sort keys %{$unified_info{$_}} ]; } # Two level structures - foreach my $l1 (("sources", "shared_sources", "ldadd", "depends")) { + foreach my $l1 (("sources", "shared_sources", "ldadd", "depends", + "htmldocs", "mandocs")) { foreach my $l2 (sort keys %{$unified_info{$l1}}) { my @items = sort @@ -2412,7 +2448,11 @@ EOF my %loopinfo = ( "lib" => [ @{$unified_info{libraries}} ], "dso" => [ @{$unified_info{modules}} ], "bin" => [ @{$unified_info{programs}} ], - "script" => [ @{$unified_info{scripts}} ] ); + "script" => [ @{$unified_info{scripts}} ], + "docs" => [ (map { @{$unified_info{htmldocs}->{$_} // []} } + keys %{$unified_info{htmldocs} // {}}), + (map { @{$unified_info{mandocs}->{$_} // []} } + keys %{$unified_info{mandocs} // {}}) ] ); foreach my $type (keys %loopinfo) { foreach my $product (@{$loopinfo{$type}}) { my %dirs = (); diff --git a/INSTALL b/INSTALL index 0bddf761a1..1c8b580114 100644 --- a/INSTALL +++ b/INSTALL @@ -1156,7 +1156,15 @@ described here. Examine the Makefiles themselves for the full list. all - The default target to build all the software components. + The target to build all the software components and + documentation. + + build_sw + Build all the software components. + THIS IS THE DEFAULT TARGET. + + build_docs + Build all documentation components. clean Remove all build artefacts and return the directory to a "clean" diff --git a/build.info b/build.info index a050ae9530..a28ddbe739 100644 --- a/build.info +++ b/build.info @@ -1,6 +1,6 @@ # Note that some of these directories are filtered in Configure. Look for # %skipdir there for further explanations. -SUBDIRS=crypto ssl apps test util tools fuzz engines providers doc/man1 +SUBDIRS=crypto ssl apps test util tools fuzz engines providers doc LIBS=libcrypto libssl INCLUDE[libcrypto]=. include diff --git a/doc/build.info b/doc/build.info new file mode 100644 index 0000000000..47728fed56 --- /dev/null +++ b/doc/build.info @@ -0,0 +1,66 @@ +SUBDIRS = man1 + +{- + use File::Spec::Functions qw(:DEFAULT abs2rel rel2abs); + use File::Basename; + + foreach my $section ((1, 3, 5, 7)) { + my @htmlfiles = (); + my @manfiles = (); + my %podfiles = + map { $_ => 1 } glob catfile($sourcedir, "man$section", "*.pod"); + my %podinfiles = + map { $_ => 1 } glob catfile($sourcedir, "man$section", "*.pod.in"); + + foreach (keys %podinfiles) { + (my $p = $_) =~ s|\.in$||i; + $podfiles{$p} = 1; + } + + foreach my $p (sort keys %podfiles) { + my $podfile = abs2rel($p, $sourcedir); + my $podname = basename($podfile, '.pod'); + my $podinfile = $podinfiles{"$p.in"} ? "$podfile.in" : undef; + + my $podname = basename($podfile, ".pod"); + + my $htmlfile = abs2rel(catfile($buildtop, "doc", "html", "man$section", + "$podname.html"), + catdir($buildtop, "doc")); + my $manfile = abs2rel(catfile($buildtop, "doc", "man", "man$section", + "$podname.$section"), + catdir($buildtop, "doc")); + + # The build.info format requires file specs to be in Unix format. + # Especially, since VMS file specs use [ and ], the build.info parser + # will otherwise get terribly confused. + if ($^O eq 'VMS') { + $htmlfile = VMS::Filespec::unixify($htmlfile); + $manfile = VMS::Filespec::unixify($manfile); + $podfile = VMS::Filespec::unixify($podfile); + $podinfile = VMS::Filespec::unixify($podinfile) + if defined $podinfile; + } elsif ($^O eq 'MSWin32') { + $htmlfile =~ s|\\|/|g; + $manfile =~ s|\\|/|g; + $podfile =~ s|\\|/|g; + $podinfile =~ s|\\|/|g + if defined $podinfile; + } + push @htmlfiles, $htmlfile; + push @manfiles, $manfile; + $OUT .= << "_____"; +DEPEND[$htmlfile]=$podfile +GENERATE[$htmlfile]=$podfile +DEPEND[$manfile]=$podfile +GENERATE[$manfile]=$podfile +_____ + $OUT .= << "_____" if $podinfile; +DEPEND[$podfile]=$podinfile ../configdata.pm +GENERATE[$podfile]=$podinfile +_____ + } + $OUT .= "HTMLDOCS[man$section]=" . join(" \\\n", @htmlfiles) . "\n"; + $OUT .= "MANDOCS[man$section]=" . join(" \\\n", @manfiles) . "\n"; + } + -}