# This file declares functions to install the uClibc C library
# Copyright 2007 Yann E. MORIN
# Licensed under the GPL v2. See COPYING in the root of this package

# This is a constant because it does not change very often.
# We're in 2010, and are still using data from 7 years ago.
uclibc_locales_version=030818
uclibc_local_tarball="uClibc-locale-${uclibc_locales_version}"

# Download uClibc
do_libc_get() {
    libc_src="http://www.uclibc.org/downloads
              http://www.uclibc.org/downloads/old-releases"
    if [ "${CT_LIBC_UCLIBC_CUSTOM}" = "y" ]; then
        CT_GetCustom "uClibc" "${CT_LIBC_VERSION}" \
                     "${CT_LIBC_UCLIBC_CUSTOM_LOCATION}"
    else
        CT_GetFile "uClibc-${CT_LIBC_VERSION}" ${libc_src}
    fi
    # uClibc locales
    if [ "${CT_LIBC_UCLIBC_LOCALES_PREGEN_DATA}" = "y" ]; then
        CT_GetFile "${uclibc_local_tarball}" ${libc_src}
    fi

    return 0
}

# Extract uClibc
do_libc_extract() {
    # If not using custom directory location, extract and patch
    # Note: we do the inverse test we do in other components,
    # because here we still need to extract the locales, even for
    # custom location directory. Just use negate the whole test,
    # to keep it the same as for other components.
    if ! [ "${CT_LIBC_UCLIBC_CUSTOM}" = "y" \
         -a -d "${CT_SRC_DIR}/uClibc-${CT_LIBC_VERSION}" ]; then
        CT_Extract "uClibc-${CT_LIBC_VERSION}"
        CT_Patch "uClibc" "${CT_LIBC_VERSION}"
    fi

    # uClibc locales
    # Extracting pregen locales ourselves is kinda
    # broken, so just link it in place...
    if [    "${CT_LIBC_UCLIBC_LOCALES_PREGEN_DATA}" = "y"           \
         -a ! -f "${CT_SRC_DIR}/.${uclibc_local_tarball}.extracted" ]; then
        CT_Pushd "${CT_SRC_DIR}/uClibc-${CT_LIBC_VERSION}/extra/locale"
        CT_DoExecLog ALL ln -s "${CT_TARBALLS_DIR}/${uclibc_local_tarball}.tgz" .
        CT_Popd
        touch "${CT_SRC_DIR}/.${uclibc_local_tarball}.extracted"
    fi

    return 0
}

# Check that uClibc has been previously configured
do_libc_check_config() {
    CT_DoStep INFO "Checking C library configuration"

    CT_TestOrAbort "You did not provide a uClibc config file!" -n "${CT_LIBC_UCLIBC_CONFIG_FILE}" -a -f "${CT_LIBC_UCLIBC_CONFIG_FILE}"

    if grep -E '^KERNEL_SOURCE=' "${CT_LIBC_UCLIBC_CONFIG_FILE}" >/dev/null 2>&1; then
        CT_DoLog WARN "Your uClibc version refers to the kernel _sources_, which is bad."
        CT_DoLog WARN "I can't guarantee that our little hack will work. Please try to upgrade."
    fi

    CT_DoLog EXTRA "Munging uClibc configuration"
    mungeuClibcConfig "${CT_LIBC_UCLIBC_CONFIG_FILE}" "${CT_CONFIG_DIR}/uClibc.config"

    CT_EndStep
}

