summaryrefslogtreecommitdiff
path: root/scripts/saveSample.sh.in
blob: 8967d54a1dbc5c94aac86f690172df7b445f901a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#!@@CT_bash@@

# This script is responsible for saving the current configuration into a
# sample to be used later on as a pre-configured target.

# What we need to save:
#  - the .config file
#  - the uClibc .config file if uClibc selected
#  - info about who reported the sample

# Parse the tools' paths configuration
. "${CT_LIB_DIR}/paths.sh"

# We'll need the stdout later, save it
exec 7>&1

. "${CT_LIB_DIR}/scripts/functions"

# Don't care about any log file
exec >/dev/null
rm -f "${tmp_log_file}"

# Parse the configuration file
# Don't use CT_TestOrAbort, it prints the test string to [DEBUG]
# Note: we just need the non-mangled .config, not .config.2
if [ ! -f .config ]; then
    CT_Abort "Configuration file not found. Please create one."
fi
. .config

# We can not reliably save a sample which either uses local patches
# and/or custom Linux kernel headers. Warn the user about this issue
# and continue if he/she confirms sving the sample.
if [ "${CT_CUSTOM_PATCH}" = "y" ]; then
    exec >&7
    echo "You are using local patches."
    echo "You will not be able to (easily) share this sample in this case."
    read -p "Press Ctrl-C to stop now, or Enter to continue..."
fi
if [ "${CT_KERNEL_LINUX_USE_CUSTOM_HEADERS}" = "y" ]; then
    exec >&7
    echo "You are using custom Linux headers."
    echo "You will not be able to (easily) share this sample in this case."
    read -p "Press Ctrl-C to stop now, or Enter to continue..."
fi

# Do not use a progress bar
unset CT_LOG_PROGRESS_BAR

# Parse architecture and kernel specific functions
. "${CT_LIB_DIR}/scripts/build/arch/${CT_ARCH}.sh"
. "${CT_LIB_DIR}/scripts/build/kernel/${CT_KERNEL}.sh"

# Target tuple: CT_TARGET needs a little love:
CT_DoBuildTargetTuple

# Kludge: if any of the config options needs either CT_TARGET or CT_TOP_DIR,
# re-parse them:
. .config

# Override log options
unset CT_LOG_PROGRESS_BAR CT_LOG_ERROR CT_LOG_INFO CT_LOG_EXTRA CT_LOG_DEBUG LOG_ALL
CT_LOG_WARN=y
CT_LOG_LEVEL_MAX="WARN"

# Compute the name of the sample directory
case "${CT_TOOLCHAIN_TYPE}" in
    cross)      samp_name="${CT_TARGET}";;
    canadian)   samp_name="${CT_HOST},${CT_TARGET}";;
    *)          CT_Abort "Unsupported toolchain type '${CT_TOOLCHAIN_TYPE}'";;
esac
samp_dir="samples/${samp_name}"
mkdir -p "${samp_dir}"

# Save the crosstool-NG config file
# We need to save the real .config with kconfig's values,
# not our mangled .config.2 with arrays
"${sed}" -r -e 's|^(CT_PREFIX_DIR)=.*|\1="${HOME}/x-tools/${CT_TARGET}"|;'      \
            -e 's|^# CT_LOG_TO_FILE is not set$|CT_LOG_TO_FILE=y|;'             \
            -e 's|^# CT_LOG_FILE_COMPRESS is not set$|CT_LOG_FILE_COMPRESS=y|;' \
            -e 's|^(CT_LOCAL_TARBALLS_DIR)=.*|\1="${HOME}/src"|;'               \
         <.config                                                               \
    >"${samp_dir}/crosstool.config"

# Function to copy a file to the sample directory
# Needed in case the file is already there (think of a previously available sample)
# Usage: CT_DoAddFileToSample <source> <dest>
CT_DoAddFileToSample() {
    source="$1"
    dest="$2"
    inode_s=$(ls -i "${source}" |awk '{ print $1; }')
    inode_d=$(ls -i "${dest}" 2>/dev/null |awk '{ print $1; }' || true)
    if [ "${inode_s}" != "${inode_d}" ]; then
        cp "${source}" "${dest}"
    fi
}

if [ "${CT_TOP_DIR}" = "${CT_LIB_DIR}" ]; then
    samp_top_dir="\${CT_LIB_DIR}"
else
    samp_top_dir="\${CT_TOP_DIR}"
fi

# Save the uClibc .config file
if [ -n "${CT_LIBC_UCLIBC_CONFIG_FILE}" ]; then
    # We save the file, and then point the saved sample to this file
    CT_DoAddFileToSample "${CT_LIBC_UCLIBC_CONFIG_FILE}" "${samp_dir}/${CT_LIBC}-${CT_LIBC_VERSION}.config"
    "${sed}" -r -i -e 's|^(CT_LIBC_UCLIBC_CONFIG_FILE)=.+$|\1="'"${samp_top_dir}"'/samples/${CT_TARGET}/${CT_LIBC}-${CT_LIBC_VERSION}.config"|;' \
             "${samp_dir}/crosstool.config"
else
    # remove any dangling files
    for f in "${samp_dir}/${CT_LIBC}-"*.config; do
        if [ -f "${f}" ]; then rm -f "${f}"; fi
    done
fi

# Restore stdout now, to be interactive
exec >&7

# Fill-in the reported-by info
[ -f "${samp_dir}/reported.by" ] && . "${samp_dir}/reported.by"
old_name="${reporter_name}"
old_url="${reporter_url}"
read -p "Reporter name [${reporter_name}]: " reporter_name
read -p "Reporter URL [${reporter_url}]: " reporter_url
if [ -n "${reporter_comment}" ]; then
  echo "Old comment if you need to copy-paste:"
  printf "${reporter_comment}\n"
fi
echo "Reporter comment (Ctrl-D to finish):"
reporter_comment=$(cat)

( echo "reporter_name=\"${reporter_name:=${old_name}}\""
  echo "reporter_url=\"${reporter_url:=${old_url}}\""
  printf "reporter_comment=\"${reporter_comment}\"\n"
) >"${samp_dir}/reported.by"