l4re-base-25.08.0

This commit is contained in:
2025-09-12 15:55:45 +02:00
commit d959eaab98
37938 changed files with 9382688 additions and 0 deletions

328
src/l4/mk/Kconfig Normal file
View File

@@ -0,0 +1,328 @@
mainmenu "L4Re Configuration"
source "Kconfig.generated.defines"
config ARCH_ENABLE_STACK_PROTECTOR
bool
config ARCH_NO_MMU
bool
choice
prompt "Target Architecture"
# ARCH_CHOICE_DEFAULT
help
Specify for which processor architecture you want to build.
# ARCH_CHOICE
endchoice
config BUILD_ARCH
string
# ARCH_NAME
# currently we have nothing for abi linux, so just do not offer this option
#choice
# prompt "ABI"
# default BUILD_ABI_l4f
#
#config BUILD_ABI_l4f
# bool "L4/Fiasco"
#
#config BUILD_ABI_linux
# bool "Linux"
#
#endchoice
config BUILD_ABI_l4f
def_bool y
config BUILD_ABI
string
default "l4f" if BUILD_ABI_l4f
default "linux" if BUILD_ABI_linux
# PF_INCLUDE
source "mk/arch/Kconfig.common.inc"
choice
prompt "Platform Selection"
# ARCH_DEFAULT_PF
# ARCH_PLATFORMS
endchoice
source "Kconfig.generated.platform_types"
source "Kconfig.generated.pkgs"
config MMU
bool
default y
depends on !ARCH_NO_MMU
config USE_DROPS_STDDIR
def_bool n
config DROPS_STDDIR
string
default "/path/to/l4re"
config DROPS_INSTDIR
string
default "/path/to/l4re"
config BID_COLORED_PHASES
bool
default y
menu "Building"
config YACC
string
default "yacc"
config LEX
string
default "flex"
config BID_OPTIMIZE_SIZE
bool "Optimize for size (-Os)"
help
Use -Os instead of -O2 to build smaller executables.
config BID_DEBUG_INFO
bool "Generate debug information"
default y
help
Generate debug information.
If unsure, say 'Y'.
choice
prompt "Position independent executables"
depends on (BUILD_ARCH_amd64 || BUILD_ARCH_arm || BUILD_ARCH_arm64) && L4_LIBC_UCLIBC
default BID_PIE_VOLUNTARY
config BID_PIE_NONE
bool "no"
help
Do not support position independent executables.
config BID_PIE_VOLUNTARY
bool "selected packages"
help
Build position independent executables where beneficial. All
libraries are built as position independent. Executables are only
linked position independent if the package indicated to do so.
Enabling this option will add some executable size and runtime
overhead.
config BID_PIE_ALL
bool "everything"
depends on EXPERIMENTAL
help
Build all executables as position independent. This is not supported
by all packages on all platforms and might break their build.
Enabling this option will add some executable size and runtime
overhead.
endchoice
config BID_BUILD_TESTS
bool "Also build tests"
default y
help
Enable to build tests.
If unsure, say 'N'.
config BID_BUILD_TESTS_SHARED
bool "Use shared linking for tests" if EXPERT
depends on BID_BUILD_TESTS
default y if !ARCH_NO_MMU
help
Linking tests shared reduces the on-disk footprint of the build tree,
and, potentially, also the amount of data needed to be transferred on
a single test invocation.
Enable this on platforms that support it if in doubt.
config INT_CPP_NAME_SWITCH
bool "Automatically determine internal gcc preprocessor names"
default y
config INT_LD_NAME_SWITCH
bool "Automatically determine internal ld names"
default y
config INT_PP_NAME
string "Internal name of the compiler preprocessor"
default "cpp0"
depends on !INT_CPP_NAME_SWITCH
config INT_LD_NAME
string "Internal name of the compiler linker"
default "ld"
depends on !INT_LD_NAME_SWITCH
config BID_STRIP_BINARIES
bool "Strip binaries on install"
default y
help
If enabled, binaries (libraries and executables) will be stripped on
installation into $(L4DIR)/bin or $(DROPS_STDDIR)/bin. If you want
to load them with all their symbols (eg to show the symbols with the
Fiasco kernel debugger), say 'N' here.
If unsure, say 'Y'.
config BID_LD_EMIT_UNWIND
bool "GCC: Emit unwind tables"
help
If enabled, gcc will be passed the '-funwind-tables' cmdline
option, adding unwind tables for all generated code. Binaries will
be larger, but without unwind tables no backtraces can be created
on most architectures (except on x86) and no exception handling
can be provided by LLVM's libunwind.
If unsure, say 'N'.
config BID_GCC_OMIT_FP
bool "GCC: Omit Frame-pointers"
default y
help
If enabled, gcc will be passed the '-fomit-frame-pointer' cmdline
option, adding an additional register to the register set for the
generated code. Programs will be faster, but backtraces cannot be
done, seriously hindering debugging.
If unsure, say 'Y'.
config BID_GCC_ENABLE_STACK_PROTECTOR
bool "GCC: enable stack protector"
default y if ARCH_ENABLE_STACK_PROTECTOR
help
If enabled, support for the gcc stack protector will be enabled.
The stack protector uses stack canaries to detect stack smashing
attacks (see "man gcc" for details). In L4Re the stack protector is
enabled only for packages that are linked against the full uclibc.
Enabling this feature will add some overhead, but increase security.
If unsure, say 'Y'.
choice
prompt "GCC: Enable stack protector"
depends on BID_GCC_ENABLE_STACK_PROTECTOR
default BID_GCC_STACK_PROTECTOR
config BID_GCC_STACK_PROTECTOR_ALL
bool "on all functions"
help
If enabled, '-fstack-protector-all' flag is used for gcc. This
option adds significant overhead, as the stack canary is checked on
every function return. See "man gcc" for details.
config BID_GCC_STACK_PROTECTOR
bool "exclusively for functions with vulnerable objects"
help
If enabled, '-fstack-protector' flag is passed to gcc. If this
flag is set, gcc will add stack canaries to vulnerable functions, such as
functions that call "alloca", and functions with buffers larger than 8
bytes.
endchoice
config BID_GENERATE_MAPFILE
bool "Generate Map-files for binaries"
help
Enabling this option will generate map-files together with the
binaries. This might be handy for debugging purposes. See ld(1)
for details on mapfiles.
If unsure, say N.
config BID_BUILD_DOC
bool "Build doc directories"
help
Say Y if you also want to build the doc directories.
config RELEASE_MODE
bool "Do a release and non-debug(able) build"
help
Enable to leave out debugging and other code normally not needed.
Do only enable this after you have a working configuration.
Say N.
config MAKECONFS_ADD
string "Additional Makeconf files"
help
List of white space separated suffixes of Makeconf files
which will be included in every source directory as
Makeconf.<suffix>.
config EXPERIMENTAL
bool "Prompt for experimental features"
help
Experimental features are available when enabling this option.
This encompases features that are still in development and might not
work correctly for all packages on all architectures at all times.
Use with caution!
if EXPERIMENTAL
config BID_THUMB
bool "Build thumb code"
depends on BUILD_ARCH_arm
help
Build with -mthumb by default. This will reduce the code size at the
slight expense of execution speed.
config BID_STATIC_HEAP
bool "Static heap reservation"
depends on BID_CAN_STATIC_HEAP
help
Statically reserve the heap in the bss section of executables.
This will save the additional MPU region that would otherwise be
necessary due to the dynmamic allocation of a dataspace.
config BID_STATIC_STACK
bool "Static stack allocation"
depends on BID_CAN_STATIC_STACK
help
Statically allocate stack in bss section of executables.
This will save the additional MPU region that would otherwise be
necessary. Also relieves the loader from dynamically allocating any
stack memory.
endif # EXPERIMENTAL
config BID_CAN_STATIC_HEAP
bool # enabled by l4re-core for configurations that support this
config BID_CAN_STATIC_STACK
bool # enabled by l4re-core for configurations that support this
config BID_PIE
bool
default y
depends on BID_PIE_VOLUNTARY || BID_PIE_ALL
config EXPERT
bool "Show expert options"
help
Expert options are those that you should never have to change unless
you have a very good reason to do so. Their default values are
intended to be used for nearly all use-cases. So only enable this
option if you are certain that you need it and ensure you are aware
of all consequences when changing any of them.
endmenu
# PKG_KCONFIG

790
src/l4/mk/Makeconf Normal file
View File

