aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoreldritch horrors <pennae@lix.systems>2024-03-04 06:12:19 +0100
committereldritch horrors <pennae@lix.systems>2024-03-04 07:11:25 +0100
commita089d8f5f6f96ea3f35790c36b6456e71f477879 (patch)
treeba290e853e076393ec9eaf1b075d294093c04cb0
parentc208e918e55c423203692343b56d893dc7435095 (diff)
Merge pull request #9465 from obsidiansystems/build-dir
Use `buildprefix` in a few more places (cherry picked from commit b6a3fde6b7a416929553e6be36fc991680ddf9ef) Change-Id: I2790663fa9f8242ac2db6582b7e421d2fdf42942
-rw-r--r--Makefile6
-rw-r--r--doc/manual/src/contributing/hacking.md25
-rw-r--r--mk/build-dir.mk10
-rw-r--r--mk/install-dirs.mk11
-rw-r--r--mk/lib.mk25
-rw-r--r--mk/templates.mk8
-rw-r--r--src/libcmd/local.mk2
-rw-r--r--src/libexpr/local.mk4
-rw-r--r--src/libmain/local.mk2
-rw-r--r--src/libstore/local.mk2
-rw-r--r--tests/functional/local.mk4
11 files changed, 64 insertions, 35 deletions
diff --git a/Makefile b/Makefile
index 2b8108150..a2b35edc2 100644
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,7 @@
--include Makefile.config
-clean-files += Makefile.config
+include mk/build-dir.mk
+
+-include $(buildprefix)Makefile.config
+clean-files += $(buildprefix)Makefile.config
ifeq ($(ENABLE_BUILD), yes)
makefiles = \
diff --git a/doc/manual/src/contributing/hacking.md b/doc/manual/src/contributing/hacking.md
index dbe0c82cf..6bea6f727 100644
--- a/doc/manual/src/contributing/hacking.md
+++ b/doc/manual/src/contributing/hacking.md
@@ -146,6 +146,31 @@ $ nix build .#packages.aarch64-linux.default
Cross-compiled builds are available for ARMv6 (`armv6l-linux`) and ARMv7 (`armv7l-linux`).
Add more [system types](#system-type) to `crossSystems` in `flake.nix` to bootstrap Nix on unsupported platforms.
+### Building for multiple platforms at once
+
+It is useful to perform multiple cross and native builds on the same source tree,
+for example to ensure that better support for one platform doesn't break the build for another.
+In order to facilitate this, Nix has some support for being built out of tree – that is, placing build artefacts in a different directory than the source code:
+
+1. Create a directory for the build, e.g.
+
+ ```bash
+ mkdir build
+ ```
+
+2. Run the configure script from that directory, e.g.
+
+ ```bash
+ cd build
+ ../configure <configure flags>
+ ```
+
+3. Run make from the source directory, but with the build directory specified, e.g.
+
+ ```bash
+ make builddir=build <make flags>
+ ```
+
## System type
Nix uses a string with he following format to identify the *system type* or *platform* it runs on:
diff --git a/mk/build-dir.mk b/mk/build-dir.mk
new file mode 100644
index 000000000..02f4cae60
--- /dev/null
+++ b/mk/build-dir.mk
@@ -0,0 +1,10 @@
+# Initialise support for build directories.
+builddir ?=
+
+ifdef builddir
+ buildprefix = $(builddir)/
+ buildprefixrel = $(builddir)
+else
+ buildprefix =
+ buildprefixrel = .
+endif
diff --git a/mk/install-dirs.mk b/mk/install-dirs.mk
new file mode 100644
index 000000000..732b0d6fc
--- /dev/null
+++ b/mk/install-dirs.mk
@@ -0,0 +1,11 @@
+# Default installation paths.
+prefix ?= /usr/local
+libdir ?= $(prefix)/lib
+bindir ?= $(prefix)/bin
+libexecdir ?= $(prefix)/libexec
+datadir ?= $(prefix)/share
+localstatedir ?= $(prefix)/var
+sysconfdir ?= $(prefix)/etc
+mandir ?= $(prefix)/share/man
+
+DESTDIR ?=
diff --git a/mk/lib.mk b/mk/lib.mk
index e86a7f1a4..366f0e373 100644
--- a/mk/lib.mk
+++ b/mk/lib.mk
@@ -43,27 +43,6 @@ define newline
endef
-# Default installation paths.
-prefix ?= /usr/local
-libdir ?= $(prefix)/lib
-bindir ?= $(prefix)/bin
-libexecdir ?= $(prefix)/libexec
-datadir ?= $(prefix)/share
-localstatedir ?= $(prefix)/var
-sysconfdir ?= $(prefix)/etc
-mandir ?= $(prefix)/share/man
-
-
-# Initialise support for build directories.
-builddir ?=
-
-ifdef builddir
- buildprefix = $(builddir)/
-else
- buildprefix =
-endif
-
-
# Pass -fPIC if we're building dynamic libraries.
BUILD_SHARED_LIBS ?= 1
@@ -94,6 +73,8 @@ ifeq ($(BUILD_DEBUG), 1)
endif
+include mk/build-dir.mk
+include mk/install-dirs.mk
include mk/functions.mk
include mk/tracing.mk
include mk/clean.mk
@@ -112,7 +93,7 @@ define include-sub-makefile
include $(1)
endef
-$(foreach mf, $(makefiles), $(eval $(call include-sub-makefile, $(mf))))
+$(foreach mf, $(makefiles), $(eval $(call include-sub-makefile,$(mf))))
# Instantiate stuff.
diff --git a/mk/templates.mk b/mk/templates.mk
index c7ac7afbf..866bdc17f 100644
--- a/mk/templates.mk
+++ b/mk/templates.mk
@@ -10,10 +10,10 @@ endef
ifneq ($(MAKECMDGOALS), clean)
-%.h: %.h.in
- $(trace-gen) rm -f $@ && ./config.status --quiet --header=$@
+$(buildprefix)%.h: %.h.in
+ $(trace-gen) rm -f $@ && cd $(buildprefixrel) && ./config.status --quiet --header=$(@:$(buildprefix)%=%)
-%: %.in
- $(trace-gen) rm -f $@ && ./config.status --quiet --file=$@
+$(buildprefix)%: %.in
+ $(trace-gen) rm -f $@ && cd $(buildprefixrel) && ./config.status --quiet --file=$(@:$(buildprefix)%=%)
endif
diff --git a/src/libcmd/local.mk b/src/libcmd/local.mk
index 541a7d2ba..afd35af08 100644
--- a/src/libcmd/local.mk
+++ b/src/libcmd/local.mk
@@ -12,4 +12,4 @@ libcmd_LDFLAGS = $(EDITLINE_LIBS) $(LOWDOWN_LIBS) -pthread
libcmd_LIBS = libstore libutil libexpr libmain libfetchers
-$(eval $(call install-file-in, $(d)/nix-cmd.pc, $(libdir)/pkgconfig, 0644))
+$(eval $(call install-file-in, $(buildprefix)$(d)/nix-cmd.pc, $(libdir)/pkgconfig, 0644))
diff --git a/src/libexpr/local.mk b/src/libexpr/local.mk
index b37fe6f1d..ed6bc761a 100644
--- a/src/libexpr/local.mk
+++ b/src/libexpr/local.mk
@@ -36,7 +36,7 @@ $(d)/lexer-tab.cc $(d)/lexer-tab.hh: $(d)/lexer.l
clean-files += $(d)/parser-tab.cc $(d)/parser-tab.hh $(d)/lexer-tab.cc $(d)/lexer-tab.hh
-$(eval $(call install-file-in, $(d)/nix-expr.pc, $(libdir)/pkgconfig, 0644))
+$(eval $(call install-file-in, $(buildprefix)$(d)/nix-expr.pc, $(libdir)/pkgconfig, 0644))
$(foreach i, $(wildcard src/libexpr/value/*.hh), \
$(eval $(call install-file-in, $(i), $(includedir)/nix/value, 0644)))
@@ -47,4 +47,4 @@ $(d)/primops.cc: $(d)/imported-drv-to-derivation.nix.gen.hh
$(d)/eval.cc: $(d)/primops/derivation.nix.gen.hh $(d)/fetchurl.nix.gen.hh $(d)/flake/call-flake.nix.gen.hh
-src/libexpr/primops/fromTOML.o: ERROR_SWITCH_ENUM =
+$(buildprefix)src/libexpr/primops/fromTOML.o: ERROR_SWITCH_ENUM =
diff --git a/src/libmain/local.mk b/src/libmain/local.mk
index 99da95e27..5c7061863 100644
--- a/src/libmain/local.mk
+++ b/src/libmain/local.mk
@@ -14,4 +14,4 @@ libmain_LIBS = libstore libutil
libmain_ALLOW_UNDEFINED = 1
-$(eval $(call install-file-in, $(d)/nix-main.pc, $(libdir)/pkgconfig, 0644))
+$(eval $(call install-file-in, $(buildprefix)$(d)/nix-main.pc, $(libdir)/pkgconfig, 0644))
diff --git a/src/libstore/local.mk b/src/libstore/local.mk
index 0be0bf310..68ccdc409 100644
--- a/src/libstore/local.mk
+++ b/src/libstore/local.mk
@@ -59,7 +59,7 @@ $(d)/build.cc:
clean-files += $(d)/schema.sql.gen.hh $(d)/ca-specific-schema.sql.gen.hh
-$(eval $(call install-file-in, $(d)/nix-store.pc, $(libdir)/pkgconfig, 0644))
+$(eval $(call install-file-in, $(buildprefix)$(d)/nix-store.pc, $(libdir)/pkgconfig, 0644))
$(foreach i, $(wildcard src/libstore/builtins/*.hh), \
$(eval $(call install-file-in, $(i), $(includedir)/nix/builtins, 0644)))
diff --git a/tests/functional/local.mk b/tests/functional/local.mk
index a2f900a9e..6b79020fc 100644
--- a/tests/functional/local.mk
+++ b/tests/functional/local.mk
@@ -135,9 +135,9 @@ ifeq ($(ENABLE_BUILD), yes)
endif
$(d)/test-libstoreconsumer.sh.test $(d)/test-libstoreconsumer.sh.test-debug: \
- $(d)/test-libstoreconsumer/test-libstoreconsumer
+ $(buildprefix)$(d)/test-libstoreconsumer/test-libstoreconsumer
$(d)/plugins.sh.test $(d)/plugins.sh.test-debug: \
- $(d)/plugins/libplugintest.$(SO_EXT)
+ $(buildprefix)$(d)/plugins/libplugintest.$(SO_EXT)
install-tests += $(foreach x, $(nix_tests), $(d)/$(x))