[PATCH] build: Support O= for out-of-tree output

Johannes Berg johannes at sipsolutions.net
Sun Oct 4 06:32:56 PDT 2026


From: Johannes Berg <johannes.berg at intel.com>

Various build artifacts are built in tree, even though in the past
I made objects go to BUILDDIR to avoid clashes between hostapd and
wpa_supplicant. In particular, binaries are built in-tree.

We have a need/desire to build with different configurations from
the same tree, and CONFIG_FILE= already lets us use an external
configuration, but binaries are written into the tree anyway, so
multiple builds clobber each other.

Add (somewhat kernel-style) O= support to the build system, so we
can do things like

	make O=.../build1 CONFIG_FILE=... hostapd

putting the hostapd binary in the .../build1/hostapd directory.

I've made it require CONFIG_FILE since otherwise it's not very
isolated, and overwriting a .config for multiple builds would be
causing trouble for parallel builds, seemed better to me to just
reject that case than create surprising behaviour.

In the implementation, most changes are mechanical, adding $(OBIN)
and using "$@" for the output file instead of repeating it.

However, all of the Makefiles now list OUTPUTS= for the above
command line to work, otherwise you'd have to instead write

	make O=.../build1 CONFIG_FILE=... .../build1/hostapd/hostapd

which seemed annoying enough to warrant adding OUTPUTS= and
creating rules from it in build.rules.

I've also made BUILDDIR get passed through as an absolute path
internally, wlantest seemed to need that.

Signed-off-by: Johannes Berg <johannes.berg at intel.com>
---
 hostapd/Makefile        |  23 ++++-----
 hs20/client/Makefile    |   5 +-
 src/build.rules         |  22 +++++++--
 wlantest/Makefile       |  13 ++---
 wpa_supplicant/Makefile | 106 +++++++++++++++++++++-------------------
 5 files changed, 98 insertions(+), 71 deletions(-)

diff --git a/hostapd/Makefile b/hostapd/Makefile
index 1ecafdc5591e..2f0342277efe 100644
--- a/hostapd/Makefile
+++ b/hostapd/Makefile
@@ -1,4 +1,5 @@
 ALL=hostapd hostapd_cli
+OUTPUTS = $(ALL) nt_password_hash hlr_auc_gw sae_pk_gen
 CONFIG_FILE = .config
 
 include ../src/build.rules
@@ -1380,7 +1381,7 @@ CFLAGS += -DCONFIG_PROCESS_COORDINATION
 OBJS += ../src/common/proc_coord.o
 endif
 
-$(DESTDIR)$(BINDIR)/%: %
+$(DESTDIR)$(BINDIR)/%: $(OBIN)%
 	install -D $(<) $(@)
 
 install: $(addprefix $(DESTDIR)$(BINDIR)/,$(ALL))
@@ -1388,8 +1389,8 @@ install: $(addprefix $(DESTDIR)$(BINDIR)/,$(ALL))
 _OBJS_VAR := OBJS
 include ../src/objs.mk
 
-hostapd: $(OBJS)
-	$(Q)$(CC) $(LDFLAGS) -o hostapd $(OBJS) $(LIBS)
+$(OBIN)hostapd: $(OBJS)
+	$(Q)$(CC) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)
 	@$(E) "  LD " $@
 
 ifdef CONFIG_WPA_TRACE
@@ -1399,8 +1400,8 @@ endif
 _OBJS_VAR := OBJS_c
 include ../src/objs.mk
 
-hostapd_cli: $(OBJS_c)
-	$(Q)$(CC) $(LDFLAGS) -o hostapd_cli $(OBJS_c) $(LIBS_c)
+$(OBIN)hostapd_cli: $(OBJS_c)
+	$(Q)$(CC) $(LDFLAGS) -o $@ $(OBJS_c) $(LIBS_c)
 	@$(E) "  LD " $@
 
 NOBJS = nt_password_hash.o ../src/crypto/ms_funcs.o $(SHA1OBJS)
