scripts/build/libc/uClibc.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Aug 30 00:57:40 2009 +0200 (2009-08-30)
changeset 1495 2542421e3321
parent 1326 56a811a04414
child 1639 bdf7ab3588c6
child 1709 39970edb42e5
permissions -rw-r--r--
tools wrapper: introduce the silent WRAPPER_NEEDED config option

Add the WRAPPER_NEEDED silent config option, that can be selected by
components that require it (companion libs so far).
Rely on this config option when deciding to install the wrapper,
instead of checking GMP/MPFR or PPL/CLoog/MPC.
yann@850
     1
# This file declares functions to install the uClibc C library
yann@850
     2
# Copyright 2007 Yann E. MORIN
yann@850
     3
# Licensed under the GPL v2. See COPYING in the root of this package
yann@850
     4
yann@850
     5
# Download uClibc
yann@850
     6
do_libc_get() {
yann@850
     7
    libc_src="http://www.uclibc.org/downloads
yann@850
     8
              http://www.uclibc.org/downloads/snapshots
yann@850
     9
              http://www.uclibc.org/downloads/old-releases"
yann@850
    10
    # For uClibc, we have almost every thing: releases, and snapshots
yann@850
    11
    # for the last month or so. We'll have to deal with svn revisions
yann@850
    12
    # later...
yann@1123
    13
    CT_GetFile "uClibc-${CT_LIBC_VERSION}" ${libc_src}
yann@850
    14
    # uClibc locales
yann@1126
    15
    if [ "${CT_LIBC_UCLIBC_LOCALES}" = "y" ]; then
yann@1126
    16
        CT_GetFile "uClibc-locale-030818" ${libc_src}
yann@1126
    17
    fi
yann@850
    18
yann@850
    19
    return 0
yann@850
    20
}
yann@850
    21
yann@850
    22
# Extract uClibc
yann@850
    23
do_libc_extract() {
yann@1126
    24
    CT_Extract "uClibc-${CT_LIBC_VERSION}"
yann@1126
    25
    CT_Patch "uClibc-${CT_LIBC_VERSION}"
yann@1126
    26
yann@850
    27
    # uClibc locales
yann@1123
    28
    if [ "${CT_LIBC_UCLIBC_LOCALES}" = "y" ]; then
yann@1126
    29
        CT_Pushd "${CT_SRC_DIR}/uClibc-${CT_LIBC_VERSION}/extra/locale"
yann@1126
    30
        CT_Extract "uClibc-locale-030818" nochdir
yann@1126
    31
        CT_Patch "uClibc-locale-030818" nochdir
yann@1123
    32
        CT_Popd
yann@1123
    33
    fi
yann@850
    34
yann@850
    35
    return 0
yann@850
    36
}
yann@850
    37
yann@850
    38
# Check that uClibc has been previously configured
yann@850
    39
do_libc_check_config() {
yann@850
    40
    CT_DoStep INFO "Checking C library configuration"
yann@850
    41
yann@850
    42
    CT_TestOrAbort "You did not provide a uClibc config file!" -n "${CT_LIBC_UCLIBC_CONFIG_FILE}" -a -f "${CT_LIBC_UCLIBC_CONFIG_FILE}"
yann@850
    43
yann@1247
    44
    if grep -E '^KERNEL_SOURCE=' "${CT_LIBC_UCLIBC_CONFIG_FILE}" >/dev/null 2>&1; then
yann@850
    45
        CT_DoLog WARN "Your uClibc version refers to the kernel _sources_, which is bad."
yann@850
    46
        CT_DoLog WARN "I can't guarantee that our little hack will work. Please try to upgrade."
yann@850
    47
    fi
yann@850
    48
yann@850
    49
    CT_DoLog EXTRA "Munging uClibc configuration"
yann@1272
    50
    mungeuClibcConfig "${CT_LIBC_UCLIBC_CONFIG_FILE}" "${CT_CONFIG_DIR}/uClibc.config"
yann@850
    51
yann@850
    52
    CT_EndStep
yann@850
    53
}
yann@850
    54
yann@850
    55
# This functions installs uClibc's headers
yann@850
    56
