author | "Nicolás Reynolds" <fauno@kiwwwi.com.ar> |
Fri May 27 22:02:30 2011 -0300 (2011-05-27) | |
changeset 2482 | af25723a794f |
parent 2278 | e86826b8621a |
child 2483 | fa3a18f9abcf |
permissions | -rw-r--r-- |
yann@850 | 1 |
# eglibc build functions (initially by Thomas JOURDAN). |
yann@850 | 2 |
|
yann@2270 | 3 |
# Add the definitions common to glibc and eglibc |
yann@2270 | 4 |
# do_libc_start_files |
yann@2270 | 5 |
# do_libc |
yann@2270 | 6 |
# do_libc_finish |
yann@2270 | 7 |
# do_libc_add_ons_list |
yann@2270 | 8 |
. "${CT_LIB_DIR}/scripts/build/libc/glibc-eglibc.sh-common" |
yann@2270 | 9 |
|
yann@850 | 10 |
# Download eglibc repository |
yann@850 | 11 |
do_eglibc_get() { |
yann@850 | 12 |
CT_HasOrAbort svn |
yann@850 | 13 |
|
yann@850 | 14 |
case "${CT_LIBC_VERSION}" in |
yann@850 | 15 |
trunk) svn_url="svn://svn.eglibc.org/trunk";; |
yann@850 | 16 |
*) svn_url="svn://svn.eglibc.org/branches/eglibc-${CT_LIBC_VERSION}";; |
yann@850 | 17 |
esac |
yann@850 | 18 |
|
yann@850 | 19 |
case "${CT_EGLIBC_CHECKOUT}" in |
yann@850 | 20 |
y) svn_action="checkout";; |
yann@850 | 21 |
*) svn_action="export --force";; |
yann@850 | 22 |
esac |
yann@850 | 23 |
|
bob@2178 | 24 |
CT_DoExecLog ALL svn ${svn_action} -r "${CT_EGLIBC_REVISION:-HEAD}" "${svn_url}" "$(pwd)" |
yann@850 | 25 |
|
yann@850 | 26 |
# Compress eglibc |
yann@1123 | 27 |
CT_DoExecLog ALL mv libc "eglibc-${CT_LIBC_VERSION}" |
yann@1123 | 28 |
CT_DoExecLog ALL tar cjf "eglibc-${CT_LIBC_VERSION}.tar.bz2" "eglibc-${CT_LIBC_VERSION}" |
yann@850 | 29 |
|
yann@850 | 30 |
# Compress linuxthreads, localedef and ports |
yann@850 | 31 |
# Assign them the name the way ct-ng like it |
yann@850 | 32 |
for addon in linuxthreads localedef ports; do |
yann@1123 | 33 |
CT_DoExecLog ALL mv "${addon}" "eglibc-${addon}-${CT_LIBC_VERSION}" |
yann@1123 | 34 |
CT_DoExecLog ALL tar cjf "eglibc-${addon}-${CT_LIBC_VERSION}.tar.bz2" "eglibc-${addon}-${CT_LIBC_VERSION}" |
yann@850 | 35 |
done |
yann@850 | 36 |
} |
yann@850 | 37 |
|
yann@850 | 38 |
# Download glibc |
yann@850 | 39 |
do_libc_get() { |
yann@850 | 40 |
# eglibc is only available through subversion, there are no |
yann@850 | 41 |
# snapshots available. Moreover, addons will be downloaded |
yann@850 | 42 |
# simultaneously. |
yann@850 | 43 |
|
yann@850 | 44 |
# build filename |
yann@1123 | 45 |
eglibc="eglibc-${CT_LIBC_VERSION}.tar.bz2" |
yann@850 | 46 |
eglibc_linuxthreads="${CT_LIBC}-linuxthreads-${CT_LIBC_VERSION}.tar.bz2" |
yann@850 | 47 |
eglibc_localedef="${CT_LIBC}-localedef-${CT_LIBC_VERSION}.tar.bz2" |
yann@850 | 48 |
eglibc_ports="${CT_LIBC}-ports-${CT_LIBC_VERSION}.tar.bz2" |
yann@850 | 49 |
|
yann@850 | 50 |
# Check if every tarballs are already present |
yann@1476 | 51 |
if [ -f "${CT_TARBALLS_DIR}/${eglibc}" \ |
yann@1476 | 52 |
-a -f "${CT_TARBALLS_DIR}/${eglibc_linuxthreads}" \ |
yann@1476 | 53 |
-a -f "${CT_TARBALLS_DIR}/${eglibc_localedef}" \ |
yann@1476 | 54 |
-a -f "${CT_TARBALLS_DIR}/${eglibc_ports}" \ |
yann@1476 | 55 |
]; then |
yann@850 | 56 |
CT_DoLog DEBUG "Already have 'eglibc-${CT_LIBC_VERSION}'" |
yann@850 | 57 |
return 0 |
yann@850 | 58 |
fi |
yann@850 | 59 |
|
yann@1476 | 60 |
if [ -f "${CT_LOCAL_TARBALLS_DIR}/${eglibc}" \ |
yann@1476 | 61 |
-a -f "${CT_LOCAL_TARBALLS_DIR}/${eglibc_linuxthreads}" \ |
yann@1476 | 62 |
-a -f "${CT_LOCAL_TARBALLS_DIR}/${eglibc_localedef}" \ |
yann@1476 | 63 |
-a -f "${CT_LOCAL_TARBALLS_DIR}/${eglibc_ports}" \ |
yann@1528 | 64 |
-a "${CT_FORCE_DOWNLOAD}" != "y" \ |
yann@1476 | 65 |
]; then |
yann@850 | 66 |
CT_DoLog DEBUG "Got 'eglibc-${CT_LIBC_VERSION}' from local storage" |
yann@850 | 67 |
for file in ${eglibc} ${eglibc_linuxthreads} ${eglibc_localedef} ${eglibc_ports}; do |
yann@850 | 68 |
CT_DoExecLog ALL ln -s "${CT_LOCAL_TARBALLS_DIR}/${file}" "${CT_TARBALLS_DIR}/${file}" |
yann@850 | 69 |
done |
yann@850 | 70 |
return 0 |
yann@850 | 71 |
fi |
yann@850 | 72 |
|
yann@850 | 73 |
# Not found locally, try from the network |
yann@850 | 74 |
CT_DoLog EXTRA "Retrieving 'eglibc-${CT_LIBC_VERSION}'" |
yann@867 | 75 |
|
yann@867 | 76 |
CT_MktempDir tmp_dir |
yann@867 | 77 |
CT_Pushd "${tmp_dir}" |
yann@867 | 78 |
|
yann@850 | 79 |
do_eglibc_get |
yann@867 | 80 |
CT_DoLog DEBUG "Moving 'eglibc-${CT_LIBC_VERSION}' to tarball directory" |
yann@867 | 81 |
for file in ${eglibc} ${eglibc_linuxthreads} ${eglibc_localedef} ${eglibc_ports}; do |
yann@867 | 82 |
CT_DoExecLog ALL mv -f "${file}" "${CT_TARBALLS_DIR}" |
yann@867 | 83 |
done |
yann@867 | 84 |
|
yann@867 | 85 |
CT_Popd |
yann@867 | 86 |
|
yann@867 | 87 |
# Remove source files |
yann@867 | 88 |
CT_DoExecLog ALL rm -rf "${tmp_dir}" |
yann@850 | 89 |
|
yann@850 | 90 |
if [ "${CT_SAVE_TARBALLS}" = "y" ]; then |
yann@850 | 91 |
CT_DoLog EXTRA "Saving 'eglibc-${CT_LIBC_VERSION}' to local storage" |
yann@850 | 92 |
for file in ${eglibc} ${eglibc_linuxthreads} ${eglibc_localedef} ${eglibc_ports}; do |
yann@850 | 93 |
CT_DoExecLog ALL mv -f "${CT_TARBALLS_DIR}/${file}" "${CT_LOCAL_TARBALLS_DIR}" |
yann@850 | 94 |
CT_DoExecLog ALL ln -s "${CT_LOCAL_TARBALLS_DIR}/${file}" "${CT_TARBALLS_DIR}/${file}" |
yann@850 | 95 |
done |
yann@850 | 96 |
fi |
yann@850 | 97 |
|
yann@850 | 98 |
return 0 |
yann@850 | 99 |
} |
yann@850 | 100 |
|
yann@850 | 101 |
# Extract eglibc |
yann@850 | 102 |
do_libc_extract() { |
yann@1126 | 103 |
CT_Extract "eglibc-${CT_LIBC_VERSION}" |
yann@1901 | 104 |
CT_Patch "eglibc" "${CT_LIBC_VERSION}" |
yann@850 | 105 |
|
yann@850 | 106 |
# C library addons |
yann@850 | 107 |
for addon in $(do_libc_add_ons_list " "); do |
yann@850 | 108 |
# NPTL addon is not to be extracted, in any case |
yann@850 | 109 |
[ "${addon}" = "nptl" ] && continue || true |
yann@1123 | 110 |
CT_Pushd "${CT_SRC_DIR}/eglibc-${CT_LIBC_VERSION}" |
yann@1761 | 111 |
CT_Extract nochdir "eglibc-${addon}-${CT_LIBC_VERSION}" |
fauno@2482 | 112 |
|
fauno@2482 | 113 |
CT_TestAndAbort "Error in add-on '${addon}': both short and long names in tarball" \ |
fauno@2482 | 114 |
-d "${addon}" -a -d "eglibc-${addon}-${CT_LIBC_VERSION}" |
fauno@2482 | 115 |
|
yann@1126 | 116 |
# Some addons have the 'long' name, while others have the |
yann@1126 | 117 |
# 'short' name, but patches are non-uniformly built with |
yann@1126 | 118 |
# either the 'long' or 'short' name, whatever the addons name |
fauno@2482 | 119 |
# but we prefer the 'short' name and avoid duplicates. |
fauno@2482 | 120 |
if [ -d "eglibc-${addon}-${CT_LIBC_VERSION}" ]; then |
fauno@2482 | 121 |
mv "eglibc-${addon}-${CT_LIBC_VERSION}" "${addon}" |
fauno@2482 | 122 |
fi |
fauno@2482 | 123 |
|
fauno@2482 | 124 |
ln -s "${addon}" "eglibc-${addon}-${CT_LIBC_VERSION}" |
fauno@2482 | 125 |
|
yann@1901 | 126 |
CT_Patch nochdir "eglibc" "${addon}-${CT_LIBC_VERSION}" |
fauno@2482 | 127 |
|
fauno@2482 | 128 |
# Remove the long name since it can confuse configure scripts to run |
fauno@2482 | 129 |
# the same source twice. |
fauno@2482 | 130 |
rm "eglibc-${addon}-${CT_LIBC_VERSION}" |
fauno@2482 | 131 |
|
yann@1123 | 132 |
CT_Popd |
yann@850 | 133 |
done |
yann@850 | 134 |
|
yann@884 | 135 |
# The configure files may be older than the configure.in files |
yann@884 | 136 |
# if using a snapshot (or even some tarballs). Fake them being |
yann@884 | 137 |
# up to date. |
yann@1123 | 138 |
find "${CT_SRC_DIR}/eglibc-${CT_LIBC_VERSION}" -type f -name configure -exec touch {} \; 2>&1 |CT_DoLog ALL |
yann@884 | 139 |
|
yann@850 | 140 |
return 0 |
yann@850 | 141 |
} |
yann@850 | 142 |
|
avrac@1569 | 143 |
# Copy user provided eglibc configuration file if provided |
yann@850 | 144 |
do_libc_check_config() { |
avrac@1569 | 145 |
if [ "${CT_EGLIBC_CUSTOM_CONFIG}" != "y" ]; then |
avrac@1569 | 146 |
return 0 |
avrac@1569 | 147 |
fi |
avrac@1569 | 148 |
|
avrac@1569 | 149 |
CT_DoStep INFO "Checking C library configuration" |
avrac@1569 | 150 |
|
avrac@1569 | 151 |
CT_TestOrAbort "You did not provide an eglibc config file!" \ |
avrac@1569 | 152 |
-n "${CT_EGLIBC_OPTION_GROUPS_FILE}" -a \ |
avrac@1569 | 153 |
-f "${CT_EGLIBC_OPTION_GROUPS_FILE}" |
avrac@1569 | 154 |
|
avrac@1569 | 155 |
CT_DoExecLog ALL cp "${CT_EGLIBC_OPTION_GROUPS_FILE}" "${CT_CONFIG_DIR}/eglibc.config" |
avrac@1569 | 156 |
|
avrac@1569 | 157 |
# NSS configuration |
avrac@1569 | 158 |
if grep -E '^OPTION_EGLIBC_NSSWITCH[[:space:]]*=[[:space:]]*n' "${CT_EGLIBC_OPTION_GROUPS_FILE}" >/dev/null 2>&1; then |
avrac@1569 | 159 |
CT_DoLog DEBUG "Using fixed-configuration nsswitch facility" |
avrac@1569 | 160 |
|
avrac@1569 | 161 |
if [ "${CT_EGLIBC_BUNDLED_NSS_CONFIG}" = "y" ]; then |
avrac@1569 | 162 |
nss_config="${CT_SRC_DIR}/eglibc-${CT_LIBC_VERSION}/nss/fixed-nsswitch.conf" |
avrac@1569 | 163 |
else |
avrac@1569 | 164 |
nss_config="${CT_EGLIBC_NSS_CONFIG_FILE}" |
avrac@1569 | 165 |
fi |
avrac@1569 | 166 |
CT_TestOrAbort "NSS config file not found!" -n "${nss_config}" -a -f "${nss_config}" |
avrac@1569 | 167 |
|
avrac@1569 | 168 |
CT_DoExecLog ALL cp "${nss_config}" "${CT_CONFIG_DIR}/nsswitch.config" |
avrac@1569 | 169 |
echo "OPTION_EGLIBC_NSSWITCH_FIXED_CONFIG = ${CT_CONFIG_DIR}/nsswitch.config" \ |
avrac@1569 | 170 |
>> "${CT_CONFIG_DIR}/eglibc.config" |
avrac@1569 | 171 |
|
avrac@1569 | 172 |
if [ "${CT_EGLIBC_BUNDLED_NSS_FUNCTIONS}" = "y" ]; then |
avrac@1569 | 173 |
nss_functions="${CT_SRC_DIR}/eglibc-${CT_LIBC_VERSION}/nss/fixed-nsswitch.functions" |
avrac@1569 | 174 |
else |
avrac@1569 | 175 |
nss_functions="${CT_EGLIBC_NSS_FUNCTIONS_FILE}" |
avrac@1569 | 176 |
fi |
avrac@1569 | 177 |
CT_TestOrAbort "NSS functions file not found!" -n "${nss_functions}" -a -f "${nss_functions}" |
avrac@1569 | 178 |
|
avrac@1569 | 179 |
CT_DoExecLog ALL cp "${nss_functions}" "${CT_CONFIG_DIR}/nsswitch.functions" |
avrac@1569 | 180 |
echo "OPTION_EGLIBC_NSSWITCH_FIXED_FUNCTIONS = ${CT_CONFIG_DIR}/nsswitch.functions" \ |
avrac@1569 | 181 |
>> "${CT_CONFIG_DIR}/eglibc.config" |
avrac@1569 | 182 |
else |
avrac@1569 | 183 |
CT_DoLog DEBUG "Using full-blown nsswitch facility" |
avrac@1569 | 184 |
fi |
avrac@1569 | 185 |
|
avrac@1569 | 186 |
CT_EndStep |
yann@850 | 187 |
} |