@@ -0,0 +1,790 @@
# -*- Makefile -*-
# vim:set ft=make:
#
# L4Re Buildsystem
#
# Make configuration file
#
# This file is included by all Makefile-templates. This file defines macros
# for div commands, sets general DROPS-Makefile variables, ensures the
# dependencies from the various Makeconf.locals, defines the messages for
# div actions, and permits the dependency-creation on clean-rules.
#
ifeq ($(origin _L4DIR_MK_MAKECONF),undefined)
_L4DIR_MK_MAKECONF=y
include $(L4DIR)/mk/util.mk
MAKEFLAGS += --no-print-directory -Rr
# the default target is all
all::
mrproper:: cleanall
# make .general.d dependent on the role-file
$(if $(ROLE),$(OBJ_DIR)/.general.d: $(L4DIR)/mk/$(ROLE))
-include $(wildcard $(L4DIR)/mk/arch/Makeconf.*)
# Additional available variants, 'std' is always available
VARIANTS_AVAILABLE := $(patsubst $(L4DIR)/mk/variants/%.inc,%,$(wildcard $(L4DIR)/mk/variants/*.inc))
include $(foreach v,$(VARIANTS_AVAILABLE),$(L4DIR)/mk/variants/$(v).inc)
CHOSEN_VARIANTS := $(subst +, ,$(VARIANT))
# Get variant specific variables for all chosen variants. This will for
# example get <VARNAME>-variant-nofpu if nofpu variant is a chosen variant
define variant_values
$(foreach v, $(CHOSEN_VARIANTS), $($(1)-variant-$(v)))
endef
$(foreach v, $(CHOSEN_VARIANTS), $(eval $(BID_DEFINE-variant-$(v))))
ARCH = $(BUILD_ARCH)
BUILDDIR_SEARCHPATH = $(OBJ_BASE)/bin/$(ARCH)_$(CPU)/plain:$(OBJ_BASE)/bin/$(ARCH)_$(CPU)/$(BUILD_ABI):$(OBJ_BASE)/lib/$(ARCH)_$(CPU)/std/plain:$(OBJ_BASE)/lib/$(ARCH)_$(CPU)/std/$(BUILD_ABI):$(OBJ_BASE)/assets
CROSS_COMPILE ?= $(CROSS_COMPILE_$(ARCH))
OFORMAT = $(OFORMAT_$(ARCH))
BFD_ARCH = $(BFD_ARCH_$(ARCH))
L4_KIP_ADDR ?= $(L4_KIP_ADDR_$(ARCH))
L4_KIP_OFFS_SYS_INVOKE = 0x800
L4_KIP_OFFS_SYS_DEBUGGER = 0x900
L4_STACK_ADDR ?= $(L4_STACK_ADDR_$(ARCH))
L4_STACK_SIZE ?= $(if $(L4_STACK_SIZE_MAIN_THREAD),$(L4_STACK_SIZE_MAIN_THREAD),0x8000)
CC_WHITELIST-gcc := 9 10 11 12 13 14 15
CC_WHITELIST-clang := 15 16 17 18 19
VERBOSE = $(if $(CONFIG_VERBOSE),,@)
DEPEND_VERBOSE = $(if $(CONFIG_DEPEND_VERBOSE),,@)
DROPS_STDDIR = $(patsubst "%",%,$(CONFIG_DROPS_STDDIR))
DROPS_INSTDIR = $(patsubst "%",%,$(CONFIG_DROPS_INSTDIR))
RAM_SIZE_MB = $(CONFIG_RAM_SIZE_MB)
PLATFORM_TYPE ?= $(patsubst "%",%,$(CONFIG_PLATFORM_TYPE))
BITS = $(patsubst "%",%,$(CONFIG_BITS))
CPU = $(patsubst "%",%,$(CONFIG_CPU))
CPU_ABI = $(patsubst "%",%,$(CONFIG_CPU_ABI))
BUILD_ABI = $(patsubst "%",%,$(CONFIG_BUILD_ABI))
BUILD_ARCH = $(patsubst "%",%,$(CONFIG_BUILD_ARCH))
MAKECONFS_ADD = $(call strip_quotes,$(CONFIG_MAKECONFS_ADD))
CARCHFLAGS = $(CARCHFLAGS_$(ARCH)) $(CARCHFLAGS_$(ARCH)_$(CPU))
CCXX_FLAGS = $(CCXX_FLAGS_$(BUILD_ARCH))
error_on_env_vars = $(if $(filter environment,$(origin $1)), \
$(error '$1' specified in environment. \
Please use a Makeconf.local file for \
specifying tool overrides explicitly))
dv = $(call error_on_env_vars,$1)$\
$(if $(filter-out default undefined,$(origin $(1))),$(1)-default,$(1))
$(call dv,AR) = $(CROSS_COMPILE)ar
$(call dv,AS) = $(CROSS_COMPILE)as
AWKP ?= gawk --posix
CCACHE ?= ccache
$(call dv,FC) = $(if $(USE_CCACHE),$(CCACHE) )$(CROSS_COMPILE)gfortran
# Args: 1=$(CLANG); 2=clang/clang++/clang-cpp
# Rules:
# If $(CLANG) contains '-', use $(CLANG) as clang-version
# else if $(CLANG) contains '/', use $(CLANG) as clang-path
# otherwise clang-version/clang-path are both empty.
# The $\ is required to suppress a newline in the command for $(CLANG) without
# '-', see the comparison in BID_call_compiler_default.
clang-bin = $(if $(filter -%,$(1)),$(2)$(1),$\
$(if $(filter %/,$(1)),$(1)$(2),$(2)))
clang-bin-tgt = $(call clang-bin,$(1),$(2)) \
$(addprefix --target=,$(notdir $(CROSS_COMPILE:%-=%)))
$(call dv,CC) = $(if $(USE_CCACHE),$(CCACHE) )$(if $(CLANG),$(call \
clang-bin-tgt,$(CLANG),clang),$(CROSS_COMPILE)gcc)
$(call dv,CXX) = $(if $(USE_CCACHE),$(CCACHE) )$(if $(CLANG),$(call \
clang-bin-tgt,$(CLANG),clang++),$(CROSS_COMPILE)g++)
$(call dv,CPP) = $(if $(CLANG),$(call \
clang-bin-tgt,$(CLANG),clang-cpp),$(CROSS_COMPILE)cpp)
$(call dv,ADAC) = $(CROSS_COMPILE)gnatmake -q
HOST_ADAC = gnatmake -q
CP ?= cp
DOXYGEN ?= doxygen
ECHO ?= echo
ELF_PATCHER = $(OBJ_BASE)/tool/elf-patcher/elf-patcher
FIXDEP = $(OBJ_BASE)/scripts/basic/fixdep
GENOFFSETS = $(L4DIR)/tool/bin/genoffsets.pl
GOSH = $(firstword $(wildcard $(L4DIR)/../tools/gosh/gosh \
$(DROPS_STDDIR)/tool/bin/gosh \
$(shell which gosh 2>/dev/null) ) \
did_not_find_gosh___please_install_gosh )
HOST_CC ?= $(if $(CLANG),$(call clang-bin,$(CLANG),clang),gcc)
HOST_CXX ?= $(if $(CLANG),$(call clang-bin,$(CLANG),clang++),g++)
HOST_LD ?= ld
INSTALL = install
$(call dv,LD) = $(CROSS_COMPILE)ld -m $(LD_EMULATION) --oformat $(OFORMAT)
DTC ?= dtc
LATEX = latex
PDFLATEX = pdflatex
GREP = GREP_OPTIONS= grep
LN = ln
MKDIR = mkdir -p
NM ?= $(CROSS_COMPILE)nm
OBJCOPY ?= $(CROSS_COMPILE)objcopy
OBJDUMP ?= $(CROSS_COMPILE)objdump
RANLIB ?= $(CROSS_COMPILE)ranlib
$(call dv,RM) = rm -f
SCRUB = $(RM) $(wildcard *.old) $(wildcard *~) $(wildcard *.bak) \
$(wildcard \#*\#)
SED = sed
SHELL = bash
SIZE ?= $(CROSS_COMPILE)size
STRIP ?= $(CROSS_COMPILE)strip
SVN = svn
TR = tr
GEN_DOPECODE = $(L4DIR)/tool/gen_dopecode/gen_dopecode
PAGER ?= less
DISASM_CMD ?= $(OBJDUMP) -lCSd $(1) | $(PAGER)
IMAGES_DIR ?= $(OBJ_BASE)/images
# QEMU defaults
QEMU_ARCH_MAP_$(ARCH) ?= qemu-system-$(ARCH)
QEMU_PATH ?= $(QEMU_ARCH_MAP_$(ARCH))
# Arm FVP defaults
FVP_PLAT_MAP_arm_fvp_base ?= FVP_Base_RevC-2xAEMvA
FVP_PLAT_MAP_arm_fvp_base_r ?= FVP_BaseR_AEMv8R
FVP_PATH ?= $(FVP_PLAT_MAP_$(PLATFORM_TYPE))
# Subdirs where libs and binaries are put into
BID_install_subdir_base = $(ARCH)_$(CPU)/$(L4API)
BID_install_subdir_var = $(subst -,/,$(SYSTEM))
ifneq ($(PT),)
PLATFORM_TYPE := $(PT)
endif
# include this one early to be able to set OBJ_BASE
-include $(L4DIR)/Makeconf.local
-include $(L4DIR)/conf/Makeconf.local
# output directory
ifeq ($(O)$(OBJ_BASE),)
$(error need to give builddir with O=.../builddir)
else
ifneq ($(O),)
ifeq ($(filter-out undefined environment,$(origin OBJ_BASE)),)
OBJ_BASE := $(abspath $(O))
export OBJ_BASE
# prevent passing O to sub-makes, because it may be a relative path
# not valid there
override O =
MAKEOVERRIDES := $(filter-out O=%,$(MAKEOVERRIDES))
endif
endif
endif
ifeq ($(origin L4DIR_ABS),undefined)
L4DIR_ABS := $(abspath $(L4DIR))
endif
ifeq ($(origin PKGDIR_ABS),undefined)
PKGDIR_ABS := $(abspath $(PKGDIR))
endif
ifeq ($(origin SRC_DIR),undefined)
SRC_DIR := $(CURDIR)
endif
ifeq ($(origin SRC_BASE_ABS),undefined)
SRC_BASE ?= $(L4DIR)
SRC_BASE_ABS := $(abspath $(SRC_BASE))
export SRC_BASE_ABS
endif
ifeq ($(origin OBJ_DIR),undefined)
OBJ_DIR := $(subst $(SRC_BASE_ABS),$(OBJ_BASE),$(SRC_DIR))
endif
ifeq ($(origin PKGDIR_OBJ),undefined)
PKGDIR_OBJ := $(abspath $(OBJ_DIR)/$(PKGDIR))
endif
PKGDIR_REL := $(patsubst pkg/%,%,$(patsubst $(L4DIR_ABS)/%,%,$(PKGDIR_ABS)))
# if PKGDIR is not in L4DIR, we have an external package, so make up some
# build-dir for it
ifneq ($(patsubst $(L4DIR_ABS)/%,,$(PKGDIR_ABS)),)
ifneq ($(filter-out $(OBJ_BASE)/ext-pkg%,$(PKGDIR_OBJ)),)
PKGDIR_OBJ := $(OBJ_BASE)/ext-pkg$(PKGDIR_OBJ)
OBJ_DIR := $(OBJ_BASE)/ext-pkg$(OBJ_DIR)
endif
endif
# sanity check the object dir
ifneq ($(SRC_BASE_ABS),$(OBJ_BASE))
ifeq ($(SRC_DIR),$(OBJ_DIR))
$(warning Sorry, your object or source path became garbled.)
$(warning OBJ_BASE: $(OBJ_BASE))
$(warning SRC_BASE_ABS: $(SRC_BASE_ABS))
$(warning SRC_DIR: $(SRC_DIR))
$(warning OBJ_DIR: $(OBJ_DIR))
$(warning PKGDIR: $(PKGDIR))
$(warning L4DIR_ABS: $(L4DIR_ABS))
$(warning PKGDIR_ABS: $(PKGDIR_ABS))
$(warning PKGDIR_OBJ: $(PKGDIR_OBJ))
$(error Please investigate.)
endif
endif
OBJ_DIR_EXPORT = $(OBJ_DIR)
export OBJ_DIR_EXPORT
VPATH_SRC_BASE ?= $(SRC_DIR)
# Makeconf.local handling
# dont use -include here, as we have special build conditions in $(L4DIR)/
ifeq ($(origin BID_ROOT_CONF),undefined)
BID_ROOT_CONF := $(abspath $(OBJ_BASE))/.config.all
endif
ifeq ($(wildcard $(BID_ROOT_CONF)),)
ifeq ($(BID_IGN_ROOT_CONF),)
$(error No configuration file found in build directory "$(OBJ_BASE)". Please run "make O=/path/to/objdir config" in "$(L4DIR_ABS)" or specify a valid build directory)
endif
else
include $(BID_ROOT_CONF)
endif
# If we're working on a program that wants the RAM_BASE be considered in its
# linking address, source a possible privately configured one. Without MMU,
# we naturally need RAM_BASE.
ifneq ($(if $(CONFIG_MMU),$(RELOC_PHYS),y),)
INCLUDE_BOOT_CONFIG := required
endif
ifneq ($(INCLUDE_BOOT_CONFIG),)
-include $(L4DIR)/conf/Makeconf.boot
-include $(OBJ_BASE)/conf/Makeconf.boot
PLATFORM_CONF_FILE := $(firstword $(wildcard $(L4DIR)/conf/platforms/$(PLATFORM_TYPE).conf $(L4DIR)/mk/platforms/$(PLATFORM_TYPE).conf))
ifneq ($(PLATFORM_TYPE),$(patsubst "%",%,$(CONFIG_PLATFORM_TYPE)))
include $(PLATFORM_CONF_FILE)
else
ifneq ($(CONFIG_PLATFORM_TYPE_custom),)
PLATFORM_RAM_BASE=$(CONFIG_PLATFORM_RAM_BASE)
PLATFORM_RAM_SIZE_MB=$(CONFIG_PLATFORM_RAM_SIZE_MB)
PLATFORM_UART_NR=$(CONFIG_PLATFORM_UART_NR)
else
ifeq ($(INCLUDE_BOOT_CONFIG),optional)
-include $(PLATFORM_CONF_FILE)
else
include $(PLATFORM_CONF_FILE)
endif
endif
endif
-include $(OBJ_BASE)/Makeconf.ram_base
BID_RAM_BASE_DEP := $(if $(wildcard $(OBJ_BASE)/Makeconf.ram_base),$(OBJ_BASE)/Makeconf.ram_base)
ifeq ($(RAM_BASE),)
RAM_BASE := 0
endif
RAM_SIZE_MB := $(if $(RAM_SIZE_MB),$(RAM_SIZE_MB),$(PLATFORM_RAM_SIZE_MB))
endif
INCLUDE_MAKE_RULES += $(foreach m,$(MAKECONFS_ADD),$(SRC_DIR)/Makeconf.$(m))
INCLUDE_MAKE_RULES_EXPANDED := $(foreach m,$(INCLUDE_MAKE_RULES),$(wildcard $(m)))
ifneq ($(strip $(INCLUDE_MAKE_RULES_EXPANDED)),)
-include $(INCLUDE_MAKE_RULES_EXPANDED)
endif
-include $(OBJ_BASE)/Makeconf.local
-include $(OBJ_BASE)/conf/Makeconf.local
ifneq ($(PKGDIR_ABS),)
-include $(PKGDIR_ABS)/Makeconf.local
endif
# if it is not already set, we use this in the local dir
MAKECONFLOCAL ?= Makeconf.local
-include $(MAKECONFLOCAL)
define _check_toolpath
ifneq ($(CONFIGURED_$1),)
ifneq ($(CONFIGURED_$1),$(realpath $(shell which $(filter-out $(CCACHE),$($1)))))
$$(error Configured $1 different than used one:$$(newline) \
Configured: $(CONFIGURED_$1)$$(newline) \
Used: $(realpath $(shell which $(filter-out $(CCACHE),$($1))))$$(newline) \
==> Please reconfigure by calling "make oldconfig" in the root source directory with the same compiler set)
endif
endif
endef
ifeq ($(BID_IGN_ROOT_CONF),)
$(eval $(call _check_toolpath,CC))
$(eval $(call _check_toolpath,CXX))
endif
DROPS_STDDIR ?= /home/drops
QEMU_OPTIONS ?= -serial stdio $(QEMU_OPTIONS_$(ARCH))
ifneq ($(PL),)
PL_j := -j $(PL)
export PL
endif
include $(L4DIR)/mk/config.inc
# MAKEDEP-call:
# arg1 - compiler binary name
# arg2 - [opt] compiler target. Will be written as target within the
# dependency file
# arg3 - [opt] name of the dependency file. If unset, .<arg2>.d will be used.
# arg4 - [opt] alternative binary name
ifeq ($(origin BID_LIBGENDEP_PATHS), undefined)
ifeq ($(HOST_SYSTEM),linux)
BID_LIBGENDEP_PATHS_fn = \
$(firstword $(wildcard $(abspath $(OBJ_BASE)/tool/gendep$(1) \
$(DROPS_STDDIR)/tool/lib$(1))))
BID_LIBGENDEP_PATHS := \
$(call BID_LIBGENDEP_PATHS_fn,/64):$(call \
BID_LIBGENDEP_PATHS_fn,/32):$(call BID_LIBGENDEP_PATHS_fn)
endif
ifeq ($(HOST_SYSTEM),darwin)
BID_LIBGENDEP_PATHS := \
$(firstword $(wildcard $(abspath $(OBJ_BASE)/tool/gendep \
$(DROPS_STDDIR)/tool/lib)))
endif
endif
ifeq ($(HOST_SYSTEM),linux)
LD_GENDEP_PREFIX = LD_PRELOAD=libgendep.so LD_LIBRARY_PATH=$(if $(LD_LIBRARY_PATH),$(LD_LIBRARY_PATH):)$(BID_LIBGENDEP_PATHS)
endif
ifeq ($(HOST_SYSTEM),darwin)
LD_GENDEP_PREFIX = DYLD_FORCE_FLAT_NAMESPACE=1 DYLD_INSERT_LIBRARIES=$(BID_LIBGENDEP_PATHS)/libgendep.so
endif
MAKEDEP=$(LD_GENDEP_PREFIX) \
GENDEP_TARGET=$(if $(2),$(2),$@) \
GENDEP_BINARY=$(firstword $(1)) $(if $(3),GENDEP_DEPFILE=$(3)) \
$(if $(4),GENDEP_BINARY_ALT1=$(4))
# We recognize the following Fortran file extensions.
FORTRAN_FILE_EXTENSIONS = .f .F .f90 .F90 .f95 .F95
# We recognize the following Ada file extensions.
ADA_FILE_EXTENSIONS = .adb .ads
# We recognize the following file extensions for assembly.
BID_ASM_FILE_EXTENSIONS ?= .S
BID_ASM_CPP_FILE_EXTENSIONS ?= .S
# macros used here and in packages
# check if the current architecture is in the provided list of allowed
# architectures and exit with an error if not.
# 1: list of allowed architectures
define check_for_arch
$(if $(filter $(ARCH),$1),,
$(error ERROR: Architecture '$(ARCH)' is not supported for target $@))
endef
# Get all variants of a variable
# This contains specific versions of this variable for
# - architecture
# - original system
# - target
# - target directory
# As well es their `-y` variants
#
# 1: variable name
define bid_flag_variants
$($(1)-y) $($(1)_$(ARCH)) $($(1)_$(ARCH)-y) \
$($(1)_$(OSYSTEM)) $($(1)_$(OSYSTEM)-y) \
$($(1)_$@) $($(1)_$@-y) $($(1)_$@_$(OSYSTEM)) $($(1)_$@_$(OSYSTEM)-y) \
$($(1)_$(@D)) $($(1)_$<) $($(1)_$(@D)/$(<F)) \
$($(1)_$(<F)) $($(1)_$(<F)_$(OSYSTEM)) $($(1)_$(<F)_$(OSYSTEM)-y) \
$($(1)_$(<D)) $(call variant_values,$(1))
endef
# 1: argument to validate and return if it works
# 2: return if argument does not work with compiler
# 3: compiler name
# 4: compiler type
check_compiler_opt = $(if $(shell $(filter-out $(CCACHE),$(3)) $(CARCHFLAGS) \
$(CCXX_FLAGS) $(check_compiler_flags) $(1) -c -o /dev/null \
-x $(4) /dev/null >/dev/null 2>&1 || echo X),$(2),$(1))
checkcc = $(call check_compiler_opt,$(1),$(2),$(CC),c)
checkcxx = $(call check_compiler_opt,$(1),$(2),$(CXX),c++)
checkdtc = $(shell if $(DTC) $(1) --version /dev/null > /dev/null 2>&1; \
then echo "$(1)"; fi)
checkcc_nowarn = $(if $(call checkcc,-W$(1),),-Wno-$(1))
checkcxx_nowarn = $(if $(call checkcxx,-W$(1),),-Wno-$(1))
checkld = $(shell if $(callld) -v "$1" > /dev/null 2>&1; \
then echo "$(1)"; else echo "$(2)"; fi)
callcc = LC_ALL=C $(filter-out $(CCACHE),$(CC)) $(CARCHFLAGS) $(CCXX_FLAGS)
callcxx = LC_ALL=C $(filter-out $(CCACHE),$(CXX)) $(CARCHFLAGS) $(CCXX_FLAGS)
callfc = LC_ALL=C $(filter-out $(CCACHE),$(FC)) $(CARCHFLAGS) $(CCXX_FLAGS)
callld = LC_ALL=C $(firstword $(LD))
get_cc_version_part = $(shell echo $(1) | $(callcc) -E -x c - | tail -1)
# compiler variables: version, base dir, include dir, gcc lib, ...
# despite having GCC in their name, they are generic and also used with and
# derived for clang
# note: determining these variables is slow, and the values should
# be set in .config.all. However, this is the place were
# they are determined on a 'make config' in $(L4DIR)
BID_COMPILER_TYPE_f = $(if $(findstring clang, $(shell $(callcc) --version)),clang,gcc)
BID_LD_TYPE_f = $(if $(findstring LLD, $(shell $(callld) --version)),lld,gnu)
# We fall back to BID_COMPILER_TYPE_f if BID_COMPILER_TYPE is not cached yet,
# because we need this info in the following lines before caching
__tmp_bid_compiler_type := $(or $(BID_COMPILER_TYPE),$(BID_COMPILER_TYPE_f))
ifeq ($(__tmp_bid_compiler_type),gcc)
BID_COMPILER_IS_GCC = 1
endif
ifeq ($(__tmp_bid_compiler_type),clang)
BID_COMPILER_IS_CLANG = 1
check_compiler_flags := -Werror=unknown-warning-option -Werror=unused-command-line-argument
endif
GCCMAJORVERSION_ID_gcc = __GNUC__
GCCMINORVERSION_ID_gcc = __GNUC_MINOR__
GCCPATCHLEVEL_ID_gcc = __GNUC_PATCHLEVEL__
GCCMAJORVERSION_ID_clang = __clang_major__
GCCMINORVERSION_ID_clang = __clang_minor__
GCCPATCHLEVEL_ID_clang = __clang_patchlevel__
GCCMAJORVERSION_ID_f = $(GCCMAJORVERSION_ID_$(BID_COMPILER_TYPE_f))
GCCMINORVERSION_ID_f = $(GCCMINORVERSION_ID_$(BID_COMPILER_TYPE_f))
GCCPATCHLEVEL_ID_f = $(GCCPATCHLEVEL_ID_$(BID_COMPILER_TYPE_f))
GCCMAJORVERSION_f = $(call get_cc_version_part, $(GCCMAJORVERSION_ID_f))
GCCMINORVERSION_f = $(call get_cc_version_part, $(GCCMINORVERSION_ID_f))
GCCPATCHLEVEL_f = $(call get_cc_version_part, $(GCCPATCHLEVEL_ID_f))
# the version is just the major version except for GCC 1-4 where it is
# major.minor
GCCVERSION_f_gcc = $(GCCMAJORVERSION_f)$(if $(filter $(GCCMAJORVERSION_f),1 2 3 4),.$(GCCMINORVERSION_f))
GCCVERSION_f_clang = $(GCCMAJORVERSION_f)
GCCVERSION_f = $(GCCVERSION_f_$(BID_COMPILER_TYPE_f))
GNATVERSION_f = $(shell LC_ALL=C $(ADAC) --version 2>/dev/null | sed -ne 's/GNATMAKE \([^ ]*\).*/\1/p')
HOST_GNATVERSION_f = $(shell LC_ALL=C $(HOST_ADAC) --version 2>/dev/null | sed -ne 's/GNATMAKE \([^ ]*\).*/\1/p')
GNATMAJORVERSION = $(word 1,$(subst ., ,$(GNATVERSION)))
HOST_GNATMAJORVERSION = $(word 1,$(subst ., ,$(HOST_GNATVERSION)))
GNATMINORVERSION = $(word 2,$(subst ., ,$(GNATVERSION)))
GNATPATCHVERSION = $(word 3,$(subst ., ,$(GNATVERSION)))
GCCDIR_f_clang = $(shell $(callcc) -print-resource-dir)
GCCDIR_f_gcc = $(shell $(callcc) -print-search-dirs | sed -ne 's+^install: \(.*[^/][^/]*\)/+\1+p' )
GCCDIR_f = $(GCCDIR_f_$(BID_COMPILER_TYPE_f))
LDVERSION_f = $(shell $(callld) -v | sed -e \
$(if $(filter LLD,$(shell $(callld) -v)),\
'/.* \([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\).*/{s//\1\2\3/;p;q}' -n,\
's/.* \([0-9]\)\.\([^. ]*\).*/\1\2/'))
LDNOWARNRWX_f = $(call checkld,--no-warn-rwx-segments)
GCCSYSLIBDIRS_f = $(shell $(callcc) -print-search-dirs | sed '/^libraries:/{s/^libraries: =\?/-L/;s/:/ -L/g;q;};d')
GCCLIB_file_f = $(call check_path_absolute,GCCLIB_file_$(1),$(shell $(callcc) -print-file-name=$(1)))
GCCLIB_HOST_f = $(if $(CONFIG_COMPILER_RT_USE_TOOLCHAIN_LIBGCC),$(call check_path_absolute,GCCLIB_HOST,$(shell $(callcc) -print-libgcc-file-name)))
GCCLIB_EH_HOST_f = $(if $(CONFIG_COMPILER_RT_USE_TOOLCHAIN_LIBGCC),$(call check_path_absolute,GCCLIB_EH_HOST,$(shell $(callcc) -print-file-name=libgcc_eh.a)))
GCCNOSTACKPROTOPT_f= $(call checkcc,-fno-stack-protector)
GCCSTACKPROTOPT_f = $(call checkcc,-fstack-protector)
GCCSTACKPROTALLOPT_f = $(call checkcc,-fstack-protector-all)
GCCWNONOEXCEPTTYPE_f = $(call checkcxx_nowarn,noexcept-type)
GCCWNOPSABI_f = $(call checkcxx_nowarn,psabi)
GCCWNOUNUSEDPRIVATEFIELD_f = $(call checkcxx_nowarn,unused-private-field)
GCCWNOUNTERMINATEDSTRINGINITIALIZATION_f = $(call checkcc_nowarn,$\
unterminated-string-initialization)
GCCWNOC99DESIGNATOR_f = $(call checkcxx_nowarn,c99-designator)
GCCARMV5TEFPOPT_arm_f = $(call checkcc,-march=armv5te+fp,-march=armv5te)
GCCARMV6FPOPT_arm_f = $(call checkcc,-march=armv6+fp,-march=armv6)
GCCARMV6T2FPOPT_arm_f = $(call checkcc,-march=armv6t2+fp,-march=armv6t2)
GCCARMV6ZKFPOPT_arm_f = $(call checkcc,-march=armv6zk+fp,-march=armv6zk)
GCCARMV7AFPOPT_arm_f = $(call checkcc,-march=armv7-a+fp,-march=armv7-a)
GCCARMV7RFPOPT_arm_f = $(call checkcc,-march=armv7-r+fp,-march=armv7-r)
GCCARMV7VEFPOPT_arm_f = $(call checkcc,-march=armv7ve+fp,-march=armv7ve)
GCCARM64OUTLINEATOMICSOPT_arm64_f = $(call checkcc,-mno-outline-atomics)
GCCFORTRANAVAIL_f = $(shell echo | $(callfc) -dD -E - 2>&1 | grep -q __GNUC__ && echo y)
GCCLIBCAVAIL_f = $(shell echo -e '$(BID_POUND)include <unistd.h>\nint main(void){return 0;}' | $(callcc) -x c -o /dev/null - > /dev/null 2>&1 && echo y)
CLANGVISNEWDELETEHIDDEN_f = $(call checkcxx,-fvisibility-global-new-delete=force-hidden,$\
$(call checkcxx,-fvisibility-global-new-delete-hidden))
GCC_HAS_ATOMICS_f = $(shell if echo '$(BID_POUND)include <bits/c++config.h>' | \
$(callcxx) -dD -E -x c++ - 2>&1 | \
grep -q _GLIBCXX_ATOMIC_BUILTINS; then \
echo y; fi)
GCCINCFIXEDPATH_f = $(patsubst %/limits.h,%,$(strip $(firstword $(wildcard \
$(addsuffix /limits.h, \
$(call GCCDIR_f)/include-fixed$(if $(filter .,$(shell $(callcc) -print-multi-directory)),,/$(shell $(callcc) -print-multi-directory)) \
$(call GCCDIR_f)/include-fixed)))))
CONDITIONAL_WARNINGS_MEDIUM_f = $(call checkcc,-Wmissing-prototypes)
CONDITIONAL_WARNINGS_FULL_f = $(call checkcc,-Wfloat-conversion) \
$(call checkcc,-Wfloat-equal) \
$(call checkcc,-Wlogical-op)
DIAGNOSTICS_SARIF_f = $(call checkcc,-fdiagnostics-format=sarif -Wno-sarif-format-unstable)
# $(call checkcc,-fdiagnostics-format=sarif-stderr)
DIAGNOSTICS_JSON_f = $(call checkcc,-fdiagnostics-format=json)
DIAGNOSTICS_COLOR_f = $(call checkcc,-fdiagnostics-color=always)
GCCPREFIXOPT_f = $(call checkcc,-fmacro-prefix-map=$(L4DIR_ABS)/= \
-fmacro-prefix-map=$(OBJ_BASE)/=)
BID_NOSTDINC_clang ?= -nostdinc
BID_NOSTDINC_gcc ?= -nostdinc
BID_NOSTDINC ?= $(BID_NOSTDINC_$(BID_COMPILER_TYPE))
# Options that must be filtered from gcc since they are linker flags
BID_GCC_OPTS=-static -shared -nostdlib -Wl$(BID_COMMA)% -L% -l% -PC% -nocrt1 -nocrt -r
# Tool to filter LD flags for the corresponding tool invocation type
# Convert arguments to a format compatible with gcc invocation
ldflags_to_gcc=$(foreach o,$(1),$(if $(filter $(BID_GCC_OPTS),$o),$o,$(addprefix -Wl$(BID_COMMA),$o)))
ifneq ($(strip $(GCCDIR)),)
GCCINCDIR = $(GCCDIR)/include $(GCCINCFIXEDPATH)
I_GCCINCDIR = $(addprefix -isystem ,$(GCCINCDIR))
endif
PKGNAME_DIRNAME := $(notdir $(abspath $(if $(PKGDIR),$(PKGDIR),.)))
ifneq ($(PKGDIR),)
ifeq ($(origin PKGNAME),undefined)
PKGNAME := $(PKGNAME_DIRNAME)
endif
endif
ifeq ($(V),1)
VERBOSE =
endif
ifeq ($(V),0)
VERBOSE = @
endif
ifeq ($(D),1)
DEBUG_MODE = y
endif
ifeq ($(CONFIG_RELEASE_MODE),y)
DEFINES += -DL4BID_RELEASE_MODE -DNDEBUG
endif
ifneq ($(filter linux host,$(MODE)),)
HOST_LINK := 1
HOST_LINK_HOST := 1
endif
ifneq ($(filter l4linux targetsys,$(MODE)),)
HOST_LINK := 1
HOST_LINK_TARGET := 1
endif
#
# SUBDIR handling, not within the OBJ-*/ dirs
#
ifeq ($(SYSTEM),)
ifneq ($(SUBDIRS),)
.PHONY: $(SUBDIRS)
$(SUBDIRS):
$(VERBOSE)$(MAKE) -C $@ all
# we know that SUBDIRS isn't empty, hence we can avoid the dir-test
scrub clean cleanall::
$(VERBOSE)set -e; $(foreach i,$(SUBDIRS), \
$(MAKE) -C $(i) $@;)
install:: $(SUBDIRS)
$(VERBOSE)set -e; $(foreach i,$(SUBDIRS), \
$(MAKE) -C $(i) $@;)
DIAG_DISPLAY_CMD := cat
diag::
@printf $(EMPHSTART)"Diagnostics:"$(EMPHSTOP)
@DIAGS=( $$(find $(OBJ_DIR) -name '*.diag') ); \
if [[ "$${#DIAGS[@]}" -eq 0 ]] ; then \
echo "<None>"; \
else \
$(DIAG_DISPLAY_CMD) "$${DIAGS[@]}"; \
fi
endif
all:: $(OBJ_DIR)/Makefile
$(OBJ_DIR)/Makefile: $(L4DIR)/mk/Makeconf
$(call build_obj_redir_Makefile,$@)
else
# we are within an OBJ-*/ dir, create dummy target
$(SUBDIRS):
endif
#
# Dependency section
#
#
# the general dependencies: All generated files depend on ".general.d".
# ".general.d" itself depends on the mk-Makeconf, the optional
# Makeconf.local, the .config.all, the packet-Makeconf.local and the
# Makeconf.local. This ensures a rebuilt if any of the configuration-
# or make-files changes.
#
# We have this nasty if-readable-magic to allow the files to disappear
# or to appear. Depending on if the according makeconf exists now, the
# if-readable magic .general.d is used on existance or non-existence.
BID_DEPEND_GENERAL_D_COND = \
if [ -r $(1) ] ; then echo -e '$@: $(strip $(1))\n$(strip $(1)):\n' >>$@ ; \
else echo '$$(if $$(wildcard $(strip $(1))), $@: FORCE)' >>$@; fi
ifeq ($(SYSTEM),)
GENERAL_D_LOC := $(OBJ_DIR)/.general.d
else
GENERAL_D_LOC := .general.d
endif
$(FIXDEP): $(L4DIR)/tool/kconfig/scripts/basic/fixdep.c
ifeq ($(ROOT_MAKEFILE),1)
@$(MAKE) genfixdep
else
@echo \'fixdep\' outdated or unavailable, please call \'make oldconfig\' in the root of your build directory.
@exit 1
endif
$(dir $(GENERAL_D_LOC)):
$(VERBOSE)$(MKDIR) $@
$(GENERAL_D_LOC): $(L4DIR)/mk/Makeconf $(FIXDEP) $(EXTRA_GENERAL_D_DEP)
$(GENERAL_D_LOC): | $(dir $(GENERAL_D_LOC))
@$(BUILD_MESSAGE)
$(file >$@.in,$(filter-out %.cmd,$(DEPS)))
$(DEPEND_VERBOSE)xargs -a $@.in $(RM)
$(DEPEND_VERBOSE)$(RM) $@.in
$(DEPEND_VERBOSE)echo '$@: $(SRC_DIR)/Makefile ' > $@
$(DEPEND_VERBOSE)$(call BID_DEPEND_GENERAL_D_COND,\
$(OBJ_BASE)/.config.all)
$(DEPEND_VERBOSE)$(call BID_DEPEND_GENERAL_D_COND,\
$(OBJ_BASE)/Makeconf.local)
$(DEPEND_VERBOSE)$(call BID_DEPEND_GENERAL_D_COND,\
$(OBJ_BASE)/conf/Makeconf.local)
$(DEPEND_VERBOSE)$(call BID_DEPEND_GENERAL_D_COND,\
$(L4DIR)/Makeconf.local)
$(DEPEND_VERBOSE)$(call BID_DEPEND_GENERAL_D_COND,\
$(L4DIR)/conf/Makeconf.local)
$(DEPEND_VERBOSE)$(foreach m,$(wildcard $(INCLUDE_MAKE_RULES)),\
$(call BID_DEPEND_GENERAL_D_COND,$(m)); )
$(if $(PKGDIR_ABS),$(DEPEND_VERBOSE)$(call BID_DEPEND_GENERAL_D_COND,\
$(PKGDIR_ABS)/Makeconf.local))
$(DEPEND_VERBOSE)$(call BID_DEPEND_GENERAL_D_COND,\
$(MAKECONFLOCAL))
$(DEPEND_VERBOSE)$(call BID_DEPEND_GENERAL_D_COND,\
$(L4DIR)/mk/arch/Makeconf.$(BUILD_ARCH))
DEPS += $(GENERAL_D_LOC)
#
# Messages
#
# coloring on color-capable terminals
# enabled by setting CONFIG_BID_COLORED_PHASES to y
ifeq ($(CONFIG_BID_COLORED_PHASES),y)
ifneq ($(BID_COLORS_TESTED),y)
BID_COLORS_TESTED := y
BID_COLORS_SUPPORTED := $(shell tput colors 2>/dev/null 1>&2; [ $$? -eq 0 ] && echo -n 'y' || echo -n 'n')
export BID_COLORS_TESTED
export BID_COLORS_SUPPORTED
endif
ifeq ($(BID_COLORS_SUPPORTED), y)
EMPHSTART = '\033[34;1m'
EMPHSTOP = '\033[0m'
else
EMPHSTART =
EMPHSTOP =
endif
endif
BID_MESSAGE_TAG ?= $(PKGDIR_REL)$(if $(filter-out std,$(VARIANT)), - $(VARIANT))
AR_MESSAGE ?= echo -e " [$(BID_MESSAGE_TAG)] ==> Archiving into $@"
BUILD_MESSAGE ?= echo -e " [$(BID_MESSAGE_TAG)] ... Building $(if $(filter $(GENERAL_D_LOC),$@),Dependencies,$@)"
BUILT_MESSAGE ?= echo -e $(EMPHSTART)' [$(BID_MESSAGE_TAG)] ==> $@ built'$(EMPHSTOP)
COMP_MESSAGE ?= echo -e " [$(BID_MESSAGE_TAG)] ... Compiling $@$(1)"
COMP_P_MESSAGE ?= echo -e " [$(BID_MESSAGE_TAG)] ... Compiling PIC $@"
COMP_PR_MESSAGE ?= echo -e " [$(BID_MESSAGE_TAG)] ... Compiling PROFILE $@"
GEN_MESSAGE ?= echo -e " [$(BID_MESSAGE_TAG)] ... Generating $(if $(1),$(1),$@)"
LINK_MESSAGE ?= echo -e " [$(BID_MESSAGE_TAG)] ==> Linking $@"
LINK_SHARED_MESSAGE ?= echo -e " [$(BID_MESSAGE_TAG)] ==> Linking to shared $@"
LINK_PARTIAL_MESSAGE ?= echo -e " [$(BID_MESSAGE_TAG)] ==> Partial linking to $@"
DEP_MESSAGE ?= echo -e " [$(BID_MESSAGE_TAG)] ... Building dependencies for $<"
CLEAN_MESSAGE ?= echo -e " [$(BID_MESSAGE_TAG)] ... Removing created files"
CLEANALL_MESSAGE ?= echo -e " [$(BID_MESSAGE_TAG)] ... Removing all created files"
INSTALL_LINK_MESSAGE ?= echo -e " [$(BID_MESSAGE_TAG)] ==> Updating symlinks"
INSTALL_DOC_MESSAGE ?= echo -e " [$(BID_MESSAGE_TAG)] ==> Installing $(if $(1),$(1),$(<)) documentation"
INSTALL_DOC_LOCAL_MESSAGE ?= echo -e " [$(BID_MESSAGE_TAG)] ==> Installing $(if $(1),$(1),$(<)) documentation locally"
INSTALL_MESSAGE ?= echo -e " [$(BID_MESSAGE_TAG)] ==> Installing $(if $(1),$(1),$^)"
INSTALL_LOCAL_MESSAGE ?= echo -e " [$(BID_MESSAGE_TAG)] ==> Installing $(if $(1),$(1),$(<)) to local build-tree"
# allows an include $(DEPSVAR) at the end of the makefile
# but prevents rebuilding them on a scrub, clean, cleanall and help
ifneq ($(filter scrub clean cleanall mrproper help,$(MAKECMDGOALS)),)
DEPSVAR =
else
DEPSVAR = $(DEPS)
endif
#
# Some rules
#
# addfileheader-rule: allows "make addfileheader main.c server.c"-like
# commands and automatically inserts the path within the package
# options may be passed with $(ADDFILEHEADER_OPTIONS)
ADDFILEHEADER_PREFIX = $(patsubst $(abspath $(PKGDIR)/)%,\
$(PKGNAME)/%,$(abspath ./))
ADDFILEHEADER_FILES = $(filter-out addfileheader,$(MAKECMDGOALS))
addfileheader:
addfileheader $(ADDFILEHEADER_OPTIONS) -p $(ADDFILEHEADER_PREFIX) $(ADDFILEHEADER_FILES)
.PHONY: FORCE
# 1: name
# 2: output file
# 3: inc path (one only)
# 4: libs
# 5: requires_libs
# 6: PC_CFLAGS
# 7: extras
generate_pcfile = \
[ -d $(dir $(2)) ] || mkdir -p $(dir $(2)) \
;echo -n > $(2) \
$(if $(3),;echo "incdir=/empty_incdir" >> $(2)) \
;echo "Name: $(1)" >> $(2) \
;echo "Version: 0" >> $(2) \
;echo "Description: L4 library" >> $(2) \
$(if $(3),;echo -n "Cflags: $(addprefix -I\$${incdir}/,$(3)) ">> $(2))\
$(if $(6),$(if $(3),,;echo -n "Cflags:" >> $(2))) \
$(if $(6),;echo " $(6)" >> $(2),;echo "" >> $(2)) \
$(if $(4),;echo "Libs: $(4)" >> $(2)) \
$(if $(5),;echo "Requires: $(5)" >> $(2)) \
$(if $(7),;echo -e '$(subst $(newline),\n,$(7))' >> $(2)) \
$(if $(BID_GEN_CONTROL),;echo "Provides: $(1)" >> $(PKGDIR)/Control) \
$(if $(BID_GEN_CONTROL),;echo "Requires: $(5)" >> $(PKGDIR)/Control) ;
define build_obj_redir_Makefile
$(VERBOSE)install -d $(dir $(1))
$(VERBOSE)echo '# automatically created -- modifications will be lost' > $(1)
$(VERBOSE)echo 'SRC := $(if $(2),$(2),$(SRC_DIR))' >> $(1)
$(VERBOSE)echo 'OBJ := $(OBJ_BASE)' >> $(1)
$(VERBOSE)echo '.PHONY: $$(MAKECMDGOALS) do-all-make-goals' >> $(1)
$(VERBOSE)echo 'do-all-make-goals:' >> $(1)
$(VERBOSE)echo ' @$$(MAKE) -C $$(SRC) O=$$(OBJ) $$(MAKECMDGOALS)'>> $(1)
$(VERBOSE)echo '$$(MAKECMDGOALS): do-all-make-goals' >> $(1)
endef
endif # _L4DIR_MK_MAKECONF undefined

2
src/l4/mk/WhatIsThis Normal file
View File

@@ -0,0 +1,2 @@
# DROPS Building Makros
filelist="*.mk *.inc config.*"

View File

@@ -0,0 +1 @@
This directory contains global package aliases

View File

@@ -0,0 +1,68 @@
# ARCH: BUILD_ARCH_arm arm
# ARCHDESCR: ARM architecture
# ARCHSELECT: ARCH_ENABLE_STACK_PROTECTOR
# ARCHDEFAULTPF: PLATFORM_TYPE_arm_virt
choice
prompt "CPU variant"
default CPU_ARM_ARMV7A
config CPU_ARM_ARMV4
bool "ARMv4 type CPU"
depends on BUILD_ARCH_arm
config CPU_ARM_ARMV4T
bool "ARMv4T type CPU"
depends on BUILD_ARCH_arm
config CPU_ARM_ARMV5
bool "ARMv5 type CPU"
depends on BUILD_ARCH_arm
config CPU_ARM_ARMV5T
bool "ARMv5T type CPU"
depends on BUILD_ARCH_arm
config CPU_ARM_ARMV5TE
bool "ARMv5TE type CPU"
depends on BUILD_ARCH_arm
config CPU_ARM_ARMV6
bool "ARMv6 type CPU"
depends on BUILD_ARCH_arm
config CPU_ARM_ARMV6T2
bool "ARMv6t2 type CPU"
depends on BUILD_ARCH_arm
config CPU_ARM_ARMV6ZK
bool "ARMv6zk type CPU"
depends on BUILD_ARCH_arm
config CPU_ARM_ARMV7A
bool "ARMv7A type CPU"
depends on BUILD_ARCH_arm
config CPU_ARM_ARMV8R_AARCH32
bool "ARMv8R type CPU"
depends on BUILD_ARCH_arm
select ARCH_NO_MMU
endchoice
config CPU
string
default "armv4" if CPU_ARM_ARMV4
default "armv4t" if CPU_ARM_ARMV4T
default "armv5" if CPU_ARM_ARMV5
default "armv5t" if CPU_ARM_ARMV5T
default "armv5te" if CPU_ARM_ARMV5TE
default "armv6" if CPU_ARM_ARMV6
default "armv6t2" if CPU_ARM_ARMV6T2
default "armv6zk" if CPU_ARM_ARMV6ZK
default "armv7a" if CPU_ARM_ARMV7A
default "armv8r" if CPU_ARM_ARMV8R_AARCH32
config BITS
int
default 32

View File

@@ -0,0 +1,28 @@
# ARCH: BUILD_ARCH_arm64 arm64
# ARCHDESCR: ARM64 architecture (AArch64)
# ARCHSELECT: ARCH_ENABLE_STACK_PROTECTOR
# ARCHDEFAULTPF: PLATFORM_TYPE_arm_virt
choice
prompt "CPU variant"
default CPU_ARM_ARMV8A
config CPU_ARM_ARMV8A
bool "ARMv8-A type CPU"
depends on BUILD_ARCH_arm64
config CPU_ARM_ARMV8R_AARCH64
bool "ARMv8-R type CPU"
depends on BUILD_ARCH_arm64
select ARCH_NO_MMU
endchoice
config CPU
string
default "armv8a" if CPU_ARM_ARMV8A
default "armv8r" if CPU_ARM_ARMV8R_AARCH64
config BITS
int
default 64

View File

@@ -0,0 +1,19 @@
# vi:se ft=kconfig:
# Common symbols for arm and arm64
config CPU_ARMV6PLUS
bool
default y if CPU_ARM_ARMV6 || CPU_ARM_ARMV6T2 || CPU_ARMV6KPLUS
config CPU_ARMV6KPLUS
bool
default y if CPU_ARM_ARMV6ZK || CPU_ARMV7PLUS
config CPU_ARMV7PLUS
bool
default y if CPU_ARM_ARMV7A || CPU_ARM_ARMV7R || CPU_ARMV8PLUS
config CPU_ARMV8PLUS
bool
default y if CPU_ARM_ARMV8R_AARCH32 || CPU_ARM_ARMV8R_AARCH64

View File

@@ -0,0 +1,16 @@
# ARCH: BUILD_ARCH_x86 x86
# ARCHDESCR: X86-32 architecture
# ARCHSELECT: ARCH_ENABLE_STACK_PROTECTOR
# ARCH: BUILD_ARCH_amd64 amd64
# ARCHDESCR: AMD64 architecture
# ARCHSELECT: ARCH_ENABLE_STACK_PROTECTOR
config CPU
string "CPU variant identifier"
default "gen"
config BITS
int
default 32 if BUILD_ARCH_x86
default 64 if BUILD_ARCH_amd64

View File

@@ -0,0 +1,66 @@
# ARCH: BUILD_ARCH_mips mips
# ARCHDESCR: MIPS architecture
# ARCHSELECT: ARCH_ENABLE_STACK_PROTECTOR
choice
prompt "CPU variant"
default CPU_MIPS_32R2
config CPU_MIPS_32R2
bool "MIPS32 Release 2"
config CPU_MIPS_32R6
bool "MIPS32 Release 6"
config CPU_MIPS_64R2
bool "MIPS64 release 2"
config CPU_MIPS_64R6
bool "MIPS64 release 6"
endchoice
choice
prompt "Endianess"
default MIPS_LITTLE_ENDIAN
config MIPS_LITTLE_ENDIAN
bool "Little Endian"
config MIPS_BIG_ENDIAN
bool "Big Endian"
endchoice
config CPU
string
default "32r2" if CPU_MIPS_32R2
default "32r6" if CPU_MIPS_32R6
default "64r2" if CPU_MIPS_64R2
default "64r6" if CPU_MIPS_64R6
config CPU_ABI
string
default "32" if CPU_MIPS_32R2
default "32" if CPU_MIPS_32R6
default "64" if CPU_MIPS_64R2
default "64" if CPU_MIPS_64R6
config BITS
int
default 32 if CPU_MIPS_32R2
default 32 if CPU_MIPS_32R6
default 64 if CPU_MIPS_64R2
default 64 if CPU_MIPS_64R6
choice
prompt "Page Size"
default PAGE_SIZE_16KB
config PAGE_SIZE_16KB
bool "16KiB Page size"
config PAGE_SIZE_4KB
bool "4KiB Page size"
endchoice

View File

@@ -0,0 +1,6 @@
# ARCH: BUILD_ARCH_ppc32 ppc32
# ARCHDESCR: PowerPC 32 architecture (EXPERIMENTAL!)
config BITS
int
default 32

View File

@@ -0,0 +1,64 @@
# ARCH: BUILD_ARCH_riscv riscv
# ARCHDESCR: RISC-V architecture
# ARCHSELECT: ARCH_ENABLE_STACK_PROTECTOR
# ARCHDEFAULTPF: PLATFORM_TYPE_riscv_virt
choice
prompt "CPU variant"
default CPU_RISCV_64IMA
config CPU_RISCV_32IMA
bool "RV32IMA"
config CPU_RISCV_64IMA
bool "RV64IMA"
endchoice
choice
prompt "FPU"
default FPU_RISCV_DOUBLE
config FPU_RISCV_NONE
bool "Off"
config FPU_RISCV_SINGLE
bool "Single precision"
config FPU_RISCV_DOUBLE
bool "Double precision"
endchoice
config RISCV_ISA_C
bool "Emit compressed instructions"
default y
config CPU
string
default "rv32ima" if CPU_RISCV_32IMA && FPU_RISCV_NONE && !RISCV_ISA_C
default "rv32imaf" if CPU_RISCV_32IMA && FPU_RISCV_SINGLE && !RISCV_ISA_C
default "rv32imafd" if CPU_RISCV_32IMA && FPU_RISCV_DOUBLE && !RISCV_ISA_C
default "rv64ima" if CPU_RISCV_64IMA && FPU_RISCV_NONE && !RISCV_ISA_C
default "rv64imaf" if CPU_RISCV_64IMA && FPU_RISCV_SINGLE && !RISCV_ISA_C
default "rv64imafd" if CPU_RISCV_64IMA && FPU_RISCV_DOUBLE && !RISCV_ISA_C
default "rv32imac" if CPU_RISCV_32IMA && FPU_RISCV_NONE && RISCV_ISA_C
default "rv32imafc" if CPU_RISCV_32IMA && FPU_RISCV_SINGLE && RISCV_ISA_C
default "rv32imafdc" if CPU_RISCV_32IMA && FPU_RISCV_DOUBLE && RISCV_ISA_C
default "rv64imac" if CPU_RISCV_64IMA && FPU_RISCV_NONE && RISCV_ISA_C
default "rv64imafc" if CPU_RISCV_64IMA && FPU_RISCV_SINGLE && RISCV_ISA_C
default "rv64imafdc" if CPU_RISCV_64IMA && FPU_RISCV_DOUBLE && RISCV_ISA_C
config CPU_ABI
string
default "ilp32" if CPU_RISCV_32IMA && FPU_RISCV_NONE
default "ilp32f" if CPU_RISCV_32IMA && FPU_RISCV_SINGLE
default "ilp32d" if CPU_RISCV_32IMA && FPU_RISCV_DOUBLE
default "lp64" if CPU_RISCV_64IMA && FPU_RISCV_NONE
default "lp64f" if CPU_RISCV_64IMA && FPU_RISCV_SINGLE
default "lp64d" if CPU_RISCV_64IMA && FPU_RISCV_DOUBLE
config BITS
int
default 32 if CPU_RISCV_32IMA
default 64 if CPU_RISCV_64IMA

View File

@@ -0,0 +1,68 @@
# ARCH: BUILD_ARCH_sparc sparc
# ARCHDESCR: Sparc architecture (EXPERIMENTAL)
choice
prompt "CPU"
config CPU_SPARC_V7
bool "Generic Sparc V7"
depends on BUILD_ARCH_sparc
config CPU_SPARC_LEON
bool "LEON"
depends on BUILD_ARCH_sparc
config CPU_SPARC_LEON3
bool "LEON3"
depends on BUILD_ARCH_sparc
config CPU_SPARC_V8
bool "Generic Sparc V8"
depends on BUILD_ARCH_sparc
config CPU_SPARC_V9
bool "Generic Sparc V9"
depends on BUILD_ARCH_sparc
config CPU_SPARC_ULTRASPARC
bool "Ultrasparc"
depends on BUILD_ARCH_sparc
config CPU_SPARC_ULTRASPARC3
bool "Ultrasparc3"
depends on BUILD_ARCH_sparc
config CPU_SPARC_NIAGARA
bool "Niagara"
depends on BUILD_ARCH_sparc
config CPU_SPARC_NIAGARA2
bool "Niagara2"
depends on BUILD_ARCH_sparc
config CPU_SPARC_NIAGARA3
bool "Niagara3"
depends on BUILD_ARCH_sparc
config CPU_SPARC_NIAGARA4
bool "Niagara4"
depends on BUILD_ARCH_sparc
endchoice
config CPU
string
default "leon" if CPU_SPARC_LEON
default "leon3" if CPU_SPARC_LEON3
default "v7" if CPU_SPARC_V7
default "v8" if CPU_SPARC_V8
default "v9" if CPU_SPARC_V9
default "ultrasparc" if CPU_SPARC_ULTRASPARC
default "ultrasparc3" if CPU_SPARC_ULTRASPARC3
default "niagara" if CPU_SPARC_NIAGARA
default "niagara2" if CPU_SPARC_NIAGARA2
default "niagara3" if CPU_SPARC_NIAGARA3
default "niagara4" if CPU_SPARC_NIAGARA4
config BITS
int
default 32

View File

@@ -0,0 +1,30 @@
# vim:se ft=make:
CROSS_COMPILE_amd64 = x86_64-linux-gnu-
CARCHFLAGS_amd64 = -mno-red-zone
ASFLAGS_amd64 = -m64 -Wa,--noexecstack
LDFLAGS_amd64 += -z max-page-size=0x1000 -z common-page-size=0x1000 \
-z noexecstack
LD_EMULATION_CHOICE_amd64 = elf_x86_64
OFORMAT_amd64 = elf64-x86-64
BFD_ARCH_amd64 = i386
L4_KIP_ADDR_amd64 ?= 0x6ffff000
L4_STACK_ADDR_amd64 ?= 0x70000000
CARCHFLAGS_amd64_K8 = -march=k8
CARCHFLAGS_amd64_K10 = -march=k10
CARCHFLAGS_amd64_opteron = -march=opteron
CARCHFLAGS_amd64 += -m64
SYSTEMS_ABI += amd64-l4f
SYSTEMS_PLAIN += amd64-plain
GCCNOFPU_amd64_f = $(call checkcc,-mno-mmx) $(call checkcc,-mno-3dnow) \
$(call checkcc,-mno-sse) $(call checkcc,-mno-sse2) \
$(call checkcc,-mno-sse3) $(call checkcc,-mno-sse4) \
$(call checkcc,-mno-sse4a) $(call checkcc,-mno-avx) \
$(call checkcc,-mno-avx2)
QEMU_ARCH_MAP_amd64 = qemu-system-x86_64
QEMU_OPTIONS_amd64 = -m 512 -M q35

View File

@@ -0,0 +1,35 @@
# vim:se ft=make:
CROSS_COMPILE_arm = arm-linux-gnueabihf-
ASFLAGS_arm = -Wa,--noexecstack
LD_EMULATION_CHOICE_arm = armelf armelf_linux_eabi
LDFLAGS_arm += -z max-page-size=0x1000 -z common-page-size=0x1000 \
-z noexecstack
OFORMAT_arm = elf32-littlearm
BFD_ARCH_arm = arm
L4_KIP_ADDR_arm ?= 0xaffff000
L4_STACK_ADDR_arm ?= 0xb0000000
CARCHFLAGS_arm_armv4 = -march=armv4
CARCHFLAGS_arm_armv4t = -march=armv4t
CARCHFLAGS_arm_armv5 = -march=armv5
CARCHFLAGS_arm_armv5t = -march=armv5t
CARCHFLAGS_arm_armv5te = $(GCCARMV5TEFPOPT_arm)
CARCHFLAGS_arm_armv6 = $(GCCARMV6FPOPT_arm)
CARCHFLAGS_arm_armv6t2 = $(GCCARMV6T2FPOPT_arm)
CARCHFLAGS_arm_armv6zk = $(GCCARMV6ZKFPOPT_arm)
CARCHFLAGS_arm_armv7a = $(GCCARMV7AFPOPT_arm)
CARCHFLAGS_arm_armv7r = $(GCCARMV7RFPOPT_arm)
CARCHFLAGS_arm_armv8r = -march=armv8-r -mfpu=fp-armv8
CARCHFLAGS_arm += $(if $(CONFIG_BID_THUMB),-mthumb,-marm)
SYSTEMS_ABI += arm-l4f
SYSTEMS_PLAIN += arm-plain
GCCNOFPU_arm_f = $(call checkcc,-mfpu=none) $(call checkcc,-mgeneral-regs-only)
# GCC 4.8.0-4.8.2 showed to be buggy on ARM at least
CC_BLACKLIST-arm-gcc := 4.8.0 4.8.1 4.8.2
QEMU_ARCH_MAP_arm = qemu-system-arm

View File

@@ -0,0 +1,21 @@
# vim:se ft=make:
CROSS_COMPILE_arm64 = aarch64-linux-gnu-
ASFLAGS_arm64 = -Wa,--noexecstack
LD_EMULATION_CHOICE_arm64 = aarch64linux aarch64elf
LDFLAGS_arm64 += -z max-page-size=0x1000 -z common-page-size=0x1000 \
-z noexecstack
OFORMAT_arm64 = elf64-littleaarch64
BFD_ARCH_arm64 = aarch64
L4_KIP_ADDR_arm64 ?= 0xb0000000
L4_STACK_ADDR_arm64 ?= 0xb0000000
CARCHFLAGS_arm64_armv8a = -march=armv8-a $(GCCARM64OUTLINEATOMICSOPT_arm64)
CARCHFLAGS_arm64_armv8r = -march=armv8-r $(GCCARM64OUTLINEATOMICSOPT_arm64)
SYSTEMS_ABI += arm64-l4f
SYSTEMS_PLAIN += arm64-plain
GCCNOFPU_arm64_f = -mgeneral-regs-only
QEMU_ARCH_MAP_arm64 = qemu-system-aarch64

View File

@@ -0,0 +1,21 @@
# vim:se ft=make:
CROSS_COMPILE_mips = mips-linux-
ASFLAGS_mips = -Wa,--noexecstack
ELF_BINARY_TYPE_mips_bl = $(if $(CONFIG_MIPS_LITTLE_ENDIAN),l,b)
OFORMAT_mips_bl = $(if $(CONFIG_MIPS_LITTLE_ENDIAN),little,big)
LD_EMULATION_CHOICE_mips = elf$(CPU_ABI)$(ELF_BINARY_TYPE_mips_bl)tsmip
OFORMAT_mips = elf$(CPU_ABI)-trad$(OFORMAT_mips_bl)mips
BFD_ARCH_mips = mips:isa$(CPU)
L4_KIP_ADDR_mips ?= 0x7fff0000
L4_STACK_ADDR_mips ?= 0x70000000
CARCHFLAGS_mips += -march=mips$(CPU) -mabi=$(CPU_ABI)
CARCHFLAGS_mips += $(if $(CONFIG_MIPS_LITTLE_ENDIAN),-EL,-EB)
LDFLAGS_mips += $(if $(CONFIG_MIPS_LITTLE_ENDIAN),-EL,-EB) \
-z noexecstack
SYSTEMS_ABI += mips-l4f
SYSTEMS_PLAIN += mips-plain
QEMU_ARCH_MAP_mips_64 = qemu-system-mips64el
QEMU_ARCH_MAP_mips_32 = qemu-system-mipsel
QEMU_ARCH_MAP_mips = $(QEMU_ARCH_MAP_mips_$(CPU_ABI))

View File

@@ -0,0 +1,15 @@
# vim:se ft=make:
CROSS_COMPILE_ppc32 = powerpc-linux-
LD_EMULATION_CHOICE_ppc32 = elf32ppc
OFORMAT_ppc32 = elf32-powerpc
BFD_ARCH_ppc32 = powerpc
L4_KIP_ADDR_ppc32 ?= 0xaffff000
L4_STACK_ADDR_ppc32 ?= 0xb0000000
CARCHFLAGS_ppc32 += -m32
SYSTEMS_ABI += ppc32-l4f
SYSTEMS_PLAIN += ppc32-plain
QEMU_ARCH_MAP_ppc32 = qemu-system-ppc

View File

@@ -0,0 +1,29 @@
# vim:se ft=make:
CROSS_COMPILE_riscv = riscv64-linux-gnu-
ASFLAGS_riscv = -Wa,--noexecstack
ELF_BINARY_TYPE_riscv = elf$(BITS)
LD_EMULATION_CHOICE_riscv = $(ELF_BINARY_TYPE_riscv)lriscv
OFORMAT_riscv = $(ELF_BINARY_TYPE_riscv)-littleriscv
BFD_ARCH_riscv = littleriscv
L4_KIP_ADDR_riscv ?= 0x7fff0000
L4_STACK_ADDR_riscv ?= 0x70000000
# Since version 2.38, binutils by default targets the ISA specification version
# 20191213, where the CSR instructions and the FENCE.I instruction have been
# moved from the I extension into separate extensions: Zicsr and Zifencei
RISCV_ZICSR_ZIFENCEI_riscv_f = $(if $(call checkcc,-march=$(CPU)_zicsr_zifencei \
-mabi=$(CPU_ABI) \
-mcmodel=medany),_zicsr_zifencei)
CARCHFLAGS_riscv += -march=$(CPU)$(RISCV_ZICSR_ZIFENCEI_riscv) \
-mabi=$(CPU_ABI) -mcmodel=medany
LDFLAGS_riscv += -z noexecstack
SYSTEMS_ABI += riscv-l4f
SYSTEMS_PLAIN += riscv-plain
# As of now (gcc-12) there is no option to prevent the compiler from generating
# FPU instructions. So we just have to assume that the compiler does not do it,
# until it introduces a flag able to prevent it.
GCCNOFPU_riscv_f =
QEMU_ARCH_MAP_riscv = qemu-system-riscv$(BITS)

View File

@@ -0,0 +1,27 @@
# vim:se ft=make:
CROSS_COMPILE_sparc = $(if $(GCCIS_sparc_leon),sparc-elf-,sparc-linux-)
LD_EMULATION_CHOICE_sparc = $(if $(GCCIS_sparc_leon),sparcleon,elf32_sparc)
OFORMAT_sparc = elf32-sparc
BFD_ARCH_sparc = sparc
L4_KIP_ADDR_sparc ?= 0xaffff000
L4_STACK_ADDR_sparc ?= 0xb0000000
CARCHFLAGS_sparc_v7 = -mcpu=v7
# the -Wa.. is probably a gcc buglet fix only, check again later
CARCHFLAGS_sparc_leon = -mcpu=leon -Wa,-Av8
CARCHFLAGS_sparc_leon3 = -mcpu=leon3
CARCHFLAGS_sparc_v8 = -mcpu=v8
CARCHFLAGS_sparc_v9 = -mcpu=v9
CARCHFLAGS_sparc_ultrasparc = -mcpu=ultrasparc
CARCHFLAGS_sparc_ultrasparc3 = -mcpu=ultrasparc3
CARCHFLAGS_sparc_niagara = -mcpu=niagara
CARCHFLAGS_sparc_niagara2 = -mcpu=niagara2
CARCHFLAGS_sparc_niagara3 = -mcpu=niagara3
CARCHFLAGS_sparc_niagara4 = -mcpu=niagara4
CARCHFLAGS_sparc += -m32
SYSTEMS_ABI += sparc-l4f
SYSTEMS_PLAIN += sparc-plain

View File

@@ -0,0 +1,42 @@
# vim:se ft=make:
CROSS_COMPILE_x86 = x86_64-linux-gnu-
LD_EMULATION_CHOICE_x86 = elf_i386
ASFLAGS_x86 = -Wa,--noexecstack
LDFLAGS_x86 += -z noexecstack
OFORMAT_x86 = elf32-i386
BFD_ARCH_x86 = i386
L4_KIP_ADDR_x86 ?= 0xaffff000
L4_STACK_ADDR_x86 ?= 0xb0000000
CARCHFLAGS_x86_586 = -march=i586
CARCHFLAGS_x86_pentium = -march=i586
CARCHFLAGS_x86_pentiummmx = -march=pentium-mmx
CARCHFLAGS_x86_pentiumpro = -march=pentiumpro
CARCHFLAGS_x86_686 = -march=i686
CARCHFLAGS_x86_pentium2 = -march=pentium2
CARCHFLAGS_x86_pentium3 = -march=pentium3
CARCHFLAGS_x86_pentiumm = -march=pentium-m
CARCHFLAGS_x86_pentium4 = -march=pentium4
CARCHFLAGS_x86_prescott = -march=prescott
CARCHFLAGS_x86_nocona = -march=nocona
CARCHFLAGS_x86_core2 = -march=core2
CARCHFLAGS_x86_K6 = -march=k6
CARCHFLAGS_x86_K7 = -march=athlon
CARCHFLAGS_x86_athlon4 = -march=athlon-4
CARCHFLAGS_x86_K8 = -march=k8
CARCHFLAGS_x86_opteron = -march=opteron
CARCHFLAGS_x86 += -m32
SYSTEMS_ABI += x86-l4f
SYSTEMS_PLAIN += x86-plain
GCCNOFPU_x86_f = $(call checkcc,-mno-mmx) $(call checkcc,-mno-3dnow) \
$(call checkcc,-mno-sse) $(call checkcc,-mno-sse2) \
$(call checkcc,-mno-sse3) $(call checkcc,-mno-sse4) \
$(call checkcc,-mno-sse4a) $(call checkcc,-mno-avx) \
$(call checkcc,-mno-avx2)
QEMU_ARCH_MAP_x86 = $(strip $(shell if qemu-system-i386 -version > /dev/null; then echo qemu-system-i386; else echo qemu; fi))

86
src/l4/mk/assets.mk Normal file
View File

@@ -0,0 +1,86 @@
# -*- Makefile -*-
#
# L4Re Buildsystem
#
ifeq ($(origin _L4DIR_MK_ASSETS_MK),undefined)
_L4DIR_MK_ASSETS_MK=y
ROLE = assets.mk
include $(L4DIR)/mk/Makeconf
$(GENERAL_D_LOC): $(L4DIR)/mk/assets.mk
# Args: dirname, targets
define register_asset_targets
$(foreach t,$(2), \
$(eval INSTALLDIR_$(t) ?= $(INSTALLDIR)/$(1)) \
$(eval INSTALLDIR_LOCAL_$(t) ?= $(INSTALLDIR_LOCAL)/$(1)))
endef
define src_asset_link
$1: $(SRC_DIR)/$1
@$(INSTALL_MESSAGE)
$(VERBOSE)$(MKDIR) $$(@D)
$(VERBOSE)ln -fs $$< $$@
endef
define install_assets
$(foreach t,$2,$(eval $(call src_asset_link,$t)))
$(call register_asset_targets,$1,$2)
$(eval INSTALL_TARGET += $2)
endef
INSTALLDIR_ASSETS ?= $(DROPS_STDDIR)/assets
INSTALLDIR_ASSETS_LOCAL ?= $(OBJ_BASE)/assets
INSTALLFILE_ASSETS ?= $(INSTALL) -m 644 $(1) $(2)
INSTALLFILE_ASSETS_LOCAL ?= $(LN) -sf $(abspath $(1)) $(2)
INSTALLFILE = $(INSTALLFILE_ASSETS)
INSTALLDIR = $(INSTALLDIR_ASSETS)
INSTALLFILE_LOCAL = $(INSTALLFILE_ASSETS_LOCAL)
INSTALLDIR_LOCAL = $(INSTALLDIR_ASSETS_LOCAL)
MODE ?= assets
REQUIRE_HOST_TOOLS ?= $(if $(SRC_DTS),dtc)
include $(L4DIR)/mk/binary.inc
ifneq ($(SYSTEM),) # if we are a system, really build
# Functionality for device-tree file handling
TARGET_DTB = $(patsubst %.dts,%.dtb,$(SRC_DTS))
TARGET_DTBO = $(patsubst %.dtso,%.dtbo,$(SRC_DTS))
TARGET += $(TARGET_DTB) $(TARGET_DTBO)
INSTALL_TARGET += $(TARGET)
DEPS += $(foreach file,$(TARGET_DTB) $(TARGET_DTBO),$(call BID_dot_fname,$(file)).d)
$(call register_asset_targets,dtb,$(TARGET_DTB))
$(call register_asset_targets,dtbo,$(TARGET_DTBO))
$(call install_assets,modlist/$(PKGNAME),$(SRC_ASSETS_MODLIST))
$(call install_assets,ned/$(PKGNAME),$(SRC_ASSETS_NED))
$(call install_assets,io/,$(SRC_ASSETS_IO))
$(call install_assets,misc/$(PKGNAME),$(SRC_ASSETS_MISC))
include $(L4DIR)/mk/install.inc
endif # SYSTEM
.PHONY: all clean cleanall config help install oldconfig txtconfig
-include $(DEPSVAR)
help::
@echo " all - generate assets locally"
ifneq ($(SYSTEM),)
@echo " to $(INSTALLDIR_LOCAL)"
endif
@echo " install - generate and install assets globally"
ifneq ($(SYSTEM),)
@echo " to $(INSTALLDIR)"
endif
@echo " scrub - delete backup and temporary files"
@echo " clean - delete generated object files"
@echo " cleanall - delete all generated, backup and temporary files"
@echo " help - this help"
endif # _L4DIR_MK_ASSETS_MK undefined

167
src/l4/mk/bid-bender.spec Normal file
View File

@@ -0,0 +1,167 @@
incdir = %:set-var(incdir %(l4obj)/include/contrib)
pc_file_dir = %:set-var(pc_file_dir %(l4obj)/pc)
# options that take an extra argument
link_arg_opts =
%:arg-option(L m z o O h e -entry fini init -defsym Map)
%:arg-option(b -format A -architecture y -trace-symbol MF)
%:arg-option(-hash-style -version-script)
%:arg-option(T Tbss Tdata Ttext Ttext-segment Trodata-segment Tldata-segment)
%:arg-option(dT -image-base)
# options that are part of the output file list %o
link_output_args =
%:output-option(l* -whole-archive -no-whole-archive
-start-group -end-group u)
l4libdir =
l4libdir_x = %:set-var(l4libdir
%(l4system:%(l4api:%(l4obj)/lib/%(l4system)/%(l4api)))
%(l4system:%(l4obj)/lib/%(l4system)) %(l4obj)/lib)
# compile a list of dirs from -L options
libdir = %:set-var(libdir %{L*:%*} %(l4libdir))
# get dependency file name from -MF or from -o options
deps_file = %:strip(%{MF*:%*;:%{o*:.%*.d;:.pcs-deps}})
# generate dependency files for used spec/pc files
generate_deps =
# main dependency
%:echo-file(>%(deps_file) %{o*:%*}: %:all-specs())
# empty deps for all spec/pc files for graceful removal
%:foreach(%%:echo-file(>>%(deps_file) %%*:) %:all-specs())
# check whether the linker variable is set
check_linker = %(linker:;:%:error(linker variable not defined))
######### ld compatibility (pass through) mode for linking ##################
# options to pass to the linker (binutils GNU ld and LLVM ld)
link_pass_opts = %:set-var(link_pass_opts
%{M} %{-print-map} %{-trace-symbol*} %{y} %{-verbose}
%{-cref} %{-trace} %{r} %{O*}
%{m} %{-error-*} %{-warn-*&-no-warn-*}
%{-sort-*} %{-unique*}
%{-define-common&-no-define-common} %{B*}
%{-check-*&-no-check-*}
%{-no-undefined} %{rpath*} %{-verbose*}
%{-discard-*}
%{x} %{X} %{S} %{s} %{t} %{z} %{Z} %{n} %{N} %{init*} %{fini*}
%{soname*} %{h} %{E} %{-export-dynamic&-no-export-dynamic}
%{e} %{-entry*} %{-defsym*} %{Map*} %{b} %{-format*} %{A} %{-architecture*}
%{-gc-sections} %{gc-sections} %{-no-gc-sections} %{-hash-style*} %{-eh-frame-hdr}
# we always set -nostlib below so drop it but use it to avoid an error
%{nostdlib:} %{no-pie:} %{pie} %{-no-dynamic-linker} %{-version-script*})
%{-wrap*}
# linker arguments part I
link_args_ld_part1 =
%(link_arg_opts)%(link_output_args)
%:read-pc-file(%(pc_file_dir) %{PC*:%*})
%{nocrt|r:;:%:read-pc-file(%(pc_file_dir) ldscripts)}
%{o} -nostdlib %{static:-static;:--eh-frame-hdr} %{shared}
%{static-pie:-static -pie --no-dynamic-linker -z text}
# linker arguments part II -- specific to GNU ld
link_args_ld_part2_gnu_ld =
%(link_pass_opts) %:foreach(%%{: -L%%*} %(l4libdir)) %{T*&L*}
%{!r:%{!dT:-dT %:search(main_%{static:stat;static-pie:pie;shared:rel;:dyn}.ld
%(libdir));dT}}
# linker arguments part II -- specific to LLVM ld
# - use `-T <script>` rather than `-dT <script>`
# - use `--image-base=...` rather than `-Ttext-segment=...`
# - allow `--undefined-version` for compatibility with GNU ld
# - use --icf=none to disable identical code folding (lld-specific)
link_args_ld_part2_llvm_lld =
%(link_pass_opts) %:foreach(%%{: -L%%*} %(l4libdir)) %{L*}
%{-undefined-version}
%{-image-base*}
--icf=none
%{!r:%{!T:-T %:search(main_%{static:stat;static-pie:pie;shared:rel;:dyn}.ld
%(libdir));T}}
# linker arguments part III
link_args_ld_part3 =
%{r|shared|static|static-pie|-dynamic-linker*:;:
--dynamic-linker=%(Link_DynLinker)
%(Link_DynLinker:;:
%:error(Link_DynLinker not specified, cannot link with shared libs.))}
%{-dynamic-linker*}
%(Link_Start) %o %{OBJ*:%*} %{pie:%(Libs_pic);:%(Libs)}
%{static|static-pie:--start-group} %{pie:%(Link_Libs_pic);:%(Link_Libs)}
%{static|static-pie:--end-group} %(Link_End)
%{EL&EB}
%{MD:%(generate_deps)} %:error-unused-options()
# executed when called with '-t ld' (L4 linker with ld)
ld = %(check_linker) %:exec(%(linker) %(link_args_ld_part1)
%(link_args_ld_part2_gnu_ld) %(link_args_ld_part3))
# executed when called with '-t lld' (L4 linker with ld)
lld = %(check_linker) %:exec(%(linker) %(link_args_ld_part1)
%(link_args_ld_part2_llvm_lld) %(link_args_ld_part3))
######### gcc command line compatibility mode for linker ###################
# maps GCC command line options directly to gnu-ld options
# specify command line compatible to linking with GCC
gcc_arg_opts =
%:arg-option(aux-info param x idirafter include imacro iprefix
iwithprefix iwithprefixbefore isystem imultilib
isysroot Xpreprocessor Xassembler T
Xlinker u z G o U D I MF)
link_output_args_gcc = %:output-option(l*)
# pass all -Wl, and -Xlinker flags as output to the linker, preserving the order
# with all -l and non-option args
link_pass_opts_gcc = %:set-var(link_pass_opts_gcc %{Wl,*&Xlinker*})
link_args_gcc =
%(gcc_arg_opts)%(link_output_args_gcc)
%{pie:}%{no-pie:}%{nostdlib:}%{static:}%{static-pie:}%{shared:}%{nostdinc:}
%{std*:} %{m*:}
%:read-pc-file(%(pc_file_dir) %{PC*:%*})
%{r}
%{r|nocrt|nostartfiles|nostdlib:;:%:read-pc-file(%(pc_file_dir) ldscripts)}
%{o} -nostdlib %{static:-static;:-Wl,--eh-frame-hdr} %{shared}
%{static-pie:-static -pie --no-dynamic-linker -z text}
%(link_pass_opts_gcc) %{W*:} %{f*:} %{u*} %{O*} %{g*} %{T*&L*}
%{!r:%{!dT:-Wl,-dT,%:search(main_%{static:stat;static-pie:pie;shared:rel;:dyn}.ld
%(libdir))}}
%{r|shared|static|static-pie|-dynamic-linker*:;:
-Wl,--dynamic-linker=%(Link_DynLinker)
%(Link_DynLinker:;:
%:error(Link_DynLinker not specified, cannot link with shared libs.))}
%{r|nostartfiles|nostdlib:;:%(Link_Start)} %o %(Libs)
%{r|nodefaultlibs|nostdlib:;:%{static|static-pie:-Wl,--start-group}
%(Link_Libs)
%{static|static-pie:-Wl,--end-group}}
%{r|nostartfiles|nostdlib:;:%(Link_End)}
%{EL&EB}
%{MD:%(generate_deps)} %:error-unused-options()
# executed when called with '-t gcc-ld' (L4 linker with gcc)
gcc-ld = %(check_linker) %:exec(%(linker) %(link_args_gcc))
################## GCC pass through for linking host / l4linux mode ###########
# implementation for modes 'host' and 'l4linux' that use GCC/G++ as linker
# (we use gcc as linker in that case)
link_host_mode_args =
%(gcc_arg_opts)
%:read-pc-file(%(pc_file_dir) %{PC*:%*})
%{o} %{z} %{pie&no-pie} %{v} %{g*} %{-coverage} %{undef}
%{static} %o
%{I*&D*&U*} %{L*&l*&Wl,*&Xlinker*} %<Wl,*
%{!static:-Wl,-Bstatic} -Wl,--start-group %(Libs) %(Link_Libs) -Wl,--end-group
%{!static:-Wl,-Bdynamic}
%{EL&EB} %{m*} %{W*} %{f*}
%{MD:%(generate_deps)} %:error-unused-options()
# executed when called with '-t host-ld', host linker.
host-ld = %(check_linker) %:exec(%(linker) %(link_host_mode_args))

984
src/l4/mk/binary.inc Normal file
View File

@@ -0,0 +1,984 @@
# -*- Makefile -*-
# vim:set ft=make:
#
# L4Re Buildsystem
#
# Makefile-Include for compiling templates (prog.mk, lib.mk)
# Makefile-Include for binary and lib directories
# Definitions for building the Makefile.inc, building dependencies,
# compiler configuration.
#
# If SYSTEM is defined and we do not clean, we generate Makefile.inc. This file
# holds the dependencies of the targets. Is also contains the definitions of
# variables holding the objects of the related targets. In a multiple
# architecture makefile, Makefile.inc will be built in arch-specific subdirs,
# like the other components built.
#
# Most compiler- and linker-flag variables are defined in such a way that
# using them in the rule will expand all the target- and
# architecture-specific definitions.
#
# The relink-rule is defined in this file.
#
# The dependencies for compiling files are defined here, the dep-files are
# generated with names .(source-file).d for .c, .cc and .S-files.
#
# Clean-rules are defined here.
#
include $(L4DIR)/mk/util.mk
$(GENERAL_D_LOC): $(L4DIR)/mk/binary.inc $(L4DIR)/mk/modes.inc $(L4DIR)/mk/rules.inc
# our default Makefile-name in the OBJ-Subdirs
BID_OBJ_Makefile ?= Makefile
include $(OBJ_BASE)/.Package.deps
# Building variants:
ifeq ($(ROLE),prog.mk)
VARIANTS ?= std
else
ifeq ($(filter-out lib.mk prog.mk test.mk assets.mk, $(ROLE)),)
VARIANTS_lib.mk = std
# If there is a variants variable for the src dir, we use it. Otherwise, we
# fall back to the pkgdir one. If there is neither, use std.
SRC_VARIANTS += $(VARIANTS_$(SRC_DIR:$(L4DIR_ABS)/%=%))
PKGDIR_VARIANTS = $(VARIANTS_$(PKGDIR_ABS:$(L4DIR_ABS)/%=%))
VARIANTS = $(or $(SRC_VARIANTS), $(PKGDIR_VARIANTS), std)
VARIANTS += $(VARIANTS_$(ROLE))
VARIANTS := $(sort $(VARIANTS))
endif
endif
$(if $(VARIANTS),,$(error No variants defined))
ifeq ($(SYSTEM),) # if we have no system yet, build the subdirs
#################################################################
#
# we have NO system defined in $(SYSTEM), we are in the src/ dir
#
#################################################################
# our default systems
SYSTEMS ?= $(SYSTEMS_ABI)
DEPENDS_PKGS ?= $(if $(PKG_OPTIONAL),$(REQUIRES_LIBS))
BID_MISSING_PCS := \
$(strip $(if $(DEPENDS_PKGS), \
$(strip $(foreach i,$(DEPENDS_PKGS), \
$(if $(strip $(wildcard $(OBJ_BASE)/pc/$(i).pc)),,$(i))))))
ifneq ($(strip $(SRC_F)$(foreach t,$(TARGET),$(SRC_F_$(t)))),)
ifeq ($(filter x86 amd64,$(BUILD_ARCH)),)
$(info $(shell echo -e "\033[32mFortran is only available on x86 and amd64 currently, skipping directory '$(SRC_DIR)'.\033[0m"))
SYSTEMS =
else
ifeq ($(GCCFORTRANAVAIL),)
$(info $(shell echo -e "\033[32mFortran compiler (gcc-4.6 or later) missing, skipping directory '$(SRC_DIR)'.\033[0m"))
SYSTEMS =
endif
endif
endif
ifneq ($(strip $(SRC_ADA)$(foreach t,$(TARGET),$(SRC_ADA_$(t)))),)
ifeq ($(GNATVERSION),)
$(info $(shell echo -e "\033[32mAda compiler (gnatmake) missing, skipping directory '$(SRC_DIR)'.033[0m"))
SYSTEMS =
endif
endif
ifneq ($(BID_MISSING_PCS),)
# clear SYSTEMS to prevent building anything
SYSTEMS =
text := $(shell echo -e "\033[32mPackage dependencies missing: \033[1m$(BID_MISSING_PCS)\033[22m; skipping directory '$(SRC_DIR)'.\033[0m")
$(if $(BID_FAIL_ON_MISSING),$(error $(text)), $(info $(text)))
endif
ifneq ($(filter l4linux targetsys,$(MODE)),)
ifneq ($(GCCLIBCAVAIL),y)
$(info Skipping target in $(SRC_DIR) as the target compiler cannot compile them.)
SYSTEMS :=
endif
endif
# intersection with BUILD_SYSTEMS
# filter the systems from the local SYSTEMS variable ($2), that match
# the build-architecture.
# args: $(1) - build architecture (one from BUILD_SYSTEMS)
# $(2) - SYSTEMS
# 1. check, if both systems are the same (optionally reduced by the CPU)
# 2. check, if at least the arch matches (and optionally the cpu)
FILTER_SYSTEM = $(shell echo $(2)|$(AWKP) '\
BEGIN{m=s="$(1)";sub("_[^-]*","",m)}\
{for(i=1;i<=NF;i++){\
if(m==$$i||s==$$i){print s}else\
if(index(m,$$i)==1||index(s,$$i)==1)\
{t=s;sub("-.*","",t);print t}}}')
# print that system of the SYSTEMS variable that actually matched with
# $(BUILD_SYSTEMS) to the given system
# args: $(1) - build architecture (SYSTEM)
# $(2) - SYSTEMS
# + do nearly the same as in FILTER_SYSTEM, but additionally check if
# the resulting system matches $(1). If so, print the according pattern from
# SYSTEMS and exit
BID_ORIG_SYSTEM = $(shell echo $(2)|$(AWKP) '\
BEGIN{s="$(1)";sub("-[^-]*","",s);m=s;sub("_[^-]*","",m)}\
{for(i=1;i<=NF;i++){\
if(m==$$i||s==$$i){print $$i;exit};\
if(index(m,$$i)==1||index(s,$$i)==1)\
{t=s;sub("-.*","",t);\
if(m==$$i&&t=="$(1)"){print $$i;exit}}}}')
TARGET_SYSTEMS := $(sort $(foreach sys,$(BUILD_SYSTEMS),\
$(call FILTER_SYSTEM,$(sys),$(SYSTEMS))))
# Add Variant infix -- helper
TARGET_SYSTEMS_ADD_VARIANT = $(firstword $(1))-$(2)-$(word 2,$(1))
# Add Variant infix to TARGET_SYSTEMS
TARGET_SYSTEMS := $(strip \
$(foreach ts,$(TARGET_SYSTEMS), \
$(foreach v,$(sort $(VARIANTS)), \
$(call TARGET_SYSTEMS_ADD_VARIANT,$(subst -,$(BID_SPACE),$(ts)),$(v)) \
) \
) \
)
DIR_FROM_SUB = $(firstword $(addprefix ../,$(patsubst /%,,$(1))) $(1))
SYSTEM_TO_ARCH = $(shell echo $(1)|$(SED) -e 's/[_-].*//')
SYSTEM_TO_CPU = $(shell echo $(1)|$(SED) -ne 's/[^-_]*_\([^-]*\).*/\1/p')
SYSTEM_TO_L4API = $(word 3,$(subst -,$(BID_SPACE),$(1)))
SYSTEM_TO_VARIANT = $(word 2,$(subst -,$(BID_SPACE),$(1)))
$(foreach sys,$(TARGET_SYSTEMS),$(OBJ_DIR)/OBJ-$(sys)/$(BID_OBJ_Makefile)):$(OBJ_DIR)/OBJ-%/$(BID_OBJ_Makefile):$(OBJ_DIR)/.general.d $(L4DIR_ABS)/mk/binary.inc
@install -d $(dir $@)
@echo 'L4DIR=$(L4DIR_ABS)'>$@
@echo 'OBJ_BASE=$(OBJ_BASE)'>>$@
@echo 'OBJ_DIR=$(OBJ_DIR)'>>$@
@echo 'SRC_DIR=$(SRC_DIR)'>>$@
@echo 'PKGDIR=$(PKGDIR_ABS)'>>$@
@echo 'PKGDIR_ABS=$(PKGDIR_ABS)'>>$@
@echo 'PKGDIR_OBJ=$(PKGDIR_OBJ)'>>$@
@echo 'MAKECONFLOCAL=$(SRC_DIR)/Makeconf.local'>>$@
@echo 'OSYSTEM=$(call BID_ORIG_SYSTEM,$*,$(SYSTEMS))'>>$@
@echo 'SYSTEM=$*'>>$@
@echo 'ARCH=$(call SYSTEM_TO_ARCH,$*)'>>$@
@echo 'CPU=$(call SYSTEM_TO_CPU,$*)'>>$@
@echo 'L4API=$(call SYSTEM_TO_L4API,$*)'>>$@
@echo 'VARIANT=$(call SYSTEM_TO_VARIANT,$*)'>>$@
@for ext in .c .cc .cpp $(FORTRAN_FILE_EXTENSIONS) $(BID_ASM_FILE_EXTENSIONS) $(ADA_FILE_EXTENSIONS) .y .l .ld .dpe .dts .dtso; \
do echo "vpath %$$ext $(VPATH_SRC_BASE)">>$@ ; done
@echo '.general.d: $(SRC_DIR)/$(if $(wildcard Make.rules),Make.rules,Makefile)'>>$@
@echo 'include $$(OBJ_BASE)/include/config/auto.conf'>>$@
@echo 'include $(SRC_DIR)/$(if $(wildcard Make.rules),Make.rules,Makefile)'>>$@
@echo 'include $$(L4DIR)/mk/$(ROLE)'>>$@
install relink scrub:: $(foreach arch,$(TARGET_SYSTEMS),\
$(OBJ_DIR)/OBJ-$(arch)/$(BID_OBJ_Makefile))
$(if $^,\
$(VERBOSE)set -e; \
for d in $(^D); do \
cd $$d; $(MAKE) -f $(BID_OBJ_Makefile) $@; \
done )
.PHONY: pre-obj
pre-obj::
all:: $(foreach arch,$(TARGET_SYSTEMS), $(OBJ_DIR)/OBJ-$(arch))
.PHONY: $(foreach arch,$(TARGET_SYSTEMS), $(OBJ_DIR)/OBJ-$(arch))
$(foreach arch,$(TARGET_SYSTEMS), $(OBJ_DIR)/OBJ-$(arch)):%:%/$(BID_OBJ_Makefile) pre-obj
$(VERBOSE)$(MAKE) $(PL_j) -C $@ -f $(BID_OBJ_Makefile)
foreach_objdir = $(if $(wildcard $(OBJ_DIR)/OBJ-*), $(VERBOSE)set -e ; \
for d in $(wildcard $(OBJ_DIR)/OBJ-*) ; do \
$(MAKE) -C $$d -f $(BID_OBJ_Makefile) $(1); \
done, @true)
%.i %.s.i:: export DO_SHOW_RESULT_FILE=y
%.i %.s.i::
$(call foreach_objdir,$@)
clean disasm::
$(call foreach_objdir,$@)
cleanall::
$(VERBOSE)$(RM) -r $(wildcard $(OBJ_DIR))
.PHONY: $(TARGET_SYSTEMS)
else
###############################################################
#
# we have a system defined in $(SYSTEM), we are in an OBJ- dir
#
###############################################################
# In Ada we need to generate the ada library information file, which also
# potentially needs to be installed. If installation is wished provide the
# target path as ADA_ALI_INSTALL_PATH and ali files will be symlinked there.
ifneq ($(strip $(SRC_ADA)$(foreach t,$(TARGET),$(SRC_ADA_$(t)))),)
ADAINSTALL=$(if $(ADA_ALI_INSTALL_PATH),\
$(MKDIR) -p $(ADA_ALI_INSTALL_PATH); \
$(LN) -fs $(abspath $*.ali) $(ADA_ALI_INSTALL_PATH))
define adarule=
%.o %.ali &: %$(1)
@$$(call COMP_MESSAGE, from $$(<F))
$(VERBOSE)$$(MKDIR) $$(@D)
$(VERBOSE)$$(ADAC) $$(ADACFLAGS) -c $$< -o $$*.o
$(VERBOSE)$$(ADAINSTALL)
endef
$(foreach ext,$(ADA_FILE_EXTENSIONS),$(eval $(call adarule,$(ext))))
endif
all:: $(TARGET)
disasm: $(TARGET)
$(call DISASM_CMD,$(if $(DABIN),$(DABIN),$<))
ifneq ($(CONFIG_USE_DROPS_STDDIR),)
L4INCDIR ?= $(addprefix $(OBJ_BASE)/include/$(ARCH)/,$(L4API)) \
$(addprefix $(OBJ_BASE)/include/,$(L4API)) \
$(OBJ_BASE)/include/$(ARCH) \
$(OBJ_BASE)/include \
$(addprefix $(DROPS_STDDIR)/include/$(ARCH)/,$(L4API)) \
$(addprefix $(DROPS_STDDIR)/include/,$(L4API)) \
$(DROPS_STDDIR)/include/$(ARCH) \
$(DROPS_STDDIR)/include
L4LIBDIR ?= $(addprefix $(OBJ_BASE)/lib/$(ARCH)_$(CPU)/$(VARIANT)/,$(L4API)) \
$(OBJ_BASE)/lib/$(ARCH)_$(CPU)/$(VARIANT)/plain \
$(OBJ_BASE)/lib/$(VARIANT) \
$(addprefix $(DROPS_STDDIR)/lib/$(ARCH)_$(CPU)/$(VARIANT)/,$(L4API)) \
$(DROPS_STDDIR)/lib/$(ARCH)_$(CPU)/$(VARIANT)/plain \
$(DROPS_STDDIR)/lib/$(VARIANT)
else
L4INCDIR ?= $(addprefix $(OBJ_BASE)/include/$(ARCH)/,$(L4API)) \
$(wildcard $(addprefix $(OBJ_BASE)/include/,$(L4API))) \
$(OBJ_BASE)/include/$(ARCH) \
$(OBJ_BASE)/include
L4LIBDIR ?= $(addprefix $(OBJ_BASE)/lib/$(ARCH)_$(CPU)/$(VARIANT)/,$(L4API)) \
$(OBJ_BASE)/lib/$(ARCH)_$(CPU)/$(VARIANT)/plain \
$(OBJ_BASE)/lib/$(VARIANT)
endif
#
# Variables Section
#
# There is a hierarchy on defining variables depending on the targets they
# refer to: Most standard-Make Variables are supported. This includes
# LDFLAGS - options for ld, defined in prog.mk and lib.mk
# CPPFLAGS - options for the c preprocessor, included in CFLAGS
# CFLAGS - options for the c compiler
# CXXFLAGS - options for the c++ compiler
# FFLAGS - options for the fortran compiler
# ASFLAGS - options for the assembler
#
# Additionally, the following variables are supported:
# SRC_C, SRC_CC, SRC_F, SRC_S - .c, .cc, .f90, .S source files
# LIBS - additional libs to link (with -l), including paths (-L)
# TARGET - targets to be built
#
# These variables will be used for all operations with the corresponding
# file types. More specific description is possible by using variables with
# added specifications. These specifications include a referred element and
# the architecture, both optional but in this order, separated by
# underscores. The referred element for CPPFLAGS, CFLAGS, CXXFLAGS and
# ASFLAGS is the source file. For the other variables, it is one of the
# target files. The TARGET variable can only be postfixed by an
# architecture.
# The specific variables will be used for the target and the referred element
# given in the name, additionally to the more general ones.
#
# Example for a valid specifications:
# SRC_C_libxverbose.a = verbose.c - ar's verbose.o into libxverbose.a, but
# not in other libs in the TARGET var.
include $(L4DIR)/mk/modes.inc
# select the variable specified in $(1) from the current architecture and
# mode. Fall back to "all" architecture if no specific version exists.
BID_mode_var= $(if $($(1)_$(ARCH)_$(MODE)),$($(1)_$(ARCH)_$(MODE)),$($(1)_all_$(MODE)))
BID_SUPPORTED ?= $(call BID_mode_var,BID_SUPPORTED)
ifneq ($(BID_SUPPORTED),y)
$(error Mode "$(MODE)" is not supported for CPU architecture "$(ARCH)")
endif
LIBCINCDIR ?= $(call BID_mode_var,LIBCINCDIR)
LIBCLIBDIR ?= $(call BID_mode_var,LIBCLIBDIR)
LDSCRIPT ?= $(call BID_mode_var,LDSCRIPT)
LDFLAGS += $(call BID_mode_var,LDFLAGS)
REQUIRES_LIBS += $(call BID_mode_var,REQUIRES_LIBS)
REQUIRES_CFLAGS += $(call BID_mode_var,REQUIRES_CFLAGS)
CARCHFLAGS += $(call variant_values,CARCHFLAGS)
LDFLAGS += $(call bid_flag_variants,LDFLAGS)
REQUIRES_LIBS += $(call bid_flag_variants,REQUIRES_LIBS)
# ---------------------------------
BID_MISSING_LIBS :=
# call pkg-config, returns __PKGCONFIG_FAILED__ if the call failed
# 1: OBJ_BASE
# 2: parameters to pkg-config
# 3: list of packages
# use L4_BID_PKG_CONFIG because of export-defs, the function is copied
L4_BID_PKG_CONFIG = $(L4DIR)/tool/bin/l4-bender
BID_PKG_CONFIG = \
$(shell PKG_CONFIG_LIBDIR=$(1)/pc \
PKG_CONFIG_PATH= $(L4_BID_PKG_CONFIG) \
--define-variable=incdir=$(1)/include/contrib \
$(if $(VERBOSE),--silence-errors) \
$(2) $(3) || echo __PKGCONFIG_FAILED__)
BID_PKG_CONFIG_MISSING = \
$(if $(strip $(3)), \
$(shell PKG_CONFIG_LIBDIR=$(1)/pc \
PKG_CONFIG_PATH= LC_ALL=C $(L4_BID_PKG_CONFIG) \
--errors-to-stdout --print-errors $(2) $(3) \
| LC_ALL=C grep ", not found"))
BID_PKG_CONFIG_FAILED = $(findstring __PKGCONFIG_FAILED__,$(1))
BID_BENDER_DEFINES = \
-Dl4obj=$(1) \
-Dl4dir=$(2) \
-Dgcclibdir="$(3:-L%=%)" \
-Dl4system=$(4) \
$(if $(5),-Dl4api=$(5))
bid_bender_default_vars = $(call BID_BENDER_DEFINES,$(OBJ_BASE),$(L4DIR),$(GCCSYSLIBDIRS),$(ARCH)_$(CPU),$(L4API))
# linker for L4 libs and applications
BID_LINK = $(L4DIR)/tool/bin/l4-bender $(if $(VERBOSE),,--trace-exec) \
-t $(if $(filter lld,$(BID_LD_TYPE)),lld,ld) \
$(bid_bender_default_vars) -Dlinker="$(LD)" \
--spec=$(L4DIR)/mk/bid-bender.spec --
# linker for host mode and l4linux mode
BID_LINK_MODE_host = $(L4DIR)/tool/bin/l4-bender $(if $(VERBOSE),,--trace-exec) \
-t host-ld $(bid_bender_default_vars) -Dlinker="$(1)" \
--spec=$(L4DIR)/mk/bid-bender.spec --
BID_link_deps_file = $(call BID_dot_fname,$1).pcs.d
BID_LINK_DEPS = $(call BID_dot_fname,$1).d $(call BID_link_deps_file,$1)
ifeq ($(BID_MISSING_PCS),)
ifneq ($(SYSTEM),)
ifneq ($(strip $(REQUIRES_LIBS)),)
MY_DEPS := $(sort $(DEPS_$(PKGDIR_ABS:$(L4DIR_ABS)/%=%)))
exclude_req_check := $(wildcard $(addprefix $(PKGDIR_ABS)/,broken obsolete))
MISSING_DEPS := $(if $(exclude_req_check),,$(filter-out $(MY_DEPS),$(REQUIRES_LIBS)))
ifneq ($(and $(MISSING_DEPS),$(BID_GLOBAL_MAKE)),)
SRC_MAKEFILE := $(firstword $(filter $(SRC_DIR)%,$(MAKEFILE_LIST)))
#RL_DEBUG_INFO := : PD[$(PKGDIR_ABS)] L4D[$(L4DIR_ABS)] D:[$(MY_DEPS)] RL:[$(REQUIRES_LIBS)] M:[$(MISSING_DEPS)]
TEXT := $(shell echo -e "\n\033[31m$(SRC_MAKEFILE): '$(MISSING_DEPS)' in REQUIRES_LIBS in Makefile but not in Control file requires$(RL_DEBUG_INFO)\033[0m")
$(if $(filter-out l4defs.gen.dir,$(notdir $(PKGDIR_ABS))),$(error $(TEXT)))
endif
REQUIRES_LIBS_LIST := $(strip $(call BID_PKG_CONFIG,$(OBJ_BASE),--libs,$(REQUIRES_LIBS)))
# error handling
ifneq ($(call BID_PKG_CONFIG_FAILED,$(REQUIRES_LIBS_LIST)),)
BID_MISSING_PCS := $(strip $(foreach i,$(REQUIRES_LIBS), \
$(if $(filter __PKGCONFIG_FAILED__,$(call BID_PKG_CONFIG,$(OBJ_BASE),--libs --print-errors,$(i))),$(i))))
text := $(shell echo -e "\033[31mLibrary dependencies missing: \033[1m$(BID_MISSING_PCS)\033[22m in directory '$(SRC_DIR)'; aborting.\033[0m")
text2 := $(strip $(foreach i,$(REQUIRES_LIBS), $(call BID_PKG_CONFIG_MISSING,$(OBJ_BASE),--libs,$(i))))
$(if $(text2),$(info $(shell echo -e "\033[31m$(text2)\033[0m")))
$(if $(BID_MISSING_PCS),$(info $(text)),$(error $(text)))
endif
endif
BID_PKG_CONFIG_CFLAGS := $(call BID_PKG_CONFIG,$(OBJ_BASE),--cflags, $(REQUIRES_CFLAGS) $(REQUIRES_LIBS))
# error handling
ifneq ($(call BID_PKG_CONFIG_FAILED,$(BID_PKG_CONFIG_CFLAGS)),)
BID_MISSING_PCS := $(strip $(foreach i,$(REQUIRES_CFLAGS) $(REQUIRES_LIBS), \
$(if $(filter __PKGCONFIG_FAILED__,$(call BID_PKG_CONFIG,$(OBJ_BASE),--cflags --print-errors,$(i))),$(i))))
text := $(shell echo -e "\033[31mCflags dependencies missing: \033[1m$(BID_MISSING_PCS)\033[22m in directory '$(SRC_DIR)'; aborting.\033[0m")
text2 := $(strip $(foreach i,$(REQUIRES_LIBS), $(call BID_PKG_CONFIG_MISSING,$(OBJ_BASE),--cflags,$(i))))
$(if $(text2),$(info $(shell echo -e "\033[31m$(text2)\033[0m")))
$(error $(text))
endif
endif # SYSTEM
endif
ifneq ($(REQUIRE_HOST_TOOLS),)
CHECK_HOST_TOOLS = \
$(shell unset mis; \
for i in $(1); do \
if ! command -v $$i >/dev/null 2>&1; then \
[ -n "$$mis" ] && mis="$$mis "; \
mis="$$mis$$i"; \
fi \
done; echo $$mis)
ifneq ($(call CHECK_HOST_TOOLS,$(REQUIRE_HOST_TOOLS)),)
$(info $(shell echo -e "\033[32mHost tool(s) missing: \033[1m$(REQUIRE_HOST_TOOLS)\033[22m needed in directory '$(SRC_DIR)'. Skipping.\033[0m"))
SYSTEMS :=
INSTALL_TARGET :=
endif
endif
# -----------------------
# TEMP-only
$(if $(filter x86 arm arm64 amd64 mips sparc ppc32,$(SYSTEMS)), $(error Please appends "-plain" to each architecture in SYSTEMS ))
LDFLAGS += $(if $(CONFIG_BID_LD_EMIT_UNWIND),--eh-frame-hdr,)
OPTS_DEBUG-$(CONFIG_BID_DEBUG_INFO) = -g
OPTS_DEBUG ?= $(OPTS_DEBUG-y)
OPTS ?= $(OPTS_DEBUG) $(if $(CONFIG_BID_OPTIMIZE_SIZE),-Os,-O2) \
-fno-strict-aliasing
WARNINGS_MINIMAL ?= -Wall $(call bid_flag_variants,WARNINGS)
WARNINGS_MEDIUM ?= -Wall -Wstrict-prototypes $(CONDITIONAL_WARNINGS_MEDIUM) \
-Wmissing-declarations $(call bid_flag_variants,WARNINGS)
WARNINGS_FULL ?= -Wextra -Wbad-function-cast -Wdouble-promotion \
$(CONDITIONAL_WARNINGS_FULL) $(WARNINGS_MEDIUM)
WARNINGS ?= $(WARNINGS_FULL)
ifeq ($(MODE),host)
# never cross compile in host mode
override CROSS_COMPILE =
override CC = $(HOST_CC)
override CXX = $(HOST_CXX)
override ADAC = $(HOST_ADAC)
else
# no architecture specific flags in host mode
LDFLAGS += $(LDFLAGS_$(ARCH))
endif
# additional libraries go after the requires-libs-list
LIBS += $(strip $(LIBS_$(OSYSTEM)) $(LIBS_$@) $(LIBS_$@_$(OSYSTEM)))
# no link address if build a lib or we're compiling a host program and using
# the host linker scripts
ifeq ($(ROLE),lib.mk)
NO_DEFAULT_RELOC := y
endif
ifneq ($(HOST_LINK),)
NO_DEFAULT_RELOC := y
endif
# stack protector support
# check if uclibc signaled support for stack protector
ifneq ($(filter bid_allow_stack_protector, $(BID_PKG_CONFIG_CFLAGS)),)
BID_PKG_CONFIG_CFLAGS := $(filter-out bid_allow_stack_protector, $(BID_PKG_CONFIG_CFLAGS))
ifdef CONFIG_BID_GCC_ENABLE_STACK_PROTECTOR # stack protector option was selected in make config
GCCSTACKPROTECTOROPT := $(if $(CONFIG_BID_GCC_STACK_PROTECTOR_ALL), $(GCCSTACKPROTALLOPT), \
$(GCCSTACKPROTOPT))
ifneq ('$(CONFIG_BID_GCC_STACK_PROTECTOR_ALL)$(CONFIG_BID_GCC_STACK_PROTECTOR)','y')
$(error invalid combination of CONFIG_BID_GCC_STACK_PROTECTOR... options)
endif
endif # CONFIG_BID_GCC_ENABLE_STACK_PROTECTOR
else
# explicity disable the stack protector (some compilers enable stack protector by default)
GCCSTACKPROTECTOROPT = $(GCCNOSTACKPROTOPT)
endif # stack protector
# We need relocation to RAM_BASE if:
# - requested explicitly (RELOC_PHYS)
# - otherwise, only if _none_ of the following things applies:
# - we compile for an MMU system
# - all binaries are PIE
# - the current binary can be PIE and this is enabled
default_reloc_phys = $(if $(CONFIG_MMU)$(CONFIG_BID_PIE_ALL)$(and $(CONFIG_BID_PIE_VOLUNTARY),$(BID_CAN_PIE)),$(RELOC_PHYS),y)
default_reloc_base = $(if $(NO_DEFAULT_RELOC),,$(firstword $(DEFAULT_RELOC_$(1)) \
$(DEFAULT_RELOC_$(ARCH)) \
$(DEFAULT_RELOC)))
# The default relocation is directly used by the bootstrap Make.rules.
default_reloc = $(if $(call default_reloc_base,$(1)),\
$(if $(default_reloc_phys), \
$(shell printf "0x%x" $$(($(RAM_BASE) + $(call default_reloc_base,$(1))))), \
$(call default_reloc_base,$(1))))
# Default relocation should not be applied for PIE binaries!
apply_default_reloc = $(if $(CONFIG_BID_PIE_ALL)$(and $(CONFIG_BID_PIE_VOLUNTARY),$(BID_CAN_PIE)),,$(call default_reloc,$(1)))
default_heap_size = $(if $(if $(NO_DEFAULT_RELOC),,$(CONFIG_BID_STATIC_HEAP)),\
$(firstword $(DEFAULT_HEAP_SIZE_$(1)) \
$(DEFAULT_HEAP_SIZE_$(ARCH)) \
$(DEFAULT_HEAP_SIZE) \
0x10000))
default_stack_size = $(if $(if $(NO_DEFAULT_RELOC),,$(CONFIG_BID_STATIC_STACK)),\
$(firstword $(DEFAULT_STACK_SIZE_$(1)) \
$(DEFAULT_STACK_SIZE_$(ARCH)) \
$(DEFAULT_STACK_SIZE) \
0x1000))
CCXX_FLAGS += $(if $(CONFIG_FULL_PATH_NAMES_IN_BINARIES),,$(GCCPREFIXOPT))
# can be overwritten to get the old mode
CFLAGS_C99 ?= -std=gnu99
ifneq ($(MODE),host)
CFLAGS_L4_GENERIC += $(CARCHFLAGS) $(CCXX_FLAGS) $(GCCSTACKPROTECTOROPT)
CFLAGS_L4_GENERIC += -ffunction-sections -fdata-sections
CFLAGS_L4_NOPIC += $(call BID_mode_var,NOPICFLAGS)
CFLAGS_L4_PIC += $(PICFLAGS)
endif
BID_DEFINES_SOURCE_STANDARD ?= -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700
CFLAGS += $(if $(CONFIG_BID_GCC_OMIT_FP),-fomit-frame-pointer,-fno-omit-frame-pointer)
CFLAGS += $(if $(CONFIG_BID_LD_EMIT_UNWIND),-funwind-tables,-fno-unwind-tables)
CFLAGS += $(OPTS) $(WARNINGS)
CFLAGS += -fno-common
CFLAGS += $(CFLAGS_C99)
CFLAGS += $(CFLAGS_L4_GENERIC)
CFLAGS += $(call bid_flag_variants,CFLAGS)
DEFINES += -DSYSTEM_$(subst -,_,$(subst +,_,$(SYSTEM))) -DARCH_$(ARCH) -DCPUTYPE_$(CPU) -DL4API_$(L4API)
DEFINES += $(BID_DEFINES_SOURCE_STANDARD) -D_FILE_OFFSET_BITS=64
DEFINES-l4api-plain := -DL4_MINIMAL_LIBC
DEFINES += $(DEFINES-l4api-$(L4API))
ifdef DEBUG
ifneq (,$(filter 0 n N, $(DEBUG)))
DEFINES += -DNDEBUG
endif
endif
DEFINES += $(call bid_flag_variants,DEFINES)
ifneq ($(MODE),host)
CPPFLAGS_L4_GENERIC += $(CARCHFLAGS)
endif
CPPFLAGS-DEBUG_MODE = \
$(if $(filter l4f,$(L4API)), \
$(addprefix -include ,$(OBJ_BASE)/include/l4/sys/kdebug.h \
$(OBJ_BASE)/include/l4/sys/ktrace.h \
$(OBJ_BASE)/include/l4/util/kprintf.h \
$(OBJ_BASE)/include/l4/sys/debugger.h))
CPPFLAGS+= $(DEFINES)
CPPFLAGS+= $(CPPFLAGS_L4_GENERIC)
CPPFLAGS+= $(addprefix -I, $(PRIVATE_INCDIR) $(call bid_flag_variants,PRIVATE_INCDIR))
CPPFLAGS+= $(if $(CONTRIB_INCDIR),$(addprefix -I$(OBJ_BASE)/include/contrib/,$(CONTRIB_INCDIR)))
CPPFLAGS+= $(BID_PKG_CONFIG_CFLAGS)
ifneq ($(MODE),host)
CPPFLAGS+= $(addprefix -I, $(L4INCDIR))
endif
CPPFLAGS+= $(if $(DEBUG_MODE),$(CPPFLAGS-DEBUG_MODE))
CPPFLAGS+= $(LIBCINCDIR)
CPPFLAGS+= $(call bid_flag_variants,CPPFLAGS)
ifneq ($(MODE),host)
CPPFLAGS += -include l4/bid_config.h
CXXFLAGS_L4_GENERIC += $(CARCHFLAGS) $(CCXX_FLAGS)
CXXFLAGS_L4_GENERIC += $(if $(GCC_HAS_ATOMICS),-DL4_GCC_HAS_ATOMICS)
CXXFLAGS_L4_GENERIC += $(GCCSTACKPROTECTOROPT)
CXXFLAGS_L4_GENERIC += -fuse-cxa-atexit -ffunction-sections -fdata-sections
CXXFLAGS_L4_NOPIC += $(call BID_mode_var,NOPICFLAGS)
CXXFLAGS_L4_PIC += $(PICFLAGS)
endif
CXXFLAGS_EARLY += $(if $(filter 1-15,$(BID_COMPILER_IS_CLANG)-$(GCCVERSION)),-std=gnu++17)
CXXFLAGS_EARLY += $(if $(filter 1-9 1-10,$(BID_COMPILER_IS_GCC)-$(GCCVERSION)),-std=gnu++17)
CXXFLAGS+= $(if $(CONFIG_BID_GCC_OMIT_FP),-fomit-frame-pointer,-fno-omit-frame-pointer)
CXXFLAGS+= $(if $(CONFIG_BID_LD_EMIT_UNWIND),-funwind-tables,-fno-unwind-tables)
CXXFLAGS+= $(OPTS) $(filter-out $(foreach w,$\
-Wbad-function-cast $\
-Wstrict-prototypes $\
-Wmissing-prototypes $\
-Wunterminated-string-initialization,$\
$(w) $(patsubst -W%,-Wno-%,$(w))),$\
$(WARNINGS))
CXXFLAGS+= $(GCCWNONOEXCEPTTYPE) $(GCCWNOPSABI) $(GCCWNOUNUSEDPRIVATEFIELD) \
$(GCCWNOC99DESIGNATOR)
CXXFLAGS+= -fno-common
CXXFLAGS+= $(CXXFLAGS_L4_GENERIC)
CXXFLAGS+= $(call bid_flag_variants,CXXFLAGS)
ifeq ($(BID_COLLECT_DIAGNOSTICS),sarif)
ifneq ($(strip $(DIAGNOSTICS_SARIF)),)
CXXFLAGS += $(DIAGNOSTICS_SARIF)
CFLAGS += $(DIAGNOSTICS_SARIF)
else
$(error SARIF diagnostics not supported by compiler)
endif
endif
ifeq ($(BID_COLLECT_DIAGNOSTICS),json)
ifneq ($(strip $(DIAGNOSTICS_JSON)),)
CXXFLAGS += $(DIAGNOSTICS_JSON)
CFLAGS += $(DIAGNOSTICS_JSON)
CXX_COLLECT_REDIR = |& sed '/^\[\]/d' | tee $$@.diag && ( [[ -s $$@.diag ]] || rm $$@.diag )
else
$(error JSON diagnostics not supported by compiler)
endif
endif
ifneq ($(BID_COLLECT_DIAGNOSTICS),)
CXXFLAGS += $(DIAGNOSTICS_COLOR)
CFLAGS += $(DIAGNOSTICS_COLOR)
CXX_COLLECT_REDIR ?= |& tee $@.diag && ( [[ -s $@.diag ]] || rm $@.diag )
C_COLLECT_REDIR = $(CXX_COLLECT_REDIR)
endif
FFLAGS += $(OPTS)
FFLAGS += $(filter-out $(GCCPREFIXOPT),$(CFLAGS_L4_GENERIC))
FFLAGS += $(call bid_flag_variants,FFLAGS)
ifneq ($(MODE),host)
ADACFLAGS += -nostdinc -I$(OBJ_BASE)/include/contrib/ada/adainclude/
ADACFLAGS += --RTS=$(OBJ_BASE)/include/contrib/ada
endif
NO_CPP_ADAC = y
NOPICFLAGS += $(if $(CONFIG_BID_PIE),-fPIE)
PICFLAGS += -fPIC -U__PIC__ -D__PIC__=1
# select NOPIEFLAGS and NOPICFLAGS, use the most specific mode variable
# first and the try the more generic _all_ and global version
NOPICFLAGS_all_$(MODE) ?= $(NOPICFLAGS)
NOPICFLAGS_$(ARCH)_$(MODE) ?= $(NOPICFLAGS_all_$(MODE))
NOPIEFLAGS_all_$(MODE) ?= $(NOPIEFLAGS)
NOPIEFLAGS_$(ARCH)_$(MODE) ?= $(NOPIEFLAGS_all_$(MODE))
ifneq ($(MODE),host)
ASFLAGS_L4_GENERIC += $(CARCHFLAGS) $(CCXX_FLAGS)
endif
ASFLAGS += $(OPTS) $(ASFLAGS_L4_GENERIC)
ASFLAGS += $(call bid_flag_variants,ASFLAGS)
ALLOBJS = $(OBJS) $(foreach target,$(TARGET) $(TARGET_$(OSYSTEM)),\
$(OBJS_$(target)) $(OBJS_$(target)_$(OSYSTEM)))
ALLDPI = $(sort $(foreach obj,$(ALLOBJS),$(patsubst %.dpe,%.dpi,\
$(DPE_$(obj:.o=.c)))))
# convert list of c++ files names to .o files
# arg: 1 - list of files
# 2 - infix between the basename and the .o
convert_cc_to_o_file = $(patsubst %.cc,%$(2).o, $(filter %.cc,$(1))) \
$(patsubst %.cpp,%$(2).o,$(filter %.cpp,$(1)))
#
# Get the combined contents of generic and target-specific variables.
#
# Returns:
# $(<var>) $(<var>_$(OSYSTEM)) $(<var>_<target>) $(<var>_<target>_$(OSYSTEM))
#
# arg: 1 - name of the variable (<var>), e.g. SRC_C
# 2 - target name
#
get_target_var = $(strip \
$($(1)) $($(1)-y) \
$($(1)_$(ARCH)) $($(1)_$(ARCH)-y) \
$(if $(OSYSTEM), \
$($(1)_$(OSYSTEM)) $($(1)_$(OSYSTEM)-y)) \
$($(1)_$(2)) $($(1)_$(2)-y) \
$(if $(OSYSTEM), \
$($(1)_$(2)_$(OSYSTEM)) $($(1)_$(2)_$(OSYSTEM)-y)))
# convert list of Fortran file names to .o files
# arg: 1 - list of files
# 2 - infix between the basename and the .o
convert_f_to_o_file = $(foreach e,$(FORTRAN_FILE_EXTENSIONS),$(patsubst %$e,%$(2).o,$(filter %$e,$(1))))
# convert list of Ada file names to .o files
# arg: 1 - list of files
# 2 - infix between the basename and the .o
convert_ada_to_o_file = $(foreach e,$(ADA_FILE_EXTENSIONS),$(patsubst %$e,%$(2).o,$(filter %$e,$(1))))
convert_asm_to_o_file = $(foreach e,$(BID_ASM_FILE_EXTENSIONS),$(patsubst %$e,%$(2).o,$(filter %$e,$(1))))
#
# generic source to object file name converters
# args: 1 - (list of) source file(s)
# 2 - object file infix 1 (after the source base-name)
#
gen_SRC_CC_obj = $(call convert_cc_to_o_file,$(1),$(2))
gen_SRC_C_obj = $(1:.c=$(2).o)
gen_SRC_S_obj = $(call convert_asm_to_o_file,$(1),$(2))
gen_SRC_F_obj = $(call convert_f_to_o_file,$(1),$(2))
gen_SRC_ADA_obj = $(call convert_ada_to_o_file,$(1),$(2))
gen_SRC_DATA_obj = $(addsuffix .bin.o,$1)
#
# Check source file constraints and generate and add the object file
# name to OBJS_<target>.
#
# Generates:
# BID_OBJ_SRC_<object-name> := <source-name>
# BID_SRC_OBJ_<source-name> += <object-name>
# OBJS_<target> += <object-name>
#
# Checks:
# * source files must be relative paths
# * there must be only one source file generating an object file
#
# arg: 1 - target name
# 2 - object file name
# 3 - source file name
#
define make_per_obj_vars
# $$(info make_per_obj_vars: '$(1)' '$(2)' '$(3)')
$$(if $$(filter /%,$(3)), $$(error Source file must be relative: $(3)))
$$(if $$(and $$(BID_OBJ_SRC_$(2)), $$(filter-out $$(BID_OBJ_SRC_$(2)), $(3))), \
$$(error $(2) has ambigous source files: $(3) $$(BID_OBJ_SRC_$(2))))
BID_OBJ_SRC_$(2) := $(3)
BID_SRC_OBJ_$(3) += $(2)
OBJS_$(1) += $(2)
endef
#
# Make variables for all source files in $($(2))
#
# args: 1 - source var name (e.g., SRC_C)
# 2 - target
# 3 - object name infix 1
#
define make_per_source_type_vars
$(foreach src,$(call get_target_var,$(1),$(2)),\
$(eval $(call make_per_obj_vars,$(2),$(strip $(call gen_$(1)_obj,$(src),$(3))),$(src))))
endef
#
# All supported SRC_<x> variables
#
BID_SRC_VARS ?= S C CC F ADA DATA
#
# Generate per target/source/object variables for all sources
# found in SRC_[$(BID_SRC_VARS)].
#
# args: 1 - target
# 2 - object file infix 1
#
define make_per_target_vars
$(foreach svar,$(BID_SRC_VARS),$(call make_per_source_type_vars,SRC_$(svar),$(1),$(2)))
endef
#
# Generate all target / object / source specific variables and
# dependencies for a given target.
#
# args: 1 - target name
# 2 - object-file infix 1 (added after the source files base-name)
#
define make_per_target_vars_and_deps
$$(call make_per_target_vars,$(1),$(2))
OBJS_$(1) := $$(call get_target_var,OBJS,$(1))
$$(OBJS_$(1)): .general.d
$(1): OBJS = $$(OBJS_$(1))
$(1): $$(OBJS_$(1))
endef
# handle per-target DEFAULT_RELOC.
#
# Create a dependency to $(BID_RAM_BASE_DEP) and LDFLAGS for the given target.
# NOTE: the handling depends on the global MODE setting in the Makefile.
ifneq ($(MODE),shared)
ifneq ($(filter l4linux host,$(MODE)),)
define make_per_target_reloc
$$(error DEFAULT_RELOC / DEFAULT_RELOC_$(1) must not be set if MODE is l4linux or host)
endef
define make_per_target_heap_size
$$(error DEFAULT_HEAP_SIZE / DEFAULT_HEAP_SIZE_$(1) must not be set if MODE is l4linux or host)
endef
define make_per_target_stack_size
$$(error DEFAULT_STACK_SIZE / DEFAULT_STACK_SIZE_$(1) must not be set if MODE is l4linux or host)
endef
else
define make_per_target_reloc
$(1): $$(BID_RAM_BASE_DEP)
LDFLAGS_$(1) += $$(if $$(filter lld,$$(BID_LD_TYPE)),\
--image-base=$$(firstword $$(call default_reloc,$(1))),\
-Ttext-segment=$$(firstword $$(call default_reloc,$(1))))
endef
define make_per_target_heap_size
LDFLAGS_$(1) += --defsym=__heap_size=$$(firstword $$(call default_heap_size,$(1)))
endef
define make_per_target_stack_size
LDFLAGS_$(1) += --defsym=__stack_size=$$(firstword $$(call default_stack_size,$(1)))
endef
endif
else
define make_per_target_reloc
endef
define make_per_target_heap_size
endef
define make_per_target_stack_size
endef
endif
#
# Generate $(1): %.dpi -> %.dpe dependencies for one source file
# arg: 1 - name of the C or C++ source file
#
# This function generates a dependency if DPE_$(1) is not empty
#
define gen_src_to_dpe_deps
$(if $(DPE_$(1)),$(eval $(SRC_DIR)/$(1): $(patsubst %.dpe,%.dpi,$(DPE_$(1)))))
endef
define gen_target_vars_and_deps
$(eval $(call make_per_target_vars_and_deps,$(1),$(2))) \
$(foreach src,$(call get_target_var,SRC_C,$(1)) \
$(call get_target_var,SRC_CC,$(1)), \
$(call gen_src_to_dpe_deps,$(src))) \
$(if $(call apply_default_reloc,$(1)),$(eval $(call make_per_target_reloc,$(1)))) \
$(if $(call default_heap_size,$(1)),$(eval $(call make_per_target_heap_size,$(1))))
$(if $(call default_stack_size,$(1)),$(eval $(call make_per_target_stack_size,$(1))))
endef
# Generate dependency rules and target-specific variables for all
# targets, using the functions above.
define GENERATE_PER_TARGET_RULES
$(foreach target,$(1),$(call gen_target_vars_and_deps,$(target),$(2)))
endef
#
# Rules Section
#
# the default target "all" ensures building of the targets. When multiple
# architectures are used, the targets are build in subdirs.
# the relink-rule: make the TARGETs phony. Specification of build-targets
# in MAKECMDGOALS is not allowed. Possibility: TARGET=
#
ifneq ($(filter relink,$(MAKECMDGOALS)),)
.PHONY: $(TARGET)
relink: all
endif
DEPFLAGS = -MD -MP -MF $(@D)/.$(@F).d
DEPFLAGS_F = -cpp
include $(L4DIR)/mk/rules.inc
# generate rules to compile %.cc files to %.o, %.s.o etc
$(eval $(call BID_GENERATE_CXX_MAKE_RULES,cc))
# generate rules to compile %.cpp files to %.o, %.s.o etc
$(eval $(call BID_GENERATE_CXX_MAKE_RULES,cpp))
# generate rules to compile %.c files to %.o, %.s.o etc
$(eval $(call BID_GENERATE_C_MAKE_RULES,c))
# generate rules to compile %.f90 files to %.o, %.s.o etc
$(foreach e,$(FORTRAN_FILE_EXTENSIONS),$(eval $(call BID_GENERATE_F_MAKE_RULES,$(subst .,,$e))))
# generate rules to compile %.adb/%.ads files to %.o, %.s.o etc
$(foreach e,$(ADA_FILE_EXTENSIONS),$(eval $(call BID_GENERATE_ADA_MAKE_RULES,$(subst .,,$e))))
# generate rules to compile %.S files to %.o, %.s.o etc
$(foreach e,$(BID_ASM_FILE_EXTENSIONS),$(eval $(call BID_GENERATE_ASM_MAKE_RULES,$(subst .,,$e))))
# Reset implicit rules, mind the TAB.
define reset_implicit_rule =
%o: %$(1)
endef
$(foreach e,.c .cc .cpp $(BID_ASM_FILE_EXTENSIONS) $(FORTRAN_FILE_EXTENSIONS) $(ADA_FILE_EXTENSIONS),$(eval $(call reset_implicit_rule,$e)))
$(eval $(call BID_GENERATE_I_MAKE_RULE,%.i,%.c,$(CC),$(CFLAGS) $(call BID_mode_var,NOPICFLAGS)))
$(eval $(call BID_GENERATE_I_MAKE_RULE,%.s.i,%.c,$(CC),$(CFLAGS) $(PICFLAGS)))
$(eval $(call BID_GENERATE_I_MAKE_RULE,%.i,%.cc,$(CXX),$(CXXFLAGS) $(call BID_mode_var,NOPICFLAGS)))
$(eval $(call BID_GENERATE_I_MAKE_RULE,%.s.i,%.cc,$(CXX),$(CXXFLAGS) $(PICFLAGS)))
$(eval $(call BID_GENERATE_I_MAKE_RULE,%.i,%.cpp,$(CXX),$(CXXFLAGS) $(call BID_mode_var,NOPICFLAGS)))
$(eval $(call BID_GENERATE_I_MAKE_RULE,%.s.i,%.cpp,$(CXX),$(CXXFLAGS) $(PICFLAGS)))
$(eval $(call BID_GENERATE_I_MAKE_RULE,%.i,%.S,$(CC),$(ASFLAGS)))
$(eval $(call BID_GENERATE_S_MAKE_RULE,%.c,$(CC),$(CFLAGS)))
$(eval $(call BID_GENERATE_S_MAKE_RULE,%.cc,$(CC),$(CXXFLAGS)))
$(eval $(call BID_GENERATE_S_MAKE_RULE,%.cpp,$(CC),$(CXXFLAGS)))
%.c: %.y
@$(GEN_MESSAGE)
$(VERBOSE)$(CONFIG_YACC) $(YFLAGS) $(abspath $<)
$(VERBOSE)mv -f y.tab.c $@
$(VERBOSE)if [ -f y.tab.h ]; then mv -f y.tab.h $(@:.c=.h); fi
%.c: %.l
@$(COMP_MESSAGE)
$(VERBOSE)$(CONFIG_LEX) -o$@ $(abspath $<)
%.dpi: %.dpe
@$(GEN_MESSAGE)
$(VERBOSE)$(call MAKEDEP,perl) $(GEN_DOPECODE) $< >$@
define device_tree_rule
%.$(2): %.$(1) $(GENERAL_D_LOC)
@$$(BUILD_MESSAGE)
$(VERBOSE)$(call lessfork_mkdir,$$(@D))
$(VERBOSE)$(CPP) $(CPPFLAGS) -undef $$(addprefix -I, $(PRIVATE_INCDIR)) -x assembler-with-cpp -Wp,-MD,$$(@D)/.$$(@F).d,-MT$$@,-MP -nostdinc -o $$@.pre $$<
$(VERBOSE)$(DTC) $(DTC_FLAGS) $$(addprefix -i , $(PRIVATE_INCDIR)) -i $$(dir $$<) -d $$(call BID_dot_fname,$$@).d-x -O dtb -b 0 -o $$@ $$@.pre
$(VERBOSE)$(SED) -e "s|$$@.pre|$$<|" $$(call BID_dot_fname,$$@).d-x | \
perl -ne 'print "$$$$_\n"; if (/^.*:\s*(.*)$$$$/) { print "$$$$_:\n" foreach (split(/ /,$$$$1)); }' >> $$(@D)/.$$(@F).d
$(VERBOSE)$(RM) $$(call BID_dot_fname,$$@).d-x $$@.pre
endef
$(eval $(call device_tree_rule,dts,dtb))
$(eval $(call device_tree_rule,dtso,dtbo))
define bin_to_asm_recipe
echo -e ".section .rodata, \"a\"\n" \
".global _binary_$(3)_start\n" \
".global _binary_$(3)_end\n" \
".p2align 3\n" \
"_binary_$(3)_start:\n" \
".incbin \"$(1)\"\n" \
"_binary_$(3)_end:\n" >$(2)
endef
SRC_DATA_VPATH ?= $(SRC_DIR)
$(foreach s,$(SRC_DATA),$(eval vpath $(s) $(SRC_DATA_VPATH)))
$(addsuffix .bin.S,$(SRC_DATA)): %.bin.S: % $(GENERAL_D_LOC)
@$(GEN_MESSAGE)
$(VERBOSE)$(MKDIR) $(@D)
$(VERBOSE)$(call bin_to_asm_recipe,$<,$@,$(subst -,_,$(subst /,_,$(subst .,_,$(strip $(*F))))))
DEPS += $(foreach file,$(ALLOBJS), $(call BID_dot_fname,$(file)).d)
DEPS += $(foreach file,$(ALLOBJS) $(INSTALL_TARGET), $(call BID_dot_fname,$(file)).cmd)
DEPS += $(foreach file,$(ALLDPI), $(call BID_dot_fname,$(file)).d)
# Common clean Rules
clean cleanall::
$(file >$@.in,\
$(strip $(filter-out $(KEEP_ON_CLEAN),\
$(wildcard *.dpi) $(wildcard *.o) $(wildcard *.i) \
$(wildcard *.S) $(wildcard *.ali) \
$(wildcard $(filter-out -%, $(ALLOBJS) $(DEL_ON_CLEAN))))))
$(VERBOSE)xargs -a $@.in $(RM)
$(VERBOSE)$(RM) $@.in
# clean: delete all temporary editor files, objects, binaries
# and most generated files
cleanall::
$(VERBOSE)$(RM) $(TARGET) \
$(addsuffix .*.d,$(sort $(dir $(ALLOBJS)))) \
$(addsuffix .*.cmd,$(sort $(dir $(ALLOBJS)))) \
$(wildcard $(BID_OBJ_Makefile).inc)
.PHONY: scrub clean cleanall disasm
endif # $(SYSTEM) is defined
# General rules
# scrub: delete temporary editor files and stuff like this
# can be extended by locals
scrub cleanall::
$(VERBOSE)$(SCRUB)

203
src/l4/mk/config.inc Normal file
View File

@@ -0,0 +1,203 @@
# -*- Makefile -*-
# vim:set ft=make:
#
# L4Re Buildsystem
#
# Makefile-Include for compiling templates (prog.mk, lib.mk)
#
# Makefile-Include for binary, lib, subdir and other directories.
# Definitions and rules for the DROPS configuration tool.
# Supported targets:
#
# config:: - run the menu-driven configuration tool
# menuconfig xconfig:: - run the configuration tool
# oldconfig:: - (re)create the configuration header
# based on a prior configuration
# or default values
# genfixdep - build fixdep tool
#
# Required Parameters:
#
# PKGDIR
#
#
# Optional Parameters:
#
# DROPSCONF - if nonempty, the configuration tool is run for
# target config::. If empty, the configuration tool
# is not run.
# DROPSCONF_TITLE - the main title in the configuration tool.
# DROPSCONF_DEFCONFIG - default config file
# DROPSCONF_CONFIG_IN - configuration defintion file
# DROPSCONF_CONFIG - config file
# DROPSCONF_CONFIG_H - generated config header file
# DROPSCONF_MACRO - macro to indicate inclusion of config header file
# DROPSCONF_HELPFILE - options help file
# DROPSCONF_TOOL - the menudriven configuration tool
# DROPSCONF_TOOL_TXT - the configuration tool
# DROPSCONF_TOOL_OLD - helper for recreating the config header file
MAKECONFIGGOALS := config menuconfig textconfig oldconfig olddefconfig xconfig \
gconfig nconfig randconfig allyesconfig allnoconfig \
savedefconfig txtconfig
.PHONY: $(MAKECONFIGGOALS)
KCONFIG_OBJ_DIR = $(OBJ_BASE)/scripts/kconfig
kconfig_call = $(MAKE) -C $(L4DIR)/tool/kconfig O=$(OBJ_BASE) \
Kconfig=$(KCONFIG_FILE) \
KCONFIG_AUTOHEADER=include/generated/autoconf.h \
KCONFIG_CONFIG=.kconfig \
KCONFIG_AUTOCONFIG=include/config/auto.conf \
KCONFIG_TRISTATE=.kconfig.tristate \
l4re_srcdir=$(L4DIR_ABS)
DROPSCONF ?=
#DROPSCONF_TITLE ?= DROPS Configuration Tool
#DROPSCONF_DEFCONFIG ?= defconfig
#DROPSCONF_CONFIG_IN ?= config.in
#DROPSCONF_CONFIG ?= $(OBJ_DIR)/.config
#DROPSCONF_CONFIG_H ?= $(OBJ_DIR)/config.h
#DROPSCONF_CONFIG_MK ?= $(OBJ_DIR)/Makeconf.bid.local
DROPSCONF_DONTINC_MK ?=
#DROPSCONF_MACRO ?= CONFIG_H_INCLUDED
#DROPSCONF_HELPFILE ?= config.help
#DROPSCONF_LXDIALOG ?= $(OBJ_BASE)/tool/config/lxdialog/lxdialog
#DROPSCONF_TOOL ?= $(firstword $(wildcard \
# $(L4DIR)/tool/config/Menuconfig \
# $(DROPS_STDDIR)/tool/bin/Menuconfig) \
# did_not_find_BID_Menuconfig)
#DROPSCONF_TOOL_TXT ?= $(firstword $(wildcard \
# $(L4DIR)/tool/config/Configure \
# $(DROPS_STDDIR)/tool/bin/Configure) \
# did_not_find_BID_Configure)
#DROPSCONF_TOOL_OLD ?= $(firstword $(wildcard \
# $(L4DIR)/tool/config/Configure \
# $(DROPS_STDDIR)/tool/bin/Configure) \
# did_not_find_BID_Configure) -d
#DROPSCONF_VARDEFS = $(foreach v,TITLE DEFCONFIG CONFIG_IN CONFIG CONFIG_H \
# MACRO HELPFILE UNDEF LXDIALOG,DROPSCONF_$v='$(DROPSCONF_$v)')
ifneq ($(DROPSCONF),)
.o: $(DROPSCONF_CONFIG_H)
DIRS_FOR_CONFIG = $(KCONFIG_OBJ_DIR) $(OBJ_BASE)/config $(OBJ_BASE)/include/l4
$(DIRS_FOR_CONFIG):
$(VERBOSE)$(MKDIR) $@
DROPSCONF_CONFIG_DEPS = $(KCONFIG_FILE) $(KCONFIG_FILE).defines
menuconfig config: $(DROPSCONF_CONFIG_DEPS) | $(DIRS_FOR_CONFIG)
$(VERBOSE)+$(kconfig_call) menuconfig
$(VERBOSE)+$(kconfig_call) syncconfig
$(VERBOSE)test ! -r $(DROPSCONF_CONFIG) -o \
! $(DROPSCONF_CONFIG) -nt $(DROPSCONF_CONFIG_MK) || \
$(MAKE) $(DROPSCONF_CONFIG_MK)
textconfig: $(DROPSCONF_CONFIG_DEPS) | $(DIRS_FOR_CONFIG)
$(VERBOSE)+$(kconfig_call) config
$(VERBOSE)+$(kconfig_call) syncconfig
@$(MAKE) $(DROPSCONF_CONFIG_MK)
oldconfig olddefconfig xconfig gconfig nconfig randconfig allyesconfig allnoconfig savedefconfig: $(DROPSCONF_CONFIG_DEPS) | $(DIRS_FOR_CONFIG)
$(VERBOSE)+$(kconfig_call) $@
$(VERBOSE)+$(kconfig_call) syncconfig
@$(MAKE) $(DROPSCONF_CONFIG_MK)
syncconfig: $(DROPSCONF_CONFIG_DEPS) | $(DIRS_FOR_CONFIG)
$(VERBOSE)+$(kconfig_call) syncconfig
$(DROPSCONF_CONFIG): $(DROPSCONF_CONFIG_DEPS) | $(DIRS_FOR_CONFIG)
$(VERBOSE)+$(kconfig_call) syncconfig
.PHONY: genfixdep
# script_basic: only fixdep for now
# config-build=1: Force doing config things and not Linux build system things
genfixdep:
$(VERBOSE)+$(kconfig_call) config-build=1 scripts_basic
#$(DROPSCONF_CONFIG_H): $(DROPSCONF_CONFIG)
#$(DROPSCONF_CONFIG_H) $(DROPSCONF_CONFIG): $(DROPSCONF_CONFIG_IN)
# @$(GEN_MESSAGE)
# $(VERBOSE)install -d $(dir $(DROPSCONF_CONFIG))
# $(VERBOSE)install -d $(dir $(DROPSCONF_CONFIG_H))
# $(VERBOSE)if tty >/dev/null; then \
# $(DROPSCONF_VARDEFS) $(DROPSCONF_TOOL_OLD); \
# else \
# true | $(DROPSCONF_VARDEFS) $(DROPSCONF_TOOL_OLD) \
# $(if $(VERBOSE),>/dev/null,) || \
# ( echo -e "\nError: Unattended mode -- Some defaults for config options are missing." ; \
# false ) \
# fi
_HAS_MAKECONFIGGOAL=$(filter $(MAKECONFIGGOALS),$(MAKECMDGOALS))
$(DROPSCONF_CONFIG_MK): $(if $(_HAS_MAKECONFIGGOAL),,$(DROPSCONF_CONFIG))
$(VERBOSE)sed -e "s/\(^[^= ]*=\)'\([^']*\)'/\1\2/" \
<$(DROPSCONF_CONFIG) >$@
$(VERBOSE)$(MAKE) DROPSCONF_CONFIG_MK_POST_HOOK
DROPSCONF_CONFIG_MK_POST_HOOK::
#config:: $(DROPSCONF_LXDIALOG)
# $(VERBOSE)install -d $(dir $(DROPSCONF_CONFIG_H))
# $(VERBOSE)$(DROPSCONF_VARDEFS) $(DROPSCONF_TOOL)
# $(VERBOSE)test ! -r $(DROPSCONF_CONFIG) -o \
# ! $(DROPSCONF_CONFIG) -nt $(DROPSCONF_CONFIG_MK) || \
# $(MAKE) $(DROPSCONF_CONFIG_MK)
#txtconfig::
# $(VERBOSE)install -d $(dir $(DROPSCONF_CONFIG_H))
# $(VERBOSE)$(DROPSCONF_VARDEFS) $(DROPSCONF_TOOL_TXT)
# @$(MAKE) $(DROPSCONF_CONFIG_MK)
#
#oldconfig::
# $(VERBOSE)install -d $(dir $(DROPSCONF_CONFIG_H))
# $(VERBOSE)$(DROPSCONF_VARDEFS) $(DROPSCONF_TOOL_OLD)
# @$(MAKE) $(DROPSCONF_CONFIG_MK)
#
#$(DROPSCONF_LXDIALOG):
# $(VERBOSE)install -d $(@D)
# $(VERBOSE)PWD=$(abspath $(L4DIR)/tool/config) $(MAKE) -C $(L4DIR)/tool/config
#
clean::
ifeq ($(SUBDIRS_TO_BUILD),)
cleanall::
$(VERBOSE)$(RM) -r $(KCONFIG_OBJ_DIR)
mrproper::
$(VERBOSE)$(RM) $(DROPSCONF_CONFIG) $(DROPSCONF_CONFIG_H) \
$(DROPSCONF_CONFIG_MK) .menuconfig.log \
$(DROPSCONF_CONFIG).old
endif
help::
@echo
@echo "Configuration targets:"
@echo " config - run the menu-driven configuration tool"
@echo " gconfig - run a graphical configuration tool"
@echo " xconfig - run a graphical configuration tool"
@echo " oldconfig - (re)create the configuration header based on a prior"
@echo " configuration or default values"
# special switch not to include DROPSCONF_CONFIG_MK
ifeq ($(DROPSCONF_DONTINC_MK),)
# do not prebuild the config file on "make config"
ifeq ($(filter $(MAKECONFIGGOALS) help scrub clean cleanall mrproper \
$(DROPSCONF_CONFIG_MK),$(MAKECMDGOALS)),)
$(info INCLUDING $(DROPSCONF_CONFIG_MK) config.inc)
-include $(DROPSCONF_CONFIG_MK)
endif
endif
# end of DROPSCONF defined
else
config txtconfig oldconfig olddefconfig syncconfig::
endif

View File

@@ -0,0 +1,2 @@
CONFIG_BUILD_ARCH_amd64=y
# CONFIG_BID_GCC_OMIT_FP is not set

View File

@@ -0,0 +1,4 @@
CONFIG_BUILD_ARCH_arm=y
CONFIG_CPU_ARM_ARMV5TE=y
CONFIG_PLATFORM_TYPE_rv=y
# CONFIG_BID_GCC_OMIT_FP is not set

View File

@@ -0,0 +1,3 @@
CONFIG_BUILD_ARCH_arm=y
CONFIG_PLATFORM_TYPE_rv=y
# CONFIG_BID_GCC_OMIT_FP is not set

View File

@@ -0,0 +1,3 @@
CONFIG_BUILD_ARCH_arm64=y
CONFIG_PLATFORM_TYPE_rv_vexpress_a15=y
# CONFIG_BID_GCC_OMIT_FP is not set

View File

@@ -0,0 +1,2 @@
CONFIG_BUILD_ARCH_arm64=y
CONFIG_PLATFORM_TYPE_arm_virt=y

View File

@@ -0,0 +1 @@
CONFIG_BUILD_ARCH_mips=y

View File

@@ -0,0 +1,2 @@
CONFIG_BUILD_ARCH_ppc32=y
# CONFIG_BID_GCC_OMIT_FP is not set

View File

@@ -0,0 +1,3 @@
CONFIG_BUILD_ARCH_riscv=y
CONFIG_CPU_RISCV_32IMA=y
# CONFIG_BID_GCC_OMIT_FP is not set

View File

@@ -0,0 +1,2 @@
CONFIG_BUILD_ARCH_riscv=y
# CONFIG_BID_GCC_OMIT_FP is not set

View File

@@ -0,0 +1 @@
# CONFIG_BID_GCC_OMIT_FP is not set

333
src/l4/mk/doc.mk Normal file
View File

@@ -0,0 +1,333 @@
# -*- Makefile -*-
#
# L4Re Buildsystem
#
# Makefile-Template for doc directories
#
# install.inc is used, see there for further documentation
ifeq ($(origin _L4DIR_MK_DOC_MK),undefined)
_L4DIR_MK_DOC_MK=y
ROLE = doc.mk
include $(L4DIR)/mk/Makeconf
$(GENERAL_D_LOC): $(L4DIR)/mk/doc.mk
ifeq ($(IN_OBJ_DIR),)
##################################################################
#
# Empty IN_OBJ_DIR means we are in the source directory and have
# to first generate a Makefile in the build-dir.
#
##################################################################
all install clean cleanall help:: $(OBJ_DIR)/Makefile.build
$(VERBOSE)$(MAKE) -C $(OBJ_DIR) O=$(OBJ_BASE) -f Makefile.build $@
$(OBJ_DIR)/Makefile.build: $(SRC_DIR)/Makefile
$(VERBOSE)install -d $(dir $@)
$(VERBOSE)echo 'IN_OBJ_DIR=1' > $@
$(VERBOSE)echo 'L4DIR=$(L4DIR_ABS)' >> $@
$(VERBOSE)echo 'SRC_DIR=$(SRC_DIR)' >> $@
$(VERBOSE)echo 'OBJ_BASE=$(OBJ_BASE)' >> $@
$(VERBOSE)echo 'PKGDIR_ABS=$(PKGDIR_ABS)' >> $@
$(VERBOSE)echo 'vpath %.fig $(SRC_DIR)' >> $@
$(VERBOSE)echo 'vpath %.tex $(SRC_DIR)' >> $@
$(VERBOSE)echo 'include $(SRC_DIR)/Makefile' >> $@
else
###################################################################
#
# We are in the build directory and can process the documentation
#
###################################################################
# default is to install all targets
INSTALL_TARGET_MASK ?= %
ifneq ($(TARGET),)
# if no SRC_DOX is given, but TARGET, extract it from TARGET
ifeq ($(origin SRC_DOX),undefined)
SRC_DOX := $(filter $(addsuffix .cfg, $(TARGET)),$(wildcard *.cfg))
ifneq ($(SRC_DOX),)
$(error SRC_DOX is undefined, but TARGET is defined. This is invalid since 04/23/2003)
endif
endif
# the same for SRC_TEX
ifeq ($(origin SRC_TEX),undefined)
SRC_TEX := $(filter $(TARGET:.ps=.tex),$(wildcard *.tex)) \
$(filter $(TARGET:.pdf=.tex),$(wildcard *.tex))
$(filter $(TARGET:.dvi=.tex),$(wildcard *.tex))
ifneq ($(SRC_TEX),)
$(error SRC_TEX is undefined, but TARGET is defined. This is invalid since 04/23/2003)
endif
endif
endif
TARGET_DOX = $(SRC_DOX:.cfg=) $(SRC_DOX_REF:.cfg=) \
$(SRC_DOX_GUIDE:.cfg=) $(SRC_DOX_INT:.cfg=)
INSTALL_TARGET_DOX ?= $(filter $(INSTALL_TARGET_MASK), $(TARGET_DOX))
TARGET_TEX ?= $(SRC_TEX:.tex=.ps) $(SRC_TEX:.tex=.pdf)
DEPS += $(foreach x,$(SRC_TEX:.tex=.dvi),$(dir $x).$(notdir $x).d)
# if no TARGET is given, generate it from all types of targets
TARGET ?= $(TARGET_DOX) $(TARGET_TEX)
DEPS += $(foreach file,$(TARGET),$(dir $(file)).$(notdir $(file)).d)
all:: $(TARGET)
$(TARGET): $(OBJ_DIR)/.general.d
####################################################################
#
# Doxygen specific
#
####################################################################
DOXY_FLAGS += $(DOXY_FLAGS_$@)
OUTPUTDIR = $(shell perl -n -e '/^\s*OUTPUT_DIRECTORY\s*=\s*(\S+)/ && print "$$1\n"' $(1))
# we refer to %/html sometimes. However, make fails on a rule of the form
# "% %/html:%.cfg", thus the workaround (others than static-pattern-rules
# won't work)
$(addprefix $(OBJ_DIR)/,$(addsuffix /html,$(TARGET_DOX))):$(OBJ_DIR)/%/html:$(TARGET_DOX)
# all our packages
ifeq ($(ALL_SUBDIRS),)
ALL_SUBDIRS := $(shell find -L $(L4DIR)/pkg -maxdepth 4 -type d ! -name .svn -exec test -f {}/Control \; -printf %P' ' -prune)
endif
# We can give an internal rule for doxygen, as the directory specified
# in the config-file should be the name of the config file with the
# .cfg removed.
# $(VERBOSE)$(ECHO) ENABLED_SECTIONS=WORKING_SUBPAGES >> $@.flags
FORCE: ;
$(OBJ_DIR)/% $(OBJ_DIR)/%/html:$(SRC_DIR)/%.cfg $(SRC_DIR)/search.js.reduce_keyTimeoutLength.patch FORCE
#generate the flags-file
$(VERBOSE)$(MKDIR) $@
$(VERBOSE)$(ECHO) '@INCLUDE_PATH=/' > $@.flags
$(VERBOSE)$(ECHO) '@INCLUDE=$(SRC_DIR)/$(notdir $<)' >> $@.flags
$(VERBOSE)$(ECHO) 'INCLUDE_PATH += $(OBJ_BASE)/include' >> $@.flags
$(VERBOSE)$(ECHO) $(DOXY_FLAGS) >> $@.flags
$(VERBOSE)$(ECHO) OUTPUT_DIRECTORY=$(OBJ_DIR)/$(call OUTPUTDIR,$<) >> $@.flags
$(VERBOSE)if [ "$(DOC_VARIANT)" = "fast" ]; then $(ECHO) HAVE_DOT=NO; $(ECHO) GENERATE_LATEX=NO; fi >> $@.flags
$(VERBOSE)if [ "$(DOC_VARIANT)" = "full" ]; then $(ECHO) HAVE_DOT=YES; $(ECHO) GENERATE_LATEX=YES; fi >> $@.flags
$(VERBOSE)if [ "$(DOC_VARIANT)" = "release" ]; then \
$(ECHO) HAVE_DOT=YES; \
$(ECHO) GENERATE_LATEX=YES; \
$(ECHO) SHOW_FILES=YES; \
$(ECHO) INTERNAL_DOCS=NO; \
$(ECHO) GENERATE_TODOLIST=NO; \
$(ECHO) GENERATE_TESTLIST=NO; \
$(ECHO) GENERATE_BUGLIST=NO; \
$(ECHO) HIDE_UNDOC_CLASSES=YES; \
$(ECHO) HIDE_UNDOC_MEMBERS=YES; \
fi >> $@.flags
$(VERBOSE)cd $(L4DIR)/pkg && \
for f in $(ALL_SUBDIRS); \
do [ ! -e $(L4DIR)/pkg/$$f/doc/files.cfg ] || sed -e "s,%PKGDIR%,$(L4DIR)/pkg/$$f,g" $(L4DIR)/pkg/$$f/doc/files.cfg || true; echo; done >> $@.flags
$(VERBOSE)cd $(OBJ_BASE)/include && L4DIR=$(L4DIR) $(DOXYGEN) $@.flags
$(VERBOSE)patch --forward --unified \
$(OBJ_DIR)/$(call OUTPUTDIR,$<)/html/search/search.js \
$(SRC_DIR)/search.js.reduce_keyTimeoutLength.patch \
|| true
$(VERBOSE)for file in $(ADD_FILES_TO_HTML); do cp $$file $@/html; done
$(VERBOSE)( [ -r $@/latex/Makefile ] && \
echo | $(MAKE) -C $@/latex ) || true
$(VERBOSE)if [ -d $@ ] ; then touch $@ ; fi
# Installation rules follow
#
# define LOCAL_INSTALLDIR prior to including install.inc, where the install-
# rules are defined. Same for INSTALLDIR.
INSTALLDIR_HTML ?= $(DROPS_STDDIR)/doc/html
INSTALLFILE_HTML ?= $(CP) -pR $(1) $(2)
INSTALLDIR_HTML_LOCAL ?= $(OBJ_BASE)/doc/html
INSTALLFILE_HTML_LOCAL ?= $(if $(call is_dir,$(2)), \
find '$(dir $(1))' -name '$(notdir $(1))' | xargs $(LN) -t $(2) -sf, \
find '$(dir $(1))' -name '$(notdir $(1))' | xargs -I '{}' $(LN) -sf '{}' $(2))
INSTALLDIR = $(INSTALLDIR_HTML)
INSTALLFILE = $(INSTALLFILE_HTML)
INSTALLDIR_LOCAL = $(INSTALLDIR_HTML_LOCAL)
INSTALLFILE_LOCAL = $(INSTALLFILE_HTML_LOCAL)
all:: $(TARGET) \
$(addprefix $(INSTALLDIR_LOCAL)/, $(addsuffix .title, $(INSTALL_TARGET_DOX)))
$(OBJ_DIR)/$(SRC_DOX_REF:.cfg=.title): BID_DOC_DOXTYPE=ref
$(OBJ_DIR)/$(SRC_DOX_GUIDE:.cfg=.title): BID_DOC_DOXTYPE=guide
$(OBJ_DIR)/$(SRC_DOX_INT:.cfg=.title): BID_DOC_DOXTYPE=int
# first line: type
# second line: title that will appear at the generated index page
$(OBJ_DIR)/%.title:$(SRC_DIR)/%.cfg $(OBJ_DIR)/.general.d
$(VERBOSE)$(ECHO) $(BID_DOC_DOXTYPE)>$@
$(VERBOSE)MAKEFLAGS= $(MAKE) -s -f $(L4DIR)/mk/makehelpers.inc -f $< \
BID_print VAR=PROJECT_NAME >>$@
# Install the title file locally
# The installed title file depends on the installed doku for message reasons
$(foreach f,$(INSTALL_TARGET_DOX),$(INSTALLDIR_LOCAL)/$(f).title):$(INSTALLDIR_LOCAL)/%.title:$(OBJ_DIR)/%.title $(INSTALLDIR_LOCAL)/%
$(VERBOSE)$(call INSTALLFILE_LOCAL,$<,$@)
# Install the docu locally, the title file will depend on
$(foreach f,$(INSTALL_TARGET_DOX),$(INSTALLDIR_LOCAL)/$(f)):$(INSTALLDIR_LOCAL)/%:$(OBJ_DIR)/% $(OBJ_DIR)/%/html
@$(INSTALL_DOC_LOCAL_MESSAGE)
$(VERBOSE)$(INSTALL) -d $@
$(VERBOSE)$(call INSTALLFILE_LOCAL,$</html/*,$@)
# Install the title file globally
# The installed title file depends on the installed doku for message reasons
$(foreach f,$(INSTALL_TARGET_DOX),$(INSTALLDIR)/$(f).title):$(INSTALLDIR)/%.title:$(OBJ_DIR)/%.title $(INSTALLDIR)/%
$(VERBOSE)$(call INSTALLFILE,$<,$@)
# Install the docu globally, the title file will depend on
$(foreach f,$(INSTALL_TARGET_DOX),$(INSTALLDIR)/$(f)):$(INSTALLDIR)/%:$(OBJ_DIR)/% $(OBJ_DIR)/%/html
@$(INSTALL_DOC_MESSAGE)
$(if $(INSTALLFILE),$(VERBOSE)$(INSTALL) -d $@)
$(VERBOSE)$(call INSTALLFILE,$</html/*,$@)
install:: $(addprefix $(INSTALLDIR)/,$(addsuffix .title,$(INSTALL_TARGET_DOX)))
.PHONY: $(addprefix $(INSTALLDIR)/,$(INSTALL_TARGET_DOX) \
$(addsuffix .title,$(INSTALL_TARGET_DOX)))
#################################################################
#
# Latex specific
#
#################################################################
FIG2EPS_PROG ?= fig2dev -L eps
FIG2PDF_PROG ?= fig2dev -L pdf
FIG2PNG_PROG ?= fig2dev -L png
$(SRC_TEX:.tex=.dvi) $(TARGET): $(SRC_FIG:.fig=.pdf) $(SRC_FIG:.fig=.png) $(SRC_FIG:.fig=.eps)
%.eps: %.fig $(OBJ_DIR)/.general.d
@$(GEN_MESSAGE)
$(VERBOSE)$(FIG2EPS_PROG) $< $@
%.pdf: %.fig $(OBJ_DIR)/.general.d
@$(GEN_MESSAGE)
$(VERBOSE)$(FIG2PDF_PROG) $< $@
%.png: %.fig $(OBJ_DIR)/.general.d
@$(GEN_MESSAGE)
$(VERBOSE)$(FIG2PNG_PROG) $< $@
%.ps: %.dvi $(OBJ_DIR)/.general.d
@$(GEN_MESSAGE)
$(VERBOSE)$(call MAKEDEP,dvips) dvips -o $@ $<
$(VERBOSE)$(VIEWERREFRESH_PS)
%.pdf: %.tex $(OBJ_DIR)/.general.d
@$(GEN_MESSAGE)
$(VERBOSE)$(PDFLATEX) $< || \
(($(GREP) 'TeX capacity exceeded' $*.log && \
echo -e "\n\033[31mIncrease pool_size to 200000 in" \
"/etc/texmf/texmf.cnf!\033[m\n" && false) || false)
$(VERBOSE)$(GREP) '\citation' $*.aux && \
bibtex $* || true
$(VERBOSE)(export size=1; touch $@; \
until [ $$size -eq `ls -o $@ | awk '{print $$4}'` ]; do\
export size=`ls -o $@ | awk '{print $$4}'` ;\
$(PDFLATEX) $< ;\
done)
# one more time, just to be sure ...
$(VERBOSE)$(PDFLATEX) $<
%.dvi: %.tex $(OBJ_DIR)/.general.d
@$(GEN_MESSAGE)
$(VERBOSE)$(call MAKEDEP,$(LATEX)) $(LATEX) $<
$(VERBOSE)if grep -q '\indexentry' $*.idx; then makeindex $*; fi
$(VERBOSE)if grep -q '\citation' $*.aux; then bibtex $*; fi
# Do we really need to call latex unconditionally again? Isn't it
# sufficient to check the logfile for the "rerun" text?
$(VERBOSE)$(LATEX) $<
$(VERBOSE)latex_count=5 ; \
while egrep -s 'Rerun (LaTeX|to get cross-references right)' $*.log &&\
[ $$latex_count -gt 0 ] ; do \
$(LATEX) $< \
let latex_count=$$latex_count-1 ;\
done
$(VERBOSE)$(VIEWERREFRESH_DVI)
SHOWTEX ?= $(firstword $(SRC_TEX))
SHOWDVI ?= $(SHOWTEX:.tex=.dvi)
SHOWPS ?= $(SHOWTEX:.tex=.ps)
SHOWPDF ?= $(SHOWTEX:.tex=.pdf)
VIEWER_DVI ?= xdvi
VIEWER_PS ?= gv
VIEWER_PDF ?= xpdf
VIEWERREFRESH_DVI ?= killall -USR1 xdvi xdvi.bin xdvi.real || true
VIEWERREFRESH_PS ?= killall -HUP $(VIEWER_PS) || true
dvi: $(SHOWDVI)
show showdvi: dvi
$(VERBOSE)$(VIEWER_DVI) $(SHOWDVI) &
ps: $(SHOWPS)
showps: ps
$(VERBOSE)$(VIEWER_PS) $(SHOWPS) &
pdf: $(SHOWPDF)
showpdf: pdf
$(VERBOSE)$(VIEWER_PDF) $(SHOWPDF) &
clean::
$(VERBOSE)$(RM) $(addprefix $(OBJ_DIR)/, \
$(addsuffix .title,$(TARGET_DOX)))
$(VERBOSE)$(RM) $(addprefix $(OBJ_DIR)/, \
$(addsuffix .flags,$(TARGET_DOX)))
$(VERBOSE)$(RM) $(wildcard $(addprefix $(OBJ_DIR)/, $(foreach ext, \
aux bbl blg dvi idx ilg ind log lod ltf toc out, \
$(SRC_TEX:.tex=.$(ext))) texput.log ))
cleanall:: clean
$(VERBOSE)$(RM) -r $(wildcard $(addprefix $(OBJ_DIR)/, \
$(TARGET)) $(wildcard .*.d))
$(VERBOSE)$(RM) $(wildcard $(addprefix $(OBJ_DIR)/, \
$(SRC_TEX:.tex=.ps) $(SRC_TEX:.tex=.pdf)))
$(VERBOSE)$(RM) $(wildcard $(addprefix $(OBJ_DIR)/, \
$(SRC_FIG:.fig=.eps) $(SRC_FIG:.fig=.pdf) $(SRC_FIG:.fig=.png)))
$(VERBOSE)$(RM) $(wildcard $(addprefix $(OBJ_DIR)/, \
Makefile Makefile.build))
.PHONY: all clean cleanall config help install oldconfig txtconfig
.PHONY: ps pdf dvi showps showpdf showdvi show
help::
@echo "Specify a target:"
@echo "all - generate documentation and install locally"
ifneq (,$(INSTALL_TARGET_DOX))
@echo "install - generate documentation and install globally"
endif
@echo "dvi - compile the primary TeX file into dvi"
@echo "showdvi - invoke the dvi viewer on the primary TeX file"
@echo "ps - compile the primary TeX file into ps"
@echo "showps - invoke the ps viewer on the primary TeX file"
@echo "pdf - compile the primary TeX file into pdf"
@echo "showpdf - invoke the pdf viewer on the primary TeX file"
@echo "clean - delete generated intermediate files"
@echo "cleanall - delete all generated files"
@echo "help - this help"
@echo
ifneq (,$(SRC_TEX))
@echo "Primary TeX file: $(SHOWTEX)"
@echo "Other documentation to be built: $(filter-out $(SHOWPDF) $(SHOWPS) $(SHOWDVI),$(TARGET))"
else
ifneq (,$(TARGET_DOX))
@echo "Primary Doxygen file: $(addsuffix .cfg, $(TARGET_DOX))"
endif
@echo "Documentation to be built: $(TARGET)"
endif
-include $(DEPSVAR)
endif # IN_OBJ_DIR
endif # _L4DIR_MK_DOC_MK undefined

192
src/l4/mk/export_defs.inc Normal file
View File

@@ -0,0 +1,192 @@
# Makefile snippet to generate l4defs.inc file
# vim:set ft=make:
#
# L4Re Buildsystem
#
PKGDIR = .
SYSTEMS = $(BUILD_ARCH)-$(BUILD_ABI)
OBJ_DIR = $(SRC_DIR)/build
# the target file
L4DEF_FILE_MK ?= l4defs.mk.inc
L4DEF_FILE_SH ?= l4defs.sh.inc
L4DEF_FILE_PL ?= l4defs.pl.inc
do_output_all = echo '$(1) = $($(1))' >> $(L4DEF_FILE_MK); echo '$(1)="$($(1))"' >> $(L4DEF_FILE_SH); echo ' "$(1)" => "$($(1))",' >> $(L4DEF_FILE_PL);
do_output_mk = echo '$(1) = $($(1))' >> $(L4DEF_FILE_MK);
ifeq ($(CALLED_FOR),static)
MODE = static
ifneq ($(SYSTEM),)
L4_SYSTEM = $(ARCH)_$(CPU)
L4_CC = $(CC)
L4_CXX = $(CXX)
L4_LD = $(LD)
L4_LDFLAGS_LD_STATIC = $(filter-out -l%,$(LDFLAGS))
L4_LDFLAGS_GCC_STATIC = $(filter-out -l%,$(call ldflags_to_gcc,$(LDFLAGS)))
L4_LDFLAGS_DYNAMIC_LINKER_LD = $(LDFLAGS_DYNAMIC_LINKER)
L4_LDFLAGS_DYNAMIC_LINKER_GCC= $(LDFLAGS_DYNAMIC_LINKER_GCC)
L4_LIBDIRS = $(addprefix -L,$(L4LIBDIR))
L4_CPPFLAGS = $(CPPFLAGS)
L4_CFLAGS = $(CFLAGS)
L4_CXXFLAGS = $(CXXFLAGS)
L4_GCCSYSLIBDIRS = $(GCCSYSLIBDIRS)
L4_LDS_stat_bin = $(LDS_stat_bin)
L4_BID_STACK_ADDR = $(L4_STACK_ADDR)
L4_BID_STACK_SIZE = $(L4_STACK_SIZE)
L4_BID_KIP_ADDR = $(L4_KIP_ADDR)
L4_BID_KIP_OFFS_SYS_INVOKE = $(L4_KIP_OFFS_SYS_INVOKE)
L4_BID_KIP_OFFS_SYS_DEBUGGER = $(L4_KIP_OFFS_SYS_DEBUGGER)
L4_BID_PKG_CONFIG_CALL = $(value BID_PKG_CONFIG)
L4_BID_PKG_CONFIG_FAILED = $(value BID_PKG_CONFIG_FAILED)
L4_VARIANT = $(VARIANT)
L4_BID_BENDER_LINK = $(value BID_BENDER_LINK)
L4_BID_BENDER_DEFINES = $(value BID_BENDER_DEFINES)
all::
@echo -e $(EMPHSTART)"Creating $(L4DEF_FILE_MK)"$(EMPHSTOP)
@echo "# Definitions for 'make' from L4 BID" > $(L4DEF_FILE_MK)
@echo "# vim:se ft=make:" >> $(L4DEF_FILE_MK)
@echo "# --- Automatically created, do not modify ---" >> $(L4DEF_FILE_MK)
@:
@echo -e $(EMPHSTART)"Creating $(L4DEF_FILE_SH)"$(EMPHSTOP)
@echo "# Definitions for 'sh' from L4 BID" > $(L4DEF_FILE_SH)
@echo "# vim:se ft=sh:" >> $(L4DEF_FILE_SH)
@echo "# --- Automatically created, do not modify ---" >> $(L4DEF_FILE_SH)
@echo "" >> $(L4DEF_FILE_SH)
@echo "l4_bid_call_pkgconfig()" >> $(L4DEF_FILE_SH)
@echo "{" >> $(L4DEF_FILE_SH)
@echo " obj_base=\$$1; shift; " >> $(L4DEF_FILE_SH)
@echo " PKG_CONFIG_LIBDIR=\$$obj_base/pc PKG_CONFIG_PATH= \\" >> $(L4DEF_FILE_SH)
@echo " \$$L4_BID_PKG_CONFIG \\" >> $(L4DEF_FILE_SH)
@echo " --define-variable=incdir=\$$obj_base/include/contrib \\" >> $(L4DEF_FILE_SH)
@echo " \"\$$@\"" >> $(L4DEF_FILE_SH)
@echo "}" >> $(L4DEF_FILE_SH)
@echo "" >> $(L4DEF_FILE_SH)
@:
@echo -e $(EMPHSTART)"Creating $(L4DEF_FILE_PL)"$(EMPHSTOP)
@echo "# Definitions for 'perl' from L4 BID" > $(L4DEF_FILE_PL)
@echo "# vim:se ft=pl:" >> $(L4DEF_FILE_PL)
@echo "# --- Automatically created, do not modify ---" >> $(L4DEF_FILE_PL)
@echo "{" >> $(L4DEF_FILE_PL)
@$(call do_output_all,L4_SYSTEM)
@$(call do_output_all,L4_CC)
@$(call do_output_all,L4_CXX)
@$(call do_output_all,L4_LD)
@$(call do_output_all,L4_LDFLAGS_LD_STATIC)
@$(call do_output_all,L4_LDFLAGS_GCC_STATIC)
@$(call do_output_all,L4_LDFLAGS_DYNAMIC_LINKER_LD)
@$(call do_output_all,L4_LDFLAGS_DYNAMIC_LINKER_GCC)
@$(call do_output_all,L4_LIBDIRS_R)
@$(call do_output_all,L4_LIBDIRS)
@$(call do_output_all,L4_GCCSYSLIBDIRS)
@$(call do_output_all,L4_CPPFLAGS)
@$(call do_output_all,L4_CFLAGS)
@$(call do_output_all,L4_CXXFLAGS)
@$(call do_output_all,L4_LDS_stat_bin)
@$(call do_output_all,L4_BID_STACK_ADDR)
@$(call do_output_all,L4_BID_KIP_ADDR)
@$(call do_output_all,L4_BID_KIP_OFFS_SYS_INVOKE)
@$(call do_output_all,L4_BID_KIP_OFFS_SYS_DEBUGGER)
@$(call do_output_all,L4_BID_PKG_CONFIG)
@$(call do_output_all,L4_VARIANT)
@$(call do_output_mk,L4_BID_PKG_CONFIG_CALL)
@$(call do_output_mk,L4_BID_PKG_CONFIG_FAILED)
@$(call do_output_mk,L4_BID_BENDER_LINK)
@$(call do_output_mk,L4_BID_BENDER_DEFINES)
@$(foreach v,LIBCINCDIR REQUIRES_LIBS LDSCRIPT LDFLAGS, \
$(call do_output_all,$(v)_all_static) $(call do_output_all,$(v)_all_shared))
else
all::
endif
include $(L4DIR)/mk/prog.mk
endif # called for static
# ----------------------------------------------------
ifeq ($(CALLED_FOR),minimal)
MODE = sigma0
ifneq ($(SYSTEM),)
REQUIRES_LIBS = libc_minimal
L4_CPPFLAGS_MINIMAL = $(CPPFLAGS)
L4_CFLAGS_MINIMAL = $(CFLAGS)
L4_CXXFLAGS_MINIMAL = $(CXXFLAGS)
all::
@$(call do_output_all,L4_CPPFLAGS_MINIMAL)
@$(call do_output_all,L4_CFLAGS_MINIMAL)
@$(call do_output_all,L4_CXXFLAGS_MINIMAL)
else
all::
endif
include $(L4DIR)/mk/prog.mk
endif # called for minimal
# ----------------------------------------------------
ifeq ($(CALLED_FOR),shared)
MODE = shared
ifneq ($(SYSTEM),)
L4_LDFLAGS_LD_SHARED = $(filter-out -l%,$(LDFLAGS))
L4_LDFLAGS_GCC_SHARED = $(filter-out -l%,$(call ldflags_to_gcc,$(LDFLAGS)))
L4_LDS_so = $(LDS_so)
L4_LDS_dyn_bin = $(LDS_dyn_bin)
all::
@$(call do_output_all,L4_LDFLAGS_LD_SHARED)
@$(call do_output_all,L4_LDFLAGS_GCC_SHARED)
@$(call do_output_all,L4_LDS_so)
@$(call do_output_all,L4_LDS_dyn_bin)
else
all::
endif
include $(L4DIR)/mk/prog.mk
endif # called for shared
# ----------------------------------------------------
ifeq ($(CALLED_FOR),sharedlib)
ifneq ($(SYSTEM),)
NOTARGETSTOINSTALL = y
endif
all::
include $(L4DIR)/mk/lib.mk
endif # called for sharedlib
# Used to add any trailing lines required.
ifeq ($(CALLED_FOR),finalize)
ifneq ($(SYSTEM),)
all::
@echo "}" >> $(L4DEF_FILE_PL)
else
all::
endif
include $(L4DIR)/mk/prog.mk
endif # called for finalize

101
src/l4/mk/include.mk Normal file
View File

@@ -0,0 +1,101 @@
# -*- Makefile -*-
#
# L4Re Buildsystem
#
# Makefile-Template for include directories
#
# supported targets:
#
# all - the default, link the includes into the
# local include dir
# install - install the includes into the global
# include dir
# config - do nothing, may be overwritten
INSTALLDIR_INC ?= $(DROPS_STDDIR)/include
INSTALLDIR_INC_LOCAL ?= $(OBJ_BASE)/include
INSTALLDIR = $(INSTALLDIR_INC)
INSTALLDIR_LOCAL = $(INSTALLDIR_INC_LOCAL)
ifeq ($(origin TARGET),undefined)
# use POSIX -print here
TARGET_CMD = (cd $(INCSRC_DIR) \
&& find . -name '*.[ih]' -print \
$(if $(EXTRA_TARGET),&& echo '$(EXTRA_TARGET)'))
else
TARGET_CMD = echo $(TARGET)
endif
ifeq ($(CONTRIB_HEADERS),)
INSTALL_INC_PREFIX ?= l4/$(PKGNAME)
else
INSTALL_INC_PREFIX ?= contrib/$(PKGNAME)
endif
INCSRC_DIR ?= $(SRC_DIR)
include $(L4DIR)/mk/Makeconf
$(GENERAL_D_LOC): $(L4DIR)/mk/include.mk
-include $(DEPSVAR)
do_link = my $$rl = readlink($$dst); \
if (!defined $$rl || $$rl ne $$src) { \
if ($$notify == 1) { \
$$notify=0; $(if $(VERBOSE),print " ... Updating symlinks\n";,)\
} \
system("ln","-sf$(if $(VERBOSE),,v)",$$src,$$dst) && exit 1; \
}
do_inst = system("install","-$(if $(VERBOSE),,v)m","644",$$src,$$dst) && exit 1;
installscript = perl -W -e ' \
chomp($$srcdir="$(INCSRC_DIR)"); \
$$notify=1; \
while(<>) { \
foreach (split) { \
s|^\./||; \
my ($$src, $$srcorig) = $$_ =~ m/^(.*?)<(.*)/g; \
$$srcorig = $$src = $$_ if not defined $$srcorig; \
s|<.*$$||; \
if(s|^ARCH-([^/]*)/L4API-([^/]*)/([^ ]*)$$|$$1/$$2/$(INSTALL_INC_PREFIX)/$$3| ||\
s|^ARCH-([^/]*)/([^ ]*)$$|$$1/$(INSTALL_INC_PREFIX)/$$2| || \
s|^L4API-([^/]*)/([^ ]*)$$|$$1/$(INSTALL_INC_PREFIX)/$$2| || \
s|^(/.*/)?(\S*)$$|$(INSTALL_INC_PREFIX)/$$2|) { \
$$src="$$srcdir/$$srcorig" if $$srcorig !~ /^\//; \
$$dstdir=$$dst="$(if $(1),$(INSTALLDIR_LOCAL),$(INSTALLDIR))/$$_";\
$$dstdir=~s|/[^/]*$$||; \
-d $$dstdir || system("install","-$(if $(VERBOSE),,v)d",$$dstdir) && exit 1; \
$(if $(1),$(do_link),$(do_inst)) \
if (! -e $$dst) \
{ print "Error: $$dst could not be installed.\n"; exit 1; } \
} \
} \
}'
PC_FILENAMES ?= $(PC_FILENAME)
PC_FILES := $(foreach pcfile,$(PC_FILENAMES),$(OBJ_BASE)/pc/$(pcfile).pc)
$(OBJ_BASE)/pc/%.pc: $(GENERAL_D_LOC)
$(VERBOSE)$(call generate_pcfile,$*,$@,$(PKGNAME),,$(call get_cont,REQUIRES_LIBS,$*))
headers::
all:: headers $(PC_FILES)
@$(TARGET_CMD) | $(call installscript,1)
@# Remove stale links - use rm -f for concurrent execution
$(VERBOSE)find $(INSTALLDIR_LOCAL) -xtype l | xargs $(RM)
install::
@$(INSTALL_LINK_MESSAGE)
@$(TARGET_CMD) | $(call installscript);
cleanall::
$(VERBOSE)$(RM) .general.d
help::
@echo " all - install files to $(INSTALLDIR_LOCAL)"
@echo " install - install files to $(INSTALLDIR)"
@echo " scrub - delete backup and temporary files"
@echo " clean - same as scrub"
@echo " cleanall - same as scrub"
@echo " help - this help"
scrub clean cleanall::
$(VERBOSE)$(SCRUB)