do_libc_headers() {
yann@1326
    57
    local install_rule
yann@1326
    58
yann@850
    59
    CT_DoStep INFO "Installing C library headers"
yann@850
    60
yann@850
    61
    mkdir -p "${CT_BUILD_DIR}/build-libc-headers"
yann@850
    62
    cd "${CT_BUILD_DIR}/build-libc-headers"
yann@850
    63
yann@850
    64
    # Simply copy files until uClibc has the ablity to build out-of-tree
yann@850
    65
    CT_DoLog EXTRA "Copying sources to build dir"
yann@1326
    66
    tar cf - -C "${CT_SRC_DIR}/uClibc-${CT_LIBC_VERSION}" . |tar xf -
yann@850
    67
yann@850
    68
    # Retrieve the config file
yann@1272
    69
    cp "${CT_CONFIG_DIR}/uClibc.config" .config
yann@850
    70
yann@850
    71
    # uClibc uses the CROSS environment variable as a prefix to the
yann@850
    72
    # compiler tools to use.  Setting it to the empty string forces
yann@850
    73
    # use of the native build host tools, which we need at this
yann@850
    74
    # stage, as we don't have target tools yet.
yann@850
    75
    CT_DoLog EXTRA "Applying configuration"
yann@850
    76
    CT_DoYes "" |CT_DoExecLog ALL make CROSS= PREFIX="${CT_SYSROOT_DIR}/" oldconfig
yann@850
    77
yann@850
    78
    CT_DoLog EXTRA "Building headers"
yann@850
    79
    CT_DoExecLog ALL make ${CT_LIBC_UCLIBC_VERBOSITY} CROSS= PREFIX="${CT_SYSROOT_DIR}/" headers
yann@850
    80
yann@1326
    81
    if [ "${CT_LIBC_UCLIBC_0_9_30_or_later}" = "y" ]; then
yann@1326
    82
        install_rule=install_headers
yann@1326
    83
    else
yann@1326
    84
        install_rule=install_dev
yann@1326
    85
    fi
yann@1326
    86
yann@850
    87
    CT_DoLog EXTRA "Installing headers"
yann@1331
    88
    CT_DoExecLog ALL make ${CT_LIBC_UCLIBC_VERBOSITY} CROSS= PREFIX="${CT_SYSROOT_DIR}/" "${install_rule}"
yann@850
    89
yann@850
    90
    CT_EndStep
yann@850
    91
}
yann@850
    92
yann@850
    93
# Build and install start files
yann@850
    94
do_libc_start_files() {
yann@850
    95
    :
yann@850
    96
}
yann@850
    97
yann@850
    98
# This function build and install the full uClibc
yann@850
    99
