On Thu, Aug 25, 2022 at 06:36:55PM +0000, Klemens Nanni wrote:
> Turns out all install media ship full copies of those two manuals due to
> what can be described like a makefile TOCTOU.
> 
> In /usr/src/distrib/special, Makefile.inc sets NOMAN=1 but */Makefile
> only includes it in the very end through <bsd.prog.mk>.
> 
> fdisk and disklabel have NOMAN logic before that include, so they don't
> see it set yet and include the whole thing:
> 
>       $ make -C fdisk manual.o
>       mk -C fdisk manual.o
>       mandoc -Tascii 
> /usr/src/distrib/special/fdisk/../../../sbin/fdisk/fdisk.8 > fdisk.cat8
>       (echo 'const unsigned char manpage[] = {';  cat fdisk.cat8 | gzip -9c | 
> hexdump -ve '"0x" 1/1 "%02x,"';  echo '};'; echo 'const int manpage_sz = 
> sizeof(manpage);') > manual.c
>       cc -O2 -pipe  -DHAS_MBR -fno-pie -Oz -fno-stack-protector 
> -fno-unwind-tables -fno-asynchronous-unwind-tables -MD -MP  -c manual.c
>       $ size fdisk/obj/manual.o
>       text    data    bss     dec     hex
>       3552    0       0       3552    de0
> 
> Forcing it on the command line yields the desired behaviour:
>       $ make -C fdisk NOMAN=1 manual.o
>       (echo 'const unsigned char manpage[] = {';  echo 'no manual' | gzip -9c 
> | hexdump -ve '"0x" 1/1 "%02x,"';  echo '};'; echo 'const int manpage_sz = 
> sizeof(manpage);') > manual.c
>       cc -O2 -pipe  -DHAS_MBR -fno-pie -Oz -fno-stack-protector 
> -fno-unwind-tables -fno-asynchronous-unwind-tables -MD -MP  -c manual.c
>       $ size fdisk/obj/manual.o
>       text    data    bss     dec     hex
>       36      0       0       36      24
> 
> Same for disklabel,  size before/after:
>       text    data    bss     dec     hex
>       6160    0       0       6160    1810
>       36      0       0       36      24
> 
> I've confirmed this through an amd64 snapshots bsd.rd where I paged
> through disklabel(8) via the 'M' command...
> 
> Here's a minimal diff to highlight this non-obvious issue and avoid
> reshuffling, i.e. cut down on differences with /usr/src/sbin/*/Makefile.

Alternatively, here's a more invasive diff that rips out the compile
logic around what I understand as purely man-install related NOMAN.

Regular fdisk and disklabel always inlcude the manual and special ones
just print "no manual." rather than gzipping the string, decompressing
it at runtime and running a pager through it.

I do like this a bit more as it makes the code simpler and just uses
SMALL for this, as I'd expect;  This saves even more bits.

> 
> Haven't built ramdisks yet to see the final size decrease, but everyone
> should be happy with this.
> 
> OK?


Index: sbin/fdisk/Makefile
===================================================================
RCS file: /cvs/src/sbin/fdisk/Makefile,v
retrieving revision 1.46
diff -u -p -r1.46 Makefile
--- sbin/fdisk/Makefile 23 May 2022 16:58:11 -0000      1.46
+++ sbin/fdisk/Makefile 25 Aug 2022 18:47:14 -0000
@@ -23,12 +23,6 @@ CLEANFILES += fdisk.cat8 manual.c
 
 .include <bsd.own.mk>
 
-.ifdef NOMAN
-manual.c:
-       (echo 'const unsigned char manpage[] = {'; \
-       echo 'no manual' | gzip -9c | hexdump -ve '"0x" 1/1 "%02x,"'; \
-       echo '};'; echo 'const int manpage_sz = sizeof(manpage);') > manual.c
-.else
 fdisk.cat8:    fdisk.8
        mandoc -Tascii ${.ALLSRC} > ${.TARGET}
 
@@ -36,7 +30,6 @@ manual.c:     fdisk.cat8
        (echo 'const unsigned char manpage[] = {'; \
        cat fdisk.cat8 | gzip -9c | hexdump -ve '"0x" 1/1 "%02x,"'; \
        echo '};'; echo 'const int manpage_sz = sizeof(manpage);') > manual.c
-.endif
 
 MAN=   fdisk.8
 
Index: sbin/fdisk/cmd.c
===================================================================
RCS file: /cvs/src/sbin/fdisk/cmd.c,v
retrieving revision 1.164
diff -u -p -r1.164 cmd.c
--- sbin/fdisk/cmd.c    25 Jul 2022 17:45:16 -0000      1.164
+++ sbin/fdisk/cmd.c    25 Aug 2022 18:51:02 -0000
@@ -509,6 +509,9 @@ Xflag(const char *args, struct mbr *mbr)
 int
 Xmanual(const char *args, struct mbr *mbr)
 {
+#ifdef SMALL
+       printf("no manual.\n");
+#else
        char                    *pager = "/usr/bin/less";
        char                    *p;
        FILE                    *f;
@@ -527,6 +530,7 @@ Xmanual(const char *args, struct mbr *mb
        }
 
        signal(SIGPIPE, opipe);
+#endif /* !SMALL */
 
        return CMD_CONT;
 }
Index: sbin/disklabel/Makefile
===================================================================
RCS file: /cvs/src/sbin/disklabel/Makefile,v
retrieving revision 1.70
diff -u -p -r1.70 Makefile
--- sbin/disklabel/Makefile     20 Sep 2021 20:23:44 -0000      1.70
+++ sbin/disklabel/Makefile     25 Aug 2022 18:46:48 -0000
@@ -10,12 +10,6 @@ CLEANFILES += disklabel.cat8 manual.c
 
 .include <bsd.own.mk>
 
-.ifdef NOMAN
-manual.c:
-       (echo 'const unsigned char manpage[] = {'; \
-       echo 'no manual' | gzip -9c | hexdump -ve '"0x" 1/1 "%02x,"'; \
-       echo '};'; echo 'const int manpage_sz = sizeof(manpage);') > manual.c
-.else
 disklabel.cat8:        disklabel.8
        mandoc -Tascii ${.ALLSRC} > ${.TARGET}
 
@@ -23,7 +17,6 @@ manual.c:     disklabel.cat8
        (echo 'const unsigned char manpage[] = {'; \
        cat disklabel.cat8 | gzip -9c | hexdump -ve '"0x" 1/1 "%02x,"'; \
        echo '};'; echo 'const int manpage_sz = sizeof(manpage);') > manual.c
-.endif
 
 .if ${MACHINE} == "sparc64"
 CFLAGS+= -DSUN_CYLCHECK -DSUN_AAT0
Index: sbin/disklabel/editor.c
===================================================================
RCS file: /cvs/src/sbin/disklabel/editor.c,v
retrieving revision 1.373
diff -u -p -r1.373 editor.c
--- sbin/disklabel/editor.c     31 Jul 2022 14:29:19 -0000      1.373
+++ sbin/disklabel/editor.c     25 Aug 2022 18:51:06 -0000
@@ -346,6 +346,9 @@ editor(int f)
                        break;
 
                case 'M': {
+#ifdef SMALL
+                       puts("no manual.");
+#else
                        sig_t opipe = signal(SIGPIPE, SIG_IGN);
                        char *pager, *comm = NULL;
                        extern const u_char manpage[];
@@ -363,6 +366,7 @@ editor(int f)
 
                        free(comm);
                        (void)signal(SIGPIPE, opipe);
+#endif /* !SMALL */
                        break;
                }
 
Index: distrib/special/fdisk/Makefile
===================================================================
RCS file: /cvs/src/distrib/special/fdisk/Makefile,v
retrieving revision 1.6
diff -u -p -r1.6 Makefile
--- distrib/special/fdisk/Makefile      23 May 2022 16:58:11 -0000      1.6
+++ distrib/special/fdisk/Makefile      25 Aug 2022 18:46:12 -0000
@@ -16,29 +16,12 @@
 # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 PROG=  fdisk
-SRCS=  fdisk.c user.c misc.c disk.c mbr.c part.c cmd.c manual.c gpt.c
+SRCS=  fdisk.c user.c misc.c disk.c mbr.c part.c cmd.c gpt.c
+CFLAGS+= -DSMALL
 DPADD= ${LIBUTIL}
 LDADD= -lutil
-CLEANFILES += fdisk.cat8 manual.c
 
 .include <bsd.own.mk>
-
-.ifdef NOMAN
-manual.c:
-       (echo 'const unsigned char manpage[] = {'; \
-       echo 'no manual' | gzip -9c | hexdump -ve '"0x" 1/1 "%02x,"'; \
-       echo '};'; echo 'const int manpage_sz = sizeof(manpage);') > manual.c
-.else
-fdisk.cat8:    fdisk.8
-       mandoc -Tascii ${.ALLSRC} > ${.TARGET}
-
-manual.c:      fdisk.cat8
-       (echo 'const unsigned char manpage[] = {'; \
-       cat fdisk.cat8 | gzip -9c | hexdump -ve '"0x" 1/1 "%02x,"'; \
-       echo '};'; echo 'const int manpage_sz = sizeof(manpage);') > manual.c
-.endif
-
-MAN=   fdisk.8
 
 .if ${MACHINE} == "amd64" || ${MACHINE} == "i386" || ${MACHINE} == "landisk"
 CFLAGS += -DHAS_MBR
Index: distrib/special/disklabel/Makefile
===================================================================
RCS file: /cvs/src/distrib/special/disklabel/Makefile,v
retrieving revision 1.13
diff -u -p -r1.13 Makefile
--- distrib/special/disklabel/Makefile  21 Sep 2021 18:36:09 -0000      1.13
+++ distrib/special/disklabel/Makefile  25 Aug 2022 18:45:42 -0000
@@ -1,29 +1,12 @@
 #      $OpenBSD: Makefile,v 1.13 2021/09/21 18:36:09 bluhm Exp $
 
 PROG=  disklabel
-SRCS=  disklabel.c dkcksum.c editor.c manual.c
+SRCS=  disklabel.c dkcksum.c editor.c
+CFLAGS+= -DSMALL
 DPADD= ${LIBUTIL}
 LDADD= -lutil
-MAN=   disklabel.8 disklabel.5
-
-CLEANFILES += disklabel.cat8 manual.c
 
 .include <bsd.own.mk>
-
-.ifdef NOMAN
-manual.c:
-       (echo 'const unsigned char manpage[] = {'; \
-       echo 'no manual' | gzip -9c | hexdump -ve '"0x" 1/1 "%02x,"'; \
-       echo '};'; echo 'const int manpage_sz = sizeof(manpage);') > manual.c
-.else
-disklabel.cat8:        disklabel.8
-       mandoc -Tascii ${.ALLSRC} > ${.TARGET}
-
-manual.c:      disklabel.cat8
-       (echo 'const unsigned char manpage[] = {'; \
-       cat disklabel.cat8 | gzip -9c | hexdump -ve '"0x" 1/1 "%02x,"'; \
-       echo '};'; echo 'const int manpage_sz = sizeof(manpage);') > manual.c
-.endif
 
 .if ${MACHINE} == "sparc64"
 CFLAGS+= -DSUN_CYLCHECK -DSUN_AAT0

Reply via email to