yann@1186
|
1 |
#!@@CT_bash@@
|
yann@63
|
2 |
|
yann@63
|
3 |
# This script is responsible for saving the current configuration into a
|
yann@63
|
4 |
# sample to be used later on as a pre-configured target.
|
yann@63
|
5 |
|
yann@63
|
6 |
# What we need to save:
|
yann@63
|
7 |
# - the .config file
|
yann@63
|
8 |
# - the uClibc .config file if uClibc selected
|
yann@935
|
9 |
# - info about who reported the sample
|
yann@935
|
10 |
|
yann@1186
|
11 |
# Parse the tools' paths configuration
|
yann@2838
|
12 |
. "${CT_LIB_DIR}/paths.sh"
|
yann@1186
|
13 |
|
yann@935
|
14 |
# We'll need the stdout later, save it
|
yann@935
|
15 |
exec 7>&1
|
yann@63
|
16 |
|
yann@182
|
17 |
. "${CT_LIB_DIR}/scripts/functions"
|
yann@63
|
18 |
|
yann@165
|
19 |
# Don't care about any log file
|
yann@115
|
20 |
exec >/dev/null
|
yann@165
|
21 |
rm -f "${tmp_log_file}"
|
yann@84
|
22 |
|
yann@63
|
23 |
# Parse the configuration file
|
yann@1935
|
24 |
# Don't use CT_TestOrAbort, it prints the test string to [DEBUG]
|
yann@2576
|
25 |
# Note: we just need the non-mangled .config, not .config.2
|
yann@2576
|
26 |
if [ ! -f .config ]; then
|
yann@1935
|
27 |
CT_Abort "Configuration file not found. Please create one."
|
yann@1935
|
28 |
fi
|
yann@2576
|
29 |
. .config
|
yann@63
|
30 |
|
yann@1223
|
31 |
# We can not reliably save a sample which either uses local patches
|
yann@1223
|
32 |
# and/or custom Linux kernel headers. Warn the user about this issue
|
yann@1223
|
33 |
# and continue if he/she confirms sving the sample.
|
yann@1223
|
34 |
if [ "${CT_CUSTOM_PATCH}" = "y" ]; then
|
yann@1223
|
35 |
exec >&7
|
yann@1223
|
36 |
echo "You are using local patches."
|
yann@1223
|
37 |
echo "You will not be able to (easily) share this sample in this case."
|
yann@1223
|
38 |
read -p "Press Ctrl-C to stop now, or Enter to continue..."
|
yann@1223
|
39 |
fi
|
yann@1223
|
40 |
if [ "${CT_KERNEL_LINUX_USE_CUSTOM_HEADERS}" = "y" ]; then
|
yann@1223
|
41 |
exec >&7
|
yann@1223
|
42 |
echo "You are using custom Linux headers."
|
yann@1223
|
43 |
echo "You will not be able to (easily) share this sample in this case."
|
yann@1223
|
44 |
read -p "Press Ctrl-C to stop now, or Enter to continue..."
|
yann@1223
|
45 |
fi
|
yann@1223
|
46 |
|
yann@682
|
47 |
# Do not use a progress bar
|
yann@682
|
48 |
unset CT_LOG_PROGRESS_BAR
|
yann@682
|
49 |
|
yann@967
|
50 |
# Parse architecture and kernel specific functions
|
yann@927
|
51 |
. "${CT_LIB_DIR}/scripts/build/arch/${CT_ARCH}.sh"
|
yann@967
|
52 |
. "${CT_LIB_DIR}/scripts/build/kernel/${CT_KERNEL}.sh"
|
yann@394
|
53 |
|
yann@335
|
54 |
# Target tuple: CT_TARGET needs a little love:
|
yann@335
|
55 |
CT_DoBuildTargetTuple
|
yann@63
|
56 |
|
yann@64
|
57 |
# Kludge: if any of the config options needs either CT_TARGET or CT_TOP_DIR,
|
yann@64
|
58 |
# re-parse them:
|
yann@2576
|
59 |
. .config
|
yann@64
|
60 |
|
yann@682
|
61 |
# Override log options
|
yann@682
|
62 |
unset CT_LOG_PROGRESS_BAR CT_LOG_ERROR CT_LOG_INFO CT_LOG_EXTRA CT_LOG_DEBUG LOG_ALL
|
yann@603
|
63 |
CT_LOG_WARN=y
|
yann@603
|
64 |
CT_LOG_LEVEL_MAX="WARN"
|
yann@126
|
65 |
|
yann@1424
|
66 |
# Compute the name of the sample directory
|
yann@1424
|
67 |
case "${CT_TOOLCHAIN_TYPE}" in
|
yann@1424
|
68 |
cross) samp_name="${CT_TARGET}";;
|
yann@1427
|
69 |
canadian) samp_name="${CT_HOST},${CT_TARGET}";;
|
yann@1424
|
70 |
*) CT_Abort "Unsupported toolchain type '${CT_TOOLCHAIN_TYPE}'";;
|
yann@1424
|
71 |
esac
|
yann@1424
|
72 |
samp_dir="samples/${samp_name}"
|
yann@1424
|
73 |
mkdir -p "${samp_dir}"
|
yann@63
|
74 |
|
yann@2981
|
75 |
# Tweak the .config file
|
yann@2981
|
76 |
# We need to be based on the real .config with kconfig's values,
|
yann@2981
|
77 |
# not our mangled .config.2 with shell arrays
|
yann@2981
|
78 |
cp .config .defconfig
|
yann@1529
|
79 |
"${sed}" -r -e 's|^(CT_PREFIX_DIR)=.*|\1="${HOME}/x-tools/${CT_TARGET}"|;' \
|
yann@1186
|
80 |
-e 's|^# CT_LOG_TO_FILE is not set$|CT_LOG_TO_FILE=y|;' \
|
yann@1186
|
81 |
-e 's|^# CT_LOG_FILE_COMPRESS is not set$|CT_LOG_FILE_COMPRESS=y|;' \
|
yann@1186
|
82 |
-e 's|^(CT_LOCAL_TARBALLS_DIR)=.*|\1="${HOME}/src"|;' \
|
yann@1186
|
83 |
<.config \
|
yann@2981
|
84 |
>.defconfig
|
yann@63
|
85 |
|
yann@64
|
86 |
# Function to copy a file to the sample directory
|
yann@64
|
87 |
# Needed in case the file is already there (think of a previously available sample)
|
yann@64
|
88 |
# Usage: CT_DoAddFileToSample <source> <dest>
|
yann@64
|
89 |
CT_DoAddFileToSample() {
|
yann@64
|
90 |
source="$1"
|
yann@64
|
91 |
dest="$2"
|
yann@1299
|
92 |
inode_s=$(ls -i "${source}" |awk '{ print $1; }')
|
yann@1299
|
93 |
inode_d=$(ls -i "${dest}" 2>/dev/null |awk '{ print $1; }' || true)
|
yann@64
|
94 |
if [ "${inode_s}" != "${inode_d}" ]; then
|
yann@64
|
95 |
cp "${source}" "${dest}"
|
yann@64
|
96 |
fi
|
yann@64
|
97 |
}
|
yann@64
|
98 |
|
yann@182
|
99 |
if [ "${CT_TOP_DIR}" = "${CT_LIB_DIR}" ]; then
|
yann@182
|
100 |
samp_top_dir="\${CT_LIB_DIR}"
|
yann@182
|
101 |
else
|
yann@182
|
102 |
samp_top_dir="\${CT_TOP_DIR}"
|
yann@182
|
103 |
fi
|
yann@182
|
104 |
|
yann@63
|
105 |
# Save the uClibc .config file
|
yann@63
|
106 |
if [ -n "${CT_LIBC_UCLIBC_CONFIG_FILE}" ]; then
|
yann@63
|
107 |
# We save the file, and then point the saved sample to this file
|
yann@1424
|
108 |
CT_DoAddFileToSample "${CT_LIBC_UCLIBC_CONFIG_FILE}" "${samp_dir}/${CT_LIBC}-${CT_LIBC_VERSION}.config"
|
yann@1539
|
109 |
"${sed}" -r -i -e 's|^(CT_LIBC_UCLIBC_CONFIG_FILE)=.+$|\1="'"${samp_top_dir}"'/samples/${CT_TARGET}/${CT_LIBC}-${CT_LIBC_VERSION}.config"|;' \
|
yann@2981
|
110 |
.defconfig
|
yann@63
|
111 |
else
|
yann@63
|
112 |
# remove any dangling files
|
yann@1424
|
113 |
for f in "${samp_dir}/${CT_LIBC}-"*.config; do
|
yann@182
|
114 |
if [ -f "${f}" ]; then rm -f "${f}"; fi
|
yann@63
|
115 |
done
|
yann@63
|
116 |
fi
|
yann@935
|
117 |
|
yann@2981
|
118 |
# Now, actually save the defconfig
|
yann@2981
|
119 |
export KCONFIG_CONFIG="$(pwd)/.defconfig"
|
yann@2981
|
120 |
${CONF} --savedefconfig="${samp_dir}/crosstool.config" "${KCONFIG_TOP}"
|
yann@2981
|
121 |
rm -f .defconfig
|
yann@2981
|
122 |
|
yann@935
|
123 |
# Restore stdout now, to be interactive
|
yann@935
|
124 |
exec >&7
|
yann@935
|
125 |
|
yann@935
|
126 |
# Fill-in the reported-by info
|
yann@1424
|
127 |
[ -f "${samp_dir}/reported.by" ] && . "${samp_dir}/reported.by"
|
yann@935
|
128 |
old_name="${reporter_name}"
|
yann@935
|
129 |
old_url="${reporter_url}"
|
yann@2937
|
130 |
old_comment="${reporter_comment}"
|
yann@935
|
131 |
read -p "Reporter name [${reporter_name}]: " reporter_name
|
yann@935
|
132 |
read -p "Reporter URL [${reporter_url}]: " reporter_url
|
yann@935
|
133 |
if [ -n "${reporter_comment}" ]; then
|
yann@2937
|
134 |
echo "Old comment:"
|
yann@2937
|
135 |
printf "${reporter_comment}\n" |sed -r -e 's/^/ > /;'
|
yann@935
|
136 |
fi
|
yann@2937
|
137 |
echo "Reporter comment (Ctrl-D to finish, '.' to use previous):"
|
yann@935
|
138 |
reporter_comment=$(cat)
|
yann@2937
|
139 |
if [ "${reporter_comment}" = "." ]; then
|
yann@2937
|
140 |
reporter_comment="${old_comment}"
|
yann@2937
|
141 |
fi
|
yann@935
|
142 |
|
yann@935
|
143 |
( echo "reporter_name=\"${reporter_name:=${old_name}}\""
|
yann@935
|
144 |
echo "reporter_url=\"${reporter_url:=${old_url}}\""
|
yann@935
|
145 |
printf "reporter_comment=\"${reporter_comment}\"\n"
|
yann@1424
|
146 |
) >"${samp_dir}/reported.by"
|