# Build and install headers and start files
do_libc_start_files() {
    local install_rule
    local cross

    CT_DoStep INFO "Installing C library headers"

    # Simply copy files until uClibc has the ability to build out-of-tree
    CT_DoLog EXTRA "Copying sources to build dir"
    CT_DoExecLog ALL cp -av "${CT_SRC_DIR}/uClibc-${CT_LIBC_VERSION}"   \
                            "${CT_BUILD_DIR}/build-libc-headers"
    cd "${CT_BUILD_DIR}/build-libc-headers"

    # Retrieve the config file
    CT_DoExecLog ALL cp "${CT_CONFIG_DIR}/uClibc.config" .config

    # uClibc uses the CROSS environment variable as a prefix to the
    # compiler tools to use.  Setting it to the empty string forces
    # use of the native build host tools, which we need at this
    # stage, as we don't have target tools yet.
    # BUT! With NPTL, we need a cross-compiler (and we have it)
    if [ "${CT_THREADS}" = "nptl" ]; then
        cross="${CT_TARGET}-"
    fi

    # Force the date of the pregen locale data, as the
    # newer ones that are referenced are not available
    CT_DoLog EXTRA "Applying configuration"
    CT_DoYes "" |CT_DoExecLog ALL                                   \
                 make CROSS="${cross}"                              \
                 PREFIX="${CT_SYSROOT_DIR}/"                        \
                 LOCALE_DATA_FILENAME="${uclibc_local_tarball}.tgz" \
                 oldconfig

    CT_DoLog EXTRA "Building headers"
    CT_DoExecLog ALL                                        \
    make ${CT_LIBC_UCLIBC_VERBOSITY}                        \
         CROSS="${cross}"                                   \
         PREFIX="${CT_SYSROOT_DIR}/"                        \
         LOCALE_DATA_FILENAME="${uclibc_local_tarball}.tgz" \
         headers

    if [ "${CT_LIBC_UCLIBC_0_9_30_or_later}" = "y" ]; then
        install_rule=install_headers
    else
        install_rule=install_dev
    fi

    CT_DoLog EXTRA "Installing headers"
    CT_DoExecLog ALL                                        \
    make ${CT_LIBC_UCLIBC_VERBOSITY}                        \
         CROSS="${cross}"                                   \
         PREFIX="${CT_SYSROOT_DIR}/"                        \
         LOCALE_DATA_FILENAME="${uclibc_local_tarball}.tgz" \
         ${install_rule}

    if [ "${CT_THREADS}" = "nptl" ]; then
        CT_DoLog EXTRA "Building start files"
        CT_DoExecLog ALL                                        \
        make ${CT_LIBC_UCLIBC_PARALLEL:+${JOBSFLAGS}}           \
             CROSS="${cross}"                                   \
             PREFIX="${CT_SYSROOT_DIR}/"                        \
             STRIPTOOL=true                                     \
             ${CT_LIBC_UCLIBC_VERBOSITY}                        \
             LOCALE_DATA_FILENAME="${uclibc_local_tarball}.tgz" \
             lib/crt1.o lib/crti.o lib/crtn.o

        # From:  http://git.openembedded.org/cgit.cgi/openembedded/commit/?id=ad5668a7ac7e0436db92e55caaf3fdf782b6ba3b
        # libm.so is needed for ppc, as libgcc is linked against libm.so
        # No problem to create it for other archs.
        CT_DoLog EXTRA "Building dummy shared libs"
        CT_DoExecLog ALL "${cross}gcc" -nostdlib        \
                                       -nostartfiles    \
                                       -shared          \
                                       -x c /dev/null   \
                                       -o libdummy.so

        CT_DoLog EXTRA "Installing start files"
        CT_DoExecLog ALL install -m 0644 lib/crt1.o lib/crti.o lib/crtn.o   \
                                         "${CT_SYSROOT_DIR}/usr/lib"

        CT_DoLog EXTRA "Installing dummy shared libs"
        CT_DoExecLog ALL install -m 0755 libdummy.so "${CT_SYSROOT_DIR}/usr/lib/libc.so"
        CT_DoExecLog ALL install -m 0755 libdummy.so "${CT_SYSROOT_DIR}/usr/lib/libm.so"
    fi # CT_THREADS == nptl

    CT_EndStep
}