do_libc() {
yann@850
   100
    CT_DoStep INFO "Installing C library"
yann@850
   101
yann@850
   102
    mkdir -p "${CT_BUILD_DIR}/build-libc"
yann@850
   103
    cd "${CT_BUILD_DIR}/build-libc"
yann@850
   104
yann@850
   105
    # Simply copy files until uClibc has the ablity to build out-of-tree
yann@850
   106
    CT_DoLog EXTRA "Copying sources to build dir"
yann@1326
   107
    tar cf - -C "${CT_SRC_DIR}/uClibc-${CT_LIBC_VERSION}" . |tar xf -
yann@850
   108
yann@850
   109
    # Retrieve the config file
yann@1272
   110
    cp "${CT_CONFIG_DIR}/uClibc.config" .config
yann@850
   111
yann@850
   112
    # uClibc uses the CROSS environment variable as a prefix to the compiler
yann@850
   113
    # tools to use.  The newly built tools should be in our path, so we need
yann@850
   114
    # only give the correct name for them.
yann@850
   115
    # Note about CFLAGS: In uClibc, CFLAGS are generated by Rules.mak,
yann@850
   116
    # depending  on the configuration of the library. That is, they are tailored
yann@850
   117
    # to best fit the target. So it is useless and seems to be a bad thing to
yann@850
   118
    # use LIBC_EXTRA_CFLAGS here.
yann@850
   119
    CT_DoLog EXTRA "Applying configuration"
yann@850
   120
    CT_DoYes "" |CT_DoExecLog ALL               \
yann@850
   121
                 make CROSS=${CT_TARGET}-       \
yann@850
   122
                 PREFIX="${CT_SYSROOT_DIR}/"    \
yann@850
   123
                 oldconfig
yann@850
   124
yann@850
   125
    # We do _not_ want to strip anything for now, in case we specifically
yann@850
   126
    # asked for a debug toolchain, thus the STRIPTOOL= assignment
yann@1029
   127
    # /Old/ versions can not build in //
yann@850
   128
    CT_DoLog EXTRA "Building C library"
yann@1029
   129
    CT_DoExecLog ALL                                    \
yann@1029
   130
    make ${CT_LIBC_UCLIBC_PARALLEL:+${PARALLELMFLAGS}}  \
yann@1029
   131
         CROSS=${CT_TARGET}-                            \
yann@1029
   132
         PREFIX="${CT_SYSROOT_DIR}/"                    \
yann@1029
   133
         STRIPTOOL=true                                 \
yann@1029
   134
         ${CT_LIBC_UCLIBC_VERBOSITY}                    \
yann@850
   135
         all
yann@850
   136
yann@1326
   137
    # YEM-FIXME:
yann@1326
   138
    # - we want to install 'runtime' files, eg. lib*.{a,so*}, crti.o and
yann@1326
   139
    #   such files, except the headers as they already are installed
yann@1326
   140
    # - "make install_dev" installs the headers, the crti.o... and the
yann@1326
   141
    #   static libs, but not the dynamic libs
yann@1326
   142
    # - "make install_runtime" installs the dynamic libs only
yann@1326
   143
    # - "make install" calls install_runtime and install_dev
yann@1326
   144
    # - so we're left with re-installing the headers... Sigh...
yann@1326
   145
    #
yann@850
   146
    # We do _not_ want to strip anything for now, in case we specifically
yann@1027
   147
    # asked for a debug toolchain, hence the STRIPTOOL= assignment
yann@1326
   148
    #
yann@1326
   149
    # Note: PARALLELMFLAGS is not usefull for installation.
yann@1326
   150
    #
yann@850
   151
    CT_DoLog EXTRA "Installing C library"
yann@850
   152
    CT_DoExecLog ALL                    \
yann@850
   153
    make CROSS=${CT_TARGET}-            \
yann@850
   154
         PREFIX="${CT_SYSROOT_DIR}/"    \
yann@850
   155
         STRIPTOOL=true                 \
yann@850
   156
         ${CT_LIBC_UCLIBC_VERBOSITY}    \
yann@850
   157
         install
yann@850
   158
yann@1209
   159
    if [ "${CT_LIBC_UCLIBC_BUILD_CROSS_LDD}" = "y" ]; then
yann@1209
   160
        CT_DoLog EXTRA "Building C library cross-ldd"
yann@1209
   161
        CT_DoExecLog ALL                    \
yann@1209
   162
        make PREFIX="${CT_SYSROOT_DIR}/"    \
yann@1209
   163
             ${CT_LIBC_UCLIBC_VERBOSITY}    \
yann@1209
   164
             -C utils hostutils
yann@1209
   165
yann@1209
   166
        CT_DoLog EXTRA "Installing C library cross-ldd"
yann@1209
   167
        CT_DoExecLog ALL install -m 0755 utils/ldd.host "${CT_PREFIX_DIR}/bin/${CT_TARGET}-ldd"
yann@1209
   168
    fi
yann@1209
   169
yann@850
   170
    CT_EndStep
yann@850
   171
}
yann@850
   172
yann@850
   173
# This function is used to install those components needing the final C compiler
yann@850
   174
do_libc_finish() {
yann@1209
   175
    :
yann@850
   176
}
yann@850
   177
yann@850
   178
# Initialises the .config file to sensible values
yann@850
   179
# $1: original file
yann@850
   180
# $2: munged file
yann@850
   181