76
src/l4/mk/install.inc Normal file
View File

@@ -0,0 +1,76 @@
# -*- Makefile -*-
# vim:set ft=make:
#
# L4Re Buildsystem
#
# Makefile-Include for install-rules
#
# INSTALL_TARGET and INSTALL_TARGET_$(ARCH) contain the targets to be
# installed. If they are both empty, and NOTARGETSTOINSTALL is not set,
# they are set to TARGET and TARGET_$(ARCH).
#
# INSTALLDIR and INSTALLDIR_LOCAL is the dir the files will be installed
# in and must be set prior to including this file. INSTALLDIR is used by the
# target "install" and "INSTALLDIR_LOCAL" by the target "all".
#
# The target "all" is made depending on the installed files in
# INSTALLDIR_LOCAL. "install" on the files in INSTALLDIR. Another
# difference is that "all" results in using the variable
# $(INSTALLFILE_LOCAL) to install the files and "install" in using
# $(INSTALLFILE). This allows the difference between linking and actually
# copying (with stripping for bins).
ifndef INSTALL_TARGET_$(OSYSTEM)
ifndef NOTARGETSTOINSTALL
INSTALL_TARGET?=$(TARGET)
endif
endif
INSTALL_TARGET += $(INSTALL_TARGET_$(OSYSTEM))
target_dir_local=$(or $(INSTALLDIR_LOCAL_$1),$(INSTALLDIR_LOCAL))
target_dir=$(or $(INSTALLDIR_$1),$(INSTALLDIR))
all:: $(foreach t,$(INSTALL_TARGET),$(call target_dir_local,$t)/$(t))
all:: $(EXTRA_INSTALL_GOALS)
install:: $(foreach t,$(INSTALL_TARGET),$(call target_dir,$t)/$(t))
install:: $(EXTRA_INSTALL_GOALS)
# with prog.mk, we copy
ifeq ($(ROLE),prog.mk)
$(foreach f,$(INSTALL_TARGET),$(INSTALLDIR_LOCAL)/$(f)):$(INSTALLDIR_LOCAL)/%:%
@$(INSTALL_LOCAL_MESSAGE)
$(VERBOSE)$(if $(INSTALLFILE_LOCAL),$(MKDIR) $(dir $@))
$(VERBOSE)$(call INSTALLFILE_LOCAL,$<,$@)
else
# with others, we symlink
# we check for each locally installed lib if either the symlink is correct or
# if we really need to update the target by executing INSTALLFILE_LOCAL.
.PHONY: $(foreach t,$(INSTALL_TARGET),$(call target_dir_local,$t)/$t)
define local_install_rule
$(call target_dir_local,$(1))/$(1):$(1)
@$(if $(INSTALLFILE_LOCAL), \
if [ ! $$< -ef $$@ -a $$< -nt $$@ ]; then \
$(if $(INSTALL_LOCAL_MESSAGE),$(INSTALL_LOCAL_MESSAGE);) \
$(INSTALL) -d $$(dir $$@); \
$$(call INSTALLFILE_LOCAL,$$<,$$@); \
fi)
endef
$(foreach t,$(INSTALL_TARGET),$(eval $(call local_install_rule,$(t))))
endif
define install_rule
$(call target_dir,$(1))/$(1):$(1)
@$(INSTALL_MESSAGE)
$(VERBOSE)$(if $(INSTALLFILE),$(MKDIR) $$(dir $$@))
$(VERBOSE)$$(call INSTALLFILE,$$<,$$@)
endef
$(foreach t,$(INSTALL_TARGET),$(eval $(call install_rule,$(t))))
# unconditionally install on "make install"
.PHONY: $(foreach t,$(INSTALL_TARGET),$(call target_dir,$t)/$(t))
.general.d: $(L4DIR)/mk/install.inc

