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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
|
#!/bin/sh
# Copyright(c) 2010-2016 Association of Universities for Research in Astronomy, Inc.
# Copy external IRAF package source from the current working directory to
# $PREFIX/iraf_extern/package_name, add any configuration files from the conda
# recipe (eg. ur_extern.pkg), update extern.pkg accordingly, compile the
# package and its help in place and remove any proprietary files. The build is
# done using the installed copy since the package and its dependencies must
# already be defined in IRAF at build time and IRAF packages are installed as a
# source tree anyway.
#
# This script is used by the AstroConda build process (with no arguments and
# the usual conda build variables set). Users wanting pre-built AstroConda IRAF
# packages should install them with "conda install" or "conda create" instead.
# Determine the directory this script lives in (for later use) and source some
# common name definitions from the same place:
script_dir=`dirname "$0"`
script_dir=`cd "$script_dir" && pwd` # canonical version of path
. "$script_dir/ac_iraf_defs"
# The parameters are effectively conda build variables, which must be set here:
if [ -n "$1" -o -z "$PREFIX" -o -z "$RECIPE_DIR" -o -z "$PKG_NAME" ]; then
echo "ERROR: `basename "$0"` should be called via \"conda build\"" >&2
echo " (with no arguments), to define the necessary environment" >&2
exit 1
fi
# IRAF must also be defined in the environment:
if [ -z "$iraf" -o -z "$IRAFARCH" ]; then
echo "ERROR: must configure IRAF environment (. setup_iraf.sh)" >&2
exit 1
fi
# These conda-set variables could interfere with building IRAF packages:
unset ARCH CFLAGS CXXFLAGS LDFLAGS LD_RUN_PATH MACOSX_DEPLOYMENT_TARGET
# Create any new dirs & files with the expected permissions:
umask 022
# Strip any "iraf." from the Conda package name, to get the IRAF equivalent,
# and determine the installation path accordingly:
pkg_name=`echo "$PKG_NAME" | sed -e 's|^iraf[.]||' -e 's|^pyraf[.]||'`
pkg_path="${PREFIX}/${extern_dir}/${pkg_name}"
# Create the destination directory, if needed:
if ! mkdir -p "$pkg_path"; then
echo "ERROR: failed to create $pkg_path" >&2
exit 1
fi
# Ensure the destination is writeable (a bit redundant but clearer than the
# subsequent message would be for this case):
if [ ! -w "$pkg_path" ]; then
echo "ERROR: cannot write to $pkg_path" >&2
exit 1
fi
# Copy the package source (CWD contents) to its destination:
if ! tar cf - ./ | (cd "$pkg_path" && tar xf -); then
echo "ERROR: failed to copy source to $pkg_path" >&2
exit 1
fi
# Add package configuration files from the recipe (overwriting any copies
# already in the tarball; any source patches should already have been added
# separately by conda):
for file_name in $ac_iraf_files; do
file_path="${RECIPE_DIR}/${file_name}"
if [ -r "$file_path" ]; then
if ! cp -pf "$file_path" "$pkg_path"/; then
echo "ERROR: failed to copy $file_name to $pkg_path" >&2
exit 1
fi
fi
done
# Define the new package in the (temporary build-time) extern.pkg:
if ! /usr/bin/python "$script_dir/ac_update_extern_pkg" "$PREFIX" "$pkg_name"
then
echo "ERROR: failed to update $extern_pkg" >&2
exit 1
fi
# Continue working in the destination directory:
cd "$pkg_path" || exit 1 # (failure would have to be 1-off race condition...)
# Remove any bin directories that aren't needed for this IRAF architecture and
# ensure we do have those that are needed:
rm -fr bin.*
mkdir bin.generic "bin.$IRAFARCH"
if [ -L bin ]; then # apart from being safer, there is a bin/ dir in mscdb
rm -f bin
fi
if [ ! -e bin ]; then
ln -s "bin.$IRAFARCH" bin
fi
# Enable compilation with debugging symbols (from the STScI IRAF "make_all";
# avoiding trailing space, which gcc fails on as a non-existent filename!):
export XC_LFLAGS="-g${XC_LFLAGS:+ $XC_LFLAGS}"
# Compile the package source, either as specified by the recipe or as usual:
file_path="${RECIPE_DIR}/${pkg_mkpkg_cmd}"
if [ -r "$file_path" ]; then
sh "$file_path" > "$log_name" 2>&1
st=$?
else
# This is an IRAF convention that usually applies but doesn't always:
mkpkg -p "$pkg_name" update > "$log_name" 2>&1
st=$?
fi
# Although mkpkg doesn't return a useful exit status, check whether it failed
# to run (IRAF not set up properly) or a ur_mkpkg_cmd script complained etc.:
if [ $st -ne 0 ]; then
echo "ERROR: compilation command failed" >&2
exit 1
fi
# Check that the build appears to have succeeded:
if ! "$script_dir/ac_check_iraf_build" ./ ; then
echo "ERROR: package build apparently failed" >&2
exit 1
fi
# Generate the help & apropos databases using the appropriate IRAF tasks, via
# PyRAF (past attempts to do this using cl have crashed intermittently):
file_path="${RECIPE_DIR}/${pkg_mkhelp_cmd}"
if [ -r "$file_path" ]; then
sh "$file_path" > "$help_log_name" 2>&1
st=$?
else
# This is an IRAF convention that usually applies but doesn't always:
"$iraf/util/make_help" "$pkg_name" > "$help_log_name" 2>&1
st=$?
fi
if [ $st -ne 0 ]; then
echo "ERROR: failed to generate help databases" >&2
exit 1
fi
# Ensure all files are readable (eg. binaries sometimes get odd --x perms):
chmod -R +r .
# Delete any proprietary source code from the build:
if [ -r "$pkg_omit_list" ]; then
if ! "$iraf/util/de_numrec" "$pkg_omit_list" >> "$log_name" 2>&1; then
echo "ERROR: removal of proprietary source files failed" >&2
exit 1
fi
fi
# Remove extern.pkg from the build variant, so it doesn't end up in the
# tarball and overwrite the existing one(s):
rm -f "${PREFIX}/${extern_pkg}" "${PREFIX}/${extpkg_bak}"
# Ensure status=0 on reaching the end (& not left over from some condition).
exit 0
|