mungeuClibcConfig() {
yann@850
   182
    src_config_file="$1"
yann@850
   183
    dst_config_file="$2"
yann@850
   184
    munge_file="${CT_BUILD_DIR}/munge-uClibc-config.sed"
yann@850
   185
yann@850
   186
    # Start with a fresh file
yann@850
   187
    rm -f "${munge_file}"
yann@850
   188
    touch "${munge_file}"
yann@850
   189
yann@850
   190
    # Hack our target in the config file.
yann@850
   191
    # Also remove stripping: its the responsibility of the
yann@850
   192
    # firmware builder to strip or not.
yann@850
   193
    cat >>"${munge_file}" <<-ENDSED
yann@850
   194
s/^(TARGET_.*)=y$/# \\1 is not set/
yann@850
   195
s/^# TARGET_${CT_KERNEL_ARCH} is not set/TARGET_${CT_KERNEL_ARCH}=y/
yann@850
   196
s/^TARGET_ARCH=".*"/TARGET_ARCH="${CT_KERNEL_ARCH}"/
yann@850
   197
s/.*(DOSTRIP).*/# \\1 is not set/
yann@850
   198
ENDSED
yann@850
   199
yann@850
   200
    # Ah. We may one day need architecture-specific handler here...
yann@850
   201
    # Hack the ARM {E,O}ABI into the config file
yann@850
   202
    if [ "${CT_ARCH_ARM_EABI}" = "y" ]; then
yann@850
   203
        cat >>"${munge_file}" <<-ENDSED
yann@850
   204
s/.*(CONFIG_ARM_OABI).*/# \\1 is not set/
yann@850
   205
s/.*(CONFIG_ARM_EABI).*/\\1=y/
yann@850
   206
ENDSED
yann@850
   207
    else
yann@850
   208
        cat >>"${munge_file}" <<-ENDSED
yann@850
   209
s/.*(CONFIG_ARM_OABI).*/\\1=y/
yann@850
   210
s/.*(CONFIG_ARM_EABI).*/# \\1 is not set/
yann@850
   211
ENDSED
yann@850
   212
    fi
yann@850
   213
yann@850
   214
    # Accomodate for old and new uClibc versions, where the
yann@850
   215
    # way to select between big/little endian has changed
yann@850
   216
    case "${CT_ARCH_BE},${CT_ARCH_LE}" in
yann@850
   217
        y,) cat >>"${munge_file}" <<-ENDSED
yann@850
   218
s/.*(ARCH_LITTLE_ENDIAN).*/# \\1 is not set/
yann@850
   219
s/.*(ARCH_BIG_ENDIAN).*/\\1=y/
yann@850
   220
s/.*(ARCH_WANTS_LITTLE_ENDIAN).*/# \\1 is not set/
yann@850
   221
s/.*(ARCH_WANTS_BIG_ENDIAN).*/\\1=y/
yann@850
   222
ENDSED
yann@850
   223
        ;;
yann@850
   224
        ,y) cat >>"${munge_file}" <<-ENDSED
yann@850
   225
s/.*(ARCH_LITTLE_ENDIAN).*/\\1=y/
yann@850
   226
s/.*(ARCH_BIG_ENDIAN).*/# \\1 is not set/
yann@850
   227
s/.*(ARCH_WANTS_LITTLE_ENDIAN).*/\\1=y/
yann@850
   228
s/.*(ARCH_WANTS_BIG_ENDIAN).*/# \\1 is not set/
yann@850
   229
ENDSED
yann@850
   230
        ;;
yann@850
   231
    esac
yann@850
   232
yann@850
   233
    # Accomodate for old and new uClibc version, where the
yann@850
   234
    # way to select between hard/soft float has changed
yann@850
   235
    case "${CT_ARCH_FLOAT_HW},${CT_ARCH_FLOAT_SW}" in
yann@850
   236
        y,) cat >>"${munge_file}" <<-ENDSED
yann@850
   237
s/^[^_]*(HAS_FPU).*/\\1=y/
yann@850
   238
s/.*(UCLIBC_HAS_FPU).*/\\1=y/
yann@850
   239
ENDSED
yann@850
   240
            ;;
yann@850
   241
        ,y) cat >>"${munge_file}" <<-ENDSED
yann@850
   242
s/^[^_]*(HAS_FPU).*/\\# \\1 is not set/
yann@850
   243
s/.*(UCLIBC_HAS_FPU).*/# \\1 is not set/
yann@850
   244
ENDSED
yann@850
   245
            ;;
yann@850
   246
    esac
yann@850
   247
yann@850
   248
    # Change paths to work with crosstool-NG
yann@850
   249
    # From http://www.uclibc.org/cgi-bin/viewcvs.cgi?rev=16846&view=rev
yann@850
   250
    #  " we just want the kernel headers, not the whole kernel source ...
yann@850
   251
    #  " so people may need to update their paths slightly
yann@850
   252
    quoted_kernel_source=$(echo "${CT_HEADERS_DIR}" | sed -r -e 's,/include/?$,,; s,/,\\/,g;')