234
src/l4/mk/lib.mk Normal file
View File

@@ -0,0 +1,234 @@
# -*- Makefile -*-
#
# L4Re Buildsystem
#
# Makefile-Template for library directories
#
# install.inc is used, see there for further documentation
# binary.inc is used, see there for further documentation
ifeq ($(origin _L4DIR_MK_LIB_MK),undefined)
_L4DIR_MK_LIB_MK=y
ROLE = lib.mk
include $(L4DIR)/mk/Makeconf
ifeq ($(CONFIG_MMU),)
TARGET := $(filter-out %.so,$(TARGET))
endif
# define INSTALLDIRs prior to including install.inc, where the install-
# rules are defined. Same for INSTALLDIR.
ifeq ($(MODE),host)
INSTALLDIR_LIB ?= $(DROPS_STDDIR)/lib/host
INSTALLDIR_LIB_LOCAL ?= $(OBJ_BASE)/lib/host
else
INSTALLDIR_LIB ?= $(DROPS_STDDIR)/lib/$(subst -,/,$(SYSTEM))
INSTALLDIR_LIB_LOCAL ?= $(OBJ_BASE)/lib/$(subst -,/,$(SYSTEM))
endif
SOVERSION_MAJOR=$(firstword $(subst ., ,$(SOVERSION)))
SOVERSION_FULL=$(firstword $(SOVERSION))
solink=$(if $(SOVERSION_FULL), \
&& mv $1 $1.$(SOVERSION_FULL) \
&& $(LN) -rsf $1.$(SOVERSION_FULL) $1 \
$(if $(filter-out $(SOVERSION_MAJOR),$(SOVERSION_FULL)),\
&& $(LN) -rsf $1.$(SOVERSION_FULL) $1.$(SOVERSION_MAJOR)))
do_strip=$(and $(CONFIG_BID_STRIP_BINARIES),$(filter %.so,$(1)))
INSTALLFILE_LIB ?= $(if $(call do_strip,$(1)), \
$(call copy_stripped_binary,$(1),$(2),644), \
$(INSTALL) -m 644 $(1) $(2))$(call solink,$2)
INSTALLFILE_LIB_LOCAL ?= $(if $(call do_strip,$(1)), \
$(call copy_stripped_binary,$(1),$(2),644), \
$(LN) -sf $(abspath $(1)) $(2))$(call solink,$2)
INSTALLFILE = $(INSTALLFILE_LIB)
INSTALLDIR = $(INSTALLDIR_LIB)
INSTALLFILE_LOCAL = $(INSTALLFILE_LIB_LOCAL)
INSTALLDIR_LOCAL = $(INSTALLDIR_LIB_LOCAL)
# our mode
MODE ?= lib
# sanity check for proper mode
ifneq ($(filter-out lib host,$(MODE)),)
$(error MODE=$(MODE) not possible when building libraries)
endif
# all libraries are built using the wraped utcb-getter
CPPFLAGS += -DL4SYS_USE_UTCB_WRAP=1
# include all Makeconf.locals, define common rules/variables
include $(L4DIR)/mk/binary.inc
$(GENERAL_D_LOC): $(L4DIR)/mk/lib.mk
ifneq ($(SYSTEM),) # if we are a system, really build
TARGET_LIB := $(TARGET) $(TARGET_$(OSYSTEM))
TARGET_SHARED := $(filter %.so,$(TARGET_LIB))
TARGET_PIC := $(filter %.p.a,$(TARGET_LIB))
TARGET_STANDARD := $(filter-out $(TARGET_SHARED) $(TARGET_PIC), $(TARGET_LIB))
$(call GENERATE_PER_TARGET_RULES,$(TARGET_STANDARD))
$(call GENERATE_PER_TARGET_RULES,$(TARGET_PIC) $(TARGET_SHARED),.s)
TARGET_PROFILE := $(patsubst %.a,%.pr.a,\
$(filter $(BUILD_PROFILE),$(TARGET_STANDARD)))
TARGET_PROFILE_SHARED := $(filter %.so,$(TARGET_PROFILE))
TARGET_PROFILE_PIC := $(patsubst %.a,%.p.a,\
$(filter $(BUILD_PIC),$(TARGET_PROFILE)))
$(call GENERATE_PER_TARGET_RULES,$(TARGET_PROFILE),.pr)
$(call GENERATE_PER_TARGET_RULES,$(TARGET_PROFILE_PIC) $(TARGET_PROFILE_SHARED),.pr)
TARGET += $(TARGET_$(OSYSTEM))
TARGET += $(TARGET_PROFILE) $(TARGET_PROFILE_SHARED) $(TARGET_PROFILE_PIC)
# define some variables different for lib.mk and prog.mk
LDFLAGS += $(addprefix -L, $(PRIVATE_LIBDIR) $(PRIVATE_LIBDIR_$(OSYSTEM)) $(PRIVATE_LIBDIR_$@) $(PRIVATE_LIBDIR_$@_$(OSYSTEM)))
LDFLAGS += $(addprefix -L, $(L4LIBDIR))
LDFLAGS += $(LIBCLIBDIR)
LDFLAGS_SO += -shared $(call BID_mode_var,LDFLAGS_SO)
SOVERSION += $(call bid_flag_variants,SOVERSION)
LDSCRIPT = $(LDS_so)
LDSCRIPT_INCR ?= /dev/null
# install.inc eventually defines rules for every target
include $(L4DIR)/mk/install.inc
# Ada needs the binder file, if we bind the ada lib.
# Request binding by setting ADA_BIND_LIB=y. The binder file will correspond to
# the name of the target and the expectation is that there was an ALI file with
# the target name. It is expected that the entry object of libfoo is called foo
# The binder file is added to the objects of the target.
ifneq ($(strip $(SRC_ADA)$(foreach t,$(TARGET),$(SRC_ADA_$(t)))),)
ifneq ($(ADA_BIND_LIB),)
$(foreach t,$(TARGET),$(if $(SRC_ADA_$(t))$(SRC_ADA),\
$(eval OBJS_$(t) += b~$(basename $(t)).o)\
$(eval $(t): b~$(basename $(t)).o)))
b~lib%.o: %.ali
@$(call COMP_MESSAGE, from $(<F))
$(VERBOSE)$(ADAC) $(ADACFLAGS) -g -z -b $* -bargs -L$* -n
$(VERBOSE)$(ADAC) -g -c b~$*
$(VERBOSE)mv b~$*.o b~lib$*.o
endif
endif
ifeq ($(NOTARGETSTOINSTALL),)
PC_LIBS ?= $(sort $(patsubst lib%.so,-l%,$(TARGET_SHARED)) \
$(patsubst lib%.a,-l%,$(TARGET_STANDARD)))
PC_FILENAME ?= $(PKGNAME)
PC_FILENAMES ?= $(PC_FILENAME)
PC_FILES := $(if $(filter std,$(VARIANT)),$(foreach pcfile,$(PC_FILENAMES),$(OBJ_BASE)/pc/$(pcfile).pc))
PC_LIBS_PIC ?= $(patsubst lib%.p.a,-l%.p,$(TARGET_PIC))
# 1: basename
# 2: pcfilename
# 3: optional prefix
get_cont = $(if $($(1)_$(2)),$(3)$($(1)_$(2)),$(if $($(1)),$(3)$($(1))))
# 1: pcfile
get_extra = $(call get_cont,PC_EXTRA,$(1))$\
$(call get_cont,PC_LIBS_PIC,$(1),$(newline)Libs_pic= )$\
$(call get_cont,PC_LINK_LIBS,$(1),$(newline)Link_Libs= )$\
$(call get_cont,PC_LINK_LIBS_PIC,$(1),$(newline)Link_Libs_pic= )
# Ths must contain all the contents of all possible PC files as used in
# below generate_pcfile
PC_FILES_CONTENTS := $(strip $(foreach pcfile,$(PC_FILENAMES),\
$(call get_cont,CONTRIB_INCDIR,$(pcfile)) \
$(call get_cont,PC_LIBS,$(pcfile)) \
$(call get_cont,REQUIRES_LIBS,$(pcfile)) \
$(call get_cont,PC_CFLAGS,$(pcfile)) $(call get_extra,$(pcfile))))
ifneq ($(PC_FILES_CONTENTS),)
# when adding something to generate_pcfile it must also be added to the
# PC_FILES_CONTENTS above, otherwise PC files may not be generated
$(patsubst %,$(OBJ_BASE)/pc/%.pc,$(PC_FILENAMES)):$(OBJ_BASE)/pc/%.pc: $(GENERAL_D_LOC)
@$(call GEN_MESSAGE,$(@F))
$(VERBOSE)$(call generate_pcfile,$*,$@,$(call get_cont,CONTRIB_INCDIR,$*),$(call get_cont,PC_LIBS,$*),$(call get_cont,REQUIRES_LIBS,$*),$(call get_cont,PC_CFLAGS,$*),$(call get_extra,$*))
all:: $(PC_FILES)
endif
endif
DEPS += $(foreach file,$(TARGET), $(call BID_LINK_DEPS,$(file)))
$(filter-out $(LINK_INCR) %.so %.ofl %.o.a %.o.pr.a, $(TARGET)):%.a: $(OBJS) $(GENERAL_D_LOC)
@$(AR_MESSAGE)
$(VERBOSE)$(MKDIR) $(@D)
$(VERBOSE)$(RM) $@
$(VERBOSE)$(AR) crs$(if $(filter %.thin.a,$@),T) $@ \
$(foreach o,$(OBJS),$(if $(filter %.ofl,$o),$(file <$o),$o))
@$(BUILT_MESSAGE)
# Object File List - just a list of object file paths for later static linking
$(filter %.ofl, $(TARGET)):%.ofl: $(OBJS) $(GENERAL_D_LOC)
@$(AR_MESSAGE)
$(VERBOSE)$(MKDIR) $(@D)
$(VERBOSE)printf '%s ' $(realpath $(OBJS)) > $@
@$(BUILT_MESSAGE)
# shared lib
$(filter %.so, $(TARGET)):%.so: $(OBJS) $(LIBDEPS) $(GENERAL_D_LOC)
@$(LINK_SHARED_MESSAGE)
$(VERBOSE)$(MKDIR) $(@D)
$(VERBOSE)$(call MAKEDEP,$(LD)) $(BID_LINK) -MD -MF $(call BID_link_deps_file,$@) -o $@ $(LDFLAGS_SO) \
$(LDFLAGS) $(OBJS) $(addprefix -PC,$(REQUIRES_LIBS)) \
$(if $(strip $(SOVERSION)),-soname=$@.$(SOVERSION_MAJOR))
@$(BUILT_MESSAGE)
# build an object file (which looks like a lib to a later link-call), which
# is either later included as a whole or not at all (important for static
# constructors)
LINK_INCR_TARGETS = $(filter $(LINK_INCR) %.o.a %.o.pr.a, $(TARGET))
$(LINK_INCR_TARGETS):%.a: $(OBJS) $(LIBDEPS) $(foreach x,$(LINK_INCR_TARGETS),$(LINK_INCR_ONLYGLOBSYMFILE_$(x)))
@$(LINK_PARTIAL_MESSAGE)
$(VERBOSE)$(MKDIR) $(@D)
$(VERBOSE)$(call MAKEDEP,$(LD)) $(LD) \
-T $(LDSCRIPT_INCR) \
-o $@ -r $(OBJS) $(LDFLAGS)
$(if $(LINK_INCR_ONLYGLOBSYM_$@)$(LINK_INCR_ONLYGLOBSYMFILE_$@), \
$(VERBOSE)$(OBJCOPY) \
$(foreach f,$(LINK_INCR_ONLYGLOBSYMFILE_$@),--keep-global-symbols=$(f)) \
$(foreach f,$(LINK_INCR_ONLYGLOBSYM_$@),-G $(f)) \
$@)
@$(BUILT_MESSAGE)
endif # architecture is defined, really build
.PHONY: all clean cleanall config help install oldconfig txtconfig
-include $(DEPSVAR)
help::
@echo " all - compile and install the libraries locally"
ifneq ($(SYSTEM),)
@echo " to $(INSTALLDIR_LOCAL)"
endif
@echo " install - compile and install the libraries globally"
ifneq ($(SYSTEM),)
@echo " to $(INSTALLDIR)"
endif
@echo " scrub - delete backup and temporary files"
@echo " clean - delete generated object files"
@echo " cleanall - delete all generated, backup and temporary files"
@echo " help - this help"
@echo
ifneq ($(SYSTEM),)
@echo " libraries are: $(TARGET)"
else
@echo " build for architectures: $(TARGET_SYSTEMS)"
endif
endif # _L4DIR_MK_LIB_MK undefined

