@@ -34,8 +34,26 @@ trap 'finish_error $LINENO' ERR
34
34
35
35
logstamp () { printf " [%s]" " $( TZ=' America/Chicago' date +' %Y-%m-%d %H:%M:%S' ) " ; }
36
36
topic () { echo " -----> $( logstamp) $* " ; }
37
- info () { echo " $* " ; }
38
- indent () { sed -u ' s/^/ /' ; } # it always runs on linux. on darwin is 'sed -l'
37
+ info () { echo " $* " ; }
38
+ HEROKU_FREETDS_BUILDPACK_DEBUG=" ${HEROKU_FREETDS_BUILDPACK_DEBUG:- false} "
39
+ debug () {
40
+ if [ " $HEROKU_FREETDS_BUILDPACK_DEBUG " = " true" ]; then
41
+ echo " [DEBUG] $* "
42
+ fi
43
+ }
44
+ debug_topic () {
45
+ if [ " $HEROKU_FREETDS_BUILDPACK_DEBUG " = " true" ]; then
46
+ echo " [DEBUG] -----> $* "
47
+ fi
48
+ }
49
+ error () { echo " ! $* " ; >&2 exit 1 ; }
50
+ indent () {
51
+ local command ; command=' s/^/ /'
52
+ case $( uname) in
53
+ Darwin) sed -l " $command " ;;
54
+ * ) sed -u " $command " ;;
55
+ esac
56
+ }
39
57
40
58
BUILD_DIR=" $1 "
41
59
CACHE_DIR=" $2 "
@@ -46,11 +64,21 @@ ENV_DIR="${3}"
46
64
# echo "$SOURCE_VERSION"
47
65
# See https://devcenter.heroku.com/articles/buildpack-api#bin-compile-summary
48
66
67
+ # Store which STACK we are running on in the cache to bust the cache if it changes
68
+ if [ -f " ${CACHE_DIR} /.freetds/STACK" ]; then
69
+ CACHED_STACK=$( cat " $CACHE_DIR /.freetds/STACK" )
70
+ else
71
+ CACHED_STACK=$STACK
72
+ fi
73
+ # Ensure we store the STACK in the cache for next time.
74
+ mkdir -p " $CACHE_DIR /.freetds"
75
+ echo " $STACK " > " $CACHE_DIR /.freetds/STACK"
76
+
49
77
BIN_DIR=" $( cd " $( dirname " $0 " ) " ; pwd) " # absolute path
50
78
LP_DIR=" $( cd " $( dirname " $0 " ) " ; cd ..; pwd) "
51
79
ROOT_DIR=" $( dirname " $BIN_DIR " ) "
52
80
53
- info " BIN_DIR=${BIN_DIR} , ROOT_DIR=${ROOT_DIR} , BUILD_DIR=${BUILD_DIR} , CACHE_DIR=${CACHE_DIR} , pwd=$( pwd) "
81
+ info " BIN_DIR=${BIN_DIR} , ROOT_DIR=${ROOT_DIR} , BUILD_DIR=${BUILD_DIR} , CACHE_DIR=${CACHE_DIR} , STACK= ${STACK} CACHED_STACK= ${CACHED_STACK} pwd=$( pwd) "
54
82
55
83
load_env_vars () {
56
84
local env_var; env_var=" ${1:- } "
@@ -63,18 +91,26 @@ FREETDS_ARCHIVE_NAME="${FREETDS_ARCHIVE_NAME:-freetds-${FREETDS_VERSION}}"
63
91
TDS_VERSION=" ${TDS_VERSION:- 7.3} " # or TDSVER
64
92
USE_GNUTLS=" ${USE_GNUTLS:- --with-gnutls} "
65
93
66
- CACHED_TAR=" ${CACHE_DIR} /freetds-${FREETDS_VERSION} -heroku.tar.bz2"
67
- # Default rebuild to true since I'm having issues linking the library to tiny_tds gem with a cached build.
68
- if [ " ${FREETDS_REBUILD:- } " = " true" ]; then
94
+ FREETDS_CACHE_DIR=" $CACHE_DIR "
95
+ mkdir -p " ${FREETDS_CACHE_DIR} "
96
+ CACHED_TAR=" ${FREETDS_CACHE_DIR} /freetds-${FREETDS_VERSION} -heroku.tar.bz2"
97
+ if [ " $CACHED_STACK " != " $STACK " ] ; then
98
+ topic " Stack has changed. Clearing cache"
99
+ rm -f " $CACHED_TAR "
100
+ elif [ " ${FREETDS_REBUILD:- } " = " true" ]; then
101
+ # Default rebuild to true since I'm having issues linking the library to tiny_tds gem with a cached build.
102
+ topic " FREETDS_REBUILD is true. Clearing cache"
69
103
rm -f " $CACHED_TAR "
70
104
fi
71
105
# This installation target is in the BUILD_DIR, which means that
72
106
# it'll end up in the slug at runtime.
73
- BUILD_TARGET_DIR=" ${BUILD_DIR} /freetds"
107
+ # Assert $BUILD_TARGET_DIR = $HOME/freetds | $BUILD_DIR/freetds # /app/freetds
108
+ BUILD_TARGET_DIR=" ${BUILD_DIR} /freetds" # /app/freetds
74
109
mkdir -p " ${BUILD_TARGET_DIR} "
75
110
76
111
# This is the path that will be used at dyno runtime, and in which we build.
77
- APP_TARGET_DIR=" /app/freetds"
112
+ # Assert $APP_TARGET_DIR = $HOME/freetds # /app/freetds
113
+ APP_TARGET_DIR=" ${HOME:- app} /freetds"
78
114
mkdir -p " ${APP_TARGET_DIR} "
79
115
80
116
configure_app_env_vars () {
@@ -83,46 +119,55 @@ configure_app_env_vars() {
83
119
84
120
# These exports must point to /app, because the profile is
85
121
# executed in a running dyno, not the buildpack environment
122
+ # Assert $APP_TARGET_DIR = $HOME/freetds # /app/freetds
86
123
cat << EOF > "${BUILD_DIR} /.profile.d/freetds.sh"
87
- export PATH="${APP_TARGET_DIR} /bin:\$ PATH"
124
+ export PATH="\$ {HOME}/freetds /bin:\$ PATH"
88
125
# tiny_tds extconf.rb uses FREETDS_DIR
89
126
# https://github.com/rails-sqlserver/tiny_tds/blob/5046755ca91594003f8b3ca541d136f3ed859973/ext/tiny_tds/extconf.rb#L36-L38
90
- export FREETDS_DIR="${APP_TARGET_DIR} "
91
- export LD_LIBRARY_PATH="${APP_TARGET_DIR} / lib:${LD_LIBRARY_PATH:-/ usr/ local/ lib} "
92
- export LD_RUN_PATH="${APP_TARGET_DIR} / lib:${LD_RUN_PATH:-/ usr/ local/ lib} "
93
- export LIBRARY_PATH="${APP_TARGET_DIR} / lib:${LIBRARY_PATH:-/ usr/ local/ lib} "
94
- export SYBASE="${APP_TARGET_DIR} "
127
+ export FREETDS_DIR="\$ {HOME}/freetds "
128
+ export LD_LIBRARY_PATH="\$ {HOME}/freetds/ lib:\ $ {LD_LIBRARY_PATH:-/usr/local/lib}"
129
+ export LD_RUN_PATH="\$ {HOME}/freetds/ lib:\ $ {LD_RUN_PATH:-/usr/local/lib}"
130
+ export LIBRARY_PATH="\$ {HOME}/freetds/ lib:\ $ {LIBRARY_PATH:-/usr/local/lib}"
131
+ export SYBASE="\$ {HOME}/freetds "
95
132
EOF
96
133
chmod +x " ${BUILD_DIR} /.profile.d/freetds.sh"
97
134
echo " configured APP env vars:" | indent
98
135
indent < " ${BUILD_DIR} /.profile.d/freetds.sh"
99
- # shellcheck disable=SC1090
136
+ # shellcheck disable=SC1091
100
137
. " ${BUILD_DIR} /.profile.d/freetds.sh"
101
138
}
102
139
103
140
configure_buildpack_env_vars () {
104
141
# These exports point to the build directory, not to /app, so that
105
142
# they work for later buildpacks.
143
+ # Assert $BUILD_TARGET_DIR = $HOME/freetds | $BUILD_DIR/freetds # /app/freetds
106
144
export PATH=" ${BUILD_TARGET_DIR} /bin:$PATH "
107
145
export FREETDS_DIR=" ${BUILD_TARGET_DIR} "
108
146
export LD_LIBRARY_PATH=" ${BUILD_TARGET_DIR} /lib:${LD_LIBRARY_PATH:-/ usr/ local/ lib} "
109
147
export LD_RUN_PATH=" ${BUILD_TARGET_DIR} /lib:${LD_RUN_PATH:-/ usr/ local/ lib} "
110
148
export LIBRARY_PATH=" ${BUILD_TARGET_DIR} /lib:${LIBRARY_PATH:-/ usr/ local/ lib} "
149
+ # Assert $APP_TARGET_DIR = $HOME/freetds # /app/freetds
111
150
export SYBASE=" ${APP_TARGET_DIR} "
112
151
# give environment to later buildpacks
113
- export | grep -E -e ' (PATH|LD_LIBRARY_PATH|LIBRARY_PATH|FREETDS_DIR|SYBASE)=' > " ${LP_DIR} /export"
152
+ export | grep -E -e ' (PATH|LD_LIBRARY_PATH|LD_RUN_PATH| LIBRARY_PATH|FREETDS_DIR|SYBASE)=' > " ${LP_DIR} /export"
114
153
115
154
echo " configured BUILDPACK env vars:" | indent
116
155
indent < " ${LP_DIR} /export"
156
+
157
+ topic " Rewrite package-config files"
158
+ # shellcheck disable=SC2038
159
+ find " $BUILD_DIR /freetds" -type f -ipath ' */pkgconfig/*.pc' | xargs --no-run-if-empty -n 1 sed -i -e ' s!^prefix=\(.*\)$!prefix=' " $BUILD_DIR " ' /freetds\1!g'
117
160
}
118
161
119
162
download_and_extract_freetds_archive () {
120
163
FREETDS_FILE=" $FREETDS_ARCHIVE_NAME .tar.gz"
121
164
FREETDS_URL=" https://www.freetds.org/files/stable/${FREETDS_FILE} "
122
- # TODO(BF): Print log when HEROKUR_FREETDS_BUILDPACK_DEBUG is set
123
165
# TODO(BF): Consider calculating and verifying SHA256: openssl dgst -sha256 < "$FREETDS_FILE"
124
166
curl -s " $FREETDS_URL " | tar xzvf - -C " ${BUILD_DIR} " > " ${BUILD_DIR} /build_log-unpack.log" # Can't write to the archive dir until it exists
125
167
mv " ${BUILD_DIR} /build_log-unpack.log" " ${BUILD_DIR} /${FREETDS_ARCHIVE_NAME} /"
168
+ if [ " $HEROKU_FREETDS_BUILDPACK_DEBUG " = " true" ]; then
169
+ debug " $( cat " ${BUILD_DIR} /build_log-unpack.log" ) "
170
+ fi
126
171
}
127
172
128
173
build_and_install_freetds () {
@@ -152,13 +197,20 @@ build_and_install_freetds() {
152
197
--disable-debug \
153
198
"--with-tdsver=${TDS_VERSION} "
154
199
EOF
155
- # TODO(BF): Print log when HEROKUR_FREETDS_BUILDPACK_DEBUG is set
156
200
/bin/bash .build_options > build_log-configure.stdout.log 2> build_log-configure.stderr.log
201
+ if [ " $HEROKU_FREETDS_BUILDPACK_DEBUG " = " true" ]; then
202
+ debug " $( cat .build_options) "
203
+ debug " $( cat build_log-configure.stdout.log) "
204
+ debug " $( cat build_log-configure.stderr.log) "
205
+ fi
157
206
# Flush make output to log since a file will be faster than printing to the screen.
158
- # TODO(BF): Print log when HEROKUR_FREETDS_BUILDPACK_DEBUG is set
159
207
{
160
208
make && make install && make clean
161
209
} > build_log-make_install.stdout.log 2> build_log-make_install.stderr.log
210
+ if [ " $HEROKU_FREETDS_BUILDPACK_DEBUG " = " true" ]; then
211
+ debug " $( cat build_log-make_install.stdout.log) "
212
+ debug " $( cat build_log-make_install.stderr.log) "
213
+ fi
162
214
cp .build_options build_log-* " ${APP_TARGET_DIR} /"
163
215
164
216
cd " $BUILD_DIR "
0 commit comments