yann@850
   253
    quoted_headers_dir=$(echo "${CT_HEADERS_DIR}" | sed -r -e 's,/,\\/,g;')
yann@850
   254
    # CROSS_COMPILER_PREFIX is left as is, as the CROSS parameter is forced on the command line
yann@850
   255
    # DEVEL_PREFIX is left as '/usr/' because it is post-pended to $PREFIX, wich is the correct value of ${PREFIX}/${TARGET}
yann@850
   256
    # Some (old) versions of uClibc use KERNEL_SOURCE (which is _wrong_), and
yann@850
   257
    # newer versions use KERNEL_HEADERS (which is right). See:
yann@850
   258
    cat >>"${munge_file}" <<-ENDSED
yann@850
   259
s/^DEVEL_PREFIX=".*"/DEVEL_PREFIX="\\/usr\\/"/
yann@850
   260
s/^RUNTIME_PREFIX=".*"/RUNTIME_PREFIX="\\/"/
yann@850
   261
s/^SHARED_LIB_LOADER_PREFIX=.*/SHARED_LIB_LOADER_PREFIX="\\/lib\\/"/
yann@850
   262
s/^KERNEL_SOURCE=".*"/KERNEL_SOURCE="${quoted_kernel_source}"/
yann@850
   263
s/^KERNEL_HEADERS=".*"/KERNEL_HEADERS="${quoted_headers_dir}"/
yann@850
   264
s/^UCLIBC_DOWNLOAD_PREGENERATED_LOCALE=y/\\# UCLIBC_DOWNLOAD_PREGENERATED_LOCALE is not set/
yann@850
   265
ENDSED
yann@850
   266
yann@850
   267
    if [ "${CT_USE_PIPES}" = "y" ]; then
yann@850
   268
        if grep UCLIBC_EXTRA_CFLAGS extra/Configs/Config.in >/dev/null 2>&1; then
yann@850
   269
            # Good, there is special provision for such things as -pipe!
yann@850
   270
            cat >>"${munge_file}" <<-ENDSED
yann@850
   271