15
src/l4/mk/makehelpers.inc Normal file
View File

@@ -0,0 +1,15 @@
# -*- Makefile -*-
# vim:set ft=make:
#
# L4Re Buildsystem
#
# Makefile-include to extract variables from Makefile-compatible files
#
# We use this file to browse doxygen files in the doc.mk rules.
BID_print:
@echo $($(VAR))
BID_printm:
@$(foreach v, $(VARS), echo '$(v)=$($(v))';)
.PHONY: BID_print BID_printm

103
src/l4/mk/modes.inc Normal file
View File

@@ -0,0 +1,103 @@
# -*- Makefile -*-
# vim:et:ts=8:ft=make:
#
# L4Re Buildsystem
#
# Makefile-Include for defining modes
LIBC_INCLUDE = $(BID_NOSTDINC) \
-I$(OBJ_BASE)/include/$(CONFIG_L4_LIBC) \
$(if $(CONFIG_USE_DROPS_STDDIR), \
-I$(DROPS_STDDIR)/include/$(CONFIG_L4_LIBC)) \
$(I_GCCINCDIR)
LIBCXX_INCLUDE = -I$(OBJ_BASE)/include/contrib/libstdc++-v3 \
$(if $(CONFIG_USE_DROPS_STDDIR), \
-I$(DROPS_STDDIR)/include/contrib/libstdc++-v3)
# Select default compiler runtime libraries based on whether targeting system
# with L4 API. The pure compiler runtime libraries do not use L4 specific APIs.
COMPILER_RT-l4api-plain := compiler-rt-pure
COMPILER_RT-l4api-l4f := compiler-rt
COMPILER_RT ?= $(COMPILER_RT-l4api-$(L4API))
#############################################################################
STATIC_PIE_LDFLAGS = $(if $(or $(CONFIG_BID_PIE_ALL), \
$(and $(CONFIG_BID_PIE_VOLUNTARY),$(BID_CAN_PIE))), \
-static-pie,-static)
################################
# sigma0 mode
################################
BID_SUPPORTED_all_sigma0 = y
LIBCINCDIR_all_sigma0 = $(LIBC_INCLUDE)
REQUIRES_LIBS_all_sigma0 = $(COMPILER_RT)
LDFLAGS_all_sigma0 = $(STATIC_PIE_LDFLAGS) -gc-sections
################################
# static mode
################################
BID_SUPPORTED_all_static = y
LIBCINCDIR_all_static = $(LIBCXX_INCLUDE) $(LIBC_INCLUDE)
REQUIRES_LIBS_all_static = stdlibs $(COMPILER_RT)
LDFLAGS_all_static = $(STATIC_PIE_LDFLAGS) -gc-sections
#####################################
# shared mode -- programs are linked against shared libs
#####################################
BID_SUPPORTED_all_shared = y
LIBCINCDIR_all_shared = $(LIBCXX_INCLUDE) $(LIBC_INCLUDE)
REQUIRES_LIBS_all_shared = stdlibs-sh $(COMPILER_RT)
LDFLAGS_all_shared = -gc-sections
################################
# l4linux mode
################################
BID_SUPPORTED_all_l4linux = y
LIBCINCDIR_all_l4linux =
REQUIRES_LIBS_all_l4linux =
LDFLAGS_all_l4linux = -gc-sections
################################
# Targetsys mode
################################
BID_SUPPORTED_all_targetsys = y
LDFLAGS_all_targetsys = -gc-sections
#####################################
# lib mode -- options when building libs
#####################################
BID_SUPPORTED_all_lib = y
LIBCINCDIR_all_lib = $(LIBCXX_INCLUDE) $(LIBC_INCLUDE)
# Libraries need include directories of compiler runtime. Cannot use
# REQUIRES_LIBS here, because a library that links against compiler-rt-pure can
# still be used by a program that links against compiler-rt. With REQUIRES_LIBS
# the program would be linked against both compiler-rt-pure and compiler-rt.
REQUIRES_CFLAGS_all_lib = $(COMPILER_RT)
# Shared libraries need hidden symbols from compiler runtime.
LDFLAGS_SO_all_lib = $(addprefix -PC,$(COMPILER_RT))
#####################################
# host mode -- no L4 specifics
#####################################
BID_SUPPORTED_all_host = y
LIBCINCDIR_all_host =
REQUIRES_LIBS_all_host =
LDFLAGS_all_host =
NOPICFLAGS_all_host ?=
NOPIEFLAGS_all_host ?=
#####################################
# assets building mode
#####################################
BID_SUPPORTED_all_assets = y

