From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.org/gmane.linux.lib.musl.general/8901 Path: news.gmane.org!not-for-mail From: Petr Hosek Newsgroups: gmane.linux.lib.musl.general Subject: Re: Support for out-of-tree build Date: Thu, 19 Nov 2015 00:22:09 +0000 Message-ID: References: <20151117210021.GB3818@brightrain.aerifal.cx> <20151117220141.GD3818@brightrain.aerifal.cx> <20151117230606.GJ18372@port70.net> <20151117232711.GG3818@brightrain.aerifal.cx> <20151117234330.GH3818@brightrain.aerifal.cx> <20151118001955.GI3818@brightrain.aerifal.cx> <20151118214452.GQ3818@brightrain.aerifal.cx> Reply-To: musl@lists.openwall.com NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=001a114844ec88dc840524d9c0fd X-Trace: ger.gmane.org 1447892568 24177 80.91.229.3 (19 Nov 2015 00:22:48 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Thu, 19 Nov 2015 00:22:48 +0000 (UTC) To: musl@lists.openwall.com Original-X-From: musl-return-8914-gllmg-musl=m.gmane.org@lists.openwall.com Thu Nov 19 01:22:36 2015 Return-path: Envelope-to: gllmg-musl@m.gmane.org Original-Received: from mother.openwall.net ([195.42.179.200]) by plane.gmane.org with smtp (Exim 4.69) (envelope-from ) id 1ZzCzj-0005BX-9X for gllmg-musl@m.gmane.org; Thu, 19 Nov 2015 01:22:35 +0100 Original-Received: (qmail 17573 invoked by uid 550); 19 Nov 2015 00:22:33 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: Original-Received: (qmail 17553 invoked from network); 19 Nov 2015 00:22:32 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :content-type; bh=C1uNUUN/4EFFsQlMaHogNyKJwADOo4lZdT9f7dapRqw=; b=fxYvXK8ECky57u3IfG1ct0+LFMu5z0h4WWhtyLTP1L4NR/LAPK9YQv/x0mSN+n2T12 Y5Hwk2c00/xqfnBpMoORtbKexducb4Bmi1eagE4roJqNy0kXaSiRfWsl2JsBmmA4d4/Y SPKaC4VhZorcI+s94INA3AJ/Un+COdCboetBA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:content-type; bh=C1uNUUN/4EFFsQlMaHogNyKJwADOo4lZdT9f7dapRqw=; b=MoN4/ZhvNfMWSL7WuarZbrTuriV3l+jQJI3s6bft+AyeCLA9lvc6iZEolqVi/EufAs d1ZkR2BAZe7dytftP16BxiMVF+tbAWINjjLgtdZ2Gi4hezq6KfvBnywYTh3tl+h1VVqC xB40lO4Fwx3OCxmAh4byNqCp+CS9A4ESBmvHbDUbEZLenB5W1X5MELJ192RtGsuRPDr9 1H+pXoWaFH+dv7uNrJJHwhKus3XF6CVzwiKcjjGL12eSwaIsmWTznXdG5T+OTy4IIYt4 JvqTKoFDCh4thMLhm9AYicUr2Poma9MOWlfFgpEub+teAfGhTKjqYNOKBxrZNYAbC+CL WRcA== X-Gm-Message-State: ALoCoQk3RoTSte3iwQajiOijfSAZ1R1xwy1aR4ivJRmYjTmdOFw16dCwX/3eGfCHtKV7oKIZKs/j X-Received: by 10.129.101.134 with SMTP id z128mr4618627ywb.92.1447892540223; Wed, 18 Nov 2015 16:22:20 -0800 (PST) In-Reply-To: <20151118214452.GQ3818@brightrain.aerifal.cx> Xref: news.gmane.org gmane.linux.lib.musl.general:8901 Archived-At: --001a114844ec88dc840524d9c0fd Content-Type: multipart/alternative; boundary=001a114844ec88dc7f0524d9c0fb --001a114844ec88dc7f0524d9c0fb Content-Type: text/plain; charset=UTF-8 On Wed, Nov 18, 2015 at 1:45 PM Rich Felker wrote: > > -SRCS = $(sort $(wildcard src/*/*.c arch/$(ARCH)/src/*.c)) > > -OBJS = $(SRCS:.c=.o) > > +BASE_SRCS = $(sort $(wildcard $(srcdir)/src/*/*.c > $(srcdir)/arch/$(ARCH)/src/*.c)) > > +BASE_OBJS = $(BASE_SRCS:$(srcdir)/%.c=%.o) > > +ARCH_SRCS = $(wildcard $(srcdir)/src/*/$(ARCH)/*.s) > > +ARCH_OBJS = $(ARCH_SRCS:$(srcdir)/%.s=%.o) > > +SUB_SRCS = $(wildcard $(srcdir)/src/*/$(ARCH)$(ASMSUBARCH)/*.sub) > > +SUB_OBJS = $(SUB_SRCS:$(srcdir)/%.sub=%.o) > > +EXCLUDE_ARCH_OBJS = $(patsubst $(srcdir)/%,%,$(subst > /$(ARCH)/,/,$(patsubst $(srcdir)/%,%,$(ARCH_OBJS)))) > > +EXCLUDE_SUB_OBJS = $(patsubst $(srcdir)/%,%,$(subst > /$(ARCH)$(ASMSUBARCH)/,/,$(patsubst $(srcdir)/%,%,$(SUB_OBJS)))) > > +OBJS = $(addprefix $(objdir)/, $(filter-out $(EXCLUDE_SUB_OBJS) > $(EXCLUDE_ARCH_OBJS), $(BASE_OBJS)) $(ARCH_OBJS) $(SUB_OBJS)) > > Why not just put all the arch files (whether they come from .s or > .sub, or in the future .c or .S) together in ARCH_OBJS? I think this > can all be done with no intermediate *_SRCS vars (and probably even > without SRCS) with some explicit $(patsubst...) etc. Actually I'm a > bit surprised if things like this work: > > $(BASE_SRCS:$(srcdir)/%.c=%.o) > > I had trouble with % in the middle of the pattern not doing what I > expected it to. > I have merged ARCH_* and SUB_* into ARCH_*. > > CFLAGS_ALL = $(CFLAGS_C99FSE) > > -CFLAGS_ALL += -D_XOPEN_SOURCE=700 -I./arch/$(ARCH) -I./src/internal > -I./include > > +CFLAGS_ALL += -D_XOPEN_SOURCE=700 -I$(srcdir)/arch/$(ARCH) $(sort > -I$(objdir)/src/internal -I$(srcdir)/src/internal) $(sort > -I$(objdir)/include -I$(srcdir)/include) > > What is the $(sort...) for now? Before I thought it was to remove > duplicates, but now they will not be duplicates unless you're trying > to support objdir=. -- is that your intent? I don't think it will > work based on our discussions yesterday. > Correct, this would only make sense if objdir=. but then the implicit rules wouldn't work so we don't need to support that scenario. > > clean: > > - rm -f crt/*.o > > + rm -f $(objdir)/crt/*.o > > rm -f $(OBJS) > > rm -f $(LOBJS) > > rm -f $(ALL_LIBS) lib/*.[ao] lib/*.so > > This can probably just be rm -rf obj, but perhaps we should wait to > make that change. And seeing this, I'm mildly in favor of hard-coding > obj/ (everywhere) rather than using $(objdir)/ simply because the > latter is really dangerous if you override it on the command line with > an unwanted setting (like make clean objdir=/). > That's why I avoided using rm -rf $(objdir). I can imagine the use case for setting $(objdir) to a different location, changing this to make it hard-coded wouldn't be a problem if you prefer. > > -include/bits: > > +$(objdir)/include/bits: > > @test "$(ARCH)" || { echo "Please set ARCH in config.mak before > running make." ; exit 1 ; } > > ln -sf ../arch/$(ARCH)/bits $@ > > I think this may be problematic -- for an in-tree build, you'll get a > bits symlink in the source include dir, and then out-of-tree builds > might use it. Include order might prevent that but it sounds fragile. > We should probably eliminate the bits symlink here. > I agree, if we're not going to support the objdir=. scenario, we can remove the symlink. It'll also simplify some of the directory dependencies. > > -include/bits/alltypes.h.in: include/bits > > - > > -include/bits/alltypes.h: include/bits/alltypes.h.in include/ > alltypes.h.in tools/mkalltypes.sed > > - sed -f tools/mkalltypes.sed include/bits/alltypes.h.in include/ > alltypes.h.in > $@ > > +$(objdir)/include/bits/alltypes.h: $(srcdir)/arch/$(ARCH)/bits/ > alltypes.h.in $(srcdir)/include/alltypes.h.in > $(srcdir)/tools/mkalltypes.sed $(objdir)/include/bits > > + sed -f $(srcdir)/tools/mkalltypes.sed $(srcdir)/arch/$(ARCH)/bits/ > alltypes.h.in $(srcdir)/include/alltypes.h.in > $@ > > So the generated alltypes.h goes in obj/include/bits? But the > installation rule does not seem to get it from there. It seems to only > look in arch/$(ARCH)/bits/%. I guess the above symlink causes them to > be the same, but I don't think there's actually a dependency in the > makefile to let make know that... > That's fixed, well spotted. > > -src/internal/version.h: $(wildcard VERSION .git) > > - printf '#define VERSION "%s"\n' "$$(sh tools/version.sh)" > $@ > > +$(objdir)/src/internal/version.h: $(wildcard $(srcdir)/VERSION > $(srcdir)/.git) > > + printf '#define VERSION "%s"\n' "$$(cd $(srcdir); sh > tools/version.sh)" > $@ > > > > -src/internal/version.lo: src/internal/version.h > > +$(objdir)/src/internal/version.lo: $(objdir)/src/internal/version.h > > > > -crt/rcrt1.o src/ldso/dlstart.lo src/ldso/dynlink.lo: > src/internal/dynlink.h arch/$(ARCH)/reloc.h > > +$(objdir)/crt/rcrt1.o $(objdir)/src/ldso/dlstart.lo > $(objdir)/src/ldso/dynlink.lo: $(srcdir)/src/internal/dynlink.h > $(srcdir)/arch/$(ARCH)/reloc.h > > > > -crt/crt1.o crt/Scrt1.o crt/rcrt1.o src/ldso/dlstart.lo: $(wildcard > arch/$(ARCH)/crt_arch.h) > > +$(objdir)/crt/crt1.o $(objdir)/crt/scrt1.o $(objdir)/crt/rcrt1.o > $(objdir)/src/ldso/dlstart.lo: $(srcdir)/arch/$(ARCH)/crt_arch.h > > > > -crt/rcrt1.o: src/ldso/dlstart.c > > +$(objdir)/crt/rcrt1.o: $(srcdir)/src/ldso/dlstart.c > > > > -crt/Scrt1.o crt/rcrt1.o: CFLAGS_ALL += -fPIC > > +$(objdir)/crt/Scrt1.o $(objdir)/crt/rcrt1.o: CFLAGS_ALL += -fPIC > > > > -OPTIMIZE_SRCS = $(wildcard $(OPTIMIZE_GLOBS:%=src/%)) > > -$(OPTIMIZE_SRCS:%.c=%.o) $(OPTIMIZE_SRCS:%.c=%.lo): CFLAGS += -O3 > > +OPTIMIZE_SRCS = $(wildcard $(OPTIMIZE_GLOBS:%=$(srcdir)/src/%)) > > +$(OPTIMIZE_SRCS:$(srcdir)/%.c=$(objdir)/%.o) > $(OPTIMIZE_SRCS:$(srcdir)/%.c=$(objdir)/%.lo): CFLAGS += -O3 > > > > MEMOPS_SRCS = src/string/memcpy.c src/string/memmove.c > src/string/memcmp.c src/string/memset.c > > -$(MEMOPS_SRCS:%.c=%.o) $(MEMOPS_SRCS:%.c=%.lo): CFLAGS_ALL += > $(CFLAGS_MEMOPS) > > +$(MEMOPS_SRCS:%.c=$(objdir)/%.o) $(MEMOPS_SRCS:%.c=$(objdir)/%.lo): > CFLAGS_ALL += $(CFLAGS_MEMOPS) > > > > NOSSP_SRCS = $(wildcard crt/*.c) \ > > - src/env/__libc_start_main.c src/env/__init_tls.c \ > > - src/thread/__set_thread_area.c src/env/__stack_chk_fail.c \ > > - src/string/memset.c src/string/memcpy.c \ > > - src/ldso/dlstart.c src/ldso/dynlink.c > > -$(NOSSP_SRCS:%.c=%.o) $(NOSSP_SRCS:%.c=%.lo): CFLAGS_ALL += > $(CFLAGS_NOSSP) > > - > > -$(CRT_LIBS:lib/%=crt/%): CFLAGS_ALL += -DCRT > > - > > -# This incantation ensures that changes to any subarch asm files will > > -# force the corresponding object file to be rebuilt, even if the > implicit > > -# rule below goes indirectly through a .sub file. > > -define mkasmdep > > -$(dir $(patsubst %/,%,$(dir $(1))))$(notdir $(1:.s=.o)): $(1) > > -endef > > -$(foreach s,$(wildcard src/*/$(ARCH)*/*.s),$(eval $(call > mkasmdep,$(s)))) > > Simply removing this will break dependency-based regeneration of > object files that use .sub files when the underlying .s file changes. > Maybe we don't care since .sub files will be removed soon, but it > should be noted as a regression for the time being, or we should just > transform this for out-of-tree support. > Reverted and update to work with the new setup. > > + $(srcdir)/src/env/__libc_start_main.c > $(srcdir)/src/env/__init_tls.c \ > > + $(srcdir)/src/thread/__set_thread_area.c > $(srcdir)/src/env/__stack_chk_fail.c \ > > + $(srcdir)/src/string/memset.c $(srcdir)/src/string/memcpy.c \ > > + $(srcdir)/src/ldso/dlstart.c $(srcdir)/src/ldso/dynlink.c > > It might make sense to use a function to apply a prefix to all of > these rather than repeating $(srcdir)/ over and over. > > > +$(NOSSP_SRCS:$(srcdir)/%.c=$(objdir)/%.o) > $(NOSSP_SRCS:$(srcdir)/%.c=$(objdir)/%.lo): CFLAGS_ALL += $(CFLAGS_NOSSP) > > Actually I think we don't even want $(srcdir) there to begin with. > It's just removed immediately. > Removed. > > + > > +$(CRT_LIBS:lib/%=$(objdir)/crt/%): CFLAGS_ALL += -DCRT > > I'm not clear on whether crti.o/crtn.o end up in crt/ or crt/$(ARCH)/ > but if it's the latter we need to handle this somehow. > These end up in crt/ even in the current upstream implementation. > > -%.lo: $(ARCH)$(ASMSUBARCH)/%.sub > > - $(CC) $(CFLAGS_ALL_SHARED) -c -o $@ $(dir $<)$(shell cat $<) > > +$(objdir)/%.lo: $(srcdir)/%.sub > > + $(CC) $(CFLAGS_ALL_SHARED) -c -o $@ $(dir $<)$(shell cat $<) > > Looks like you got a spurious space in there. > Removed. > > -lib/%.o: crt/%.o > > +lib/%.o: $(objdir)/crt/%.o > > cp $< $@ > > This also depends on crti.o/crtn.o not being in an arch subdir. > > > +$(DESTDIR)$(includedir)/bits/%: $(srcdir)/arch/$(ARCH)/bits/% > > + $(INSTALL) -D -m 644 $< $@ > > + > > $(DESTDIR)$(includedir)/bits/%: arch/$(ARCH)/bits/% > > $(INSTALL) -D -m 644 $< $@ > > This is the rule I mentioned above that doesn't seem to have any way > for make to know how to generate arch/$(ARCH)/bits/alltypes.h unless > it already happened to be generated. > Fixed. > > +# Get the musl source dir for out-of-tree builds > > I don't recall if I've followed this principle myself, but it probably > makes sense to avoid writing musl explicitly all over the configure > script in case someone goes and reuses parts of it for another > project. > Removed. > > +# > > +if test -z "$srcdir" ; then > > +srcdir="${0%/configure}" > > +stripdir srcdir > > +fi > > +abs_builddir="$(pwd)" || fail "$0: cannot determine working directory" > > +abs_srcdir="$(cd $srcdir && pwd)" || fail "$0: invalid source directory > $srcdir" > > +test "$abs_srcdir" = "$abs_builddir" && srcdir=. > > +ln -sf $srcdir/Makefile . > > Doesn't this do ln -sf ./Makefile . when srcdir=.? That needs to be > suppressed, and the ln should probably not happen until the configure > script has "succeeded", at the same time config.mak is generated. > Check added and moved to the bottom. of the configure script. --001a114844ec88dc7f0524d9c0fb Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
On Wed, Nov 18= , 2015 at 1:45 PM Rich Felker <dalias= @libc.org> wrote:
> -SRCS =3D $(sort $(wildcard src/*/*.c arch/$(ARCH)/src/*.c))
> -OBJS =3D $(SRCS:.c=3D.o)
> +BASE_SRCS =3D $(sort $(wildcard $(srcdir)/src/*/*.c $(srcdir)/arch/$(= ARCH)/src/*.c))
> +BASE_OBJS =3D $(BASE_SRCS:$(srcdir)/%.c=3D%.o)
> +ARCH_SRCS =3D $(wildcard $(srcdir)/src/*/$(ARCH)/*.s)
> +ARCH_OBJS =3D $(ARCH_SRCS:$(srcdir)/%.s=3D%.o)
> +SUB_SRCS =3D $(wildcard $(srcdir)/src/*/$(ARCH)$(ASMSUBARCH)/*.sub) > +SUB_OBJS =3D $(SUB_SRCS:$(srcdir)/%.sub=3D%.o)
> +EXCLUDE_ARCH_OBJS =3D $(patsubst $(srcdir)/%,%,$(subst /$(ARCH)/,/,$(= patsubst $(srcdir)/%,%,$(ARCH_OBJS))))
> +EXCLUDE_SUB_OBJS =3D $(patsubst $(srcdir)/%,%,$(subst /$(ARCH)$(ASMSU= BARCH)/,/,$(patsubst $(srcdir)/%,%,$(SUB_OBJS))))
> +OBJS =3D $(addprefix $(objdir)/, $(filter-out $(EXCLUDE_SUB_OBJS) $(E= XCLUDE_ARCH_OBJS), $(BASE_OBJS)) $(ARCH_OBJS) $(SUB_OBJS))

Why not just put all the arch files (whether they come from .s or
.sub, or in the future .c or .S) together in ARCH_OBJS? I think this
can all be done with no intermediate *_SRCS vars (and probably even
without SRCS) with some explicit $(patsubst...) etc. Actually I'm a
bit surprised if things like this work:

=C2=A0 =C2=A0 =C2=A0 =C2=A0 $(BASE_SRCS:$(srcdir)/%.c=3D%.o)

I had trouble with % in the middle of the pattern not doing what I
expected it to.

I have merged ARCH_* an= d SUB_* into ARCH_*.
=C2=A0
>=C2=A0 CFLAGS_ALL =3D $(CFLAGS_C99FSE)
> -CFLAGS_ALL +=3D -D_XOPEN_SOURCE=3D700 -I./arch/$(ARCH) -I./src/intern= al -I./include
> +CFLAGS_ALL +=3D -D_XOPEN_SOURCE=3D700 -I$(srcdir)/arch/$(ARCH) $(sort= -I$(objdir)/src/internal -I$(srcdir)/src/internal) $(sort -I$(objdir)/incl= ude -I$(srcdir)/include)

What is the $(sort...) for now? Before I thought it was to remove
duplicates, but now they will not be duplicates unless you're trying to support objdir=3D. -- is that your intent? I don't think it will
work based on our discussions yesterday.

Correct, this would only make sense if objdir=3D. but then the implicit r= ules wouldn't work so we don't need to support that scenario.
=
=C2=A0
>=C2=A0 clean:
> -=C2=A0 =C2=A0 =C2=A0rm -f crt/*.o
> +=C2=A0 =C2=A0 =C2=A0rm -f $(objdir)/crt/*.o
>=C2=A0 =C2=A0 =C2=A0 =C2=A0rm -f $(OBJS)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0rm -f $(LOBJS)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0rm -f $(ALL_LIBS) lib/*.[ao] lib/*.so

This can probably just be rm -rf obj, but perhaps we should wait to
make that change. And seeing this, I'm mildly in favor of hard-coding obj/ (everywhere) rather than using $(objdir)/ simply because the
latter is really dangerous if you override it on the command line with
an unwanted setting (like make clean objdir=3D/).

=
That's why I avoided using rm -rf $(objdir). I can imagine t= he use case for setting $(objdir) to a different location, changing this to= make it hard-coded wouldn't be a problem if you prefer.
=C2= =A0
> -include/bits:
> +$(objdir)/include/bits:
>=C2=A0 =C2=A0 =C2=A0 =C2=A0@test "$(ARCH)" || { echo "Pl= ease set ARCH in config.mak before running make." ; exit 1 ; }
>=C2=A0 =C2=A0 =C2=A0 =C2=A0ln -sf ../arch/$(ARCH)/bits $@

I think this may be problematic -- for an in-tree build, you'll get a bits symlink in the source include dir, and then out-of-tree builds
might use it. Include order might prevent that but it sounds fragile.
We should probably eliminate the bits symlink here.
I agree, if we're not going to support the objdir=3D. scen= ario, we can remove the symlink. It'll also simplify some of the direct= ory dependencies.
=C2=A0
> -include/bits/alltypes.h.in: include/bits
> -
> -include/bits/alltypes.h: include/bits/alltypes.h.in include/alltypes.h.in tools/mkalltypes.sed
> -=C2=A0 =C2=A0 =C2=A0sed -f tools/mkalltypes.sed include/bits/
alltypes.h.i= n include/alltypes.h.in > $@
> +$(objdir)/include/bits/alltypes.h: $(srcdir)/arch/$(ARCH)/bits/alltypes.h.= in $(srcdir)/include/alltypes.h.in $(srcdir)/tools/mkalltypes.sed $(objd= ir)/include/bits
> +=C2=A0 =C2=A0 =C2=A0sed -f $(srcdir)/tools/mkalltypes.sed $(srcdir)/a= rch/$(ARCH)/bits/alltypes.h.in $(srcdir)/include/alltypes.h.in > $@

So the generated alltypes.h goes in obj/include/bits? But the
installation rule does not seem to get it from there. It seems to only
look in arch/$(ARCH)/bits/%. I guess the above symlink causes them to
be the same, but I don't think there's actually a dependency in the=
makefile to let make know that...

That&= #39;s fixed, well spotted.
=C2=A0
> -src/internal/version.h: $(wildcard VERSION .git)
> -=C2=A0 =C2=A0 =C2=A0printf '#define VERSION "%s"\n'= "$$(sh tools/version.sh)" > $@
> +$(objdir)/src/internal/version.h: $(wildcard $(srcdir)/VERSION $(srcd= ir)/.git)
> +=C2=A0 =C2=A0 =C2=A0printf '#define VERSION "%s"\n'= "$$(cd $(srcdir); sh tools/version.sh)" > $@
>
> -src/internal/version.lo: src/internal/version.h
> +$(objdir)/src/internal/version.lo: $(objdir)/src/internal/version.h >
> -crt/rcrt1.o src/ldso/dlstart.lo src/ldso/dynlink.lo: src/internal/dyn= link.h arch/$(ARCH)/reloc.h
> +$(objdir)/crt/rcrt1.o $(objdir)/src/ldso/dlstart.lo $(objdir)/src/lds= o/dynlink.lo: $(srcdir)/src/internal/dynlink.h $(srcdir)/arch/$(ARCH)/reloc= .h
>
> -crt/crt1.o crt/Scrt1.o crt/rcrt1.o src/ldso/dlstart.lo: $(wildcard ar= ch/$(ARCH)/crt_arch.h)
> +$(objdir)/crt/crt1.o $(objdir)/crt/scrt1.o $(objdir)/crt/rcrt1.o $(ob= jdir)/src/ldso/dlstart.lo: $(srcdir)/arch/$(ARCH)/crt_arch.h
>
> -crt/rcrt1.o: src/ldso/dlstart.c
> +$(objdir)/crt/rcrt1.o: $(srcdir)/src/ldso/dlstart.c
>
> -crt/Scrt1.o crt/rcrt1.o: CFLAGS_ALL +=3D -fPIC
> +$(objdir)/crt/Scrt1.o $(objdir)/crt/rcrt1.o: CFLAGS_ALL +=3D -fPIC >
> -OPTIMIZE_SRCS =3D $(wildcard $(OPTIMIZE_GLOBS:%=3Dsrc/%))
> -$(OPTIMIZE_SRCS:%.c=3D%.o) $(OPTIMIZE_SRCS:%.c=3D%.lo): CFLAGS +=3D -= O3
> +OPTIMIZE_SRCS =3D $(wildcard $(OPTIMIZE_GLOBS:%=3D$(srcdir)/src/%)) > +$(OPTIMIZE_SRCS:$(srcdir)/%.c=3D$(objdir)/%.o) $(OPTIMIZE_SRCS:$(srcd= ir)/%.c=3D$(objdir)/%.lo): CFLAGS +=3D -O3
>
>=C2=A0 MEMOPS_SRCS =3D src/string/memcpy.c src/string/memmove.c src/str= ing/memcmp.c src/string/memset.c
> -$(MEMOPS_SRCS:%.c=3D%.o) $(MEMOPS_SRCS:%.c=3D%.lo): CFLAGS_ALL +=3D $= (CFLAGS_MEMOPS)
> +$(MEMOPS_SRCS:%.c=3D$(objdir)/%.o) $(MEMOPS_SRCS:%.c=3D$(objdir)/%.lo= ): CFLAGS_ALL +=3D $(CFLAGS_MEMOPS)
>
>=C2=A0 NOSSP_SRCS =3D $(wildcard crt/*.c) \
> -=C2=A0 =C2=A0 =C2=A0src/env/__libc_start_main.c src/env/__init_tls.c = \
> -=C2=A0 =C2=A0 =C2=A0src/thread/__set_thread_area.c src/env/__stack_ch= k_fail.c \
> -=C2=A0 =C2=A0 =C2=A0src/string/memset.c src/string/memcpy.c \
> -=C2=A0 =C2=A0 =C2=A0src/ldso/dlstart.c src/ldso/dynlink.c
> -$(NOSSP_SRCS:%.c=3D%.o) $(NOSSP_SRCS:%.c=3D%.lo): CFLAGS_ALL +=3D $(C= FLAGS_NOSSP)
> -
> -$(CRT_LIBS:lib/%=3Dcrt/%): CFLAGS_ALL +=3D -DCRT
> -
> -# This incantation ensures that changes to any subarch asm files will=
> -# force the corresponding object file to be rebuilt, even if the impl= icit
> -# rule below goes indirectly through a .sub file.
> -define mkasmdep
> -$(dir $(patsubst %/,%,$(dir $(1))))$(notdir $(1:.s=3D.o)): $(1)
> -endef
> -$(foreach s,$(wildcard src/*/$(ARCH)*/*.s),$(eval $(call mkasmdep,$(s= ))))

Simply removing this will break dependency-based regeneration of
object files that use .sub files when the underlying .s file changes.
Maybe we don't care since .sub files will be removed soon, but it
should be noted as a regression for the time being, or we should just
transform this for out-of-tree support.

Reverted and update to work with the new setup.
=C2=A0
> +=C2=A0 =C2=A0 =C2=A0$(srcdir)/src/env/__libc_start_main.c $(srcdir)/s= rc/env/__init_tls.c \
> +=C2=A0 =C2=A0 =C2=A0$(srcdir)/src/thread/__set_thread_area.c $(srcdir= )/src/env/__stack_chk_fail.c \
> +=C2=A0 =C2=A0 =C2=A0$(srcdir)/src/string/memset.c $(srcdir)/src/strin= g/memcpy.c \
> +=C2=A0 =C2=A0 =C2=A0$(srcdir)/src/ldso/dlstart.c $(srcdir)/src/ldso/d= ynlink.c

It might make sense to use a function to apply a prefix to all of
these rather than repeating $(srcdir)/ over and over.

> +$(NOSSP_SRCS:$(srcdir)/%.c=3D$(objdir)/%.o) $(NOSSP_SRCS:$(srcdir)/%.= c=3D$(objdir)/%.lo): CFLAGS_ALL +=3D $(CFLAGS_NOSSP)

Actually I think we don't even want $(srcdir) there to begin with.
It's just removed immediately.

Remo= ved.
=C2=A0
> +
> +$(CRT_LIBS:lib/%=3D$(objdir)/crt/%): CFLAGS_ALL +=3D -DCRT

I'm not clear on whether crti.o/crtn.o end up in crt/ or crt/$(ARCH)/ but if it's the latter we need to handle this somehow.
=

These end up in crt/ even in the current upstream imple= mentation.
=C2=A0
> -%.lo: $(ARCH)$(ASMSUBARCH)/%.sub
> -=C2=A0 =C2=A0 =C2=A0$(CC) $(CFLAGS_ALL_SHARED) -c -o $@ $(dir $<)$= (shell cat $<)
> +$(objdir)/%.lo: $(srcdir)/%.sub
> +=C2=A0 =C2=A0 =C2=A0 $(CC) $(CFLAGS_ALL_SHARED) -c -o $@ $(dir $<)= $(shell cat $<)

Looks like you got a spurious space in there.

Removed.
=C2=A0
> -lib/%.o: crt/%.o
> +lib/%.o: $(objdir)/crt/%.o
>=C2=A0 =C2=A0 =C2=A0 =C2=A0cp $< $@

This also depends on crti.o/crtn.o not being in an arch subdir.

> +$(DESTDIR)$(includedir)/bits/%: $(srcdir)/arch/$(ARCH)/bits/%
> +=C2=A0 =C2=A0 =C2=A0$(INSTALL) -D -m 644 $< $@
> +
>=C2=A0 $(DESTDIR)$(includedir)/bits/%: arch/$(ARCH)/bits/%
>=C2=A0 =C2=A0 =C2=A0 =C2=A0$(INSTALL) -D -m 644 $< $@

This is the rule I mentioned above that doesn't seem to have any way for make to know how to generate arch/$(ARCH)/bits/alltypes.h unless
it already happened to be generated.

Fi= xed.
=C2=A0
> +# Get the musl source dir for out-of-tree builds

I don't recall if I've followed this principle myself, but it proba= bly
makes sense to avoid writing musl explicitly all over the configure
script in case someone goes and reuses parts of it for another
project.

Removed.
=C2=A0
> +#
> +if test -z "$srcdir" ; then
> +srcdir=3D"${0%/configure}"
> +stripdir srcdir
> +fi
> +abs_builddir=3D"$(pwd)" || fail "$0: cannot determine = working directory"
> +abs_srcdir=3D"$(cd $srcdir && pwd)" || fail "$= 0: invalid source directory $srcdir"
> +test "$abs_srcdir" =3D "$abs_builddir" &&= srcdir=3D.
> +ln -sf $srcdir/Makefile .

Doesn't this do ln -sf ./Makefile . when srcdir=3D.? That needs to be suppressed, and the ln should probably not happen until the configure
script has "succeeded", at the same time config.mak is generated.=

Check added and moved to the bottom. o= f the configure script.
--001a114844ec88dc7f0524d9c0fb-- --001a114844ec88dc840524d9c0fd Content-Type: text/x-patch; charset=US-ASCII; name="support-out-of-tree-build.patch" Content-Disposition: attachment; filename="support-out-of-tree-build.patch" Content-Transfer-Encoding: base64 Content-ID: <1511d1e9362d265dd521> X-Attachment-Id: 1511d1e9362d265dd521 RnJvbSBhMGU1MmEwMzc0NGRkYzcyYTQ4MDNlZmJiMmNkOTA0ZDFmZjQwMTJjIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBQZXRyIEhvc2VrIDxwaG9zZWtAY2hyb21pdW0ub3JnPgpEYXRl OiBXZWQsIDE4IE5vdiAyMDE1IDEyOjA3OjMyIC0wODAwClN1YmplY3Q6IFtQQVRDSF0gc3VwcG9y dCBvdXQtb2YtdHJlZSBidWlsZAoKdGhpcyBjaGFuZ2UgYWRkIHN1cHBvcnQgZm9yIGJ1aWxkaW5n IG11c2wgb3V0c2lkZSBvZiB0aGUgc291cmNlCnRyZWUuIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBz aW1pbGFyIHRvIGF1dG90b29scyB3aGVyZSBydW5uaW5nCmNvbmZpZ3VyZSBpbiBhIGRpZmZlcmVu dCBmb2xkZXIgY3JlYXRlcyBjb25maWcubWFrIGluIHRoZSBjdXJyZW50CndvcmtpbmcgZGlyZWN0 b3J5IGFuZCBzeW1saW5rcyB0aGUgbWFrZWZpbGUsIHdoaWNoIGNvbnRhaW5zIHRoZQpsb2dpYyBm b3IgY3JlYXRpbmcgYWxsIG5lY2Vzc2FyeSBkaXJlY3RvcmllcyBhbmQgcmVzb2x2aW5nIHBhdGhz CnJlbGF0aXZlIHRvIHRoZSBzb3VyY2UgZGlyZWN0b3J5LgoKdG8gc3VwcG9ydCBib3RoIGluLXRy ZWUgYW5kIG91dC1vZi10cmVlIGJ1aWxkcyB3aXRoIGltcGxpY2l0IG1ha2UKcnVsZXMsIGFsbCBv YmplY3QgZmlsZXMgYXJlIG5vdyBwbGFjZWQgaW50byBhIHNlcGFyYXRlIGRpcmVjdG9yeS4KLS0t CiAuZ2l0aWdub3JlIHwgICAxICsKIE1ha2VmaWxlICAgfCAxMDkgKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogY29uZmlndXJlICB8 ICAyNSArKysrKysrKysrKystLQogMyBmaWxlcyBjaGFuZ2VkLCA4NiBpbnNlcnRpb25zKCspLCA0 OSBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS8uZ2l0aWdub3JlIGIvLmdpdGlnbm9yZQppbmRl eCBjNWQ1YzQ2Li4zNmRjNWY5IDEwMDY0NAotLS0gYS8uZ2l0aWdub3JlCisrKyBiLy5naXRpZ25v cmUKQEAgLTMsNiArMyw3IEBACiAqLmEKICouc28KICouc28uMQorb2JqCiBhcmNoLyovYml0cy9h bGx0eXBlcy5oCiBjb25maWcubWFrCiBpbmNsdWRlL2JpdHMKZGlmZiAtLWdpdCBhL01ha2VmaWxl IGIvTWFrZWZpbGUKaW5kZXggZGYyMGY5NC4uN2M4OTU0ZCAxMDA2NDQKLS0tIGEvTWFrZWZpbGUK KysrIGIvTWFrZWZpbGUKQEAgLTgsNiArOCw4IEBACiAjIERvIG5vdCBtYWtlIGNoYW5nZXMgaGVy ZS4KICMKIAorc3JjZGlyID0gLgorb2JqZGlyID0gb2JqCiBleGVjX3ByZWZpeCA9IC91c3IvbG9j YWwKIGJpbmRpciA9ICQoZXhlY19wcmVmaXgpL2JpbgogCkBAIC0xNiwxMiArMTgsMTYgQEAgaW5j bHVkZWRpciA9ICQocHJlZml4KS9pbmNsdWRlCiBsaWJkaXIgPSAkKHByZWZpeCkvbGliCiBzeXNs aWJkaXIgPSAvbGliCiAKLVNSQ1MgPSAkKHNvcnQgJCh3aWxkY2FyZCBzcmMvKi8qLmMgYXJjaC8k KEFSQ0gpL3NyYy8qLmMpKQotT0JKUyA9ICQoU1JDUzouYz0ubykKK0JBU0VfU1JDUyA9ICQoc29y dCAkKHdpbGRjYXJkICQoc3JjZGlyKS9zcmMvKi8qLmMgJChzcmNkaXIpL2FyY2gvJChBUkNIKS9z cmMvKi5jKSkKK0JBU0VfT0JKUyA9ICQocGF0c3Vic3QgJChzcmNkaXIpLyUuYywlLm8sJChCQVNF X1NSQ1MpKQorQVJDSF9TUkNTID0gJCh3aWxkY2FyZCAkKHNyY2Rpcikvc3JjLyovJChBUkNIKS8q LnMgJChzcmNkaXIpL3NyYy8qLyQoQVJDSCkkKEFTTVNVQkFSQ0gpLyouc3ViKQorQVJDSF9PQkpT ID0gJChwYXRzdWJzdCAkKHNyY2RpcikvJS5zdWIsJS5vLCQocGF0c3Vic3QgJChzcmNkaXIpLyUu cywlLm8sJChBUkNIX1NSQ1MpKSkKK0VYQ0xVREVfT0JKUyA9ICQocGF0c3Vic3QgJChzcmNkaXIp LyUsJSwkKHN1YnN0IC8kKEFSQ0gpJChBU01TVUJBUkNIKS8sLywkKHN1YnN0IC8kKEFSQ0gpLywv LCQocGF0c3Vic3QgJChzcmNkaXIpLyUsJSwkKEFSQ0hfT0JKUykpKSkpCitPQkpTID0gJChhZGRw cmVmaXggJChvYmpkaXIpLywgJChmaWx0ZXItb3V0ICQoRVhDTFVERV9PQkpTKSwgJChCQVNFX09C SlMpKSAkKEFSQ0hfT0JKUykgJChTVUJfT0JKUykpCiBMT0JKUyA9ICQoT0JKUzoubz0ubG8pCi1H RU5IID0gaW5jbHVkZS9iaXRzL2FsbHR5cGVzLmgKLUdFTkhfSU5UID0gc3JjL2ludGVybmFsL3Zl cnNpb24uaAotSU1QSCA9IHNyYy9pbnRlcm5hbC9zdGRpb19pbXBsLmggc3JjL2ludGVybmFsL3B0 aHJlYWRfaW1wbC5oIHNyYy9pbnRlcm5hbC9saWJjLmgKK0dFTkggPSAkKG9iamRpcikvaW5jbHVk ZS9iaXRzL2FsbHR5cGVzLmgKK0dFTkhfSU5UID0gJChvYmpkaXIpL3NyYy9pbnRlcm5hbC92ZXJz aW9uLmgKK0lNUEggPSAkKGFkZHByZWZpeCAkKHNyY2RpcikvLCBzcmMvaW50ZXJuYWwvc3RkaW9f aW1wbC5oIHNyYy9pbnRlcm5hbC9wdGhyZWFkX2ltcGwuaCBzcmMvaW50ZXJuYWwvbGliYy5oKQog CiBMREZMQUdTID0KIExERkxBR1NfQVVUTyA9CkBAIC0zMiw3ICszOCw3IEBAIENGTEFHU19BVVRP ID0gLU9zIC1waXBlCiBDRkxBR1NfQzk5RlNFID0gLXN0ZD1jOTkgLWZmcmVlc3RhbmRpbmcgLW5v c3RkaW5jIAogCiBDRkxBR1NfQUxMID0gJChDRkxBR1NfQzk5RlNFKQotQ0ZMQUdTX0FMTCArPSAt RF9YT1BFTl9TT1VSQ0U9NzAwIC1JLi9hcmNoLyQoQVJDSCkgLUkuL3NyYy9pbnRlcm5hbCAtSS4v aW5jbHVkZQorQ0ZMQUdTX0FMTCArPSAtRF9YT1BFTl9TT1VSQ0U9NzAwIC1JJChzcmNkaXIpL2Fy Y2gvJChBUkNIKSAtSSQob2JqZGlyKS9zcmMvaW50ZXJuYWwgLUkkKHNyY2Rpcikvc3JjL2ludGVy bmFsIC1JJChvYmpkaXIpL2luY2x1ZGUgLUkkKHNyY2RpcikvaW5jbHVkZQogQ0ZMQUdTX0FMTCAr PSAkKENQUEZMQUdTKSAkKENGTEFHU19BVVRPKSAkKENGTEFHUykKIENGTEFHU19BTExfU1RBVElD ID0gJChDRkxBR1NfQUxMKQogQ0ZMQUdTX0FMTF9TSEFSRUQgPSAkKENGTEFHU19BTEwpIC1mUElD IC1EU0hBUkVECkBAIC00MSwxMCArNDcsMTEgQEAgTERGTEFHU19BTEwgPSAkKExERkxBR1NfQVVU TykgJChMREZMQUdTKQogCiBBUiAgICAgID0gJChDUk9TU19DT01QSUxFKWFyCiBSQU5MSUIgID0g JChDUk9TU19DT01QSUxFKXJhbmxpYgotSU5TVEFMTCA9IC4vdG9vbHMvaW5zdGFsbC5zaAorSU5T VEFMTCA9ICQoc3JjZGlyKS90b29scy9pbnN0YWxsLnNoCiAKLUFSQ0hfSU5DTFVERVMgPSAkKHdp bGRjYXJkIGFyY2gvJChBUkNIKS9iaXRzLyouaCkKLUFMTF9JTkNMVURFUyA9ICQoc29ydCAkKHdp bGRjYXJkIGluY2x1ZGUvKi5oIGluY2x1ZGUvKi8qLmgpICQoR0VOSCkgJChBUkNIX0lOQ0xVREVT OmFyY2gvJChBUkNIKS8lPWluY2x1ZGUvJSkpCitBUkNIX0lOQ0xVREVTID0gJCh3aWxkY2FyZCAk KHNyY2RpcikvYXJjaC8kKEFSQ0gpL2JpdHMvKi5oKQorSU5DTFVERVMgPSAkKHdpbGRjYXJkICQo c3JjZGlyKS9pbmNsdWRlLyouaCAkKHNyY2RpcikvaW5jbHVkZS8qLyouaCkKK0FMTF9JTkNMVURF UyA9ICQoc29ydCAkKElOQ0xVREVTOiQoc3JjZGlyKS8lPSUpICQoR0VOSDokKG9iamRpcikvJT0l KSAkKEFSQ0hfSU5DTFVERVM6JChzcmNkaXIpL2FyY2gvJChBUkNIKS8lPWluY2x1ZGUvJSkpCiAK IEVNUFRZX0xJQl9OQU1FUyA9IG0gcnQgcHRocmVhZCBjcnlwdCB1dGlsIHhuZXQgcmVzb2x2IGRs CiBFTVBUWV9MSUJTID0gJChFTVBUWV9MSUJfTkFNRVM6JT1saWIvbGliJS5hKQpAQCAtNjQsMTAg KzcxLDIyIEBAIExEU09fUEFUSE5BTUUgPSAkKHN5c2xpYmRpcikvbGQtbXVzbC0kKEFSQ0gpJChT VUJBUkNIKS5zby4xCiAKIGFsbDogJChBTExfTElCUykgJChBTExfVE9PTFMpCiAKKyQoQUxMX0xJ QlMpOiB8IGxpYi8KKyQoQUxMX1RPT0xTKTogfCB0b29scy8KKyQoQ1JUX0xJQlM6bGliLyU9JChv YmpkaXIpL2NydC8lKTogfCAkKG9iamRpcikvY3J0LworJChPQkpTKSAkKExPQkpTKTogfCAkKHNv cnQgJChkaXIgJChPQkpTKSkpCiskKEdFTkgpOiB8ICQob2JqZGlyKS9pbmNsdWRlL2JpdHMvCisk KEdFTkhfSU5UKTogfCAkKG9iamRpcikvc3JjL2ludGVybmFsLworCitTUkNfRElSUyA9ICQoc29y dCAkKGRpciAkKEFMTF9MSUJTKSAkKEFMTF9UT09MUykgJChPQkpTKSAkKEdFTkgpICQoR0VOSF9J TlQpKSAkKGFkZHByZWZpeCAkKG9iamRpcikvLCBjcnQvIGluY2x1ZGUvKSkKKworJChTUkNfRElS Uyk6CisJbWtkaXIgLXAgJEAKKwogaW5zdGFsbDogaW5zdGFsbC1saWJzIGluc3RhbGwtaGVhZGVy cyBpbnN0YWxsLXRvb2xzCiAKIGNsZWFuOgotCXJtIC1mIGNydC8qLm8KKwlybSAtZiAkKG9iamRp cikvY3J0LyoubwogCXJtIC1mICQoT0JKUykKIAlybSAtZiAkKExPQkpTKQogCXJtIC1mICQoQUxM X0xJQlMpIGxpYi8qLlthb10gbGliLyouc28KQEAgLTc4LDc1ICs5Nyw3MCBAQCBjbGVhbjoKIGRp c3RjbGVhbjogY2xlYW4KIAlybSAtZiBjb25maWcubWFrCiAKLWluY2x1ZGUvYml0czoKLQlAdGVz dCAiJChBUkNIKSIgfHwgeyBlY2hvICJQbGVhc2Ugc2V0IEFSQ0ggaW4gY29uZmlnLm1hayBiZWZv cmUgcnVubmluZyBtYWtlLiIgOyBleGl0IDEgOyB9Ci0JbG4gLXNmIC4uL2FyY2gvJChBUkNIKS9i aXRzICRACi0KLWluY2x1ZGUvYml0cy9hbGx0eXBlcy5oLmluOiBpbmNsdWRlL2JpdHMKKyQob2Jq ZGlyKS9pbmNsdWRlL2JpdHMvYWxsdHlwZXMuaDogJChzcmNkaXIpL2FyY2gvJChBUkNIKS9iaXRz L2FsbHR5cGVzLmguaW4gJChzcmNkaXIpL2luY2x1ZGUvYWxsdHlwZXMuaC5pbiAkKHNyY2Rpcikv dG9vbHMvbWthbGx0eXBlcy5zZWQgJChvYmpkaXIpL2luY2x1ZGUvYml0cworCXNlZCAtZiAkKHNy Y2RpcikvdG9vbHMvbWthbGx0eXBlcy5zZWQgJChzcmNkaXIpL2FyY2gvJChBUkNIKS9iaXRzL2Fs bHR5cGVzLmguaW4gJChzcmNkaXIpL2luY2x1ZGUvYWxsdHlwZXMuaC5pbiA+ICRACiAKLWluY2x1 ZGUvYml0cy9hbGx0eXBlcy5oOiBpbmNsdWRlL2JpdHMvYWxsdHlwZXMuaC5pbiBpbmNsdWRlL2Fs bHR5cGVzLmguaW4gdG9vbHMvbWthbGx0eXBlcy5zZWQKLQlzZWQgLWYgdG9vbHMvbWthbGx0eXBl cy5zZWQgaW5jbHVkZS9iaXRzL2FsbHR5cGVzLmguaW4gaW5jbHVkZS9hbGx0eXBlcy5oLmluID4g JEAKKyQob2JqZGlyKS9zcmMvaW50ZXJuYWwvdmVyc2lvbi5oOiAkKHdpbGRjYXJkICQoc3JjZGly KS9WRVJTSU9OICQoc3JjZGlyKS8uZ2l0KQorCXByaW50ZiAnI2RlZmluZSBWRVJTSU9OICIlcyJc bicgIiQkKGNkICQoc3JjZGlyKTsgc2ggdG9vbHMvdmVyc2lvbi5zaCkiID4gJEAKIAotc3JjL2lu dGVybmFsL3ZlcnNpb24uaDogJCh3aWxkY2FyZCBWRVJTSU9OIC5naXQpCi0JcHJpbnRmICcjZGVm aW5lIFZFUlNJT04gIiVzIlxuJyAiJCQoc2ggdG9vbHMvdmVyc2lvbi5zaCkiID4gJEAKKyQob2Jq ZGlyKS9zcmMvaW50ZXJuYWwvdmVyc2lvbi5vICQob2JqZGlyKS9zcmMvaW50ZXJuYWwvdmVyc2lv bi5sbzogJChvYmpkaXIpL3NyYy9pbnRlcm5hbC92ZXJzaW9uLmgKIAotc3JjL2ludGVybmFsL3Zl cnNpb24ubyBzcmMvaW50ZXJuYWwvdmVyc2lvbi5sbzogc3JjL2ludGVybmFsL3ZlcnNpb24uaAor JChvYmpkaXIpL2NydC9yY3J0MS5vICQob2JqZGlyKS9zcmMvbGRzby9kbHN0YXJ0LmxvICQob2Jq ZGlyKS9zcmMvbGRzby9keW5saW5rLmxvOiAkKHNyY2Rpcikvc3JjL2ludGVybmFsL2R5bmxpbmsu aCAkKHNyY2RpcikvYXJjaC8kKEFSQ0gpL3JlbG9jLmgKIAotY3J0L3JjcnQxLm8gc3JjL2xkc28v ZGxzdGFydC5sbyBzcmMvbGRzby9keW5saW5rLmxvOiBzcmMvaW50ZXJuYWwvZHlubGluay5oIGFy Y2gvJChBUkNIKS9yZWxvYy5oCiskKG9iamRpcikvY3J0L2NydDEubyAkKG9iamRpcikvY3J0L3Nj cnQxLm8gJChvYmpkaXIpL2NydC9yY3J0MS5vICQob2JqZGlyKS9zcmMvbGRzby9kbHN0YXJ0Lmxv OiAkKHNyY2RpcikvYXJjaC8kKEFSQ0gpL2NydF9hcmNoLmgKIAotY3J0L2NydDEubyBjcnQvU2Ny dDEubyBjcnQvcmNydDEubyBzcmMvbGRzby9kbHN0YXJ0LmxvOiAkKHdpbGRjYXJkIGFyY2gvJChB UkNIKS9jcnRfYXJjaC5oKQorJChvYmpkaXIpL2NydC9yY3J0MS5vOiAkKHNyY2Rpcikvc3JjL2xk c28vZGxzdGFydC5jCiAKLWNydC9yY3J0MS5vOiBzcmMvbGRzby9kbHN0YXJ0LmMKKyQob2JqZGly KS9jcnQvU2NydDEubyAkKG9iamRpcikvY3J0L3JjcnQxLm86IENGTEFHU19BTEwgKz0gLWZQSUMK IAotY3J0L1NjcnQxLm8gY3J0L3JjcnQxLm86IENGTEFHU19BTEwgKz0gLWZQSUMKLQotT1BUSU1J WkVfU1JDUyA9ICQod2lsZGNhcmQgJChPUFRJTUlaRV9HTE9CUzolPXNyYy8lKSkKLSQoT1BUSU1J WkVfU1JDUzolLmM9JS5vKSAkKE9QVElNSVpFX1NSQ1M6JS5jPSUubG8pOiBDRkxBR1MgKz0gLU8z CitPUFRJTUlaRV9TUkNTID0gJCh3aWxkY2FyZCAkKE9QVElNSVpFX0dMT0JTOiU9JChzcmNkaXIp L3NyYy8lKSkKKyQoT1BUSU1JWkVfU1JDUzokKHNyY2RpcikvJS5jPSQob2JqZGlyKS8lLm8pICQo T1BUSU1JWkVfU1JDUzokKHNyY2RpcikvJS5jPSQob2JqZGlyKS8lLmxvKTogQ0ZMQUdTICs9IC1P MwogCiBNRU1PUFNfU1JDUyA9IHNyYy9zdHJpbmcvbWVtY3B5LmMgc3JjL3N0cmluZy9tZW1tb3Zl LmMgc3JjL3N0cmluZy9tZW1jbXAuYyBzcmMvc3RyaW5nL21lbXNldC5jCi0kKE1FTU9QU19TUkNT OiUuYz0lLm8pICQoTUVNT1BTX1NSQ1M6JS5jPSUubG8pOiBDRkxBR1NfQUxMICs9ICQoQ0ZMQUdT X01FTU9QUykKKyQoTUVNT1BTX1NSQ1M6JS5jPSQob2JqZGlyKS8lLm8pICQoTUVNT1BTX1NSQ1M6 JS5jPSQob2JqZGlyKS8lLmxvKTogQ0ZMQUdTX0FMTCArPSAkKENGTEFHU19NRU1PUFMpCiAKIE5P U1NQX1NSQ1MgPSAkKHdpbGRjYXJkIGNydC8qLmMpIFwKIAlzcmMvZW52L19fbGliY19zdGFydF9t YWluLmMgc3JjL2Vudi9fX2luaXRfdGxzLmMgXAogCXNyYy90aHJlYWQvX19zZXRfdGhyZWFkX2Fy ZWEuYyBzcmMvZW52L19fc3RhY2tfY2hrX2ZhaWwuYyBcCiAJc3JjL3N0cmluZy9tZW1zZXQuYyBz cmMvc3RyaW5nL21lbWNweS5jIFwKIAlzcmMvbGRzby9kbHN0YXJ0LmMgc3JjL2xkc28vZHlubGlu ay5jCi0kKE5PU1NQX1NSQ1M6JS5jPSUubykgJChOT1NTUF9TUkNTOiUuYz0lLmxvKTogQ0ZMQUdT X0FMTCArPSAkKENGTEFHU19OT1NTUCkKKyQoTk9TU1BfU1JDUzolLmM9JChvYmpkaXIpLyUubykg JChOT1NTUF9TUkNTOiUuYz0kKG9iamRpcikvJS5sbyk6IENGTEFHU19BTEwgKz0gJChDRkxBR1Nf Tk9TU1ApCiAKLSQoQ1JUX0xJQlM6bGliLyU9Y3J0LyUpOiBDRkxBR1NfQUxMICs9IC1EQ1JUCisk KENSVF9MSUJTOmxpYi8lPSQob2JqZGlyKS9jcnQvJSk6IENGTEFHU19BTEwgKz0gLURDUlQKIAog IyBUaGlzIGluY2FudGF0aW9uIGVuc3VyZXMgdGhhdCBjaGFuZ2VzIHRvIGFueSBzdWJhcmNoIGFz bSBmaWxlcyB3aWxsCiAjIGZvcmNlIHRoZSBjb3JyZXNwb25kaW5nIG9iamVjdCBmaWxlIHRvIGJl IHJlYnVpbHQsIGV2ZW4gaWYgdGhlIGltcGxpY2l0CiAjIHJ1bGUgYmVsb3cgZ29lcyBpbmRpcmVj dGx5IHRocm91Z2ggYSAuc3ViIGZpbGUuCisjJChkaXIgJChwYXRzdWJzdCAlLywlLCQoZGlyICQo MSkpKSkkKG5vdGRpciAkKDE6LnM9Lm8pKTogJCgxKQogZGVmaW5lIG1rYXNtZGVwCi0kKGRpciAk KHBhdHN1YnN0ICUvLCUsJChkaXIgJCgxKSkpKSQobm90ZGlyICQoMToucz0ubykpOiAkKDEpCisk KHBhdHN1YnN0ICQoc3JjZGlyKS8lLCQob2JqZGlyKS8lLCQoZGlyICQocGF0c3Vic3QgJS8sJSwk KGRpciAkKDEpKSkpJChBUkNIKSQoQVNNU1VCQVJDSCkvJChub3RkaXIgJCgxOi5zPS5vKSkpOiAk KDEpCiBlbmRlZgotJChmb3JlYWNoIHMsJCh3aWxkY2FyZCBzcmMvKi8kKEFSQ0gpKi8qLnMpLCQo ZXZhbCAkKGNhbGwgbWthc21kZXAsJChzKSkpKQorJChmb3JlYWNoIHMsJCh3aWxkY2FyZCAkKHNy Y2Rpcikvc3JjLyovJChBUkNIKSovKi5zKSwkKGV2YWwgJChjYWxsIG1rYXNtZGVwLCQocykpKSkK IAogIyBDaG9vc2UgaW52b2NhdGlvbiBvZiBhc3NlbWJsZXIgdG8gYmUgdXNlZAogIyAkKDEpIGlz IGlucHV0IGZpbGUsICQoMikgaXMgb3V0cHV0IGZpbGUsICQoMykgaXMgYXNzZW1ibGVyIGZsYWdz CiBpZmVxICgkKEFERF9DRkkpLHllcykKLQlBU19DTUQgPSBMQ19BTEw9QyBhd2sgLWYgdG9vbHMv YWRkLWNmaS5jb21tb24uYXdrIC1mIHRvb2xzL2FkZC1jZmkuJChBUkNIKS5hd2sgJDwgfCAkKEND KSAteCBhc3NlbWJsZXIgLWMgLW8gJEAgLQorCUFTX0NNRCA9IExDX0FMTD1DIGF3ayAtZiAkKHNy Y2RpcikvdG9vbHMvYWRkLWNmaS5jb21tb24uYXdrIC1mICQoc3JjZGlyKS90b29scy9hZGQtY2Zp LiQoQVJDSCkuYXdrICQ8IHwgJChDQykgLXggYXNzZW1ibGVyIC1jIC1vICRAIC0KIGVsc2UKIAlB U19DTUQgPSAkKENDKSAtYyAtbyAkQCAkPAogZW5kaWYKIAotJS5vOiAkKEFSQ0gpJChBU01TVUJB UkNIKS8lLnN1YgorJChvYmpkaXIpLyUubzogJChzcmNkaXIpLyUuc3ViCiAJJChDQykgJChDRkxB R1NfQUxMX1NUQVRJQykgLWMgLW8gJEAgJChkaXIgJDwpJChzaGVsbCBjYXQgJDwpCiAKLSUubzog JChBUkNIKS8lLnMKKyQob2JqZGlyKS8lLm86ICQoc3JjZGlyKS8lLnMKIAkkKEFTX0NNRCkgJChD RkxBR1NfQUxMX1NUQVRJQykKIAotJS5vOiAlLmMgJChHRU5IKSAkKElNUEgpCiskKG9iamRpcikv JS5vOiAkKHNyY2RpcikvJS5jICQoR0VOSCkgJChJTVBIKQogCSQoQ0MpICQoQ0ZMQUdTX0FMTF9T VEFUSUMpIC1jIC1vICRAICQ8CiAKLSUubG86ICQoQVJDSCkkKEFTTVNVQkFSQ0gpLyUuc3ViCisk KG9iamRpcikvJS5sbzogJChzcmNkaXIpLyUuc3ViCiAJJChDQykgJChDRkxBR1NfQUxMX1NIQVJF RCkgLWMgLW8gJEAgJChkaXIgJDwpJChzaGVsbCBjYXQgJDwpCiAKLSUubG86ICQoQVJDSCkvJS5z CiskKG9iamRpcikvJS5sbzogJChzcmNkaXIpLyUucwogCSQoQVNfQ01EKSAkKENGTEFHU19BTExf U0hBUkVEKQogCi0lLmxvOiAlLmMgJChHRU5IKSAkKElNUEgpCiskKG9iamRpcikvJS5sbzogJChz cmNkaXIpLyUuYyAkKEdFTkgpICQoSU1QSCkKIAkkKENDKSAkKENGTEFHU19BTExfU0hBUkVEKSAt YyAtbyAkQCAkPAogCiBsaWIvbGliYy5zbzogJChMT0JKUykKQEAgLTE2MywxNyArMTc3LDE3IEBA ICQoRU1QVFlfTElCUyk6CiAJcm0gLWYgJEAKIAkkKEFSKSByYyAkQAogCi1saWIvJS5vOiBjcnQv JS5vCitsaWIvJS5vOiAkKG9iamRpcikvY3J0LyUubwogCWNwICQ8ICRACiAKLWxpYi9tdXNsLWdj Yy5zcGVjczogdG9vbHMvbXVzbC1nY2Muc3BlY3Muc2ggY29uZmlnLm1haworbGliL211c2wtZ2Nj LnNwZWNzOiAkKHNyY2RpcikvdG9vbHMvbXVzbC1nY2Muc3BlY3Muc2ggY29uZmlnLm1hawogCXNo ICQ8ICIkKGluY2x1ZGVkaXIpIiAiJChsaWJkaXIpIiAiJChMRFNPX1BBVEhOQU1FKSIgPiAkQAog CiB0b29scy9tdXNsLWdjYzogY29uZmlnLm1hawogCXByaW50ZiAnIyEvYmluL3NoXG5leGVjICIk JHtSRUFMR0NDOi0kKFdSQVBDQ19HQ0MpfSIgIiQkQCIgLXNwZWNzICIlcy9tdXNsLWdjYy5zcGVj cyJcbicgIiQobGliZGlyKSIgPiAkQAogCWNobW9kICt4ICRACiAKLXRvb2xzLyUtY2xhbmc6IHRv b2xzLyUtY2xhbmcuaW4gY29uZmlnLm1hawordG9vbHMvJS1jbGFuZzogJChzcmNkaXIpL3Rvb2xz LyUtY2xhbmcuaW4gY29uZmlnLm1hawogCXNlZCAtZSAncyFAQ0NAISQoV1JBUENDX0NMQU5HKSFn JyAtZSAncyFAUFJFRklYQCEkKHByZWZpeCkhZycgLWUgJ3MhQElOQ0RJUkAhJChpbmNsdWRlZGly KSFnJyAtZSAncyFATElCRElSQCEkKGxpYmRpcikhZycgLWUgJ3MhQExEU09AISQoTERTT19QQVRI TkFNRSkhZycgJDwgPiAkQAogCWNobW9kICt4ICRACiAKQEAgLTE4NiwxMCArMjAwLDEzIEBAICQo REVTVERJUikkKGxpYmRpcikvJS5zbzogbGliLyUuc28KICQoREVTVERJUikkKGxpYmRpcikvJTog bGliLyUKIAkkKElOU1RBTEwpIC1EIC1tIDY0NCAkPCAkQAogCi0kKERFU1RESVIpJChpbmNsdWRl ZGlyKS9iaXRzLyU6IGFyY2gvJChBUkNIKS9iaXRzLyUKKyQoREVTVERJUikkKGluY2x1ZGVkaXIp L2JpdHMvJTogJChzcmNkaXIpL2FyY2gvJChBUkNIKS9iaXRzLyUKKwkkKElOU1RBTEwpIC1EIC1t IDY0NCAkPCAkQAorCiskKERFU1RESVIpJChpbmNsdWRlZGlyKS9iaXRzLyU6ICQob2JqZGlyKS9p bmNsdWRlL2JpdHMvJQogCSQoSU5TVEFMTCkgLUQgLW0gNjQ0ICQ8ICRACiAKLSQoREVTVERJUikk KGluY2x1ZGVkaXIpLyU6IGluY2x1ZGUvJQorJChERVNURElSKSQoaW5jbHVkZWRpcikvJTogJChz cmNkaXIpL2luY2x1ZGUvJQogCSQoSU5TVEFMTCkgLUQgLW0gNjQ0ICQ8ICRACiAKICQoREVTVERJ UikkKExEU09fUEFUSE5BTUUpOiAkKERFU1RESVIpJChsaWJkaXIpL2xpYmMuc28KQEAgLTIwMiw5 ICsyMTksOSBAQCBpbnN0YWxsLWhlYWRlcnM6ICQoQUxMX0lOQ0xVREVTOmluY2x1ZGUvJT0kKERF U1RESVIpJChpbmNsdWRlZGlyKS8lKQogaW5zdGFsbC10b29sczogJChBTExfVE9PTFM6dG9vbHMv JT0kKERFU1RESVIpJChiaW5kaXIpLyUpCiAKIG11c2wtZ2l0LSUudGFyLmd6OiAuZ2l0Ci0JIGdp dCBhcmNoaXZlIC0tZm9ybWF0PXRhci5neiAtLXByZWZpeD0kKHBhdHN1YnN0ICUudGFyLmd6LCUs JEApLyAtbyAkQCAkKHBhdHN1YnN0IG11c2wtZ2l0LSUudGFyLmd6LCUsJEApCisJIGdpdCAtLWdp dC1kaXI9JChzcmNkaXIpLy5naXQgYXJjaGl2ZSAtLWZvcm1hdD10YXIuZ3ogLS1wcmVmaXg9JChw YXRzdWJzdCAlLnRhci5neiwlLCRAKS8gLW8gJEAgJChwYXRzdWJzdCBtdXNsLWdpdC0lLnRhci5n eiwlLCRAKQogCiBtdXNsLSUudGFyLmd6OiAuZ2l0Ci0JIGdpdCBhcmNoaXZlIC0tZm9ybWF0PXRh ci5neiAtLXByZWZpeD0kKHBhdHN1YnN0ICUudGFyLmd6LCUsJEApLyAtbyAkQCB2JChwYXRzdWJz dCBtdXNsLSUudGFyLmd6LCUsJEApCisJIGdpdCAtLWdpdC1kaXI9JChzcmNkaXIpLy5naXQgYXJj aGl2ZSAtLWZvcm1hdD10YXIuZ3ogLS1wcmVmaXg9JChwYXRzdWJzdCAlLnRhci5neiwlLCRAKS8g LW8gJEAgdiQocGF0c3Vic3QgbXVzbC0lLnRhci5neiwlLCRAKQogCiAuUEhPTlk6IGFsbCBjbGVh biBpbnN0YWxsIGluc3RhbGwtbGlicyBpbnN0YWxsLWhlYWRlcnMgaW5zdGFsbC10b29scwpkaWZm IC0tZ2l0IGEvY29uZmlndXJlIGIvY29uZmlndXJlCmluZGV4IGVlMjE3NzEuLjBmYWMzMDQgMTAw NzU1Ci0tLSBhL2NvbmZpZ3VyZQorKysgYi9jb25maWd1cmUKQEAgLTksNiArOSw5IEBAIFZBUj1W QUxVRS4gIFNlZSBiZWxvdyBmb3IgZGVzY3JpcHRpb25zIG9mIHNvbWUgb2YgdGhlIHVzZWZ1bCB2 YXJpYWJsZXMuCiAKIERlZmF1bHRzIGZvciB0aGUgb3B0aW9ucyBhcmUgc3BlY2lmaWVkIGluIGJy YWNrZXRzLgogCitDb25maWd1cmF0aW9uOgorICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBzb3Vy Y2UgZGlyZWN0b3J5IFtkZXRlY3RlZF0KKwogSW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzOgogICAt LXByZWZpeD1QUkVGSVggICAgICAgICBtYWluIGluc3RhbGxhdGlvbiBwcmVmaXggWy91c3IvbG9j YWwvbXVzbF0KICAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbGF0aW9uIHByZWZpeCBm b3IgZXhlY3V0YWJsZSBmaWxlcyBbUFJFRklYXQpAQCAtMTE3LDYgKzEyMCw3IEBAIENGTEFHU19U Ulk9CiBMREZMQUdTX0FVVE89CiBMREZMQUdTX1RSWT0KIE9QVElNSVpFX0dMT0JTPQorc3JjZGly PQogcHJlZml4PS91c3IvbG9jYWwvbXVzbAogZXhlY19wcmVmaXg9JyQocHJlZml4KScKIGJpbmRp cj0nJChleGVjX3ByZWZpeCkvYmluJwpAQCAtMTM5LDYgKzE0Myw3IEBAIGNsYW5nX3dyYXBwZXI9 bm8KIGZvciBhcmcgOyBkbwogY2FzZSAiJGFyZyIgaW4KIC0taGVscCkgdXNhZ2UgOzsKKy0tc3Jj ZGlyPSopIHNyY2Rpcj0ke2FyZyMqPX0gOzsKIC0tcHJlZml4PSopIHByZWZpeD0ke2FyZyMqPX0g OzsKIC0tZXhlYy1wcmVmaXg9KikgZXhlY19wcmVmaXg9JHthcmcjKj19IDs7CiAtLWJpbmRpcj0q KSBiaW5kaXI9JHthcmcjKj19IDs7CkBAIC0xNzksMTEgKzE4NCwyMiBAQCBMSUJDQz0qKSBMSUJD Qz0ke2FyZyMqPX0gOzsKIGVzYWMKIGRvbmUKIAotZm9yIGkgaW4gcHJlZml4IGV4ZWNfcHJlZml4 IGJpbmRpciBsaWJkaXIgaW5jbHVkZWRpciBzeXNsaWJkaXIgOyBkbworZm9yIGkgaW4gc3JjZGly IHByZWZpeCBleGVjX3ByZWZpeCBiaW5kaXIgbGliZGlyIGluY2x1ZGVkaXIgc3lzbGliZGlyIDsg ZG8KIHN0cmlwZGlyICRpCiBkb25lCiAKICMKKyMgR2V0IHRoZSBzb3VyY2UgZGlyIGZvciBvdXQt b2YtdHJlZSBidWlsZHMKKyMKK2lmIHRlc3QgLXogIiRzcmNkaXIiIDsgdGhlbgorc3JjZGlyPSIk ezAlL2NvbmZpZ3VyZX0iCitzdHJpcGRpciBzcmNkaXIKK2ZpCithYnNfYnVpbGRkaXI9IiQocHdk KSIgfHwgZmFpbCAiJDA6IGNhbm5vdCBkZXRlcm1pbmUgd29ya2luZyBkaXJlY3RvcnkiCithYnNf c3JjZGlyPSIkKGNkICRzcmNkaXIgJiYgcHdkKSIgfHwgZmFpbCAiJDA6IGludmFsaWQgc291cmNl IGRpcmVjdG9yeSAkc3JjZGlyIgordGVzdCAiJGFic19zcmNkaXIiID0gIiRhYnNfYnVpbGRkaXIi ICYmIHNyY2Rpcj0uCisKKyMKICMgR2V0IGEgdGVtcCBmaWxlbmFtZSB3ZSBjYW4gdXNlCiAjCiBp PTAKQEAgLTMyMSw3ICszMzcsNyBAQCBfX2F0dHJpYnV0ZV9fKChfX21heV9hbGlhc19fKSkKICNl bmRpZgogeDsKIEVPRgotaWYgJENDICRDRkxBR1NfQzk5RlNFIC1JLi9hcmNoLyRBUkNIIC1JLi9p bmNsdWRlICRDUFBGTEFHUyAkQ0ZMQUdTIFwKK2lmICRDQyAkQ0ZMQUdTX0M5OUZTRSAtSSRzcmNk aXIvYXJjaC8kQVJDSCAtSSRzcmNkaXIvaW5jbHVkZSAkQ1BQRkxBR1MgJENGTEFHUyBcCiAgIC1j IC1vIC9kZXYvbnVsbCAiJHRtcGMiID4vZGV2L251bGwgMj4mMSA7IHRoZW4KIHByaW50ZiAibm9c biIKIGVsc2UKQEAgLTYyNSw3ICs2NDEsNyBAQCBlY2hvICcjaW5jbHVkZSA8ZmxvYXQuaD4nID4g IiR0bXBjIgogZWNobyAnI2lmIExEQkxfTUFOVF9ESUcgPT0gNTMnID4+ICIkdG1wYyIKIGVjaG8g J3R5cGVkZWYgY2hhciBsZGNoZWNrWzktKGludClzaXplb2YobG9uZyBkb3VibGUpXTsnID4+ICIk dG1wYyIKIGVjaG8gJyNlbmRpZicgPj4gIiR0bXBjIgotaWYgJENDICRDRkxBR1NfQzk5RlNFIC1J Li9hcmNoLyRBUkNIIC1JLi9pbmNsdWRlICRDUFBGTEFHUyAkQ0ZMQUdTIFwKK2lmICRDQyAkQ0ZM QUdTX0M5OUZTRSAtSSRzcmNkaXIvYXJjaC8kQVJDSCAtSSRzcmNkaXIvaW5jbHVkZSAkQ1BQRkxB R1MgJENGTEFHUyBcCiAgIC1jIC1vIC9kZXYvbnVsbCAiJHRtcGMiID4vZGV2L251bGwgMj4mMSA7 IHRoZW4KIHByaW50ZiAieWVzXG4iCiBlbHNlCkBAIC02NDgsNiArNjY0LDcgQEAgY2F0IDw8IEVP RgogQVJDSCA9ICRBUkNICiBTVUJBUkNIID0gJFNVQkFSQ0gKIEFTTVNVQkFSQ0ggPSAkQVNNU1VC QVJDSAorc3JjZGlyID0gJHNyY2RpcgogcHJlZml4ID0gJHByZWZpeAogZXhlY19wcmVmaXggPSAk ZXhlY19wcmVmaXgKIGJpbmRpciA9ICRiaW5kaXIKQEAgLTY3Niw0ICs2OTMsNiBAQCB0ZXN0ICJ4 JGNjX2ZhbWlseSIgPSB4Z2NjICYmIGVjaG8gJ1dSQVBDQ19HQ0MgPSAkKENDKScKIHRlc3QgIngk Y2NfZmFtaWx5IiA9IHhjbGFuZyAmJiBlY2hvICdXUkFQQ0NfQ0xBTkcgPSAkKENDKScKIGV4ZWMg MT4mMyAzPiYtCiAKK3Rlc3QgLWYgTWFrZWZpbGUgfHwgbG4gLXNmICRzcmNkaXIvTWFrZWZpbGUg LgorCiBwcmludGYgImRvbmVcbiIKLS0gCjIuNi4wLnJjMi4yMzAuZzNkZDE1YzAKCg== --001a114844ec88dc840524d9c0fd--