@@ -1480,16 +1481,16 @@ include ../src/objs.mk
 _OBJS_VAR := SOBJS
 include ../src/objs.mk
 
-nt_password_hash: $(NOBJS)
-	$(Q)$(CC) $(LDFLAGS) -o nt_password_hash $(NOBJS) $(LIBS_n)
+$(OBIN)nt_password_hash: $(NOBJS)
+	$(Q)$(CC) $(LDFLAGS) -o $@ $(NOBJS) $(LIBS_n)
 	@$(E) "  LD " $@
 
-hlr_auc_gw: $(HOBJS)
-	$(Q)$(CC) $(LDFLAGS) -o hlr_auc_gw $(HOBJS) $(LIBS_h)
+$(OBIN)hlr_auc_gw: $(HOBJS)
+	$(Q)$(CC) $(LDFLAGS) -o $@ $(HOBJS) $(LIBS_h)
 	@$(E) "  LD " $@
 
-sae_pk_gen: $(SOBJS)
-	$(Q)$(CC) $(LDFLAGS) -o sae_pk_gen $(SOBJS) $(LIBS_s)
+$(OBIN)sae_pk_gen: $(SOBJS)
+	$(Q)$(CC) $(LDFLAGS) -o $@ $(SOBJS) $(LIBS_s)
 	@$(E) "  LD " $@
 
 .PHONY: lcov-html
diff --git a/hs20/client/Makefile b/hs20/client/Makefile
index 9e65dc63e8d5..2d2fa74e6f10 100644
--- a/hs20/client/Makefile
+++ b/hs20/client/Makefile
@@ -1,4 +1,5 @@
 ALL=hs20-osu-client
+OUTPUTS = $(ALL)
 
 include ../../src/build.rules
 
@@ -70,8 +71,8 @@ LIBS += -lssl -lcrypto
 
 _OBJS_VAR := OBJS
 include ../../src/objs.mk
-hs20-osu-client: $(OBJS)
-	$(Q)$(LDO) $(LDFLAGS) -o hs20-osu-client $(OBJS) $(LIBS)
+$(OBIN)hs20-osu-client: $(OBJS)
+	$(Q)$(LDO) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)
 	@$(E) "  LD " $@
 
 clean: common-clean
diff --git a/src/build.rules b/src/build.rules
index eb6759ac2068..16cd1627fce8 100644
--- a/src/build.rules
+++ b/src/build.rules
@@ -7,8 +7,14 @@ all: _all
 # setup some variables
 ROOTDIR := $(dir $(lastword $(MAKEFILE_LIST)))
 ROOTDIR := $(dir $(ROOTDIR:%../src/=%))../
-BUILDDIR ?= $(abspath $(ROOTDIR)build)
-BUILDDIR := $(BUILDDIR:%/=%)
+BUILDDIR ?= $(ROOTDIR)build
+ifneq ($(O),)
+override BUILDDIR := $(O)
+ifeq ($(origin CONFIG_FILE),file)
+$(error O= requires CONFIG_FILE= to be given as well)
+endif
+endif
+override BUILDDIR := $(abspath $(BUILDDIR))
 ABSROOT := $(abspath $(ROOTDIR))
 ifeq ($(origin OUT),command line)
 _PROJ := $(OUT:%/=%)
@@ -62,6 +68,16 @@ _all: $(VERIFY) $(ALL) $(EXTRA_TARGETS)
 COVSUFFIX := $(if $(CONFIG_CODE_COVERAGE),-cov,)
 PROJ := $(_PROJ)$(COVSUFFIX)
 
+# With O=, linked outputs go to the object directory too, and their
+# plain names (listed in OUTPUTS) become aliases for them.
+ifneq ($(O),)
+OBIN := $(BUILDDIR)/$(PROJ)/
+ifneq ($(OUTPUTS),)
+.PHONY: $(OUTPUTS)
+$(OUTPUTS): %: $(OBIN)%
+endif
+endif
+
 Q=@
 E=echo
 ifeq ($(V), 1)