s/^(UCLIBC_EXTRA_CFLAGS=".*)"$/\\1 -pipe"/
yann@850
   272
ENDSED
yann@850
   273
        else
yann@850
   274
            # Hack our -pipe into WARNINGS, which will be internally incorporated to
yann@850
   275
            # CFLAGS. This a dirty hack, but yet needed
yann@850
   276
            cat >> "${munge_file}" <<-ENDSED
yann@850
   277
s/^(WARNINGS=".*)"$/\\1 -pipe"/
yann@850
   278
ENDSED
yann@850
   279
        fi
yann@850
   280
    fi
yann@850
   281
yann@1028
   282
    # Locales support
yann@850
   283
    # Note that the two PREGEN_LOCALE and the XLOCALE lines may be missing
yann@850
   284
    # entirely if LOCALE is not set.  If LOCALE was already set, we'll
yann@850
   285
    # assume the user has already made all the appropriate generation
yann@850
   286
    # arrangements.  Note that having the uClibc Makefile download the
yann@850
   287
    # pregenerated locales is not compatible with crosstool; besides,
yann@850
   288
    # crosstool downloads them as part of getandpatch.sh.
yann@1028
   289
    if [ "${CT_LIBC_UCLIBC_LOCALES}" = "y" ] ; then
yann@1028
   290
       cat >>"${munge_file}" <<-ENDSED
yann@1028
   291
s/^# UCLIBC_HAS_LOCALE is not set/UCLIBC_HAS_LOCALE=y\\nUCLIBC_PREGENERATED_LOCALE_DATA=y\\n\\# UCLIBC_DOWNLOAD_PREGENERATED_LOCALE_DATA is not set\\n\\# UCLIBC_HAS_XLOCALE is not
yann@1028
   292
ENDSED
yann@1028
   293
    fi
yann@1028
   294
yann@1028
   295
    # Force on options needed for C++ if we'll be making a C++ compiler.
yann@1028
   296
    # I'm not sure locales are a requirement for doing C++... Are they?
yann@850
   297
    if [ "${CT_CC_LANG_CXX}" = "y" ]; then
yann@850
   298
        cat >>"${munge_file}" <<-ENDSED
yann@850
   299
s/^# DO_C99_MATH is not set/DO_C99_MATH=y/
yann@850
   300
s/^# UCLIBC_CTOR_DTOR is not set/UCLIBC_CTOR_DTOR=y/
yann@850
   301
# Add these three lines when doing C++?
yann@850
   302
s/^# UCLIBC_HAS_WCHAR is not set/UCLIBC_HAS_WCHAR=y/
yann@850
   303
#s/^# UCLIBC_HAS_LOCALE is not set/UCLIBC_HAS_LOCALE=y\\nUCLIBC_PREGENERATED_LOCALE_DATA=y\\n\\# UCLIBC_DOWNLOAD_PREGENERATED_LOCALE_DATA is not set\\n\\# UCLIBC_HAS_XLOCALE is not set/
yann@850
   304
s/^# UCLIBC_HAS_GNU_GETOPT is not set/UCLIBC_HAS_GNU_GETOPT=y/
yann@850
   305
ENDSED
yann@850
   306
    fi
yann@850
   307
yann@850
   308
    # Always build the libpthread_db
yann@850
   309
    cat >>"${munge_file}" <<-ENDSED
yann@850
   310
s/^# PTHREADS_DEBUG_SUPPORT is not set.*/PTHREADS_DEBUG_SUPPORT=y/
yann@850
   311
ENDSED
yann@850
   312
yann@850
   313
    # Force on debug options if asked for
yann@850
   314
    case "${CT_LIBC_UCLIBC_DEBUG_LEVEL}" in
yann@850
   315
      0)
yann@850
   316
        cat >>"${munge_file}" <<-ENDSED
yann@850
   317
s/^DODEBUG=y/# DODEBUG is not set/
yann@850
   318
s/^DODEBUG_PT=y/# DODEBUG_PT is not set/
yann@850
   319
s/^DOASSERTS=y/# DOASSERTS is not set/
yann@850
   320
s/^SUPPORT_LD_DEBUG=y/# SUPPORT_LD_DEBUG is not set/
yann@850
   321
s/^SUPPORT_LD_DEBUG_EARLY=y/# SUPPORT_LD_DEBUG_EARLY is not set/
yann@850
   322
s/^UCLIBC_MALLOC_DEBUGGING=y/# UCLIBC_MALLOC_DEBUGGING is not set/
yann@850
   323
ENDSED
yann@850
   324
        ;;
yann@850
   325
      1)
yann@850
   326
        cat >>"${munge_file}" <<-ENDSED
yann@850
   327
s/^# DODEBUG is not set.*/DODEBUG=y/
yann@850
   328
s/^DODEBUG_PT=y/# DODEBUG_PT is not set/
yann@850
   329
s/^DOASSERTS=y/# DOASSERTS is not set/
yann@850
   330
s/^SUPPORT_LD_DEBUG=y/# SUPPORT_LD_DEBUG is not set/
yann@850
   331
s/^SUPPORT_LD_DEBUG_EARLY=y/# SUPPORT_LD_DEBUG_EARLY is not set/
yann@850
   332
s/^UCLIBC_MALLOC_DEBUGGING=y/# UCLIBC_MALLOC_DEBUGGING is not set/
yann@850
   333
ENDSED
yann@850
   334
        ;;
yann@850
   335
      2)
yann@850
   336
        cat >>"${munge_file}" <<-ENDSED
yann@850
   337
s/^# DODEBUG is not set.*/DODEBUG=y/
yann@850
   338
s/^# DODEBUG_PT is not set.*/DODEBUG_PT=y/
yann@850
   339
s/^# DOASSERTS is not set.*/DOASSERTS=y/
yann@850
   340
s/^# SUPPORT_LD_DEBUG is not set.*/SUPPORT_LD_DEBUG=y/
yann@850
   341
s/^# SUPPORT_LD_DEBUG_EARLY is not set.*/SUPPORT_LD_DEBUG_EARLY=y/
yann@850
   342
s/^# UCLIBC_MALLOC_DEBUGGING is not set/UCLIBC_MALLOC_DEBUGGING=y/
yann@850
   343
ENDSED
yann@850
   344
        ;;
yann@850
   345
    esac
yann@850
   346
    sed -r -f "${munge_file}" "${src_config_file}" >"${dst_config_file}"
yann@850
   347
}