diff --git a/Makefile b/Makefile index b31ba05..c3ff325 100644 --- a/Makefile +++ b/Makefile @@ -363,9 +363,12 @@ HOSTCC = gcc HOSTCXX = g++ -KBUILD_HOSTCFLAGS := -Wall -Wstrict-prototypes -O2 \ - -fomit-frame-pointer $(HOST_LFS_CFLAGS) \ - $(HOSTCFLAGS) + +export KBUILD_USERCFLAGS := -Wall -Wmissing-prototypes -Wstrict-prototypes \ + -O2 -fomit-frame-pointer -std=gnu89 +export KBUILD_USERLDFLAGS := + +KBUILD_HOSTCFLAGS := $(KBUILD_USERCFLAGS) $(HOST_LFS_CFLAGS) $(HOSTCFLAGS) KBUILD_HOSTCXXFLAGS := -Wall -O2 $(HOST_LFS_CFLAGS) $(HOSTCXXFLAGS) KBUILD_HOSTLDFLAGS := $(HOST_LFS_LDFLAGS) $(HOSTLDFLAGS) KBUILD_HOSTLDLIBS := $(HOST_LFS_LIBS) $(HOSTLDLIBS) @@ -609,6 +612,10 @@ KBUILD_CFLAGS += $(call cc-disable-warning, address-of-packed-member) +# Align the bit size of userspace programs with the kernel +KBUILD_USERCFLAGS += $(filter -m32 -m64, $(KBUILD_CFLAGS)) +KBUILD_USERLDFLAGS += $(filter -m32 -m64, $(KBUILD_CFLAGS)) + # arch Makefile may override CC so keep this after arch Makefile is included NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include) CHECKFLAGS += $(NOSTDINC_FLAGS) diff --git a/scripts/Makefile b/scripts/Makefile index f3b9aec..75e6882 100644 --- a/scripts/Makefile +++ b/scripts/Makefile @@ -35,30 +35,21 @@ HOSTLDLIBS_omap4_usbboot = -lpthread `pkg-config --libs libusb-1.0` hostprogs-$(CONFIG_OMAP4_HOSTTOOL_USBBOOT) += omap4_usbboot +userprogs-$(CONFIG_BAREBOXENV_TARGET) += bareboxenv-target +userprogs-$(CONFIG_KERNEL_INSTALL_TARGET) += kernel-install-target +userprogs-$(CONFIG_BAREBOXCRC32_TARGET) += bareboxcrc32-target +userprogs-$(CONFIG_IMD_TARGET) += bareboximd-target + +userccflags += -I $(srctree)/$(src)/include + +userprogs := $(userprogs-y) +always-y := $(hostprogs-y) $(hostprogs-m) $(userprogs-y) + subdir-y += mod subdir-y += imx subdir-$(CONFIG_X86) += setupmbr subdir-$(CONFIG_DTC) += dtc subdir-$(CONFIG_ARCH_TEGRA) += tegra -targetprogs-$(CONFIG_BAREBOXENV_TARGET) += bareboxenv-target -targetprogs-$(CONFIG_KERNEL_INSTALL_TARGET) += kernel-install-target -targetprogs-$(CONFIG_BAREBOXCRC32_TARGET) += bareboxcrc32-target -targetprogs-$(CONFIG_IMD_TARGET) += bareboximd-target - # Let clean descend into subdirs subdir- += basic kconfig setupmbr - -quiet_cmd_csingle = CC $@ - cmd_csingle = $(CC) -Wp,-MD,$(depfile) $(TARGETCFLAGS) $(KBUILD_CFLAGS) -o $@ $< - -__targetprogs := $(sort $(targetprogs-y) $(targetprogs-m)) -target-csingle := $(foreach m,$(__targetprogs),$(if $($(m)-objs),,$(m))) -__targetprogs := $(addprefix $(obj)/,$(__targetprogs)) -target-csingle := $(addprefix $(obj)/,$(target-csingle)) -TARGETCFLAGS += -I$(srctree)/scripts/include/ - -always := $(hostprogs-y) $(hostprogs-m) $(targetprogs-y) - -$(target-csingle): %-target: %.c FORCE - $(call if_changed_dep,csingle) diff --git a/scripts/Makefile.build b/scripts/Makefile.build index 00f6277..a3dfe26 100644 --- a/scripts/Makefile.build +++ b/scripts/Makefile.build @@ -49,6 +49,12 @@ include scripts/Makefile.host endif +# Do not include userprogs rules unless needed. +userprogs := $(sort $(userprogs)) +ifneq ($(userprogs),) +include scripts/Makefile.userprogs +endif + ifndef obj $(warning kbuild: Makefile.build is included improperly) endif diff --git a/scripts/Makefile.clean b/scripts/Makefile.clean index 6e6c9ef..97fd2ef 100644 --- a/scripts/Makefile.clean +++ b/scripts/Makefile.clean @@ -37,7 +37,7 @@ __clean-files := $(extra-y) $(extra-m) $(extra-) \ $(always) $(always-y) $(always-m) $(always-) $(targets) $(clean-files) \ - $(hostprogs) $(hostprogs-y) $(hostprogs-m) $(hostprogs-) + $(hostprogs) $(hostprogs-y) $(hostprogs-m) $(hostprogs-) $(userprogs) # as clean-files is given relative to the current directory, this adds # a $(obj) prefix, except for absolute paths diff --git a/scripts/Makefile.userprogs b/scripts/Makefile.userprogs new file mode 100644 index 0000000..fb41529 --- /dev/null +++ b/scripts/Makefile.userprogs @@ -0,0 +1,45 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Build userspace programs for the target system +# + +# Executables compiled from a single .c file +user-csingle := $(foreach m, $(userprogs), $(if $($(m)-objs),,$(m))) + +# Executables linked based on several .o files +user-cmulti := $(foreach m, $(userprogs), $(if $($(m)-objs),$(m))) + +# Objects compiled from .c files +user-cobjs := $(sort $(foreach m, $(userprogs), $($(m)-objs))) + +user-csingle := $(addprefix $(obj)/, $(user-csingle)) +user-cmulti := $(addprefix $(obj)/, $(user-cmulti)) +user-cobjs := $(addprefix $(obj)/, $(user-cobjs)) + +user_ccflags = -Wp,-MMD,$(depfile) $(KBUILD_USERCFLAGS) $(userccflags) \ + $($(target-stem)-userccflags) +user_ldflags = $(KBUILD_USERLDFLAGS) $(userldflags) $($(target-stem)-userldflags) + +# Create an executable from a single .c file +quiet_cmd_user_cc_c = CC [U] $@ + cmd_user_cc_c = $(CC) $(user_ccflags) $(user_ldflags) -o $@ $< \ + $($(target-stem)-userldlibs) +$(user-csingle): $(obj)/%: $(src)/%.c FORCE + $(call if_changed_dep,user_cc_c) + +# Link an executable based on list of .o files +quiet_cmd_user_ld = LD [U] $@ + cmd_user_ld = $(CC) $(user_ldflags) -o $@ \ + $(addprefix $(obj)/, $($(target-stem)-objs)) \ + $($(target-stem)-userldlibs) +$(user-cmulti): FORCE + $(call if_changed,user_ld) +$(call multi_depend, $(user-cmulti), , -objs) + +# Create .o file from a .c file +quiet_cmd_user_cc_o_c = CC [U] $@ + cmd_user_cc_o_c = $(CC) $(user_ccflags) -c -o $@ $< +$(user-cobjs): $(obj)/%.o: $(src)/%.c FORCE + $(call if_changed_dep,user_cc_o_c) + +targets += $(user-csingle) $(user-cmulti) $(user-cobjs) diff --git a/scripts/bareboxcrc32-target.c b/scripts/bareboxcrc32-target.c new file mode 100644 index 0000000..6c09c9f --- /dev/null +++ b/scripts/bareboxcrc32-target.c @@ -0,0 +1 @@ +#include "bareboxcrc32.c" diff --git a/scripts/bareboxenv-target.c b/scripts/bareboxenv-target.c new file mode 100644 index 0000000..caf1759 --- /dev/null +++ b/scripts/bareboxenv-target.c @@ -0,0 +1 @@ +#include "bareboxenv.c" diff --git a/scripts/bareboximd-target.c b/scripts/bareboximd-target.c new file mode 100644 index 0000000..903adee --- /dev/null +++ b/scripts/bareboximd-target.c @@ -0,0 +1 @@ +#include "bareboximd.c" diff --git a/scripts/kernel-install-target.c b/scripts/kernel-install-target.c new file mode 100644 index 0000000..845a96d --- /dev/null +++ b/scripts/kernel-install-target.c @@ -0,0 +1 @@ +#include "kernel-install.c"