@@ -103,7 +119,7 @@ lib_phony:
 # nothing
 
 $(BUILDDIR)/$(PROJ)/%.a: $(CONFIG_FILE) lib_phony
-	$(Q)$(MAKE) -C $(ROOTDIR)$(dir $(@:$(BUILDDIR)/$(PROJ)/%=%)) OUT=$(abspath $(dir $@))/
+	$(Q)$(MAKE) -C $(ROOTDIR)$(dir $(@:$(BUILDDIR)/$(PROJ)/%=%)) OUT=$(abspath $(dir $@))/ BUILDDIR=$(BUILDDIR) O=
 
 BUILDOBJ = $(patsubst %,$(BUILDDIR)/$(PROJ)/%,$(patsubst $(ROOTDIR)%,%,$(1)))
 
diff --git a/wlantest/Makefile b/wlantest/Makefile
index c01452d04cad..8ef339c75530 100644
--- a/wlantest/Makefile
+++ b/wlantest/Makefile
@@ -1,4 +1,5 @@
 ALL=wlantest wlantest_cli test_vectors
+OUTPUTS = $(ALL)
 
 include ../src/build.rules
 
@@ -76,14 +77,14 @@ include ../src/objs.mk
 _OBJS_VAR := OWN_LIBS
 include ../src/objs.mk
 
-wlantest: $(OBJS) $(OWN_LIBS)
-	$(LDO) $(LDFLAGS) -o wlantest $(OBJS) $(OWN_LIBS) $(LIBS)
+$(OBIN)wlantest: $(OBJS) $(OWN_LIBS)
+	$(LDO) $(LDFLAGS) -o $@ $(OBJS) $(OWN_LIBS) $(LIBS)
 
-wlantest_cli: $(OBJS_cli) $(OWN_LIBS)
-	$(LDO) $(LDFLAGS) -o wlantest_cli $(OBJS_cli) $(OWN_LIBS) $(LIBS)
+$(OBIN)wlantest_cli: $(OBJS_cli) $(OWN_LIBS)
+	$(LDO) $(LDFLAGS) -o $@ $(OBJS_cli) $(OWN_LIBS) $(LIBS)
 
-test_vectors: $(TOBJS) $(OWN_LIBS)
-	$(LDO) $(LDFLAGS) -o test_vectors $(TOBJS) $(OWN_LIBS) $(LIBS)
+$(OBIN)test_vectors: $(TOBJS) $(OWN_LIBS)
+	$(LDO) $(LDFLAGS) -o $@ $(TOBJS) $(OWN_LIBS) $(LIBS)
 
 clean: common-clean
 	rm -f core *~
diff --git a/wpa_supplicant/Makefile b/wpa_supplicant/Makefile
index 6de5ce571d92..d8afd718c715 100644
--- a/wpa_supplicant/Makefile
+++ b/wpa_supplicant/Makefile
@@ -9,6 +9,12 @@ ALL += dbus/fi.w1.wpa_supplicant1.service
 
 EXTRA_TARGETS=dynamic_eap_methods
 
+OUTPUTS = $(ALL) wpa_passphrase wpa_priv eapol_test preauth_test nfc_pw_token
+OUTPUTS += libwpa_client.a libwpa_client.so libwpa_client.a libpasn.so
+OUTPUTS += libwpa_test1 libwpa_test2
+OUTPUTS += win_if_list wpa_supplicant.exe wpa_cli.exe wpa_passphrase.exe
+OUTPUTS += win_if_list.exe eapol_test.exe
+
 CONFIG_FILE=.config
 include ../src/build.rules
 
@@ -81,30 +87,30 @@ mkconfig:
 	echo CONFIG_DRIVER_NL80211=y >> .config
 	echo CONFIG_DRIVER_WEXT=y >> .config
 
