162306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci# Makefile for nolibc installation and tests
362306a36Sopenharmony_ciinclude ../../scripts/Makefile.include
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci# we're in ".../tools/include/nolibc"
662306a36Sopenharmony_ciifeq ($(srctree),)
762306a36Sopenharmony_cisrctree := $(patsubst %/tools/include/,%,$(dir $(CURDIR)))
862306a36Sopenharmony_ciendif
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci# when run as make -C tools/ nolibc_<foo> the arch is not set
1162306a36Sopenharmony_ciifeq ($(ARCH),)
1262306a36Sopenharmony_ciinclude $(srctree)/scripts/subarch.include
1362306a36Sopenharmony_ciARCH = $(SUBARCH)
1462306a36Sopenharmony_ciendif
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci# OUTPUT is only set when run from the main makefile, otherwise
1762306a36Sopenharmony_ci# it defaults to this nolibc directory.
1862306a36Sopenharmony_ciOUTPUT ?= $(CURDIR)/
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ciifeq ($(V),1)
2162306a36Sopenharmony_ciQ=
2262306a36Sopenharmony_cielse
2362306a36Sopenharmony_ciQ=@
2462306a36Sopenharmony_ciendif
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_cinolibc_arch := $(patsubst arm64,aarch64,$(ARCH))
2762306a36Sopenharmony_ciarch_file := arch-$(nolibc_arch).h
2862306a36Sopenharmony_ciall_files := \
2962306a36Sopenharmony_ci		compiler.h \
3062306a36Sopenharmony_ci		crt.h \
3162306a36Sopenharmony_ci		ctype.h \
3262306a36Sopenharmony_ci		errno.h \
3362306a36Sopenharmony_ci		nolibc.h \
3462306a36Sopenharmony_ci		signal.h \
3562306a36Sopenharmony_ci		stackprotector.h \
3662306a36Sopenharmony_ci		std.h \
3762306a36Sopenharmony_ci		stdint.h \
3862306a36Sopenharmony_ci		stdlib.h \
3962306a36Sopenharmony_ci		string.h \
4062306a36Sopenharmony_ci		sys.h \
4162306a36Sopenharmony_ci		time.h \
4262306a36Sopenharmony_ci		types.h \
4362306a36Sopenharmony_ci		unistd.h \
4462306a36Sopenharmony_ci		stdio.h \
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci# install all headers needed to support a bare-metal compiler
4862306a36Sopenharmony_ciall: headers
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ciinstall: help
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_cihelp:
5362306a36Sopenharmony_ci	@echo "Supported targets under nolibc:"
5462306a36Sopenharmony_ci	@echo "  all                 call \"headers\""
5562306a36Sopenharmony_ci	@echo "  clean               clean the sysroot"
5662306a36Sopenharmony_ci	@echo "  headers             prepare a sysroot in tools/include/nolibc/sysroot"
5762306a36Sopenharmony_ci	@echo "  headers_standalone  like \"headers\", and also install kernel headers"
5862306a36Sopenharmony_ci	@echo "  help                this help"
5962306a36Sopenharmony_ci	@echo ""
6062306a36Sopenharmony_ci	@echo "These targets may also be called from tools as \"make nolibc_<target>\"."
6162306a36Sopenharmony_ci	@echo ""
6262306a36Sopenharmony_ci	@echo "Currently using the following variables:"
6362306a36Sopenharmony_ci	@echo "  ARCH    = $(ARCH)"
6462306a36Sopenharmony_ci	@echo "  OUTPUT  = $(OUTPUT)"
6562306a36Sopenharmony_ci	@echo ""
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci# Note: when ARCH is "x86" we concatenate both x86_64 and i386
6862306a36Sopenharmony_ciheaders:
6962306a36Sopenharmony_ci	$(Q)mkdir -p $(OUTPUT)sysroot
7062306a36Sopenharmony_ci	$(Q)mkdir -p $(OUTPUT)sysroot/include
7162306a36Sopenharmony_ci	$(Q)cp $(all_files) $(OUTPUT)sysroot/include/
7262306a36Sopenharmony_ci	$(Q)if [ "$(ARCH)" = "x86" ]; then      \
7362306a36Sopenharmony_ci		sed -e                          \
7462306a36Sopenharmony_ci		  's,^#ifndef _NOLIBC_ARCH_X86_64_H,#if !defined(_NOLIBC_ARCH_X86_64_H) \&\& defined(__x86_64__),' \
7562306a36Sopenharmony_ci		  arch-x86_64.h;                \
7662306a36Sopenharmony_ci		sed -e                          \
7762306a36Sopenharmony_ci		  's,^#ifndef _NOLIBC_ARCH_I386_H,#if !defined(_NOLIBC_ARCH_I386_H) \&\& !defined(__x86_64__),' \
7862306a36Sopenharmony_ci		  arch-i386.h;                  \
7962306a36Sopenharmony_ci	elif [ -e "$(arch_file)" ]; then        \
8062306a36Sopenharmony_ci		cat $(arch_file);               \
8162306a36Sopenharmony_ci	else                                    \
8262306a36Sopenharmony_ci		echo "Fatal: architecture $(ARCH) not yet supported by nolibc." >&2; \
8362306a36Sopenharmony_ci		exit 1;                         \
8462306a36Sopenharmony_ci	fi > $(OUTPUT)sysroot/include/arch.h
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ciheaders_standalone: headers
8762306a36Sopenharmony_ci	$(Q)$(MAKE) -C $(srctree) headers
8862306a36Sopenharmony_ci	$(Q)$(MAKE) -C $(srctree) headers_install INSTALL_HDR_PATH=$(OUTPUT)sysroot
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ciclean:
9162306a36Sopenharmony_ci	$(call QUIET_CLEAN, nolibc) rm -rf "$(OUTPUT)sysroot"
92