# This function build and install the full uClibc
do_libc() {
    CT_DoStep INFO "Installing C library"

    # Simply copy files until uClibc has the ability to build out-of-tree
    CT_DoLog EXTRA "Copying sources to build dir"
    CT_DoExecLog ALL cp -av "${CT_SRC_DIR}/uClibc-${CT_LIBC_VERSION}"   \
                            "${CT_BUILD_DIR}/build-libc"
    cd "${CT_BUILD_DIR}/build-libc"

    # Retrieve the config file
    CT_DoExecLog ALL cp "${CT_CONFIG_DIR}/uClibc.config" .config

    # uClibc uses the CROSS environment variable as a prefix to the compiler
    # tools to use.  The newly built tools should be in our path, so we need
    # only give the correct name for them.
    # Note about CFLAGS: In uClibc, CFLAGS are generated by Rules.mak,
    # depending  on the configuration of the library. That is, they are tailored
    # to best fit the target. So it is useless and seems to be a bad thing to
    # use LIBC_EXTRA_CFLAGS here.
    CT_DoLog EXTRA "Applying configuration"
    CT_DoYes "" |CT_DoExecLog CFG                                   \
                 make CROSS=${CT_TARGET}-                           \
                 PREFIX="${CT_SYSROOT_DIR}/"                        \
                 LOCALE_DATA_FILENAME="${uclibc_local_tarball}.tgz" \
                 oldconfig

    # We do _not_ want to strip anything for now, in case we specifically
    # asked for a debug toolchain, thus the STRIPTOOL= assignment
    # /Old/ versions can not build in //
    CT_DoLog EXTRA "Building C library"
    CT_DoExecLog ALL                                        \
    make -j1                                                \
         CROSS=${CT_TARGET}-                                \
         PREFIX="${CT_SYSROOT_DIR}/"                        \
         STRIPTOOL=true                                     \
         ${CT_LIBC_UCLIBC_VERBOSITY}                        \
         LOCALE_DATA_FILENAME="${uclibc_local_tarball}.tgz" \
         pregen
    CT_DoExecLog ALL                                        \
    make ${CT_LIBC_UCLIBC_PARALLEL:+${JOBSFLAGS}}           \
         CROSS=${CT_TARGET}-                                \
         PREFIX="${CT_SYSROOT_DIR}/"                        \
         STRIPTOOL=true                                     \
         ${CT_LIBC_UCLIBC_VERBOSITY}                        \
         LOCALE_DATA_FILENAME="${uclibc_local_tarball}.tgz" \
         all

    # YEM-FIXME:
    # - we want to install 'runtime' files, eg. lib*.{a,so*}, crti.o and
    #   such files, except the headers as they already are installed
    # - "make install_dev" installs the headers, the crti.o... and the
    #   static libs, but not the dynamic libs
    # - "make install_runtime" installs the dynamic libs only
    # - "make install" calls install_runtime and install_dev
    # - so we're left with re-installing the headers... Sigh...
    #
    # We do _not_ want to strip anything for now, in case we specifically
    # asked for a debug toolchain, hence the STRIPTOOL= assignment
    #
    # Note: JOBSFLAGS is not usefull for installation.
    #
    CT_DoLog EXTRA "Installing C library"
    CT_DoExecLog ALL                                        \
    make CROSS=${CT_TARGET}-                                \
         PREFIX="${CT_SYSROOT_DIR}/"                        \
         STRIPTOOL=true                                     \
         ${CT_LIBC_UCLIBC_VERBOSITY}                        \
         LOCALE_DATA_FILENAME="${uclibc_local_tarball}.tgz" \
         install

    CT_EndStep
}

