* Out-of-tree builds
@ 2014-02-06 17:15 Oliver Schneider
2014-02-06 17:39 ` Szabolcs Nagy
0 siblings, 1 reply; 11+ messages in thread
From: Oliver Schneider @ 2014-02-06 17:15 UTC (permalink / raw)
To: musl
Hi,
currently I am trying to perform an out-of-tree build on musl and I am
hitting a problem.
When I run this (in-tree) it works fine:
./configure --disable-shared
however, then I switch to an empty directory and run this:
../musl/configure --disable-shared
I get:
using compiler runtime libraries: -lgcc -lgcc_eh
checking whether compiler's long double definition matches float.h... no
../musl/configure: error: unsupported long double type
Are out-of-tree builds generally not supported, or am I doing something
wrong?
I am using the Git repository and it's checked out at:
b589fb4 release 0.9.15
Thanks and best regards,
// Oliver
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Out-of-tree builds
2014-02-06 17:15 Out-of-tree builds Oliver Schneider
@ 2014-02-06 17:39 ` Szabolcs Nagy
2014-02-06 18:25 ` Oliver Schneider
2014-02-06 19:04 ` Rich Felker
0 siblings, 2 replies; 11+ messages in thread
From: Szabolcs Nagy @ 2014-02-06 17:39 UTC (permalink / raw)
To: musl
* Oliver Schneider <musl-mailinglist@f-prot.com> [2014-02-06 17:15:21 +0000]:
> however, then I switch to an empty directory and run this:
>
> ../musl/configure --disable-shared
>
> I get:
>
> using compiler runtime libraries: -lgcc -lgcc_eh
> checking whether compiler's long double definition matches float.h... no
> ../musl/configure: error: unsupported long double type
>
> Are out-of-tree builds generally not supported, or am I doing something
> wrong?
not supported (yet)
it probably wouldn't be hard to add though
(eg the paths in the makefile can be prefixed with the build path
and the generated config.mak can set that prefix up, but i'm not
sure what's the best way to detect the path and there might be
issues around the generated alltypes.h and include/bits)
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Out-of-tree builds
2014-02-06 17:39 ` Szabolcs Nagy
@ 2014-02-06 18:25 ` Oliver Schneider
2014-02-06 19:04 ` Rich Felker
1 sibling, 0 replies; 11+ messages in thread
From: Oliver Schneider @ 2014-02-06 18:25 UTC (permalink / raw)
To: musl
On 2014-02-06 17:39, Szabolcs Nagy wrote:
> not supported (yet)
>
> it probably wouldn't be hard to add though
Thanks for your quick response.
I'll see whether I'm allowed to spend time on this and contribute a
patch back. I certainly hope so.
Thanks for musl-libc!
// Oliver
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Out-of-tree builds
2014-02-06 17:39 ` Szabolcs Nagy
2014-02-06 18:25 ` Oliver Schneider
@ 2014-02-06 19:04 ` Rich Felker
2014-02-06 23:27 ` Szabolcs Nagy
1 sibling, 1 reply; 11+ messages in thread
From: Rich Felker @ 2014-02-06 19:04 UTC (permalink / raw)
To: musl
On Thu, Feb 06, 2014 at 06:39:32PM +0100, Szabolcs Nagy wrote:
> * Oliver Schneider <musl-mailinglist@f-prot.com> [2014-02-06 17:15:21 +0000]:
> > however, then I switch to an empty directory and run this:
> >
> > ../musl/configure --disable-shared
> >
> > I get:
> >
> > using compiler runtime libraries: -lgcc -lgcc_eh
> > checking whether compiler's long double definition matches float.h... no
> > ../musl/configure: error: unsupported long double type
> >
> > Are out-of-tree builds generally not supported, or am I doing something
> > wrong?
>
> not supported (yet)
>
> it probably wouldn't be hard to add though
>
> (eg the paths in the makefile can be prefixed with the build path
> and the generated config.mak can set that prefix up, but i'm not
> sure what's the best way to detect the path and there might be
> issues around the generated alltypes.h and include/bits)
It's not as easy as it sounds because of the way implicit % rules
work. I don't know how to get them to work when adding a leading path.
If someone can figure out how to do this without doing anything
horribly ugly/bloated/slow in the makefile, I'm open to adding support
for out-of-tree builds this way.
Rich
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Out-of-tree builds
2014-02-06 19:04 ` Rich Felker
@ 2014-02-06 23:27 ` Szabolcs Nagy
2014-02-06 23:31 ` Szabolcs Nagy
0 siblings, 1 reply; 11+ messages in thread
From: Szabolcs Nagy @ 2014-02-06 23:27 UTC (permalink / raw)
To: musl
* Rich Felker <dalias@aerifal.cx> [2014-02-06 14:04:10 -0500]:
> It's not as easy as it sounds because of the way implicit % rules
> work. I don't know how to get them to work when adding a leading path.
ok i see the problem, this dependency cannot be expressed
for all foo and bar easily:
src/foo/bar.o: $(SOMEDIR)/src/foo/$(ARCH)/bar.s
without $(SOMEDIR)
%.o: $(ARCH)/%.s
works
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Out-of-tree builds
2014-02-06 23:27 ` Szabolcs Nagy
@ 2014-02-06 23:31 ` Szabolcs Nagy
2014-02-07 1:01 ` Szabolcs Nagy
0 siblings, 1 reply; 11+ messages in thread
From: Szabolcs Nagy @ 2014-02-06 23:31 UTC (permalink / raw)
To: musl
* Szabolcs Nagy <nsz@port70.net> [2014-02-07 00:27:06 +0100]:
> ok i see the problem, this dependency cannot be expressed
> for all foo and bar easily:
>
> src/foo/bar.o: $(SOMEDIR)/src/foo/$(ARCH)/bar.s
>
> without $(SOMEDIR)
>
> %.o: $(ARCH)/%.s
>
> works
VPATH=$(SOMEDIR)
%.o: $(ARCH)/%.s
seems to work but i have no clue why :)
(i don't think this follows from the make manual)
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Out-of-tree builds
2014-02-06 23:31 ` Szabolcs Nagy
@ 2014-02-07 1:01 ` Szabolcs Nagy
2014-02-07 1:07 ` Rich Felker
0 siblings, 1 reply; 11+ messages in thread
From: Szabolcs Nagy @ 2014-02-07 1:01 UTC (permalink / raw)
To: musl
[-- Attachment #1: Type: text/plain, Size: 363 bytes --]
* Szabolcs Nagy <nsz@port70.net> [2014-02-07 00:31:22 +0100]:
>
> VPATH=$(SOMEDIR)
> %.o: $(ARCH)/%.s
>
attached a make diff that can do out-of-tree build, by specifying
M=relative/path/to/musl
- config is not ready
- directory creation is a hack
- include/bits/alltypes.h is generated into the original repo
(include/bits is a symlink to the arch/bits dir)
[-- Attachment #2: make.diff --]
[-- Type: text/x-diff, Size: 4024 bytes --]
diff --git a/Makefile b/Makefile
index 0ab0bfd..fb9a83e 100644
--- a/Makefile
+++ b/Makefile
@@ -16,8 +16,9 @@ includedir = $(prefix)/include
libdir = $(prefix)/lib
syslibdir = /lib
-SRCS = $(sort $(wildcard src/*/*.c arch/$(ARCH)/src/*.c))
-OBJS = $(SRCS:.c=.o)
+M = .
+SRCS = $(sort $(wildcard $(M)/src/*/*.c $(M)/arch/$(ARCH)/src/*.c))
+OBJS = $(SRCS:$(M)/%.c=%.o)
LOBJS = $(OBJS:.o=.lo)
GENH = include/bits/alltypes.h
GENH_INT = src/internal/version.h
@@ -30,17 +31,17 @@ CFLAGS = -Os -pipe
CFLAGS_C99FSE = -std=c99 -ffreestanding -nostdinc
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$(M)/arch/$(ARCH) -I./src/internal -I$(M)/src/internal -I./include -I$(M)/include
CFLAGS_ALL += $(CPPFLAGS) $(CFLAGS)
CFLAGS_ALL_STATIC = $(CFLAGS_ALL)
CFLAGS_ALL_SHARED = $(CFLAGS_ALL) -fPIC -DSHARED
AR = $(CROSS_COMPILE)ar
RANLIB = $(CROSS_COMPILE)ranlib
-INSTALL = ./tools/install.sh
+INSTALL = $(M)/tools/install.sh
-ARCH_INCLUDES = $(wildcard arch/$(ARCH)/bits/*.h)
-ALL_INCLUDES = $(sort $(wildcard include/*.h include/*/*.h) $(GENH) $(ARCH_INCLUDES:arch/$(ARCH)/%=include/%))
+ARCH_INCLUDES = $(wildcard $(M)/arch/$(ARCH)/bits/*.h)
+ALL_INCLUDES = $(sort $(wildcard $(M)/include/*.h $(M)/include/*/*.h) $(GENH) $(ARCH_INCLUDES:$(M)/arch/$(ARCH)/%=include/%))
EMPTY_LIB_NAMES = m rt pthread crypt util xnet resolv dl
EMPTY_LIBS = $(EMPTY_LIB_NAMES:%=lib/lib%.a)
@@ -55,7 +56,12 @@ LDSO_PATHNAME = $(syslibdir)/ld-musl-$(ARCH)$(SUBARCH).so.1
-include config.mak
-all: $(ALL_LIBS) $(ALL_TOOLS)
+VPATH = $(M)
+
+all: dirhack $(ALL_LIBS) $(ALL_TOOLS)
+
+dirhack:
+ mkdir -p $(sort $(dir $(OBJS))) crt include lib tools
install: install-libs install-headers install-tools
@@ -73,26 +79,26 @@ distclean: clean
include/bits:
@test "$(ARCH)" || { echo "Please set ARCH in config.mak before running make." ; exit 1 ; }
- ln -sf ../arch/$(ARCH)/bits $@
+ ln -sf ../$(M)/arch/$(ARCH)/bits $@
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 > $@
+include/bits/alltypes.h: include/bits/alltypes.h.in $(M)/include/alltypes.h.in $(M)/tools/mkalltypes.sed
+ sed -f $(M)/tools/mkalltypes.sed include/bits/alltypes.h.in $(M)/include/alltypes.h.in > $@
-src/internal/version.h: $(wildcard VERSION .git)
- printf '#define VERSION "%s"\n' "$$(sh tools/version.sh)" > $@
+src/internal/version.h: $(wildcard $(M)/VERSION $(M)/.git)
+ printf '#define VERSION "%s"\n' "$$(cd $(M); sh tools/version.sh)" > $@
src/internal/version.lo: src/internal/version.h
src/ldso/dynlink.lo: arch/$(ARCH)/reloc.h
-crt/crt1.o crt/Scrt1.o: $(wildcard arch/$(ARCH)/crt_arch.h)
+crt/crt1.o crt/Scrt1.o: $(wildcard $(M)/arch/$(ARCH)/crt_arch.h)
crt/Scrt1.o: CFLAGS += -fPIC
-OPTIMIZE_SRCS = $(wildcard $(OPTIMIZE_GLOBS:%=src/%))
-$(OPTIMIZE_SRCS:%.c=%.o) $(OPTIMIZE_SRCS:%.c=%.lo): CFLAGS += -O3
+OPTIMIZE_SRCS = $(wildcard $(OPTIMIZE_GLOBS:%=$(M)/src/%))
+$(OPTIMIZE_SRCS:$(M)/%.c=%.o) $(OPTIMIZE_SRCS:$(M)/%.c=%.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 += $(CFLAGS_MEMOPS)
@@ -101,9 +107,9 @@ $(MEMOPS_SRCS:%.c=%.o) $(MEMOPS_SRCS:%.c=%.lo): CFLAGS += $(CFLAGS_MEMOPS)
# 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)
+$(dir $(patsubst $(M)/%/,%,$(dir $(1))))$(notdir $(1:.s=.o)): $(1)
endef
-$(foreach s,$(wildcard src/*/$(ARCH)*/*.s),$(eval $(call mkasmdep,$(s))))
+$(foreach s,$(wildcard $(M)/src/*/$(ARCH)*/*.s),$(eval $(call mkasmdep,$(s))))
%.o: $(ARCH)$(ASMSUBARCH)/%.sub
$(CC) $(CFLAGS_ALL_STATIC) -c -o $@ $(dir $<)$(shell cat $<)
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Out-of-tree builds
2014-02-07 1:01 ` Szabolcs Nagy
@ 2014-02-07 1:07 ` Rich Felker
2014-02-08 2:49 ` Szabolcs Nagy
0 siblings, 1 reply; 11+ messages in thread
From: Rich Felker @ 2014-02-07 1:07 UTC (permalink / raw)
To: musl
On Fri, Feb 07, 2014 at 02:01:36AM +0100, Szabolcs Nagy wrote:
> +dirhack:
> + mkdir -p $(sort $(dir $(OBJS))) crt include lib tools
How does this avoid having the $(M) source root from $(OBJS)?
> include/bits:
> @test "$(ARCH)" || { echo "Please set ARCH in config.mak before running make." ; exit 1 ; }
> - ln -sf ../arch/$(ARCH)/bits $@
> + ln -sf ../$(M)/arch/$(ARCH)/bits $@
Having ../ prior to a possibly-absolute path $(M) seems wrong.
Rich
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Out-of-tree builds
2014-02-07 1:07 ` Rich Felker
@ 2014-02-08 2:49 ` Szabolcs Nagy
2014-02-26 22:56 ` Szabolcs Nagy
0 siblings, 1 reply; 11+ messages in thread
From: Szabolcs Nagy @ 2014-02-08 2:49 UTC (permalink / raw)
To: musl
[-- Attachment #1: Type: text/plain, Size: 819 bytes --]
* Rich Felker <dalias@aerifal.cx> [2014-02-06 20:07:55 -0500]:
> On Fri, Feb 07, 2014 at 02:01:36AM +0100, Szabolcs Nagy wrote:
> > +dirhack:
> > + mkdir -p $(sort $(dir $(OBJS))) crt include lib tools
>
> How does this avoid having the $(M) source root from $(OBJS)?
objs have no $(M) prefix
> > include/bits:
> > @test "$(ARCH)" || { echo "Please set ARCH in config.mak before running make." ; exit 1 ; }
> > - ln -sf ../arch/$(ARCH)/bits $@
> > + ln -sf ../$(M)/arch/$(ARCH)/bits $@
>
> Having ../ prior to a possibly-absolute path $(M) seems wrong.
this was problematic for other reasons too so i create
the arch/... dir and symlink locally
attached second try (fixes install, dirs, symlink)
for in-tree builds it creates spurious '.mark' files
otherwise the same make should work in-tree and out-of-tree
[-- Attachment #2: make.diff --]
[-- Type: text/x-diff, Size: 4778 bytes --]
diff --git a/Makefile b/Makefile
index 0ab0bfd..db0a040 100644
--- a/Makefile
+++ b/Makefile
@@ -16,8 +16,9 @@ includedir = $(prefix)/include
libdir = $(prefix)/lib
syslibdir = /lib
-SRCS = $(sort $(wildcard src/*/*.c arch/$(ARCH)/src/*.c))
-OBJS = $(SRCS:.c=.o)
+M = .
+SRCS = $(sort $(wildcard $(M)/src/*/*.c $(M)/arch/$(ARCH)/src/*.c))
+OBJS = $(SRCS:$(M)/%.c=%.o)
LOBJS = $(OBJS:.o=.lo)
GENH = include/bits/alltypes.h
GENH_INT = src/internal/version.h
@@ -30,17 +31,18 @@ CFLAGS = -Os -pipe
CFLAGS_C99FSE = -std=c99 -ffreestanding -nostdinc
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$(M)/arch/$(ARCH) -I./src/internal -I$(M)/src/internal -I./include -I$(M)/include
CFLAGS_ALL += $(CPPFLAGS) $(CFLAGS)
CFLAGS_ALL_STATIC = $(CFLAGS_ALL)
CFLAGS_ALL_SHARED = $(CFLAGS_ALL) -fPIC -DSHARED
AR = $(CROSS_COMPILE)ar
RANLIB = $(CROSS_COMPILE)ranlib
-INSTALL = ./tools/install.sh
+INSTALL = $(M)/tools/install.sh
-ARCH_INCLUDES = $(wildcard arch/$(ARCH)/bits/*.h)
-ALL_INCLUDES = $(sort $(wildcard include/*.h include/*/*.h) $(GENH) $(ARCH_INCLUDES:arch/$(ARCH)/%=include/%))
+ARCH_INCLUDES = $(wildcard $(M)/arch/$(ARCH)/bits/*.h)
+INCLUDES = $(wildcard $(M)/include/*.h $(M)/include/*/*.h)
+ALL_INCLUDES = $(sort $(INCLUDES:$(M)/%=%) $(GENH) $(ARCH_INCLUDES:$(M)/arch/$(ARCH)/%=include/%))
EMPTY_LIB_NAMES = m rt pthread crypt util xnet resolv dl
EMPTY_LIBS = $(EMPTY_LIB_NAMES:%=lib/lib%.a)
@@ -57,6 +59,18 @@ LDSO_PATHNAME = $(syslibdir)/ld-musl-$(ARCH)$(SUBARCH).so.1
all: $(ALL_LIBS) $(ALL_TOOLS)
+vpath %.s $(M)
+vpath %.c $(M)
+vpath %.h $(M)
+
+$(ALL_TOOLS): tools/.mark
+$(ALL_LIBS): lib/.mark
+$(CRT_LIBS:lib/%=crt/%): crt/.mark
+$(OBJS) $(LOBJS): $(patsubst %/,%/.mark,$(sort $(dir $(OBJS))))
+%/.mark:
+ mkdir -p $*
+ touch $@
+
install: install-libs install-headers install-tools
clean:
@@ -71,28 +85,27 @@ clean:
distclean: clean
rm -f config.mak
-include/bits:
+include/bits: include/.mark arch/$(ARCH)/bits/.mark
@test "$(ARCH)" || { echo "Please set ARCH in config.mak before running make." ; exit 1 ; }
ln -sf ../arch/$(ARCH)/bits $@
-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 > $@
+INS = $(M)/arch/$(ARCH)/bits/alltypes.h.in $(M)/include/alltypes.h.in
+include/bits/alltypes.h: $(M)/tools/mkalltypes.sed $(INS) include/bits
+ sed -f $(M)/tools/mkalltypes.sed $(INS) > $@
-src/internal/version.h: $(wildcard VERSION .git)
- printf '#define VERSION "%s"\n' "$$(sh tools/version.sh)" > $@
+src/internal/version.h: $(wildcard $(M)/VERSION $(M)/.git) src/internal/.mark
+ printf '#define VERSION "%s"\n' "$$(cd $(M); sh tools/version.sh)" > $@
src/internal/version.lo: src/internal/version.h
src/ldso/dynlink.lo: arch/$(ARCH)/reloc.h
-crt/crt1.o crt/Scrt1.o: $(wildcard arch/$(ARCH)/crt_arch.h)
+crt/crt1.o crt/Scrt1.o: $(wildcard $(M)/arch/$(ARCH)/crt_arch.h)
crt/Scrt1.o: CFLAGS += -fPIC
-OPTIMIZE_SRCS = $(wildcard $(OPTIMIZE_GLOBS:%=src/%))
-$(OPTIMIZE_SRCS:%.c=%.o) $(OPTIMIZE_SRCS:%.c=%.lo): CFLAGS += -O3
+OPTIMIZE_SRCS = $(wildcard $(OPTIMIZE_GLOBS:%=$(M)/src/%))
+$(OPTIMIZE_SRCS:$(M)/%.c=%.o) $(OPTIMIZE_SRCS:$(M)/%.c=%.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 += $(CFLAGS_MEMOPS)
@@ -101,9 +114,9 @@ $(MEMOPS_SRCS:%.c=%.o) $(MEMOPS_SRCS:%.c=%.lo): CFLAGS += $(CFLAGS_MEMOPS)
# 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)
+$(dir $(patsubst $(M)/%/,%,$(dir $(1))))$(notdir $(1:.s=.o)): $(1)
endef
-$(foreach s,$(wildcard src/*/$(ARCH)*/*.s),$(eval $(call mkasmdep,$(s))))
+$(foreach s,$(wildcard $(M)/src/*/$(ARCH)*/*.s),$(eval $(call mkasmdep,$(s))))
%.o: $(ARCH)$(ASMSUBARCH)/%.sub
$(CC) $(CFLAGS_ALL_STATIC) -c -o $@ $(dir $<)$(shell cat $<)
@@ -140,7 +153,7 @@ $(EMPTY_LIBS):
lib/%.o: crt/%.o
cp $< $@
-lib/musl-gcc.specs: tools/musl-gcc.specs.sh config.mak
+lib/musl-gcc.specs: $(M)/tools/musl-gcc.specs.sh config.mak
sh $< "$(includedir)" "$(libdir)" "$(LDSO_PATHNAME)" > $@
tools/musl-gcc: config.mak
@@ -156,7 +169,7 @@ $(DESTDIR)$(libdir)/%.so: lib/%.so
$(DESTDIR)$(libdir)/%: lib/%
$(INSTALL) -D -m 644 $< $@
-$(DESTDIR)$(includedir)/bits/%: arch/$(ARCH)/bits/%
+$(DESTDIR)$(includedir)/bits/%: $(M)/arch/$(ARCH)/bits/%
$(INSTALL) -D -m 644 $< $@
$(DESTDIR)$(includedir)/%: include/%
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Out-of-tree builds
2014-02-08 2:49 ` Szabolcs Nagy
@ 2014-02-26 22:56 ` Szabolcs Nagy
2014-02-27 13:29 ` Szabolcs Nagy
0 siblings, 1 reply; 11+ messages in thread
From: Szabolcs Nagy @ 2014-02-26 22:56 UTC (permalink / raw)
To: musl
[-- Attachment #1: Type: text/plain, Size: 442 bytes --]
* Szabolcs Nagy <nsz@port70.net> [2014-02-08 03:49:22 +0100]:
> attached second try (fixes install, dirs, symlink)
>
> for in-tree builds it creates spurious '.mark' files
> otherwise the same make should work in-tree and out-of-tree
third try, with configure changes and some simplifications
(configure detects out-of-tree build and copies the Makefile,
there is an ifndef block in the Makefile to add extra rules
for directory creation)
[-- Attachment #2: out-of-tree.diff --]
[-- Type: text/x-diff, Size: 6990 bytes --]
diff --git a/Makefile b/Makefile
index 0ab0bfd..43dea0d 100644
--- a/Makefile
+++ b/Makefile
@@ -8,6 +8,7 @@
# Do not make changes here.
#
+srcdir = .
exec_prefix = /usr/local
bindir = $(exec_prefix)/bin
@@ -16,8 +17,8 @@ includedir = $(prefix)/include
libdir = $(prefix)/lib
syslibdir = /lib
-SRCS = $(sort $(wildcard src/*/*.c arch/$(ARCH)/src/*.c))
-OBJS = $(SRCS:.c=.o)
+SRCS = $(sort $(wildcard $(srcdir)/src/*/*.c $(srcdir)/arch/$(ARCH)/src/*.c))
+OBJS = $(SRCS:$(srcdir)/%.c=%.o)
LOBJS = $(OBJS:.o=.lo)
GENH = include/bits/alltypes.h
GENH_INT = src/internal/version.h
@@ -30,17 +31,19 @@ CFLAGS = -Os -pipe
CFLAGS_C99FSE = -std=c99 -ffreestanding -nostdinc
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)
+CFLAGS_ALL += $(sort -I./src/internal -I$(srcdir)/src/internal) $(sort -I./include -I$(srcdir)/include)
CFLAGS_ALL += $(CPPFLAGS) $(CFLAGS)
CFLAGS_ALL_STATIC = $(CFLAGS_ALL)
CFLAGS_ALL_SHARED = $(CFLAGS_ALL) -fPIC -DSHARED
AR = $(CROSS_COMPILE)ar
RANLIB = $(CROSS_COMPILE)ranlib
-INSTALL = ./tools/install.sh
+INSTALL = $(srcdir)/tools/install.sh
-ARCH_INCLUDES = $(wildcard arch/$(ARCH)/bits/*.h)
-ALL_INCLUDES = $(sort $(wildcard include/*.h include/*/*.h) $(GENH) $(ARCH_INCLUDES:arch/$(ARCH)/%=include/%))
+ARCH_INCLUDES = $(wildcard $(srcdir)/arch/$(ARCH)/bits/*.h)
+INCLUDES = $(wildcard $(srcdir)/include/*.h $(srcdir)/include/*/*.h)
+ALL_INCLUDES = $(sort $(INCLUDES:$(srcdir)/%=%) $(GENH) $(ARCH_INCLUDES:$(srcdir)/arch/$(ARCH)/%=include/%))
EMPTY_LIB_NAMES = m rt pthread crypt util xnet resolv dl
EMPTY_LIBS = $(EMPTY_LIB_NAMES:%=lib/lib%.a)
@@ -57,6 +60,19 @@ LDSO_PATHNAME = $(syslibdir)/ld-musl-$(ARCH)$(SUBARCH).so.1
all: $(ALL_LIBS) $(ALL_TOOLS)
+ifneq ($(srcdir),.)
+VPATH = $(srcdir)
+$(ALL_TOOLS): tools/.dir
+$(ALL_LIBS): lib/.dir
+$(CRT_LIBS:lib/%=crt/%): crt/.dir
+$(OBJS) $(LOBJS): $(patsubst %/,%/.dir,$(sort $(dir $(OBJS))))
+include/bits: include/.dir arch/$(ARCH)/bits/.dir
+src/internal/version.h: src/internal/.dir
+%/.dir:
+ mkdir -p $*
+ touch $@
+endif
+
install: install-libs install-headers install-tools
clean:
@@ -75,24 +91,23 @@ include/bits:
@test "$(ARCH)" || { echo "Please set ARCH in config.mak before running make." ; exit 1 ; }
ln -sf ../arch/$(ARCH)/bits $@
-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 > $@
+INS = $(srcdir)/arch/$(ARCH)/bits/alltypes.h.in $(srcdir)/include/alltypes.h.in
+include/bits/alltypes.h: $(srcdir)/tools/mkalltypes.sed $(INS) include/bits
+ sed -f $(srcdir)/tools/mkalltypes.sed $(INS) > $@
-src/internal/version.h: $(wildcard VERSION .git)
- printf '#define VERSION "%s"\n' "$$(sh tools/version.sh)" > $@
+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
src/ldso/dynlink.lo: arch/$(ARCH)/reloc.h
-crt/crt1.o crt/Scrt1.o: $(wildcard arch/$(ARCH)/crt_arch.h)
+crt/crt1.o crt/Scrt1.o: $(wildcard $(srcdir)/arch/$(ARCH)/crt_arch.h)
crt/Scrt1.o: CFLAGS += -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=%.o) $(OPTIMIZE_SRCS:$(srcdir)/%.c=%.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 += $(CFLAGS_MEMOPS)
@@ -101,9 +116,9 @@ $(MEMOPS_SRCS:%.c=%.o) $(MEMOPS_SRCS:%.c=%.lo): CFLAGS += $(CFLAGS_MEMOPS)
# 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)
+$(dir $(patsubst $(srcdir)/%/,%,$(dir $(1))))$(notdir $(1:.s=.o)): $(1)
endef
-$(foreach s,$(wildcard src/*/$(ARCH)*/*.s),$(eval $(call mkasmdep,$(s))))
+$(foreach s,$(wildcard $(srcdir)/src/*/$(ARCH)*/*.s),$(eval $(call mkasmdep,$(s))))
%.o: $(ARCH)$(ASMSUBARCH)/%.sub
$(CC) $(CFLAGS_ALL_STATIC) -c -o $@ $(dir $<)$(shell cat $<)
diff --git a/configure b/configure
index c622366..9ed785a 100755
--- a/configure
+++ b/configure
@@ -9,6 +9,9 @@ VAR=VALUE. See below for descriptions of some of the useful variables.
Defaults for the options are specified in brackets.
+Configuration:
+ --srcdir=DIR source directory [detected]
+
Installation directories:
--prefix=PREFIX main installation prefix [/usr/local/musl]
--exec-prefix=EPREFIX installation prefix for executable files [PREFIX]
@@ -113,6 +116,7 @@ CFLAGS_AUTO=
CFLAGS_MEMOPS=
LDFLAGS_AUTO=
OPTIMIZE_GLOBS=
+srcdir=
prefix=/usr/local/musl
exec_prefix='$(prefix)'
bindir='$(exec_prefix)/bin'
@@ -129,6 +133,7 @@ static=yes
for arg ; do
case "$arg" in
--help) usage ;;
+--srcdir=*) srcdir=${arg#*=} ;;
--prefix=*) prefix=${arg#*=} ;;
--exec-prefix=*) exec_prefix=${arg#*=} ;;
--bindir=*) bindir=${arg#*=} ;;
@@ -162,11 +167,28 @@ LIBCC=*) LIBCC=${arg#*=} ;;
esac
done
-for i in prefix exec_prefix bindir libdir includedir syslibdir ; do
+for i in srcdir prefix exec_prefix bindir libdir includedir syslibdir ; do
stripdir $i
done
#
+# Get the musl source dir for out-of-tree builds
+#
+if test -z "$srcdir" ; then
+srcdir="${0%/configure}"
+stripdir srcdir
+fi
+abs_builddir="$(pwd)" || fail "$0: cannot determine current directory"
+abs_srcdir="$(cd $srcdir && pwd)" || fail "$0: invalid source directory $srcdir"
+test "$abs_srcdir" = "$abs_builddir" && srcdir=.
+printf "source directory: %s\n" "$srcdir"
+if test -f Makefile ; then
+echo "using existing Makefile"
+else
+cp $srcdir/Makefile . || fail "$0: cannot create Makefile"
+fi
+
+#
# Get a temp filename we can use
#
i=0
@@ -258,7 +280,7 @@ __attribute__((__may_alias__))
#endif
x;
EOF
-if $CC $CFLAGS_C99FSE -I./arch/$ARCH -I./include $CPPFLAGS $CFLAGS \
+if $CC $CFLAGS_C99FSE -I$srcdir/arch/$ARCH -I$srcdir/include $CPPFLAGS $CFLAGS \
-c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then
printf "no\n"
else
@@ -445,7 +467,7 @@ echo '#include <float.h>' > "$tmpc"
echo '#if LDBL_MANT_DIG == 53' >> "$tmpc"
echo 'typedef char ldcheck[9-(int)sizeof(long double)];' >> "$tmpc"
echo '#endif' >> "$tmpc"
-if $CC $CFLAGS_C99FSE -I./arch/$ARCH -I./include $CPPFLAGS $CFLAGS \
+if $CC $CFLAGS_C99FSE -I$srcdir/arch/$ARCH -I$srcdir/include $CPPFLAGS $CFLAGS \
-c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then
printf "yes\n"
else
@@ -468,6 +490,7 @@ cat << EOF
ARCH = $ARCH
SUBARCH = $SUBARCH
ASMSUBARCH = $ASMSUBARCH
+srcdir = $srcdir
prefix = $prefix
exec_prefix = $exec_prefix
bindir = $bindir
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: Out-of-tree builds
2014-02-26 22:56 ` Szabolcs Nagy
@ 2014-02-27 13:29 ` Szabolcs Nagy
0 siblings, 0 replies; 11+ messages in thread
From: Szabolcs Nagy @ 2014-02-27 13:29 UTC (permalink / raw)
To: musl
* Szabolcs Nagy <nsz@port70.net> [2014-02-26 23:56:14 +0100]:
> third try, with configure changes and some simplifications
>
> (configure detects out-of-tree build and copies the Makefile,
> there is an ifndef block in the Makefile to add extra rules
> for directory creation)
hm the makefile shouldn't be copied, it's enough to link it
or create one with "include $srcdir/Makefile"
(so if the source repo is updated the new makefile will be
used for the out-of-tree build)
> +if test -f Makefile ; then
> +echo "using existing Makefile"
> +else
> +cp $srcdir/Makefile . || fail "$0: cannot create Makefile"
> +fi
> +
else
printf "creating Makefile... "
echo "include $srcdir/Makefile" >Makefile
echo "done"
fi
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2014-02-27 13:29 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-02-06 17:15 Out-of-tree builds Oliver Schneider
2014-02-06 17:39 ` Szabolcs Nagy
2014-02-06 18:25 ` Oliver Schneider
2014-02-06 19:04 ` Rich Felker
2014-02-06 23:27 ` Szabolcs Nagy
2014-02-06 23:31 ` Szabolcs Nagy
2014-02-07 1:01 ` Szabolcs Nagy
2014-02-07 1:07 ` Rich Felker
2014-02-08 2:49 ` Szabolcs Nagy
2014-02-26 22:56 ` Szabolcs Nagy
2014-02-27 13:29 ` Szabolcs Nagy
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/musl/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).