-$(DESTDIR)$(BINDIR)/%: %
+$(DESTDIR)$(BINDIR)/%: $(OBIN)%
 	install -D $(<) $(@)
 
 install: $(addprefix $(DESTDIR)$(BINDIR)/,$(BINALL))
 	$(MAKE) -C ../src install
 ifndef CONFIG_NO_WPA_PASSPHRASE
-	install -D wpa_passphrase $(DESTDIR)/$(BINDIR)/wpa_passphrase
+	install -D $(OBIN)wpa_passphrase $(DESTDIR)/$(BINDIR)/wpa_passphrase
 endif
 
 ifdef CONFIG_BUILD_PASN_SO
-	install -m 0644 -D libpasn.so $(DESTDIR)/$(LIBDIR)/libpasn.so
+	install -m 0644 -D $(OBIN)libpasn.so $(DESTDIR)/$(LIBDIR)/libpasn.so
 endif
 
 ifdef CONFIG_BUILD_WPA_CLIENT_SO
-	install -m 0644 -D libwpa_client.so $(DESTDIR)/$(LIBDIR)/libwpa_client.so
+	install -m 0644 -D $(OBIN)libwpa_client.so $(DESTDIR)/$(LIBDIR)/libwpa_client.so
 	install -m 0644 -D ../src/common/wpa_ctrl.h $(DESTDIR)/$(INCDIR)/wpa_ctrl.h
 endif
 ifdef CONFIG_BUILD_WPA_CLIENT_STATIC
-	install -m 0644 -D libwpa_client.a $(DESTDIR)/$(LIBDIR)/libwpa_client.a
+	install -m 0644 -D $(OBIN)libwpa_client.a $(DESTDIR)/$(LIBDIR)/libwpa_client.a
 	install -m 0644 -D ../src/common/wpa_ctrl.h $(DESTDIR)/$(INCDIR)/wpa_ctrl.h
 endif
-	if ls eap_*.so >/dev/null 2>&1; then \
+	if ls $(OBIN)eap_*.so >/dev/null 2>&1; then \
 		install -d $(DESTDIR)$(LIBDIR)/wpa_supplicant && \
-		cp *.so $(DESTDIR)$(LIBDIR)/wpa_supplicant \
+		cp $(OBIN)*.so $(DESTDIR)$(LIBDIR)/wpa_supplicant \
 	; fi
 
 ifdef CONFIG_FIPS
@@ -2092,42 +2098,42 @@ ifdef CONFIG_NO_TKIP
 CFLAGS += -DCONFIG_NO_TKIP
 endif
 
-dynamic_eap_methods: $(EAPDYN)
+dynamic_eap_methods: $(addprefix $(OBIN),$(EAPDYN))
 
 _OBJS_VAR := OBJS_priv
 include ../src/objs.mk
-wpa_priv: $(BCHECK) $(OBJS_priv)
-	$(Q)$(LDO) $(LDFLAGS) -o wpa_priv $(OBJS_priv) $(LIBS)
+$(OBIN)wpa_priv: $(BCHECK) $(OBJS_priv)
+	$(Q)$(LDO) $(LDFLAGS) -o $@ $(OBJS_priv) $(LIBS)
 	@$(E) "  LD " $@
 
 _OBJS_VAR := OBJS
 include ../src/objs.mk
-wpa_supplicant: $(BCHECK) $(OBJS) $(EXTRA_progs)
-	$(Q)$(LDO) $(LDFLAGS) -o wpa_supplicant $(OBJS) $(LIBS) $(EXTRALIBS)
+$(OBIN)wpa_supplicant: $(BCHECK) $(OBJS) $(addprefix $(OBIN),$(EXTRA_progs))
+	$(Q)$(LDO) $(LDFLAGS) -o $@ $(OBJS) $(LIBS) $(EXTRALIBS)
 	@$(E) "  LD " $@
 
 _OBJS_VAR := OBJS_t
 include ../src/objs.mk
