View | Details | Raw Unified | Return to bug 204577 | Differences between
and this patch

Collapse All | Expand All

(-)Mk2/Uses/nodejs.mk (+455 lines)
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

Return to bug 204577