1280
src/l4/mk/pkgdeps Executable file

File diff suppressed because it is too large Load Diff

53
src/l4/mk/pkgfind Executable file
View File

@@ -0,0 +1,53 @@
#! /usr/bin/env perl
=head1 pkgfind
This tool finds l4re packages in the provided source dir by looking for a
`Control` file and sorting out those that are marked 'obsolete' or 'broken'
by a respective file.
Args:
=over
=item 1: source dir to locate packages in
=item 2: max search depth
=back
=cut
use strict;
use File::Spec::Functions;
my ($p, $max) = @ARGV;
my %hits;
sub find_dir
{
my $m = shift;
my $dx = catdir(@_);
my $d = catdir($p, @_);
if (-f "$d/Control" and ! -f "$d/obsolete" and ! -f "$d/broken") {
$hits{$dx} = 1;
return;
}
return if $m <= 1;
opendir (my $dh, $d) || "can't open $d: $!";
foreach my $sd (readdir($dh)) {
next if $sd eq '.' or $sd eq '..';
next if $sd eq '.git' or $sd eq '.svn';
my $fd = catdir($d, $sd);
next unless -d $fd;
find_dir($m - 1, @_, $sd);
}
closedir $dh;
}
find_dir($max);
print join("\n", sort(keys(%hits))). "\n";