-eapol_test: $(OBJS_t)
-	$(Q)$(LDO) $(LDFLAGS) -o eapol_test $(OBJS_t) $(LIBS)
+$(OBIN)eapol_test: $(OBJS_t)
+	$(Q)$(LDO) $(LDFLAGS) -o $@ $(OBJS_t) $(LIBS)
 	@$(E) "  LD " $@
 
 _OBJS_VAR := OBJS_t2
 include ../src/objs.mk
-preauth_test: $(OBJS_t2)
-	$(Q)$(LDO) $(LDFLAGS) -o preauth_test $(OBJS_t2) $(LIBS)
+$(OBIN)preauth_test: $(OBJS_t2)
+	$(Q)$(LDO) $(LDFLAGS) -o $@ $(OBJS_t2) $(LIBS)
 	@$(E) "  LD " $@
 
 _OBJS_VAR := OBJS_p
 include ../src/objs.mk
-wpa_passphrase: $(OBJS_p)
-	$(Q)$(LDO) $(LDFLAGS) -o wpa_passphrase $(OBJS_p) $(LIBS_p) $(LIBS)
+$(OBIN)wpa_passphrase: $(OBJS_p)
+	$(Q)$(LDO) $(LDFLAGS) -o $@ $(OBJS_p) $(LIBS_p) $(LIBS)
 	@$(E) "  LD " $@
 
 _OBJS_VAR := OBJS_c
 include ../src/objs.mk
-wpa_cli: $(OBJS_c)
-	$(Q)$(LDO) $(LDFLAGS) -o wpa_cli $(OBJS_c) $(LIBS_c)
+$(OBIN)wpa_cli: $(OBJS_c)
+	$(Q)$(LDO) $(LDFLAGS) -o $@ $(OBJS_c) $(LIBS_c)
 	@$(E) "  LD " $@
 
 LIBCTRL += ../src/common/wpa_ctrl.o
@@ -2141,114 +2147,116 @@ LIBCTRLSO += ../src/utils/wpa_debug.c
 
 _OBJS_VAR := LIBCTRL
 include ../src/objs.mk
-libwpa_client.a: $(LIBCTRL)
+$(OBIN)libwpa_client.a: $(LIBCTRL)
 	$(Q)rm -f $@
 	$(Q)$(AR) crs $@ $?
 	@$(E) "  AR " $@
 
-libwpa_client.so: $(LIBCTRLSO)
+$(OBIN)libwpa_client.so: $(LIBCTRLSO) | _make_dirs
 	@$(E) "  CC  $@ ($^)"
 	$(Q)$(CC) $(LDFLAGS) -o $@ $(CFLAGS) -shared -fPIC $^
 
 OBJS_wpatest := libwpa_test.o
 _OBJS_VAR := OBJS_wpatest
 include ../src/objs.mk
-libwpa_test1: $(OBJS_wpatest) libwpa_client.a
-	$(Q)$(LDO) $(LDFLAGS) -o libwpa_test1 $(OBJS_wpatest) libwpa_client.a $(LIBS_c)
+$(OBIN)libwpa_test1: $(OBJS_wpatest) $(OBIN)libwpa_client.a
+	$(Q)$(LDO) $(LDFLAGS) -o $@ $(OBJS_wpatest) $(OBIN)libwpa_client.a $(LIBS_c)
 	@$(E) "  LD " $@
 
-libwpa_test2: $(OBJS_wpatest) libwpa_client.so
-	$(Q)$(LDO) $(LDFLAGS) -o libwpa_test2 $(OBJS_wpatest) -L. -lwpa_client $(LIBS_c)
+$(OBIN)libwpa_test2: $(OBJS_wpatest) $(OBIN)libwpa_client.so
+	$(Q)$(LDO) $(LDFLAGS) -o $@ $(OBJS_wpatest) -L$(dir $(OBIN)libwpa_client.so) -lwpa_client $(LIBS_c)
 	@$(E) "  LD " $@
 
 _OBJS_VAR := OBJS_nfc
 include ../src/objs.mk
