Why?

I've been here for a while.  My experiences:

Lots of variations of build environment -> lots of failure
conditions happen -> many people wasting their time.

Please supply a good justification why that is good.

If you can't, throw your diff away.  It Simple as that.

> With these changes applied, and by specifying 
> MAKESRCDIRPREFIX/MAKEOBJDIRPREFIX,
> I can build tree without creating obj symlinks under source.
> 
> If src directory is /a/src, and obj is /b/obj, use
>       MAKESRCDIRPREFIX=/a/src
>       MAKEOBJDIRPREFIX=/b/obj
> then .OBJDIR under /a/src/bin/ls becomes /b/obj/bin/ls (if object directories
> are already generated by "make obj").
> 
> I'm not 100% sure about the change in bsd.obj.mk (i.e. interaction with
> bsd.subdir.mk).
> 
> --y0ulUmNC+osPPQO6
> Content-Type: text/plain; charset=us-ascii
> Content-Disposition: attachment; 
> filename="0001-Teach-make-1-handling-of-BSDSRCDIRPREFIX-BSDOBJDIRPR.patch"
> 
> >From d81931ee7fea3e1f30c7d05ef95bbc01a489f73f Mon Sep 17 00:00:00 2001
> From: Masao Uebayashi <[email protected]>
> Date: Fri, 24 Jun 2016 02:35:35 +0900
> Subject: [PATCH 1/3] Teach make(1) handling of BSDSRCDIRPREFIX/BSDOBJDIRPREFIX
> 
> ---
>  usr.bin/make/main.c | 47 ++++++++++++++++++++++++++++++++++++++++-------
>  1 file changed, 40 insertions(+), 7 deletions(-)
> 
> diff --git a/usr.bin/make/main.c b/usr.bin/make/main.c
> index ac2402c..6cb4191 100644
> --- a/usr.bin/make/main.c
> +++ b/usr.bin/make/main.c
> @@ -546,22 +546,55 @@ chdir_verify_path(const char *path, struct dirs *d)
>  static void
>  setup_CURDIR_OBJDIR(struct dirs *d, const char *machine)
>  {
> -     char *path;
> +     char *srcpfx, *objpfx;
> +     char objdirbuf[PATH_MAX], *objdir;
>  
>       d->current = figure_out_CURDIR();
>       /*
> -      * If the MAKEOBJDIR (or by default, the _PATH_OBJDIR) directory
> -      * exists, change into it and build there.  
> +      * 1. If both MAKESRCDIRPREFIX and MAKEOBJDIRPREFIX are defined,
> +      *    the object directory is:
> +      *      ${MAKEOBJDIRPREFIX}/<sub-directory under ${MAKESRCDIRPREFIX}>
> +      * 2. If MAKEOBJDIR is defined, the object directory is:
> +      *      ${.CURDIR}/${MAKEOBJDIR}
> +      * 3. Or by default:
> +      *      ${.CURDIR}/<_PATH_OBJDIR>
> +      *
> +      * If the object directory exists, change into it and build there.
> +      * The object directory has to be created in prior by "make obj";
> +      * otherwise chdir(2) fails and build is done in the current directory.
>        *
>        * Once things are initted,
>        * have to add the original directory to the search path,
>        * and modify the paths for the Makefiles appropriately.  The
>        * current directory is also placed as a variable for make scripts.
>        */
> -     if ((path = getenv("MAKEOBJDIR")) == NULL) {
> -             path = _PATH_OBJDIR;
> -     } 
> -     d->object = chdir_verify_path(path, d);
> +
> +     srcpfx = getenv("MAKESRCDIRPREFIX");
> +     objpfx = getenv("MAKEOBJDIRPREFIX");
> +     if (srcpfx != NULL && objpfx != NULL) {
> +             const size_t srcpfxlen = strlen(srcpfx);
> +             const ssize_t srcsfxlen = strlen(d->current) - srcpfxlen;
> +             const size_t objpfxlen = strlen(objpfx);
> +
> +             if (srcsfxlen <= 0 ||
> +                 memcmp(d->current, srcpfx, srcpfxlen) != 0 ||
> +                 d->current[srcpfxlen] != '/') {
> +                     Fatal("make: .CURDIR (%s) not under "
> +                         "MAKESRCDIRPREFIX (%s).", d->current, srcpfx);
> +             }
> +             if (objpfxlen + srcsfxlen + 1 > PATH_MAX) {
> +                     Fatal("make: .OBJDIR too long (%s%s).", objpfx,
> +                         d->current + srcpfxlen);
> +             }
> +             objdir = objdirbuf;
> +             strncpy(objdir, objpfx, objpfxlen);
> +             strncpy(objdir + objpfxlen, d->current + srcpfxlen, srcsfxlen);
> +     } else {
> +             if ((objdir = getenv("MAKEOBJDIR")) == NULL) {
> +                     objdir = _PATH_OBJDIR;
> +             }
> +     }
> +     d->object = chdir_verify_path(objdir, d);
>       if (d->object == NULL)
>               d->object = d->current;
>  }
> -- 
> 2.8.4
> 
> 
> --y0ulUmNC+osPPQO6
> Content-Type: text/plain; charset=us-ascii
> Content-Disposition: attachment; 
> filename="0002-Create-obj-directories-for-BSDSRCDIRPREFIX-BSDOBJDIR.patch"
> 
> >From 317a1522aac0464d87d6ed37559db7e73bf5d91c Mon Sep 17 00:00:00 2001
> From: Masao Uebayashi <[email protected]>
> Date: Fri, 24 Jun 2016 02:36:19 +0900
> Subject: [PATCH 2/3] Create obj directories for
>  BSDSRCDIRPREFIX/BSDOBJDIRPREFIX
> 
> ---
>  share/mk/bsd.obj.mk | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/share/mk/bsd.obj.mk b/share/mk/bsd.obj.mk
> index 0c2a67a..d8c21ca 100644
> --- a/share/mk/bsd.obj.mk
> +++ b/share/mk/bsd.obj.mk
> @@ -4,6 +4,12 @@
>  .if !target(obj)
>  .  if defined(NOOBJ)
>  obj:
> +.  elif defined(MAKEOBJDIRPREFIX) && defined(MAKESRCDIRPREFIX)
> +
> +_SUBDIRUSE:
> +obj! _SUBDIRUSE
> +     mkdir -p ${MAKEOBJDIRPREFIX}${.CURDIR:C|^${MAKESRCDIRPREFIX}||}
> +
>  .  else
>  
>  .  if defined(MAKEOBJDIR)
> -- 
> 2.8.4
> 
> 
> --y0ulUmNC+osPPQO6
> Content-Type: text/plain; charset=us-ascii
> Content-Disposition: attachment; 
> filename="0003-Pass-MAKESRCDIRPREFIX-MAKEOBJDIRPREFIX-for-cross-bui.patch"
> 
> >From 4741aa198b2dd411b2a7baed848263561d30734a Mon Sep 17 00:00:00 2001
> From: Masao Uebayashi <[email protected]>
> Date: Fri, 24 Jun 2016 10:52:18 +0900
> Subject: [PATCH 3/3] Pass MAKESRCDIRPREFIX/MAKEOBJDIRPREFIX for cross build
> 
> ---
>  Makefile.cross | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 52 insertions(+)
> 
> diff --git a/Makefile.cross b/Makefile.cross
> index 8e2afa1..90d8e25 100644
> --- a/Makefile.cross
> +++ b/Makefile.cross
> @@ -119,6 +119,8 @@ cross-env:
>       @echo ${CROSSENV} MACHINE=${TARGET} \
>           MACHINE_ARCH=`cat ${CROSSDIR}/TARGET_ARCH` \
>           MACHINE_CPU=`cat ${CROSSDIR}/TARGET_CPU` \
> +         MAKESRCDIRPREFIX=${MAKESRCDIRPREFIX} \
> +         MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} \
>           BSDOBJDIR=${CROSSDIR}/usr/obj \
>           BSDSRCDIR=${.CURDIR} MAKEOBJDIR=obj.${MACHINE}.${TARGET}
>  
> @@ -154,6 +156,8 @@ ${CROSSOBJ}:      ${CROSSDIRS}
>           COMPILER_VERSION=${COMPILER_VERSION} \
>           MACHINE=${TARGET} \
>           MACHINE_ARCH=${TARGET_ARCH} MACHINE_CPU=${TARGET_CPU} \
> +         MAKESRCDIRPREFIX=${MAKESRCDIRPREFIX} \
> +         MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} \
>           BSDSRCDIR=${.CURDIR} MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
>           ${MAKE} obj)
>       @touch ${CROSSOBJ}
> @@ -164,12 +168,16 @@ ${CROSSINCLUDES}:       ${CROSSOBJ}
>           COMPILER_VERSION=${COMPILER_VERSION} \
>           MACHINE=${TARGET} \
>           MACHINE_ARCH=${TARGET_ARCH} MACHINE_CPU=${TARGET_CPU} \
> +         MAKESRCDIRPREFIX=${MAKESRCDIRPREFIX} \
> +         MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} \
>           MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
>           TARGET_ARCH=${TARGET_ARCH} TARGET_CPU=${TARGET_CPU} \
>           ${MAKE} prereq && \
>           COMPILER_VERSION=${COMPILER_VERSION} \
>           MACHINE=${TARGET} \
>           MACHINE_ARCH=${TARGET_ARCH} MACHINE_CPU=${TARGET_CPU} \
> +         MAKESRCDIRPREFIX=${MAKESRCDIRPREFIX} \
> +         MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} \
>           MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
>           TARGET_ARCH=${TARGET_ARCH} TARGET_CPU=${TARGET_CPU} \
>           ${MAKE} DESTDIR=${CROSSDIR} includes)
> @@ -177,16 +185,22 @@ ${CROSSINCLUDES}:       ${CROSSOBJ}
>  
>  ${CROSSBINUTILS}:    ${CROSSINCLUDES}
>       (cd ${.CURDIR}/${BINUTILS_DIR}; \
> +         MAKESRCDIRPREFIX=${MAKESRCDIRPREFIX} \
> +         MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} \
>           MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
>           PIE_DEFAULT=${PIE_DEFAULT} \
>           TARGET_ARCH=${TARGET_ARCH} TARGET_CPU=${TARGET_CPU} \
>           PATH=${CROSSPATH} \
>           ${MAKE} -f Makefile.bsd-wrapper depend && \
> +         MAKESRCDIRPREFIX=${MAKESRCDIRPREFIX} \
> +         MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} \
>           MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
>           PIE_DEFAULT=${PIE_DEFAULT} \
>           TARGET_ARCH=${TARGET_ARCH} TARGET_CPU=${TARGET_CPU} \
>           ${MAKE} -f Makefile.bsd-wrapper all && \
>           DESTDIR=${CROSSDIR} MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
> +         MAKESRCDIRPREFIX=${MAKESRCDIRPREFIX} \
> +         MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} \
>           COMPILER_VERSION=${COMPILER_VERSION} \
>           PIE_DEFAULT=${PIE_DEFAULT} \
>           MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
> @@ -217,14 +231,20 @@ ${CROSSGCC}:            ${CROSSBINUTILS}
>  .if ${COMPILER_VERSION:L} == "gcc3"
>       (cd ${.CURDIR}/gnu/usr.bin/gcc; \
>           MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
> +         MAKESRCDIRPREFIX=${MAKESRCDIRPREFIX} \
> +         MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} \
>           TARGET_ARCH=${TARGET_ARCH} TARGET_CPU=${TARGET_CPU} \
>           CROSSDIR=${CROSSDIR} \
>           PATH=${CROSSPATH} ${MAKE} -f Makefile.bsd-wrapper depend && \
>           MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
> +         MAKESRCDIRPREFIX=${MAKESRCDIRPREFIX} \
> +         MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} \
>           TARGET_ARCH=${TARGET_ARCH} TARGET_CPU=${TARGET_CPU} \
>           CROSSDIR=${CROSSDIR} \
>           ${MAKE} -f Makefile.bsd-wrapper all && \
>           env CROSSDIR=${CROSSDIR} DESTDIR=${CROSSDIR} 
> MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
> +         MAKESRCDIRPREFIX=${MAKESRCDIRPREFIX} \
> +         MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} \
>           PATH=${CROSSPATH} ${MAKE} -f Makefile.bsd-wrapper install)
>       cp -f ${CROSSDIR}/usr/bin/${TARGET_CANON}-g++ 
> ${CROSSDIR}/usr/${TARGET_CANON}/bin/${TARGET_CANON}-c++
>       cp -f ${CROSSDIR}/usr/bin/gcc 
> ${CROSSDIR}/usr/${TARGET_CANON}/bin/${TARGET_CANON}-cc
> @@ -245,6 +265,8 @@ ${CROSSGCC}:              ${CROSSBINUTILS}
>       (cd ${.CURDIR}/gnu/usr.bin/cc; \
>           PIE_DEFAULT=${PIE_DEFAULT} \
>           MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
> +         MAKESRCDIRPREFIX=${MAKESRCDIRPREFIX} \
> +         MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} \
>           TARGET_ARCH=${TARGET_ARCH} TARGET_CPU=${TARGET_CPU} \
>           CROSSDIR=${CROSSDIR} \
>           MACHINE=${TARGET} \
> @@ -252,6 +274,8 @@ ${CROSSGCC}:              ${CROSSBINUTILS}
>       (cd ${.CURDIR}/gnu/usr.bin/cc; \
>           PIE_DEFAULT=${PIE_DEFAULT} \
>           MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
> +         MAKESRCDIRPREFIX=${MAKESRCDIRPREFIX} \
> +         MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} \
>           TARGET_ARCH=${TARGET_ARCH} TARGET_CPU=${TARGET_CPU} \
>           CROSSDIR=${CROSSDIR} \
>           MACHINE=${TARGET} \
> @@ -260,6 +284,8 @@ ${CROSSGCC}:              ${CROSSBINUTILS}
>           env CROSSDIR=${CROSSDIR} DESTDIR=${CROSSDIR} \
>           PIE_DEFAULT=${PIE_DEFAULT} \
>           MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
> +         MAKESRCDIRPREFIX=${MAKESRCDIRPREFIX} \
> +         MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} \
>           TARGET_ARCH=${TARGET_ARCH} TARGET_CPU=${TARGET_CPU} \
>           MACHINE=${TARGET} \
>           PATH=${CROSSPATH} ${MAKE} install)
> @@ -294,14 +320,22 @@ cross-lib:      ${CROSSGCC}
>           for lib in csu libc; do \
>           (cd $$lib; \
>               eval ${CROSSENV} MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
> +                 MAKESRCDIRPREFIX=${MAKESRCDIRPREFIX} \
> +                 MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} \
>                   ${MAKE} depend all ;\
>               eval ${CROSSENV} MAKEOBJDIR=obj.${MACHINE}.${TARGET} 
> DESTDIR=${CROSSDIR} \
> +                 MAKESRCDIRPREFIX=${MAKESRCDIRPREFIX} \
> +                 MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} \
>                   ${MAKE} install); \
>           done; \
>           eval ${CROSSENV} MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
> +             MAKESRCDIRPREFIX=${MAKESRCDIRPREFIX} \
> +             MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} \
>               SKIPDIR=\"${NO_CROSS}\" \
>               ${MAKE} depend all ; \
>           eval ${CROSSENV} MAKEOBJDIR=obj.${MACHINE}.${TARGET} 
> DESTDIR=${CROSSDIR} \
> +             MAKESRCDIRPREFIX=${MAKESRCDIRPREFIX} \
> +             MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} \
>               SKIPDIR=\"${NO_CROSS}\" \
>               ${MAKE} install)
>  
> @@ -312,9 +346,13 @@ cross-bin:       ${CROSSOBJ}
>       for i in libexec bin sbin usr.bin usr.sbin; do \
>       (cd ${.CURDIR}/$$i; \
>           eval ${CROSSENV} MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
> +             MAKESRCDIRPREFIX=${MAKESRCDIRPREFIX} \
> +             MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} \
>               SKIPDIR=\"${BINUTILS} ${NO_CROSS}\" \
>               ${MAKE} depend all ; \
>           eval ${CROSSENV} MAKEOBJDIR=obj.${MACHINE}.${TARGET} 
> DESTDIR=${CROSSDIR} \
> +             MAKESRCDIRPREFIX=${MAKESRCDIRPREFIX} \
> +             MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} \
>               SKIPDIR=\"${BINUTILS} ${NO_CROSS}\" \
>               ${MAKE} install); \
>       done
> @@ -326,9 +364,13 @@ cross-gnu:       ${CROSSOBJ}
>       for i in gnu/lib gnu/usr.sbin gnu/usr.bin ; do \
>       (cd ${.CURDIR}/$$i; \
>           eval ${CROSSENV} MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
> +             MAKESRCDIRPREFIX=${MAKESRCDIRPREFIX} \
> +             MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} \
>               SKIPDIR=\"${NO_CROSS}\" \
>               ${MAKE} depend all ; \
>           eval ${CROSSENV} MAKEOBJDIR=obj.${MACHINE}.${TARGET} 
> DESTDIR=${CROSSDIR} \
> +             MAKESRCDIRPREFIX=${MAKESRCDIRPREFIX} \
> +             MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} \
>               SKIPDIR=\"${NO_CROSS}\" \
>               ${MAKE} install); \
>       done
> @@ -340,6 +382,8 @@ cross-share:   ${CROSSOBJ}
>       for i in share; do \
>           (cd ${.CURDIR}/$$i; \
>               eval ${CROSSENV} MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
> +             MAKESRCDIRPREFIX=${MAKESRCDIRPREFIX} \
> +             MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} \
>               SKIPDIR=\"${NO_CROSS}\" \
>               DESTDIR=${CROSSDIR} \
>               ${MAKE} depend all install); \
> @@ -352,6 +396,8 @@ cross-sys:   ${CROSSOBJ}
>       for i in sys; do \
>           (cd ${.CURDIR}/$$i; \
>               eval ${CROSSENV} MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
> +             MAKESRCDIRPREFIX=${MAKESRCDIRPREFIX} \
> +             MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} \
>               SKIPDIR=\"${NO_CROSS}\" \
>               DESTDIR=${CROSSDIR} \
>               ${MAKE} depend all install); \
> @@ -368,6 +414,8 @@ cross-depend:
>       @(cd ${.CURDIR} && \
>           BSDOBJDIR=${CROSSDIR}/usr/obj \
>           BSDSRCDIR=${.CURDIR} MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
> +         MAKESRCDIRPREFIX=${MAKESRCDIRPREFIX} \
> +         MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} \
>           SKIPDIR="${NO_CROSS}" \
>           ${MAKE} depend)
>  
> @@ -375,6 +423,8 @@ cross-clean:
>       @(cd ${.CURDIR} && \
>           BSDOBJDIR=${CROSSDIR}/usr/obj \
>           BSDSRCDIR=${.CURDIR} MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
> +         MAKESRCDIRPREFIX=${MAKESRCDIRPREFIX} \
> +         MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} \
>           SKIPDIR="${NO_CROSS}" \
>           ${MAKE} clean)
>  
> @@ -382,5 +432,7 @@ cross-cleandir:
>       @(cd ${.CURDIR} && \
>           BSDOBJDIR=${CROSSDIR}/usr/obj \
>           BSDSRCDIR=${.CURDIR} MAKEOBJDIR=obj.${MACHINE}.${TARGET} \
> +         MAKESRCDIRPREFIX=${MAKESRCDIRPREFIX} \
> +         MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} \
>           SKIPDIR="${NO_CROSS}" \
>           ${MAKE} cleandir)
> -- 
> 2.8.4
> 
> 
> --y0ulUmNC+osPPQO6--
> 

Reply via email to