View File

@@ -0,0 +1,7 @@
PLATFORM_NAME = "ARM AEM FVP Base"
PLATFORM_ARCH = arm arm64
PLATFORM_RAM_BASE = 0x80000000
PLATFORM_RAM_SIZE_MB = 4096
# The platform's default is 4GB, but smaller makes things
# smoother in most cases.
PLATFORM_RAM_SIZE_MB = 512

View File

@@ -0,0 +1,5 @@
PLATFORM_NAME = "ARM AEM FVP BaseR (ARMv8R)"
PLATFORM_ARCH = arm arm64
PLATFORM_RAM_BASE = 0x00000000
# On arm64 the default RAM size is 4G by default but 2G should be enough, still.
PLATFORM_RAM_SIZE_MB = 2048

View File

@@ -0,0 +1,8 @@
PLATFORM_NAME = "ARM MPS3 AN536 (ARMv8R)"
PLATFORM_ARCH = arm
PLATFORM_RAM_BASE = 0x20000000
# The total RAM size is actually 3GB, but in QEMU only the lower 1.5GB (up to
# address 0x7fff'ffff) permit instruction execution. This is most likely a bug
# in QEMU's PMSAv8 implementation, where it consults the default memory map when
# it shouldn't.
PLATFORM_RAM_SIZE_MB = 1536