-nfc_pw_token: $(OBJS_nfc)
-	$(Q)$(LDO) $(LDFLAGS) -o nfc_pw_token $(OBJS_nfc) $(LIBS)
+$(OBIN)nfc_pw_token: $(OBJS_nfc)
+	$(Q)$(LDO) $(LDFLAGS) -o $@ $(OBJS_nfc) $(LIBS)
 	@$(E) "  LD " $@
 
-win_if_list: win_if_list.c
+$(OBIN)win_if_list: win_if_list.c | _make_dirs
 	$(Q)$(LDO) $(LDFLAGS) -o $@ win_if_list.c $(CFLAGS) $(LIBS_w)
 	@$(E) "  LD " $@
 
-eap_psk.so: $(SRC_EAP_PSK)
+$(OBIN)eap_psk.so: $(SRC_EAP_PSK) | _make_dirs
 	$(Q)$(CC) $(LDFLAGS) -o $@ $(CFLAGS) -shared -rdynamic -fPIC $^ \
 		-Deap_peer_psk_register=eap_peer_method_dynamic_init
 	@$(E) "  CC/LD " $@
 
-eap_pax.so: $(SRC_EAP_PAX)
+$(OBIN)eap_pax.so: $(SRC_EAP_PAX) | _make_dirs
 	$(Q)$(CC) $(LDFLAGS) -o $@ $(CFLAGS) -shared -rdynamic -fPIC $^ \
 		-D$(@F:eap_%.so=eap_peer_%)_register=eap_peer_method_dynamic_init
 	@$(E) "  CC/LD " $@
 
-eap_peap.so: $(SRC_EAP_PEAP)
+$(OBIN)eap_peap.so: $(SRC_EAP_PEAP) | _make_dirs
 	$(Q)$(CC) $(LDFLAGS) -o $@ $(CFLAGS) -shared -rdynamic -fPIC $^ \
 		-D$(@F:eap_%.so=eap_peer_%)_register=eap_peer_method_dynamic_init
 	@$(E) "  CC/LD " $@
 
-eap_sake.so: $(SRC_EAP_SAKE)
+$(OBIN)eap_sake.so: $(SRC_EAP_SAKE) | _make_dirs
 	$(Q)$(CC) $(LDFLAGS) -o $@ $(CFLAGS) -shared -rdynamic -fPIC $^ \
 		-D$(@F:eap_%.so=eap_peer_%)_register=eap_peer_method_dynamic_init
 	@$(E) "  CC/LD " $@
 
-eap_ikev2.so: $(SRC_EAP_IKEV2)
+$(OBIN)eap_ikev2.so: $(SRC_EAP_IKEV2) | _make_dirs
 	$(Q)$(CC) $(LDFLAGS) -o $@ $(CFLAGS) -shared -rdynamic -fPIC $^ \
 		-D$(@F:eap_%.so=eap_peer_%)_register=eap_peer_method_dynamic_init
 	@$(E) "  CC/LD " $@
 
-eap_eke.so: $(SRC_EAP_EKE)
+$(OBIN)eap_eke.so: $(SRC_EAP_EKE) | _make_dirs
 	$(Q)$(CC) $(LDFLAGS) -o $@ $(CFLAGS) -shared -rdynamic -fPIC $^ \
 		-D$(@F:eap_%.so=eap_peer_%)_register=eap_peer_method_dynamic_init
 	@$(E) "  CC/LD " $@
 
-eap_mschapv2.so: $(SRC_EAP_MSCHAPV2)
+$(OBIN)eap_mschapv2.so: $(SRC_EAP_MSCHAPV2) | _make_dirs
 	$(Q)$(CC) $(LDFLAGS) -o $@ $(CFLAGS) -shared -rdynamic -fPIC $^ \
 		-D$(@F:eap_%.so=eap_peer_%)_register=eap_peer_method_dynamic_init
 	@$(E) "  CC/LD " $@
 
