###############################################################################
#                                                                             #
# IPFire.org - A linux based firewall                                         #
# Copyright (C) 2007-2021  IPFire Team  <info@ipfire.org>                     #
#                                                                             #
# This program is free software: you can redistribute it and/or modify        #
# it under the terms of the GNU General Public License as published by        #
# the Free Software Foundation, either version 3 of the License, or           #
# (at your option) any later version.                                         #
#                                                                             #
# This program is distributed in the hope that it will be useful,             #
# but WITHOUT ANY WARRANTY; without even the implied warranty of              #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               #
# GNU General Public License for more details.                                #
#                                                                             #
# You should have received a copy of the GNU General Public License           #
# along with this program.  If not, see <http://www.gnu.org/licenses/>.       #
#                                                                             #
###############################################################################

###############################################################################
# Definitions
###############################################################################

include Config

VER        = 2.33

THISAPP    = glibc-$(VER)
DL_FILE    = $(THISAPP).tar.xz
DL_FROM    = $(URL_IPFIRE)
DIR_APP    = $(DIR_SRC)/$(THISAPP)

# Normal build or $(TOOLS_DIR) build.
#
ifeq "$(ROOT)" ""
  TARGET = $(DIR_INFO)/$(THISAPP)
  EXTRA_CONFIG = \
	--build=$(BUILDTARGET) \
	--prefix=/usr \
	--libexecdir=/usr/lib/glibc \
	--enable-stack-protector=strong
else
  TARGET = $(DIR_INFO)/$(THISAPP)-tools
  EXTRA_CONFIG = \
	--host=$(CROSSTARGET) \
	--build=$(BUILDTARGET) \
	--prefix=$(TOOLS_DIR) \
	--with-headers=$(TOOLS_DIR)/include \
	libc_cv_forced_unwind=yes \
	libc_cv_c_cleanup=yes
endif

ifeq "$(BUILD_ARCH)" "aarch64"
	CFLAGS += -Wno-error=maybe-uninitialized
endif

ifeq "$(BUILD_ARCH)" "i586"
	EXTRA_CONFIG += libc_cv_include_x86_isa_level=no
endif

# Add some general configuration flags
EXTRA_CONFIG += \
	--disable-profile \
	--enable-kernel=4.14.0 \
	--enable-add-ons \
	--without-selinux \
	--enable-experimental-malloc \
	--enable-bind-now \
	--disable-crypt

###############################################################################
# Top-level Rules
###############################################################################

objects = $(DL_FILE)

$(DL_FILE) = $(DL_FROM)/$(DL_FILE)

$(DL_FILE)_MD5 = 390bbd889c7e8e8a7041564cb6b27cca

install : $(TARGET)

check : $(patsubst %,$(DIR_CHK)/%,$(objects))

download :$(patsubst %,$(DIR_DL)/%,$(objects))

md5 : $(subst %,%_MD5,$(objects))

###############################################################################
# Downloading, checking, md5sum
###############################################################################

$(patsubst %,$(DIR_CHK)/%,$(objects)) :
	@$(CHECK)

$(patsubst %,$(DIR_DL)/%,$(objects)) :
	@$(LOAD)

$(subst %,%_MD5,$(objects)) :
	@$(MD5)

###############################################################################
# Installation Details
###############################################################################

$(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
	@$(PREBUILD)
	@rm -rf $(DIR_APP) $(DIR_SRC)/glibc-build && cd $(DIR_SRC) && tar axf $(DIR_DL)/$(DL_FILE)
	@mkdir $(DIR_SRC)/glibc-build

	# Security Fixes
	cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc-2.33-use-__pthread_attr_copy-in-mq_notify-bug-27896.patch
	cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc-2.33-librt-fix-null-pointer-dereference-bug-28213.patch

	cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/glibc-localedef-no-archive.patch

ifneq "$(TOOLCHAIN)" "1"
 ifeq "$(BUILD_ARCH)" "x86_64"
	cd $(DIR_APP) && sed -i 's|libs -o|libs -L/usr/lib64 -Wl,-dynamic-linker=/lib64/ld-linux-x86-64.so.2 -o|' \
		scripts/test-installation.pl
 endif

 ifeq "$(BUILD_ARCH)" "i586"
	cd $(DIR_APP) && sed -i 's|libs -o|libs -L/usr/lib -Wl,-dynamic-linker=/lib/ld-linux.so.2 -o|' \
		scripts/test-installation.pl
 endif

 ifeq "$(BUILD_ARCH)" "armv6l"
	cd $(DIR_APP) && sed -i 's|libs -o|libs -L/usr/lib -Wl,-dynamic-linker=/lib/ld-linux.so.3 -o|' \
		scripts/test-installation.pl
 endif
endif

	cd $(DIR_SRC)/glibc-build && \
		CFLAGS="$(CFLAGS) -fno-asynchronous-unwind-tables" \
		$(DIR_APP)/configure $(EXTRA_CONFIG)

	cd $(DIR_SRC)/glibc-build && make PARALLELMFLAGS=$(MAKETUNING) \
		CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)"

	cd $(DIR_APP) && sed '/test-installation/s@\$$(PERL)@echo not running@' -i Makefile

	cd $(DIR_SRC)/glibc-build && make install

ifneq "$(TOOLCHAIN)" "1"
	# Creating the locales
	mkdir -p /usr/lib/locale
	cd $(DIR_SRC)/glibc-build && make localedata/install-locales $(MAKETUNING)

	# Timezone data will be shipped by tzdata.
	rm -rfv /usr/share/zoneinfo
endif

ifeq "$(TOOLCHAIN)" "1"
	# Test the linker in toolchain
	cd $(DIR_APP) && echo "int main() { return 0; }" > dummy.c
	cd $(DIR_APP) && $(CROSSTARGET)-gcc dummy.c -o dummy

	# Must be using a runtime linker from $(TOOLS_DIR)
	cd $(DIR_APP) && readelf -l dummy | grep "Requesting program interpreter: $(TOOLS_DIR)"
	cd $(DIR_APP) && rm -vf dummy dummy.c
endif

	@rm -rf $(DIR_APP) $(DIR_SRC)/glibc-build
	@$(POSTBUILD)
