Line 0
Link Here
|
|
|
1 |
# $FreeBSD$ |
2 |
# |
3 |
# Provide support for NodeJS based projects |
4 |
# |
5 |
# Feature: nodejs |
6 |
# Usage: USES=nodejs |
7 |
# |
8 |
# MAINTAINER: portmgr@FreeBSD.org |
9 |
|
10 |
# NODE_SUB_PROJECTS - additional projects to extract into individual |
11 |
# directories. Distfile for the group with the name |
12 |
# of the sub-project is extracted into the sub-folder |
13 |
# with the same name. Build is also performed for |
14 |
# sub-projects. |
15 |
# NODE_SUB_MODULES - additional projects to insert as submodules into the |
16 |
# specific directories identified. Build is not |
17 |
# prformed for them. |
18 |
# NODE_USES - additional features enabled in nodejs module: |
19 |
# grunt - run grunt tasks as a part of the build |
20 |
# coffee - perform the coffee-migration on all .coffee files |
21 |
# jq - add fetch dependency on jq when jq is also used by some custom targets |
22 |
# merge-pkg-deps - merge packageDependencies into dependencies in package.json |
23 |
# NODE_MODULES_ADD - delete node module dependencies, in the format: {<dir>/}<module>:<version> |
24 |
# NODE_MODULES_DEL - delete node module dependencies, in the format: {<dir>/}<module> |
25 |
# NODE_FILES_TO_CLEAN - wildcards for files and directoroes that do not need to be installed |
26 |
|
27 |
.if !defined(_INCLUDE_USES_NODE_MK) |
28 |
_INCLUDE_USES_NODE_MK= yes |
29 |
|
30 |
FETCH_DEPENDS+= npm:${PORTSDIR}/www/npm \ |
31 |
git:${PORTSDIR}/devel/git |
32 |
BUILD_DEPENDS+= npm:${PORTSDIR}/www/npm \ |
33 |
gmake:${PORTSDIR}/devel/gmake |
34 |
RUN_DEPENDS+= node:${PORTSDIR}/www/node |
35 |
|
36 |
_NODE_DIR?= ${PORTNAME}-${PORTVERSION} |
37 |
|
38 |
# commands |
39 |
NPM_CMD= ${LOCALBASE}/bin/npm |
40 |
NODE_CMD= ${LOCALBASE}/bin/node |
41 |
|
42 |
# variables |
43 |
_NODE_TMP_BASE_FETCH= ${DISTDIR}/${_NODE_DIR}.tmpdirs |
44 |
_NODE_TMP_BASE_BUILD= ${WRKDIR} |
45 |
_NODE_USERHOME_FETCH= ${_NODE_TMP_BASE_FETCH}/.userhome |
46 |
_NODE_TMP_FETCH= ${_NODE_TMP_BASE_FETCH}/.tmp |
47 |
_NODE_USERHOME_BUILD= ${_NODE_TMP_BASE_BUILD}/.userhome |
48 |
_NODE_TMP_BUILD= ${_NODE_TMP_BASE_BUILD}/.tmp |
49 |
_NODE_FAKE_GIT= ${_NODE_TMP_FETCH}/fake-git |
50 |
#_NODE_FAKE_GIT_LINK= ${_NODE_TMP_FETCH}/git |
51 |
#_NODE_MAKE_LINK= ${_NODE_TMP_FETCH}/make |
52 |
_NODE_FAKE_GMAKE= ${_NODE_TMP_BUILD}/gmake |
53 |
_NODE_NPMRC_FETCH= ${_NODE_USERHOME_FETCH}/.npmrc |
54 |
CFLAGS+= -I${LOCALBASE}/include/node |
55 |
CXXFLAGS+= -I${LOCALBASE}/include/node |
56 |
NPM_ENV+= C=${CC} CXX=${CXX} |
57 |
NPM_ENV_FETCH= ${NPM_ENV} HOME=${_NODE_USERHOME_FETCH} TMP=${_NODE_TMP_FETCH} PATH=${_NODE_TMP_FETCH}:${PATH} |
58 |
NPM_ENV_BUILD= ${NPM_ENV} HOME=${_NODE_USERHOME_BUILD} TMP=${_NODE_TMP_BUILD} PATH=${_NODE_TMP_BUILD}:${PATH} |
59 |
NPM_LOG_LEVEL?= warn |
60 |
NPM_FETCH_ARGS= --loglevel ${NPM_LOG_LEVEL} --ignore-scripts |
61 |
NPM_BUILD_ARGS= --loglevel ${NPM_LOG_LEVEL} --nodedir=${LOCALBASE} |
62 |
NPM_PRUNE_ARGS= --loglevel ${NPM_LOG_LEVEL} --production=true |
63 |
NPM_SHRINKWRAP_ARGS= --dev |
64 |
REINPLACE_ARGS= -i "" |
65 |
SHRINKWRAP_NAME= npm-shrinkwrap.json |
66 |
SHRINKWRAP_FILE= ${FILESDIR}/${SHRINKWRAP_NAME} |
67 |
NODE_INSTALL_BASE:= ${LOCALBASE}/share/node-projects |
68 |
NODE_INSTALL_DIR:= ${NODE_INSTALL_BASE}/${PORTNAME} |
69 |
NODE_ORIG_DISTFILES:= ${DISTFILES} |
70 |
NODE_DISTFILE:= ${PORTNAME}-${PORTVERSION}-nodejs.tar.gz |
71 |
CKSUMFILES+= ${NODE_DISTFILE} |
72 |
_NODE_MASTER_SITE_BACKUP_URLS= ${MASTER_SITE_BACKUP}${NODE_DISTFILE} |
73 |
NPM_BUILD_DIR?= . |
74 |
NODE_FILES_TO_CLEAN+= .git* *.bak *.log *.bat Makefile .travis.yml man *.info .DS_Store |
75 |
|
76 |
.for f in ${NODE_USES} |
77 |
_f:= ${f:C/\:.*//} |
78 |
.if ${_f}=="grunt" |
79 |
FETCH_DEPENDS+= grunt:${PORTSDIR}/devel/grunt |
80 |
GRUNT_CMD= ${LOCALBASE}/bin/grunt |
81 |
GRUNT_ENV+= HOME=${_NODE_USERHOME_BUILD} TMP=${_NODE_TMP_BUILD} PATH=${_NODE_TMP_BUILD}:${PATH} |
82 |
GRUNT_BUILD_ARGS+= |
83 |
NODE_GRUNT_TARGETS?= |
84 |
_NODE_USES_GRUNT= yes |
85 |
.elif ${_f}=="coffee" |
86 |
BUILD_DEPENDS+= coffee:${PORTSDIR}/lang/coffeescript |
87 |
COFFEE_CMD= ${LOCALBASE}/bin/coffee |
88 |
_NODE_USES_COFFEE= yes |
89 |
.elif ${_f}=="jq" |
90 |
_NODE_USES_JQ= yes |
91 |
.elif ${_f}=="merge-pkg-deps" |
92 |
_NODE_USES_MERGE_PKG_DEPS= yes |
93 |
.endif |
94 |
.endfor |
95 |
|
96 |
.if defined(NODE_MODULES_ADD) || defined(NODE_MODULES_DEL) || defined(_NODE_USES_MERGE_PKG_DEPS) || defined(_NODE_USES_JQ) |
97 |
FETCH_DEPENDS+= jq:${PORTSDIR}/textproc/jq |
98 |
JQ_CMD= ${LOCALBASE}/bin/jq |
99 |
.endif |
100 |
|
101 |
|
102 |
.if defined(NODE_SRCDIR) |
103 |
_NODE_DO_CD=node_modules/${NODE_SUBDIR} |
104 |
.else |
105 |
_NODE_DO_CD=. |
106 |
.endif |
107 |
_NODE_FETCH_WORKDIR=${DISTDIR} |
108 |
|
109 |
makeshrinkwrap: do-fetch |
110 |
@cd ${_NODE_FETCH_WORKDIR}; \ |
111 |
for main_distfile in ${NODE_ORIG_DISTFILES:N*\:*}; do \ |
112 |
${EXTRACT_CMD} ${EXTRACT_BEFORE_ARGS} $${main_distfile} ${EXTRACT_AFTER_ARGS}; \ |
113 |
done && \ |
114 |
cd ${_NODE_DIR}/${_NODE_DO_CD} && \ |
115 |
(cd ${NPM_BUILD_DIR} && \ |
116 |
${NPM_ENV_FETCH} ${NPM_CMD} shrinkwrap ${NPM_SHRINKWRAP_ARGS} && \ |
117 |
${MKDIR} ${FILESDIR} && \ |
118 |
${MV} ${SHRINKWRAP_NAME} ${SHRINKWRAP_FILE}) && \ |
119 |
for sp in ${NODE_SUB_PROJECTS}; do \ |
120 |
(cd $${sp} && \ |
121 |
${NPM_ENV_FETCH} ${NPM_CMD} shrinkwrap ${NPM_SHRINKWRAP_ARGS} && \ |
122 |
${MKDIR} ${FILESDIR}/$${sp} && \ |
123 |
${MV} ${SHRINKWRAP_NAME} ${FILESDIR}/$${sp}/); \ |
124 |
done && \ |
125 |
cd ${_NODE_FETCH_WORKDIR} && \ |
126 |
${RM} -r ${_NODE_DIR} |
127 |
|
128 |
tmpdirs_fetch: .EXEC .PHONY |
129 |
@${RM} -rf ${_NODE_USERHOME_FETCH} ${_NODE_TMP_FETCH} |
130 |
@${MKDIR} ${_NODE_USERHOME_FETCH} ${_NODE_TMP_FETCH} |
131 |
|
132 |
tmpdirs_build: .EXEC .PHONY |
133 |
@${RM} -rf ${_NODE_USERHOME_BUILD} ${_NODE_TMP_BUILD} |
134 |
@${MKDIR} ${_NODE_USERHOME_BUILD} ${_NODE_TMP_BUILD} |
135 |
|
136 |
fakegit: .EXEC .PHONY |
137 |
@(${ECHO} '#!/bin/sh'; \ |
138 |
${ECHO} ''; \ |
139 |
${ECHO} 'name="nodejs-fetch"'; \ |
140 |
${ECHO} 'DISTDIR="${DISTDIR}"'; \ |
141 |
${ECHO} 'NODE_ORIG_DISTFILES="${NODE_ORIG_DISTFILES:C@^([^:]+).*@\1@}"'; \ |
142 |
${ECHO} 'NODE_VERBOSE="${NODE_VERBOSE}"'; \ |
143 |
${ECHO} 'NODE_DEBUG="${NODE_DEBUG}"'; \ |
144 |
${ECHO} ''; \ |
145 |
${ECHO} 'msg() {'; \ |
146 |
${ECHO} ' [ "$$NODE_VERBOSE" = yes ] && echo "$${name}: $$1" >&2'; \ |
147 |
${ECHO} ' dbg_log "$${name}: $$1"'; \ |
148 |
${ECHO} '}'; \ |
149 |
${ECHO} 'err() {'; \ |
150 |
${ECHO} ' echo "$${name}: ERROR: $$1" >&2'; \ |
151 |
${ECHO} ' dbg_log "$${name}: ERROR: $$1"'; \ |
152 |
${ECHO} '}'; \ |
153 |
${ECHO} 'dbg_log() {'; \ |
154 |
${ECHO} ' [ "$$NODE_DEBUG" = yes ] && (echo "$$1" >>/tmp/nodejs-$$$$.log)'; \ |
155 |
${ECHO} '}'; \ |
156 |
${ECHO} ''; \ |
157 |
${ECHO} 'dbg_log "called with arguments: $$*"'; \ |
158 |
${ECHO} ''; \ |
159 |
${ECHO} 'cmd_clone_remote() {'; \ |
160 |
${ECHO} ' local mirror="$$1"'; \ |
161 |
${ECHO} ' local dir="$$2"'; \ |
162 |
${ECHO} ' msg "Git clone requested: mirror=$$mirror -> dir=$${dir}"'; \ |
163 |
${ECHO} ' local fname_regex=$$(echo $$mirror | sed -E "s/https:\/\/github\.com\/([^/]+)\/([^/]+)\.git$$/^\1-\2-[[:alnum:].]*_GH0.tar.gz$$/g")'; \ |
164 |
${ECHO} ' local fname=$$(find_file "$${fname_regex}")'; \ |
165 |
${ECHO} ' if [ -n "$${fname}" ]; then'; \ |
166 |
${ECHO} ' msg "Found distfile=$$fname for $$mirror"'; \ |
167 |
${ECHO} ' (cd $${dir} && tar xzf $${DISTDIR}/$${fname} --strip 1)'; \ |
168 |
${ECHO} ' return $$?'; \ |
169 |
${ECHO} ' else'; \ |
170 |
${ECHO} ' err "Failed to find distfile for $$mirror"'; \ |
171 |
${ECHO} ' return 1'; \ |
172 |
${ECHO} ' fi'; \ |
173 |
${ECHO} '}'; \ |
174 |
${ECHO} 'cmd_clone_local() {'; \ |
175 |
${ECHO} ' local src="$$1"'; \ |
176 |
${ECHO} ' local dst="$$2"'; \ |
177 |
${ECHO} ' msg "copy $$src -> $$dst"'; \ |
178 |
${ECHO} ' (cd $${src} && tar czf - .) | (cd $${dst} && tar xzf -)'; \ |
179 |
${ECHO} '}'; \ |
180 |
${ECHO} ''; \ |
181 |
${ECHO} 'cmd_checkout() {'; \ |
182 |
${ECHO} ' msg "do nothing for checkout of $$1 in `pwd`"'; \ |
183 |
${ECHO} '}'; \ |
184 |
${ECHO} ''; \ |
185 |
${ECHO} 'find_file() {'; \ |
186 |
${ECHO} ' for f in $${NODE_ORIG_DISTFILES}; do'; \ |
187 |
${ECHO} ' if expr "$${f}" : "$${fname_regex}" > /dev/null; then'; \ |
188 |
${ECHO} ' echo "$$f"'; \ |
189 |
${ECHO} ' return'; \ |
190 |
${ECHO} ' fi'; \ |
191 |
${ECHO} ' done'; \ |
192 |
${ECHO} '}'; \ |
193 |
${ECHO} ''; \ |
194 |
${ECHO} 'case $$1 in'; \ |
195 |
${ECHO} 'clone)'; \ |
196 |
${ECHO} ' shift'; \ |
197 |
${ECHO} ' while [ $$# -gt 0 ]; do'; \ |
198 |
${ECHO} ' key="$$1"'; \ |
199 |
${ECHO} ' case $$key in'; \ |
200 |
${ECHO} ' --template=*)'; \ |
201 |
${ECHO} ' ;;'; \ |
202 |
${ECHO} ' --mirror)'; \ |
203 |
${ECHO} ' MIRROR="$$2"'; \ |
204 |
${ECHO} ' shift'; \ |
205 |
${ECHO} ' ;;'; \ |
206 |
${ECHO} ' -*)'; \ |
207 |
${ECHO} ' err "Unknown argument: $$key" && exit 1'; \ |
208 |
${ECHO} ' ;;'; \ |
209 |
${ECHO} ' *)'; \ |
210 |
${ECHO} ' if [ $$# -eq 1 -a -n "$$MIRROR" ]; then'; \ |
211 |
${ECHO} ' cmd_clone_remote "$${MIRROR}" "$$key"'; \ |
212 |
${ECHO} ' exit $$?'; \ |
213 |
${ECHO} ' fi'; \ |
214 |
${ECHO} ' if [ $$# -eq 2 -a -z "$$MIRROR" ]; then'; \ |
215 |
${ECHO} ' cmd_clone_local "$$1" "$$2"'; \ |
216 |
${ECHO} ' exit $$?'; \ |
217 |
${ECHO} ' fi'; \ |
218 |
${ECHO} ' err "Unknown argument #=$$#: $$key"'; \ |
219 |
${ECHO} ' exit 1'; \ |
220 |
${ECHO} ' ;;'; \ |
221 |
${ECHO} ' esac'; \ |
222 |
${ECHO} ' shift'; \ |
223 |
${ECHO} ' done'; \ |
224 |
${ECHO} ' ;;'; \ |
225 |
${ECHO} 'rev-list)'; \ |
226 |
${ECHO} ' shift'; \ |
227 |
${ECHO} ' while [ $$# -gt 0 ]; do'; \ |
228 |
${ECHO} ' key="$$1"'; \ |
229 |
${ECHO} ' case $$key in'; \ |
230 |
${ECHO} ' -n1)'; \ |
231 |
${ECHO} ' shift'; \ |
232 |
${ECHO} ' [ $$# -eq 1 ] || ! err "Unknown argument: $$key" || exit 1'; \ |
233 |
${ECHO} ' msg "Returning same revision $$1"'; \ |
234 |
${ECHO} ' echo $$1'; \ |
235 |
${ECHO} ' exit 0'; \ |
236 |
${ECHO} ' ;;'; \ |
237 |
${ECHO} ' *)'; \ |
238 |
${ECHO} ' err "Unknown argument: $$key" && exit 1'; \ |
239 |
${ECHO} ' ;;'; \ |
240 |
${ECHO} ' esac'; \ |
241 |
${ECHO} ' shift'; \ |
242 |
${ECHO} ' done'; \ |
243 |
${ECHO} ' err "rev-list without arguments" && exit 1'; \ |
244 |
${ECHO} ' ;;'; \ |
245 |
${ECHO} 'checkout)'; \ |
246 |
${ECHO} ' shift'; \ |
247 |
${ECHO} ' if [ $$# -eq 1 ]; then'; \ |
248 |
${ECHO} ' cmd_checkout "$$1"'; \ |
249 |
${ECHO} ' exit 0'; \ |
250 |
${ECHO} ' fi'; \ |
251 |
${ECHO} ' ;;'; \ |
252 |
${ECHO} 'config)'; \ |
253 |
${ECHO} ' echo ""'; \ |
254 |
${ECHO} ' ;;'; \ |
255 |
${ECHO} '*)'; \ |
256 |
${ECHO} ' err "Unknown command: $$1" && exit 1'; \ |
257 |
${ECHO} ' ;;'; \ |
258 |
${ECHO} 'esac'; \ |
259 |
${ECHO} '') >> ${_NODE_FAKE_GIT} |
260 |
@${CHMOD} +x ${_NODE_FAKE_GIT} |
261 |
#@${LN} -s ${_NODE_FAKE_GIT} ${_NODE_FAKE_GIT_LINK} |
262 |
@${ECHO} "git = ${_NODE_FAKE_GIT}" >> ${_NODE_NPMRC_FETCH} |
263 |
|
264 |
makelink: .EXEC .PHONY |
265 |
#@${LN} -s ${LOCALBASE}/bin/gmake ${_NODE_MAKE_LINK} |
266 |
|
267 |
fakemake: .EXEC .PHONY |
268 |
@(${ECHO} '#!/bin/sh'; \ |
269 |
${ECHO} ''; \ |
270 |
${ECHO} '${MAKE_ENV} PATH=$$PATH:${LOCALBASE}/bin ${LOCALBASE}/bin/gmake ${MAKE_ARGS} $$@'; \ |
271 |
${ECHO} '') >> ${_NODE_FAKE_GMAKE} |
272 |
@${CHMOD} +x ${_NODE_FAKE_GMAKE} |
273 |
|
274 |
.if !target(nodejs-patch-fetch) |
275 |
nodejs-patch-fetch: |
276 |
.endif |
277 |
|
278 |
_USES_fetch+= 750:npm-fetch |
279 |
npm-fetch: tmpdirs_fetch fakegit makelink |
280 |
@${MKDIR} ${_NODE_FETCH_WORKDIR} |
281 |
@cd ${_NODE_FETCH_WORKDIR}; \ |
282 |
force_fetch=false; \ |
283 |
for afile in ${FORCE_FETCH}; do \ |
284 |
afile=$${afile##*/}; \ |
285 |
if [ "x$$afile" = "x${NODE_DISTFILE}" ]; then \ |
286 |
force_fetch=true; \ |
287 |
fi; \ |
288 |
done; \ |
289 |
if [ ! -f ${NODE_DISTFILE} -o "$$force_fetch" = "true" ]; then \ |
290 |
${RM} -rf ${_NODE_PROJECT_FILE} ${_NODE_DIR} ${NODE_DISTFILE}; \ |
291 |
for url in ${_NODE_MASTER_SITE_BACKUP_URLS}; do \ |
292 |
if ${ECHO_MSG} "===> Attempting to fetch ${PORTNAME} from the master backup site" && \ |
293 |
${SETENV} ${FETCH_ENV} ${FETCH_CMD} ${FETCH_BEFORE_ARGS} $${url} ${FETCH_AFTER_ARGS}; then \ |
294 |
return 0; \ |
295 |
fi; \ |
296 |
done && \ |
297 |
if ${ECHO_MSG} "===> Extracting node project source for ${PKGNAME}" && \ |
298 |
${MKDIR} ${_NODE_DIR} && \ |
299 |
for main_distfile in ${NODE_ORIG_DISTFILES:N*\:*}; do \ |
300 |
${EXTRACT_CMD} ${EXTRACT_BEFORE_ARGS} $${main_distfile} ${EXTRACT_AFTER_ARGS} \ |
301 |
-C ${_NODE_DIR} --strip 1; \ |
302 |
done && \ |
303 |
for sp in ${NODE_SUB_PROJECTS}; do \ |
304 |
for df in `${ECHO} ${NODE_ORIG_DISTFILES} | tr ' ' '\n' | grep :$${sp}$$`; do \ |
305 |
${MKDIR} ${_NODE_DIR}/$${sp} && \ |
306 |
${EXTRACT_CMD} ${EXTRACT_BEFORE_ARGS} ${DISTDIR}/`${ECHO} $${df} | ${SED} -e 's/:[^:]*$$//g'` ${EXTRACT_AFTER_ARGS} \ |
307 |
-C ${_NODE_DIR}/$${sp} --strip 1; \ |
308 |
done; \ |
309 |
done && \ |
310 |
(cd ${_NODE_DIR} && ${MAKE} -f ${MASTERDIR}/Makefile nodejs-patch-fetch) && \ |
311 |
for sm in ${NODE_SUB_MODULES}; do \ |
312 |
sm_path=$${sm%%:*}; \ |
313 |
sm_group=$${sm##*:}; \ |
314 |
for df in `${ECHO} ${NODE_ORIG_DISTFILES} | tr ' ' '\n' | grep :$${sm_group}$$`; do \ |
315 |
${EXTRACT_CMD} ${EXTRACT_BEFORE_ARGS} ${DISTDIR}/`${ECHO} $${df} | ${SED} -e 's/:[^:]*$$//g'` ${EXTRACT_AFTER_ARGS} \ |
316 |
-C ${_NODE_DIR}/$${sm_path} --strip 1; \ |
317 |
done; \ |
318 |
done && \ |
319 |
${ECHO_MSG} "===> Preparing the node project for ${PKGNAME}" && \ |
320 |
cd ${_NODE_DIR} && \ |
321 |
([ -z "${NODE_SRCDIR}" ] || \ |
322 |
(${MKDIR} node_modules && \ |
323 |
${MV} ${NODE_SRCDIR} node_modules/${NODE_SUBDIR} \ |
324 |
) \ |
325 |
) && cd ${_NODE_DO_CD} && \ |
326 |
for m in ${NODE_MODULES_ADD}; do \ |
327 |
mdir=$${m%%/*} && \ |
328 |
mmod=$${m##*/} && \ |
329 |
if [ $${mdir} = $${m} ]; then \ |
330 |
mdir=.; \ |
331 |
fi && \ |
332 |
(cd $${mdir} && ${JQ_CMD} -s ".[0] * `${ECHO} $${mmod} | ${SED} -E 's/([[:alnum:]-]+):([[:digit:].]+)/{"dependencies":{"\1":"\2"}}/'`" \ |
333 |
package.json > package-new.json && ${MV} package-new.json package.json); \ |
334 |
done && \ |
335 |
for m in ${NODE_MODULES_DEL}; do \ |
336 |
mdir=$${m%%/*} && \ |
337 |
mmod=$${m##*/} && \ |
338 |
if [ $${mdir} = $${m} ]; then \ |
339 |
mdir=.; \ |
340 |
fi && \ |
341 |
(cd $${mdir} && ${JQ_CMD} -s ".[0] | del(.[\"dependencies\"][\"$${mmod}\"])" \ |
342 |
package.json > package-new.json && ${MV} package-new.json package.json); \ |
343 |
done && \ |
344 |
([ -z ${_NODE_USES_MERGE_PKG_DEPS} ] || \ |
345 |
(${JQ_CMD} -s '(.[0] | del(.["packageDependencies"])) * (.[0]["packageDependencies"] | {"dependencies": .})' \ |
346 |
package.json > package-new.json && ${MV} package-new.json package.json)) && \ |
347 |
([ -f "${SHRINKWRAP_FILE}" ] || \ |
348 |
${ECHO} "Warning: no shrinkwrap file, you need to run 'make makeshrinkwrap'" >&2) && \ |
349 |
([ ! -f "${SHRINKWRAP_FILE}" ] || \ |
350 |
${CP} ${SHRINKWRAP_FILE} npm-shrinkwrap.json) && \ |
351 |
for sp in ${NODE_SUB_PROJECTS}; do \ |
352 |
cd $${sp} && \ |
353 |
([ -f "${FILESDIR}/$${sp}/${SHRINKWRAP_NAME}" ] || \ |
354 |
${ECHO} "Warning: no shrinkwrap file for subproject $${sp}, you need to run 'make makeshrinkwrap'" >&2) && \ |
355 |
([ ! -f "${FILESDIR}/$${sp}/${SHRINKWRAP_NAME}" ] || \ |
356 |
${CP} ${FILESDIR}/$${sp}/${SHRINKWRAP_NAME} npm-shrinkwrap.json) && \ |
357 |
cd ..; \ |
358 |
done && \ |
359 |
${ECHO_MSG} "===> Downloading the project nodejs dependencies for ${PKGNAME}" && \ |
360 |
(cd ${NPM_BUILD_DIR} && ${NPM_ENV_FETCH} ${NPM_CMD} install ${NPM_FETCH_ARGS}) && \ |
361 |
for sp in ${NODE_SUB_PROJECTS}; do \ |
362 |
${ECHO_MSG} "===> Downloading the project dependencies for ${PKGNAME}/$${sp}" && \ |
363 |
(cd $${sp} && ${NPM_ENV_FETCH} ${NPM_CMD} install ${NPM_FETCH_ARGS}); \ |
364 |
done && \ |
365 |
cd ${_NODE_FETCH_WORKDIR} && \ |
366 |
${RM} -rf ${_NODE_TMP_BASE_FETCH} && \ |
367 |
${ECHO_MSG} "===> Packaging the final distfile for ${PKGNAME}" && \ |
368 |
${FIND} ${_NODE_DIR} -and -exec ${TOUCH} -h -d 1970-01-01T00:00:00Z {} + && \ |
369 |
${FIND} ${_NODE_DIR} -print0 | sort -z | \ |
370 |
${TAR} czf ${NODE_DISTFILE} --options gzip:!timestamp --no-recursion --null -T - && \ |
371 |
${RM} -rf ${_NODE_DIR}; then \ |
372 |
return 0; \ |
373 |
fi; \ |
374 |
${ECHO_MSG} "===> Fetch failed for ${PKGNAME}"; \ |
375 |
exit 1; \ |
376 |
fi; |
377 |
|
378 |
do-extract: |
379 |
@cd ${WRKDIR} && \ |
380 |
tar xzf ${DISTDIR}/${NODE_DISTFILE} |
381 |
|
382 |
_USES_patch+= 750:patch-gyp-cflags |
383 |
patch-gyp-cflags: |
384 |
@${FIND} ${WRKSRC} -name "*.gyp" -and -exec ${REINPLACE_CMD} -e "s|cflags': \[|cflags': ['-I${LOCALBASE}/include/node',|g" {} \; |
385 |
|
386 |
npm-build: tmpdirs_build fakemake |
387 |
@cd ${WRKSRC}/${_NODE_DO_CD} && \ |
388 |
${ECHO} "===> NPM build for ${PKGNAME}" && \ |
389 |
(cd ${NPM_BUILD_DIR} && ${NPM_ENV_BUILD} ${NPM_CMD} rebuild ${NPM_BUILD_ARGS}) && \ |
390 |
for sp in ${NODE_SUB_PROJECTS}; do \ |
391 |
${ECHO} "===> NPM build for ${PKGNAME}/$${sp}" && \ |
392 |
(cd $${sp} && ${NPM_ENV_BUILD} ${NPM_CMD} rebuild ${NPM_BUILD_ARGS}); \ |
393 |
done; |
394 |
|
395 |
.if defined(_NODE_USES_GRUNT) |
396 |
grunt-build: |
397 |
@${ECHO} "===> Grunt build for ${PKGNAME}" |
398 |
@cd ${WRKSRC}/${_NODE_DO_CD} && \ |
399 |
${GRUNT_ENV} ${GRUNT_CMD} ${NODE_GRUNT_TARGETS} ${GRUNT_BUILD_ARGS} |
400 |
opt-grunt-build: grunt-build |
401 |
.else |
402 |
opt-grunt-build: |
403 |
.endif |
404 |
|
405 |
.if !target(do-pre-build) |
406 |
do-pre-build: |
407 |
.endif |
408 |
.if !target(do-post-build) |
409 |
do-post-build: |
410 |
.endif |
411 |
|
412 |
# TODO npm-clean ? |
413 |
npm-prune: |
414 |
@${ECHO} "===> Pruning for ${PKGNAME}" |
415 |
@cd ${WRKSRC}/${_NODE_DO_CD} && \ |
416 |
${NPM_ENV_BUILD} ${NPM_CMD} prune ${NPM_PRUNE_ARGS} && \ |
417 |
for sp in ${NODE_SUB_PROJECTS}; do \ |
418 |
(cd $${sp} && ${NPM_ENV_BUILD} ${NPM_CMD} prune ${NPM_PRUNE_ARGS}) \ |
419 |
done; |
420 |
clean-files: |
421 |
@${ECHO} "===> Cleaning files for ${PKGNAME}" |
422 |
@cd ${WRKSRC}/${_NODE_DO_CD} && \ |
423 |
for f in ${NODE_FILES_TO_CLEAN}; do \ |
424 |
${FIND} -d . -name "$${f}" -and -exec ${RM} -rf {} \;; \ |
425 |
done && \ |
426 |
${FIND} -d . -type d -empty -exec rmdir {} \; |
427 |
|
428 |
do-build: do-pre-build npm-build opt-grunt-build do-post-build opt-coffee-migrate npm-prune clean-files |
429 |
|
430 |
.if defined(_NODE_USES_COFFEE) |
431 |
coffee-migrate: |
432 |
@${ECHO} "===> Performing coffee-migration for ${PKGNAME}" && \ |
433 |
${COFFEE_CMD} --output ${WRKSRC} --compile ${WRKSRC} && \ |
434 |
${FIND} ${WRKSRC} -name "*.coffee" -and -exec ${RM} -rf {} \; |
435 |
opt-coffee-migrate: coffee-migrate |
436 |
.else |
437 |
opt-coffee-migrate: |
438 |
.endif |
439 |
|
440 |
_USES_build+= 751:delete-gyp-pyc |
441 |
delete-gyp-pyc: |
442 |
@${ECHO} "===> Deleting created .pyc files that npm should have installed" |
443 |
@${RM} -rf `${FIND} ${LOCALBASE}/lib/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp -name "*.pyc"` |
444 |
|
445 |
do-install: |
446 |
@${ECHO} "===> Staging for ${PKGNAME}" |
447 |
@${MKDIR} ${STAGEDIR}${NODE_INSTALL_BASE} |
448 |
@${CP} -r ${WRKSRC} ${STAGEDIR}${NODE_INSTALL_DIR} |
449 |
@${RM} `${FIND} ${STAGEDIR}${NODE_INSTALL_DIR} -name "*.orig"` |
450 |
@${RM} `${FIND} ${STAGEDIR}${NODE_INSTALL_DIR} -name npm-shrinkwrap.json` |
451 |
@${RM} -rf `${FIND} ${STAGEDIR}${NODE_INSTALL_DIR} -name .deps` |
452 |
@${FIND} ${STAGEDIR}${NODE_INSTALL_DIR} -name "*.o" -and -exec ${STRIP_CMD} {} \; |
453 |
@${FIND} ${STAGEDIR}${NODE_INSTALL_DIR} -name "*.node" -and -exec ${STRIP_CMD} {} \; |
454 |
|
455 |
.endif |