View File

@@ -0,0 +1,3 @@
PLATFORM_NAME = "ARM SBSA compliant platform"
PLATFORM_ARCH = arm64
PLATFORM_RAM_BASE = 0x0

View File

@@ -0,0 +1,3 @@
PLATFORM_NAME = "QEMU ARM Virtual Platform"
PLATFORM_ARCH = arm arm64
PLATFORM_RAM_BASE = 0x40000000

View File

@@ -0,0 +1,3 @@
PLATFORM_NAME = "Marvell Armada 37xx"
PLATFORM_ARCH = arm arm64
PLATFORM_RAM_BASE = 0x0

View File

@@ -0,0 +1,4 @@
PLATFORM_NAME = "Marvell Armada 38x"
PLATFORM_ARCH = arm
PLATFORM_RAM_BASE = 0x00000000
PLATFORM_RAM_SIZE_MB = 512

View File

@@ -0,0 +1,5 @@
PLATFORM_NAME = "Baikal-T"
PLATFORM_ARCH = mips
PLATFORM_RAM_BASE = 0x00000000
PLATFORM_RAM_SIZE_MB = 1660
PLATFORM_UART_NR = 0

View File

@@ -0,0 +1,4 @@
PLATFORM_NAME = "Beagleboard"
PLATFORM_ARCH = arm
PLATFORM_RAM_BASE = 0x80000000
PLATFORM_RAM_SIZE_MB = 128

View File

@@ -0,0 +1,3 @@
PLATFORM_NAME = "Boston"
PLATFORM_ARCH = mips
PLATFORM_RAM_BASE = 0x00000000

View File

@@ -0,0 +1,4 @@
PLATFORM_NAME = "Creator Ci20"
PLATFORM_ARCH = mips
PLATFORM_RAM_BASE = 0x00000000
PLATFORM_UART_NR = 4

View File

@@ -0,0 +1,4 @@
PLATFORM_NAME = "Creator Ci40"
PLATFORM_ARCH = mips
PLATFORM_RAM_BASE = 0x00000000
PLATFORM_RAM_SIZE_MB = 256

View File

@@ -0,0 +1,4 @@
PLATFORM_NAME = "CubieBoard 2"
PLATFORM_ARCH = arm
PLATFORM_RAM_BASE = 0x40000000
PLATFORM_RAM_SIZE_MB = 1024

View File

@@ -0,0 +1,5 @@
PLATFORM_NAME = "Samsung Exynos4"
PLATFORM_ARCH = arm
PLATFORM_RAM_BASE = 0x40000000
PLATFORM_RAM_SIZE_MB = 1024
PLATFORM_UART_NR = 2

View File

@@ -0,0 +1,5 @@
PLATFORM_NAME = "Samsung Exynos5"
PLATFORM_ARCH = arm
PLATFORM_RAM_BASE = 0x40000000
PLATFORM_RAM_SIZE_MB = 2047
PLATFORM_UART_NR = 2

View File

@@ -0,0 +1,3 @@
PLATFORM_NAME = "HiFive Unmatched"
PLATFORM_ARCH = riscv
PLATFORM_RAM_BASE = 0x80000000

View File

@@ -0,0 +1,4 @@
PLATFORM_NAME = "Freescale i.MX21"
PLATFORM_ARCH = arm
PLATFORM_RAM_BASE = 0xc0000000
PLATFORM_RAM_SIZE_MB = 64

View File

@@ -0,0 +1,4 @@
PLATFORM_NAME = "Freescale i.MX28"
PLATFORM_ARCH = arm
PLATFORM_RAM_BASE = 0x40000000
PLATFORM_RAM_SIZE_MB = 128

View File

@@ -0,0 +1,5 @@
PLATFORM_NAME = "Freescale i.MX35"
PLATFORM_ARCH = arm
PLATFORM_RAM_BASE = 0x80000000
PLATFORM_RAM_SIZE_MB = 128
PLATFORM_UART_NR = 1

View File

@@ -0,0 +1,4 @@
PLATFORM_NAME = "Freescale i.MX51"
PLATFORM_ARCH = arm
PLATFORM_RAM_BASE = 0x90000000
PLATFORM_RAM_SIZE_MB = 512

View File

@@ -0,0 +1,5 @@
PLATFORM_NAME = "Freescale i.MX6"
PLATFORM_ARCH = arm
PLATFORM_RAM_BASE = 0x10000000
PLATFORM_RAM_SIZE_MB = 1024
PLATFORM_UART_NR = 2

View File

@@ -0,0 +1,5 @@
PLATFORM_NAME = "NXP i.MX6UL"
PLATFORM_ARCH = arm
PLATFORM_RAM_BASE = 0x80000000
PLATFORM_RAM_SIZE_MB = 256
PLATFORM_UART_NR = 1

View File

@@ -0,0 +1,5 @@
PLATFORM_NAME = "NXP i.MX7"
PLATFORM_ARCH = arm
PLATFORM_RAM_BASE = 0x80000000
PLATFORM_RAM_SIZE_MB = 1024
PLATFORM_UART_NR = 1

View File

@@ -0,0 +1,5 @@
PLATFORM_NAME = "NXP i.MX8M"
PLATFORM_ARCH = arm arm64
PLATFORM_RAM_BASE = 0x40000000
PLATFORM_RAM_SIZE_MB = 3064
PLATFORM_UART_NR = 1

View File

@@ -0,0 +1,3 @@
PLATFORM_NAME = "NXP i.MX8MP"
PLATFORM_ARCH = arm arm64
PLATFORM_RAM_BASE = 0x40000000

View File

@@ -0,0 +1,4 @@
PLATFORM_NAME = "NXP i.MX8Q"
PLATFORM_ARCH = arm arm64
PLATFORM_RAM_BASE = 0x88000000
PLATFORM_UART_NR = 1

View File

@@ -0,0 +1,4 @@
PLATFORM_NAME = "NXP i.MX8X"
PLATFORM_ARCH = arm arm64
PLATFORM_RAM_BASE = 0x88000000
PLATFORM_UART_NR = 1

View File

@@ -0,0 +1,3 @@
PLATFORM_NAME = "NXP i.MX95"
PLATFORM_ARCH = arm arm64
PLATFORM_RAM_BASE = 0x90200000

View File

@@ -0,0 +1,4 @@
PLATFORM_NAME = "ARM Integrator"
PLATFORM_ARCH = arm
PLATFORM_RAM_BASE = 0
PLATFORM_RAM_SIZE_MB = 256

View File

@@ -0,0 +1,4 @@
PLATFORM_NAME = "Marvell Kirkwood"
PLATFORM_ARCH = arm
PLATFORM_RAM_BASE = 0
PLATFORM_RAM_SIZE_MB = 128

View File

@@ -0,0 +1,3 @@
PLATFORM_NAME = "Sparc Leon3"
PLATFORM_ARCH = sparc
PLATFORM_RAM_BASE = 0x40000000

View File

@@ -0,0 +1,5 @@
PLATFORM_NAME = "NXP LS1012A-FRDM"
PLATFORM_ARCH = arm arm64
PLATFORM_RAM_BASE = 0x80000000
PLATFORM_RAM_SIZE_MB = 510
PLATFORM_UART_NR = 0

View File

@@ -0,0 +1,5 @@
PLATFORM_NAME = "NXP TWR-LS1021A"
PLATFORM_ARCH = arm
PLATFORM_RAM_BASE = 0x80000000
PLATFORM_RAM_SIZE_MB = 1024
PLATFORM_UART_NR = 0

View File

@@ -0,0 +1,3 @@
PLATFORM_NAME = "NXP LS1046"
PLATFORM_ARCH = arm arm64
PLATFORM_RAM_BASE = 0x80000000

View File

@@ -0,0 +1,3 @@
PLATFORM_NAME = "NXP LX2160"
PLATFORM_ARCH = arm arm64
PLATFORM_RAM_BASE = 0x80000000

View File

@@ -0,0 +1,4 @@
PLATFORM_NAME = "Malta"
PLATFORM_ARCH = mips
PLATFORM_RAM_BASE = 0x00000000
PLATFORM_RAM_SIZE_MB = 1024

View File

@@ -0,0 +1,3 @@
PLATFORM_NAME = HENSOLDT Cyber MiG-V
PLATFORM_ARCH = riscv
PLATFORM_RAM_BASE = 0x40000000

View File

@@ -0,0 +1,4 @@
PLATFORM_NAME = "MPC5200"
PLATFORM_ARCH = ppc32
PLATFORM_RAM_BASE = 0
PLATFORM_RAM_SIZE_MB = 64

View File

@@ -0,0 +1,3 @@
PLATFORM_NAME = "Qualcomm MSM8226"
PLATFORM_ARCH = arm
PLATFORM_RAM_BASE = 0x00000000

View File

@@ -0,0 +1,3 @@
PLATFORM_NAME = "Qualcomm MSM8909"
PLATFORM_ARCH = arm
PLATFORM_RAM_BASE = 0x80000000

View File

@@ -0,0 +1,3 @@
PLATFORM_NAME = "Qualcomm MSM8916"
PLATFORM_ARCH = arm64 arm
PLATFORM_RAM_BASE = 0x80000000

View File

@@ -0,0 +1,3 @@
PLATFORM_NAME = "Qualcomm MSM8939"
PLATFORM_ARCH = arm64 arm
PLATFORM_RAM_BASE = 0x80000000

View File

@@ -0,0 +1,3 @@
PLATFORM_NAME = "Qualcomm MSM8974"
PLATFORM_ARCH = arm
PLATFORM_RAM_BASE = 0x00000000

View File

@@ -0,0 +1,4 @@
PLATFORM_NAME = "TI OMAP AM33xx"
PLATFORM_ARCH = arm
PLATFORM_RAM_BASE = 0x80000000
PLATFORM_RAM_SIZE_MB = 256

View File

@@ -0,0 +1,4 @@
PLATFORM_NAME = "TI OMAP3EVM"
PLATFORM_ARCH = arm
PLATFORM_RAM_BASE = 0x80000000
PLATFORM_RAM_SIZE_MB = 128

View File

@@ -0,0 +1,4 @@
PLATFORM_NAME = "OMAP5 EVM"
PLATFORM_ARCH = arm
PLATFORM_RAM_BASE = 0x80000000
PLATFORM_RAM_SIZE_MB = 2046

View File

@@ -0,0 +1,3 @@
PLATFORM_NAME = "Nvidia Jetson Orin"
PLATFORM_ARCH = arm64
PLATFORM_RAM_BASE = 0x80000000

View File

@@ -0,0 +1,4 @@
PLATFORM_NAME = "Pandaboard"
PLATFORM_ARCH = arm
PLATFORM_RAM_BASE = 0x80000000
PLATFORM_RAM_SIZE_MB = 1024

View File

@@ -0,0 +1,5 @@
PLATFORM_NAME = "Parallella Board"
PLATFORM_ARCH = arm
PLATFORM_RAM_BASE = 0
PLATFORM_RAM_SIZE_MB = 1024
PLATFORM_UART_NR = 1

View File

@@ -0,0 +1,3 @@
PLATFORM_NAME = "PC"
PLATFORM_ARCH = x86 amd64
PLATFORM_RAM_BASE = 0

View File

@@ -0,0 +1,3 @@
PLATFORM_NAME = Microchip PolarFire SoC
PLATFORM_ARCH = riscv
PLATFORM_RAM_BASE = 0x80000000

View File

@@ -0,0 +1,3 @@
PLATFORM_NAME = "Renesas R-Car Gen3"
PLATFORM_ARCH = arm arm64
PLATFORM_RAM_BASE = 0x48000000

View File

@@ -0,0 +1,3 @@
PLATFORM_NAME = "Renesas R-Car Gen4"
PLATFORM_ARCH = arm arm64
PLATFORM_RAM_BASE = 0x49000000

View File

@@ -0,0 +1,3 @@
PLATFORM_NAME = "Renesas R-Car Gen4 Realtime Core (R52)"
PLATFORM_ARCH = arm
PLATFORM_RAM_BASE = 0xeb200000

View File

@@ -0,0 +1,3 @@
PLATFORM_NAME = "QEMU RISC-V Virtual Platform"
PLATFORM_ARCH = riscv
PLATFORM_RAM_BASE = 0x80000000

View File

@@ -0,0 +1,3 @@
PLATFORM_NAME = "Raspberry Pi"
PLATFORM_ARCH = arm arm64
PLATFORM_RAM_BASE = 0x0

View File

@@ -0,0 +1,4 @@
PLATFORM_NAME = "ARM Realview (Generic)"
PLATFORM_ARCH = arm
PLATFORM_RAM_BASE = 0
PLATFORM_RAM_SIZE_MB = 256

Some files were not shown because too many files have changed in this diff Show More