-eap_fast.so: $(SRC_EAP_FAST)
+$(OBIN)eap_fast.so: $(SRC_EAP_FAST) | _make_dirs
 	$(Q)$(CC) $(LDFLAGS) -o $@ $(CFLAGS) -shared -rdynamic -fPIC $^ \
 		-D$(@F:eap_%.so=eap_peer_%)_register=eap_peer_method_dynamic_init
 	@$(E) "  CC/LD " $@
 
-eap_teap.so: $(SRC_EAP_TEAP)
+$(OBIN)eap_teap.so: $(SRC_EAP_TEAP) | _make_dirs
 	$(Q)$(CC) $(LDFLAGS) -o $@ $(CFLAGS) -shared -rdynamic -fPIC $^ \
 		-D$(@F:eap_%.so=eap_peer_%)_register=eap_peer_method_dynamic_init
 	@$(E) "  CC/LD " $@
 
-eap_gpsk.so: $(SRC_EAP_GPSK)
+$(OBIN)eap_gpsk.so: $(SRC_EAP_GPSK) | _make_dirs
 	$(Q)$(CC) $(LDFLAGS) -o $@ $(CFLAGS) -shared -rdynamic -fPIC $^ \
 		-D$(@F:eap_%.so=eap_peer_%)_register=eap_peer_method_dynamic_init
 	@$(E) "  CC/LD " $@
 
-%.so: ../src/eap_peer/%.c
+$(OBIN)%.so: ../src/eap_peer/%.c | _make_dirs
 	$(Q)$(CC) $(LDFLAGS) -o $@ $(CFLAGS) -shared -rdynamic -fPIC $< \
 		-D$(*F:eap_%=eap_peer_%)_register=eap_peer_method_dynamic_init
 	@$(E) "  CC/LD " $@
 
-%.service: %.service.in
+$(OBIN)%.service: %.service.in
+	@mkdir -p $(@D)
 	$(Q)sed -e 's|\@BINDIR\@|$(BINDIR)|g' $< >$@
 	@$(E) "  sed" $<
 
-%@.service: %.service.arg.in
+$(OBIN)%@.service: %.service.arg.in
+	@mkdir -p $(@D)
 	$(Q)sed -e 's|\@BINDIR\@|$(BINDIR)|g' $< >$@
 	@$(E) "  sed" $<
 
-wpa_supplicant.exe: wpa_supplicant
+$(OBIN)wpa_supplicant.exe: $(OBIN)wpa_supplicant
 	mv -f $< $@
-wpa_cli.exe: wpa_cli
+$(OBIN)wpa_cli.exe: $(OBIN)wpa_cli
 	mv -f $< $@
-wpa_passphrase.exe: wpa_passphrase
+$(OBIN)wpa_passphrase.exe: $(OBIN)wpa_passphrase
 	mv -f $< $@
-win_if_list.exe: win_if_list
+$(OBIN)win_if_list.exe: $(OBIN)win_if_list
 	mv -f $< $@
-eapol_test.exe: eapol_test
+$(OBIN)eapol_test.exe: $(OBIN)eapol_test
 	mv -f $< $@
 
 WINALL=wpa_supplicant.exe wpa_cli.exe wpa_passphrase.exe win_if_list.exe
 
 windows-bin: $(WINALL)
-	$(STRIP) $(WINALL)
+	$(STRIP) $(addprefix $(OBIN),$(WINALL))
 
 wpa_gui:
 	@echo "wpa_gui has been removed - see wpa_gui-qt4 for replacement"
@@ -2424,7 +2432,7 @@ LIBPASNSO += ../src/pasn/pasn_initiator.c
 LIBPASNSO += ../src/pasn/pasn_responder.c
 LIBPASNSO += ../src/pasn/pasn_common.c
 
-libpasn.so: $(LIBPASNSO)
+$(OBIN)libpasn.so: $(LIBPASNSO) | _make_dirs
 	@$(E) "  CC  $@ ($^)"
 	$(Q)$(CC) $(LDFLAGS) -o $@ $(PASN_CFLAGS) -shared -fPIC $^ -lcrypto $(LIBPASNSO_DEP)
 
-- 
2.55.0




More information about the Hostap mailing list