# Initialises the .config file to sensible values
# $1: original file
# $2: munged file
mungeuClibcConfig() {
    src_config_file="$1"
    dst_config_file="$2"
    munge_file="${CT_BUILD_DIR}/munge-uClibc-config.sed"

    # Start with a fresh file
    rm -f "${munge_file}"
    touch "${munge_file}"

    # Do it all in a sub-shell, it's easier to redirect output
    (

    # Hack our target in the config file.
    case "${CT_ARCH}:${CT_ARCH_BITNESS}" in
        x86:32)      arch=i386;;
        x86:64)      arch=x86_64;;
        sh:32)       arch="sh";;
        sh:64)       arch="sh64";;
        blackfin:32) arch="bfin";;
        *)           arch="${CT_ARCH}";;
    esac
    # Also remove stripping: its the responsibility of the
    # firmware builder to strip or not.
    cat <<-ENDSED
		s/^(TARGET_.*)=y$/# \\1 is not set/
		s/^# TARGET_${arch} is not set/TARGET_${arch}=y/
		s/^TARGET_ARCH=".*"/TARGET_ARCH="${arch}"/
		s/.*(DOSTRIP).*/# \\1 is not set/
		ENDSED

    # Ah. We may one day need architecture-specific handler here...
    case "${CT_ARCH}" in
        arm)
            # Hack the ARM {E,O}ABI into the config file
            if [ "${CT_ARCH_ARM_EABI}" = "y" ]; then
                cat <<-ENDSED
					s/.*(CONFIG_ARM_OABI).*/# \\1 is not set/
					s/.*(CONFIG_ARM_EABI).*/\\1=y/
					ENDSED
            else
                cat <<-ENDSED
					s/.*(CONFIG_ARM_OABI).*/\\1=y/
					s/.*(CONFIG_ARM_EABI).*/# \\1 is not set/
					ENDSED
            fi
            ;;
        mips)
            case "${CT_ARCH_mips_ABI}" in
                32)
                    cat <<-ENDSED
						s/.*(CONFIG_MIPS_O32_ABI).*/\\1=y/
						s/.*(CONFIG_MIPS_N32_ABI).*/# \\1 is not set/
						s/.*(CONFIG_MIPS_N64_ABI).*/# \\1 is not set/
						ENDSED
                    ;;
                # For n32 and n64, also force the ISA
                # Not so sure this is pertinent, so it's
                # commented out for now. It would take a
                # (MIPS+uClibc) expert to either remove
                # or re-enable the overrides.
                n32)
                    cat <<-ENDSED
						s/.*(CONFIG_MIPS_O32_ABI).*/# \\1 is not set/
						s/.*(CONFIG_MIPS_N32_ABI).*/\\1=y/
						s/.*(CONFIG_MIPS_N64_ABI).*/# \\1 is not set/
						s/.*(CONFIG_MIPS_ISA_.*).*/# \\1 is not set/
						s/.*(CONFIG_MIPS_ISA_3).*/\\1=y/
						ENDSED
                    ;;
                64)
                    cat <<-ENDSED
						s/.*(CONFIG_MIPS_O32_ABI).*/# \\1 is not set/
						s/.*(CONFIG_MIPS_N32_ABI).*/# \\1 is not set/
						s/.*(CONFIG_MIPS_N64_ABI).*/\\1=y/
						s/.*(CONFIG_MIPS_ISA_.*).*/# \\1 is not set/
						s/.*(CONFIG_MIPS_ISA_MIPS64).*/\\1=y/
						ENDSED
                    ;;
            esac
            ;;
    esac

    # Accomodate for old and new uClibc versions, where the
    # way to select between big/little endian has changed
    case "${CT_ARCH_ENDIAN}" in
        big)
            cat <<-ENDSED
				s/.*(ARCH_LITTLE_ENDIAN).*/# \\1 is not set/
				s/.*(ARCH_BIG_ENDIAN).*/\\1=y/
				s/.*(ARCH_WANTS_LITTLE_ENDIAN).*/# \\1 is not set/
				s/.*(ARCH_WANTS_BIG_ENDIAN).*/\\1=y/
				ENDSED
        ;;
        little)
            cat <<-ENDSED
				s/.*(ARCH_LITTLE_ENDIAN).*/\\1=y/
				s/.*(ARCH_BIG_ENDIAN).*/# \\1 is not set/
				s/.*(ARCH_WANTS_LITTLE_ENDIAN).*/\\1=y/
				s/.*(ARCH_WANTS_BIG_ENDIAN).*/# \\1 is not set/
				ENDSED
        ;;
    esac

    # Accomodate for old and new uClibc versions, where the
    # MMU settings has different config knobs
    if [ "${CT_ARCH_USE_MMU}" = "y" ]; then
        cat <<-ENDSED
			s/.*(ARCH_HAS_MMU).*/\\1=y\nARCH_USE_MMU=y/
			ENDSED
    else
        cat <<-ENDSED
			s/.*(ARCH_HAS_MMU).*/# \\1 is not set/
			/.*(ARCH_USE_MMU).*/d
			ENDSED
    fi

    # Accomodate for old and new uClibc version, where the
    # way to select between hard/soft float has changed
    case "${CT_ARCH_FLOAT}" in
        hard|softfp)
            cat <<-ENDSED
				s/^[^_]*(HAS_FPU).*/\\1=y/
				s/.*(UCLIBC_HAS_FPU).*/\\1=y/
				ENDSED
            ;;
        soft)
            cat <<-ENDSED
				s/^[^_]*(HAS_FPU).*/\\# \\1 is not set/
				s/.*(UCLIBC_HAS_FPU).*/# \\1 is not set/
				ENDSED
            ;;
    esac
    if [ "${CT_LIBC_UCLIBC_FENV}" = "y" ]; then
        cat <<-ENDSED
			s/.*(UCLIBC_HAS_FENV).*/\\1=y/
			ENDSED
    fi

    # We always want ctor/dtor
    cat <<-ENDSED
		s/^# (UCLIBC_CTOR_DTOR) is not set/\\1=y/
		ENDSED

    # Change paths to work with crosstool-NG
    # From http://www.uclibc.org/cgi-bin/viewcvs.cgi?rev=16846&view=rev
    #  " we just want the kernel headers, not the whole kernel source ...
    #  " so people may need to update their paths slightly
    quoted_kernel_source=$(echo "${CT_HEADERS_DIR}" | sed -r -e 's,/include/?$,,; s,/,\\/,g;')
    quoted_headers_dir=$(echo "${CT_HEADERS_DIR}" | sed -r -e 's,/,\\/,g;')
    # CROSS_COMPILER_PREFIX is left as is, as the CROSS parameter is forced on the command line
    # DEVEL_PREFIX is left as '/usr/' because it is post-pended to $PREFIX, wich is the correct value of ${PREFIX}/${TARGET}
    # Some (old) versions of uClibc use KERNEL_SOURCE (which is _wrong_), and
    # newer versions use KERNEL_HEADERS (which is right).
    cat <<-ENDSED
		s/^DEVEL_PREFIX=".*"/DEVEL_PREFIX="\\/usr\\/"/
		s/^RUNTIME_PREFIX=".*"/RUNTIME_PREFIX="\\/"/
		s/^SHARED_LIB_LOADER_PREFIX=.*/SHARED_LIB_LOADER_PREFIX="\\/lib\\/"/
		s/^KERNEL_SOURCE=".*"/KERNEL_SOURCE="${quoted_kernel_source}"/
		s/^KERNEL_HEADERS=".*"/KERNEL_HEADERS="${quoted_headers_dir}"/
		s/^UCLIBC_DOWNLOAD_PREGENERATED_LOCALE=y/\\# UCLIBC_DOWNLOAD_PREGENERATED_LOCALE is not set/
		ENDSED

    if [ "${CT_USE_PIPES}" = "y" ]; then
        if grep UCLIBC_EXTRA_CFLAGS extra/Configs/Config.in >/dev/null 2>&1; then
            # Good, there is special provision for such things as -pipe!
            cat <<-ENDSED
				s/^(UCLIBC_EXTRA_CFLAGS=".*)"$/\\1 -pipe"/
				ENDSED
        else
            # Hack our -pipe into WARNINGS, which will be internally incorporated to
            # CFLAGS. This a dirty hack, but yet needed
            cat <<-ENDSED
				s/^(WARNINGS=".*)"$/\\1 -pipe"/
				ENDSED
        fi
    fi

    # Locales support
    # Note that the two PREGEN_LOCALE and the XLOCALE lines may be missing
    # entirely if LOCALE is not set.  If LOCALE was already set, we'll
    # assume the user has already made all the appropriate generation
    # arrangements.  Note that having the uClibc Makefile download the
    # pregenerated locales is not compatible with crosstool; besides,
    # crosstool downloads them as part of getandpatch.sh.
    case "${CT_LIBC_UCLIBC_LOCALES}:${CT_LIBC_UCLIBC_LOCALES_PREGEN_DATA}" in
        :*)
            ;;
        y:)
            cat <<-ENDSED
				s/^# UCLIBC_HAS_LOCALE is not set/UCLIBC_HAS_LOCALE=y\\
				# UCLIBC_PREGENERATED_LOCALE_DATA is not set\\
				# UCLIBC_DOWNLOAD_PREGENERATED_LOCALE_DATA is not set\\
				# UCLIBC_HAS_XLOCALE is not set/
				ENDSED
            ;;
        y:y)
            cat <<-ENDSED
				s/^# UCLIBC_HAS_LOCALE is not set/UCLIBC_HAS_LOCALE=y\\
				UCLIBC_PREGENERATED_LOCALE_DATA=y\\
				# UCLIBC_DOWNLOAD_PREGENERATED_LOCALE_DATA is not set\\
				# UCLIBC_HAS_XLOCALE is not set/
				ENDSED
            ;;
    esac

    # WCHAR support
    if [ "${CT_LIBC_UCLIBC_WCHAR}" = "y" ] ; then
        cat <<-ENDSED
			s/^.*UCLIBC_HAS_WCHAR.*/UCLIBC_HAS_WCHAR=y/
			ENDSED
    else
        cat <<-ENDSED
			s/^.*UCLIBC_HAS_WCHAR.*/UCLIBC_HAS_WCHAR=n/
			ENDSED
    fi

    # Force on options needed for C++ if we'll be making a C++ compiler.
    # I'm not sure locales are a requirement for doing C++... Are they?
    if [ "${CT_CC_LANG_CXX}" = "y" ]; then
        cat <<-ENDSED
			s/^# DO_C99_MATH is not set/DO_C99_MATH=y/
			s/^# UCLIBC_HAS_GNU_GETOPT is not set/UCLIBC_HAS_GNU_GETOPT=y/
			ENDSED
    fi

    # Push the threading model
    case "${CT_THREADS}:${CT_LIBC_UCLIBC_LNXTHRD}" in
        none:)
            cat <<-ENDSED
				s/^UCLIBC_HAS_THREADS=y/# UCLIBC_HAS_THREADS is not set/
				s/^LINUXTHREADS_OLD=y/# LINUXTHREADS_OLD is not set/
				s/^LINUXTHREADS_NEW=y/# LINUXTHREADS_NEW is not set/
				s/^UCLIBC_HAS_THREADS_NATIVE=y/# UCLIBC_HAS_THREADS_NATIVE is not set/
				ENDSED
            ;;
        linuxthreads:old)
            cat <<-ENDSED
				s/^# UCLIBC_HAS_THREADS is not set/UCLIBC_HAS_THREADS=y/
				s/^# LINUXTHREADS_OLD is not set/LINUXTHREADS_OLD=y/
				s/^LINUXTHREADS_NEW=y/# LINUXTHREADS_NEW is not set/
				s/^UCLIBC_HAS_THREADS_NATIVE=y/# UCLIBC_HAS_THREADS_NATIVE is not set/
				ENDSED
            ;;
        linuxthreads:new)
            cat <<-ENDSED
				s/^# UCLIBC_HAS_THREADS is not set/UCLIBC_HAS_THREADS=y/
				s/^LINUXTHREADS_OLD=y/# LINUXTHREADS_OLD is not set/
				s/^# LINUXTHREADS_NEW is not set/LINUXTHREADS_NEW=y/
				s/^UCLIBC_HAS_THREADS_NATIVE=y/# UCLIBC_HAS_THREADS_NATIVE is not set/
				ENDSED
            ;;
        nptl:)
            cat <<-ENDSED
				s/^HAS_NO_THREADS=y/# HAS_NO_THREADS is not set/
				s/^UCLIBC_HAS_THREADS=y/# UCLIBC_HAS_THREADS is not set/
				s/^LINUXTHREADS_OLD=y/# LINUXTHREADS_OLD is not set/
				s/^LINUXTHREADS_NEW=y/# LINUXTHREADS_NEW is not set/
				s/^# UCLIBC_HAS_THREADS_NATIVE is not set/UCLIBC_HAS_THREADS_NATIVE=y/
				ENDSED
            ;;
        *)
            CT_Abort "Incorrect thread settings: CT_THREADS='${CT_THREAD}' CT_LIBC_UCLIBC_LNXTHRD='${CT_LIBC_UCLIBC_LNXTHRD}'"
            ;;
    esac

    # Always build the libpthread_db
    cat <<-ENDSED
		s/^# PTHREADS_DEBUG_SUPPORT is not set.*/PTHREADS_DEBUG_SUPPORT=y/
		ENDSED

    # Force on debug options if asked for
    case "${CT_LIBC_UCLIBC_DEBUG_LEVEL}" in
      0)
        cat <<-ENDSED
			s/^DODEBUG=y/# DODEBUG is not set/
			s/^DODEBUG_PT=y/# DODEBUG_PT is not set/
			s/^DOASSERTS=y/# DOASSERTS is not set/
			s/^SUPPORT_LD_DEBUG=y/# SUPPORT_LD_DEBUG is not set/
			s/^SUPPORT_LD_DEBUG_EARLY=y/# SUPPORT_LD_DEBUG_EARLY is not set/
			s/^UCLIBC_MALLOC_DEBUGGING=y/# UCLIBC_MALLOC_DEBUGGING is not set/
			ENDSED
        ;;
      1)
        cat <<-ENDSED
			s/^# DODEBUG is not set.*/DODEBUG=y/
			s/^DODEBUG_PT=y/# DODEBUG_PT is not set/
			s/^DOASSERTS=y/# DOASSERTS is not set/
			s/^SUPPORT_LD_DEBUG=y/# SUPPORT_LD_DEBUG is not set/
			s/^SUPPORT_LD_DEBUG_EARLY=y/# SUPPORT_LD_DEBUG_EARLY is not set/
			s/^UCLIBC_MALLOC_DEBUGGING=y/# UCLIBC_MALLOC_DEBUGGING is not set/
			ENDSED
        ;;
      2)
        cat <<-ENDSED
			s/^# DODEBUG is not set.*/DODEBUG=y/
			s/^DODEBUG_PT=y/# DODEBUG_PT is not set/
			s/^# DOASSERTS is not set.*/DOASSERTS=y/
			s/^# SUPPORT_LD_DEBUG is not set.*/SUPPORT_LD_DEBUG=y/
			s/^SUPPORT_LD_DEBUG_EARLY=y/# SUPPORT_LD_DEBUG_EARLY is not set/
			s/^# UCLIBC_MALLOC_DEBUGGING is not set/UCLIBC_MALLOC_DEBUGGING=y/
			ENDSED
        ;;
      3)
        cat <<-ENDSED
			s/^# DODEBUG is not set.*/DODEBUG=y/
			s/^# DODEBUG_PT is not set.*/DODEBUG_PT=y/
			s/^# DOASSERTS is not set.*/DOASSERTS=y/
			s/^# SUPPORT_LD_DEBUG is not set.*/SUPPORT_LD_DEBUG=y/
			s/^# SUPPORT_LD_DEBUG_EARLY is not set.*/SUPPORT_LD_DEBUG_EARLY=y/
			s/^# UCLIBC_MALLOC_DEBUGGING is not set/UCLIBC_MALLOC_DEBUGGING=y/
			ENDSED
        ;;
    esac

    # And now, this is the end
    ) >>"${munge_file}"

    sed -r -f "${munge_file}" "${src_config_file}" >"${dst_config_file}"
}
