--- Mk2/Uses/nodejs.mk 1969-12-31 16:00:00.000000000 -0800
+++ Mk2/Uses/nodejs.mk 2015-12-06 01:59:38.731824000 -0800
@@ -0,0 +1,455 @@
+# $FreeBSD$
+#
+# Provide support for NodeJS based projects
+#
+# Feature: nodejs
+# Usage: USES=nodejs
+#
+# MAINTAINER: portmgr@FreeBSD.org
+
+# NODE_SUB_PROJECTS - additional projects to extract into individual
+# directories. Distfile for the group with the name
+# of the sub-project is extracted into the sub-folder
+# with the same name. Build is also performed for
+# sub-projects.
+# NODE_SUB_MODULES - additional projects to insert as submodules into the
+# specific directories identified. Build is not
+# prformed for them.
+# NODE_USES - additional features enabled in nodejs module:
+# grunt - run grunt tasks as a part of the build
+# coffee - perform the coffee-migration on all .coffee files
+# jq - add fetch dependency on jq when jq is also used by some custom targets
+# merge-pkg-deps - merge packageDependencies into dependencies in package.json
+# NODE_MODULES_ADD - delete node module dependencies, in the format: {
/}:
+# NODE_MODULES_DEL - delete node module dependencies, in the format: {/}
+# NODE_FILES_TO_CLEAN - wildcards for files and directoroes that do not need to be installed
+
+.if !defined(_INCLUDE_USES_NODE_MK)
+_INCLUDE_USES_NODE_MK= yes
+
+FETCH_DEPENDS+= npm:${PORTSDIR}/www/npm \
+ git:${PORTSDIR}/devel/git
+BUILD_DEPENDS+= npm:${PORTSDIR}/www/npm \
+ gmake:${PORTSDIR}/devel/gmake
+RUN_DEPENDS+= node:${PORTSDIR}/www/node
+
+_NODE_DIR?= ${PORTNAME}-${PORTVERSION}
+
+# commands
+NPM_CMD= ${LOCALBASE}/bin/npm
+NODE_CMD= ${LOCALBASE}/bin/node
+
+# variables
+_NODE_TMP_BASE_FETCH= ${DISTDIR}/${_NODE_DIR}.tmpdirs
+_NODE_TMP_BASE_BUILD= ${WRKDIR}
+_NODE_USERHOME_FETCH= ${_NODE_TMP_BASE_FETCH}/.userhome
+_NODE_TMP_FETCH= ${_NODE_TMP_BASE_FETCH}/.tmp
+_NODE_USERHOME_BUILD= ${_NODE_TMP_BASE_BUILD}/.userhome
+_NODE_TMP_BUILD= ${_NODE_TMP_BASE_BUILD}/.tmp
+_NODE_FAKE_GIT= ${_NODE_TMP_FETCH}/fake-git
+#_NODE_FAKE_GIT_LINK= ${_NODE_TMP_FETCH}/git
+#_NODE_MAKE_LINK= ${_NODE_TMP_FETCH}/make
+_NODE_FAKE_GMAKE= ${_NODE_TMP_BUILD}/gmake
+_NODE_NPMRC_FETCH= ${_NODE_USERHOME_FETCH}/.npmrc
+CFLAGS+= -I${LOCALBASE}/include/node
+CXXFLAGS+= -I${LOCALBASE}/include/node
+NPM_ENV+= C=${CC} CXX=${CXX}
+NPM_ENV_FETCH= ${NPM_ENV} HOME=${_NODE_USERHOME_FETCH} TMP=${_NODE_TMP_FETCH} PATH=${_NODE_TMP_FETCH}:${PATH}
+NPM_ENV_BUILD= ${NPM_ENV} HOME=${_NODE_USERHOME_BUILD} TMP=${_NODE_TMP_BUILD} PATH=${_NODE_TMP_BUILD}:${PATH}
+NPM_LOG_LEVEL?= warn
+NPM_FETCH_ARGS= --loglevel ${NPM_LOG_LEVEL} --ignore-scripts
+NPM_BUILD_ARGS= --loglevel ${NPM_LOG_LEVEL} --nodedir=${LOCALBASE}
+NPM_PRUNE_ARGS= --loglevel ${NPM_LOG_LEVEL} --production=true
+NPM_SHRINKWRAP_ARGS= --dev
+REINPLACE_ARGS= -i ""
+SHRINKWRAP_NAME= npm-shrinkwrap.json
+SHRINKWRAP_FILE= ${FILESDIR}/${SHRINKWRAP_NAME}
+NODE_INSTALL_BASE:= ${LOCALBASE}/share/node-projects
+NODE_INSTALL_DIR:= ${NODE_INSTALL_BASE}/${PORTNAME}
+NODE_ORIG_DISTFILES:= ${DISTFILES}
+NODE_DISTFILE:= ${PORTNAME}-${PORTVERSION}-nodejs.tar.gz
+CKSUMFILES+= ${NODE_DISTFILE}
+_NODE_MASTER_SITE_BACKUP_URLS= ${MASTER_SITE_BACKUP}${NODE_DISTFILE}
+NPM_BUILD_DIR?= .
+NODE_FILES_TO_CLEAN+= .git* *.bak *.log *.bat Makefile .travis.yml man *.info .DS_Store
+
+.for f in ${NODE_USES}
+_f:= ${f:C/\:.*//}
+.if ${_f}=="grunt"
+FETCH_DEPENDS+= grunt:${PORTSDIR}/devel/grunt
+GRUNT_CMD= ${LOCALBASE}/bin/grunt
+GRUNT_ENV+= HOME=${_NODE_USERHOME_BUILD} TMP=${_NODE_TMP_BUILD} PATH=${_NODE_TMP_BUILD}:${PATH}
+GRUNT_BUILD_ARGS+=
+NODE_GRUNT_TARGETS?=
+_NODE_USES_GRUNT= yes
+.elif ${_f}=="coffee"
+BUILD_DEPENDS+= coffee:${PORTSDIR}/lang/coffeescript
+COFFEE_CMD= ${LOCALBASE}/bin/coffee
+_NODE_USES_COFFEE= yes
+.elif ${_f}=="jq"
+_NODE_USES_JQ= yes
+.elif ${_f}=="merge-pkg-deps"
+_NODE_USES_MERGE_PKG_DEPS= yes
+.endif
+.endfor
+
+.if defined(NODE_MODULES_ADD) || defined(NODE_MODULES_DEL) || defined(_NODE_USES_MERGE_PKG_DEPS) || defined(_NODE_USES_JQ)
+FETCH_DEPENDS+= jq:${PORTSDIR}/textproc/jq
+JQ_CMD= ${LOCALBASE}/bin/jq
+.endif
+
+
+.if defined(NODE_SRCDIR)
+_NODE_DO_CD=node_modules/${NODE_SUBDIR}
+.else
+_NODE_DO_CD=.
+.endif
+_NODE_FETCH_WORKDIR=${DISTDIR}
+
+makeshrinkwrap: do-fetch
+ @cd ${_NODE_FETCH_WORKDIR}; \
+ for main_distfile in ${NODE_ORIG_DISTFILES:N*\:*}; do \
+ ${EXTRACT_CMD} ${EXTRACT_BEFORE_ARGS} $${main_distfile} ${EXTRACT_AFTER_ARGS}; \
+ done && \
+ cd ${_NODE_DIR}/${_NODE_DO_CD} && \
+ (cd ${NPM_BUILD_DIR} && \
+ ${NPM_ENV_FETCH} ${NPM_CMD} shrinkwrap ${NPM_SHRINKWRAP_ARGS} && \
+ ${MKDIR} ${FILESDIR} && \
+ ${MV} ${SHRINKWRAP_NAME} ${SHRINKWRAP_FILE}) && \
+ for sp in ${NODE_SUB_PROJECTS}; do \
+ (cd $${sp} && \
+ ${NPM_ENV_FETCH} ${NPM_CMD} shrinkwrap ${NPM_SHRINKWRAP_ARGS} && \
+ ${MKDIR} ${FILESDIR}/$${sp} && \
+ ${MV} ${SHRINKWRAP_NAME} ${FILESDIR}/$${sp}/); \
+ done && \
+ cd ${_NODE_FETCH_WORKDIR} && \
+ ${RM} -r ${_NODE_DIR}
+
+tmpdirs_fetch: .EXEC .PHONY
+ @${RM} -rf ${_NODE_USERHOME_FETCH} ${_NODE_TMP_FETCH}
+ @${MKDIR} ${_NODE_USERHOME_FETCH} ${_NODE_TMP_FETCH}
+
+tmpdirs_build: .EXEC .PHONY
+ @${RM} -rf ${_NODE_USERHOME_BUILD} ${_NODE_TMP_BUILD}
+ @${MKDIR} ${_NODE_USERHOME_BUILD} ${_NODE_TMP_BUILD}
+
+fakegit: .EXEC .PHONY
+ @(${ECHO} '#!/bin/sh'; \
+ ${ECHO} ''; \
+ ${ECHO} 'name="nodejs-fetch"'; \
+ ${ECHO} 'DISTDIR="${DISTDIR}"'; \
+ ${ECHO} 'NODE_ORIG_DISTFILES="${NODE_ORIG_DISTFILES:C@^([^:]+).*@\1@}"'; \
+ ${ECHO} 'NODE_VERBOSE="${NODE_VERBOSE}"'; \
+ ${ECHO} 'NODE_DEBUG="${NODE_DEBUG}"'; \
+ ${ECHO} ''; \
+ ${ECHO} 'msg() {'; \
+ ${ECHO} ' [ "$$NODE_VERBOSE" = yes ] && echo "$${name}: $$1" >&2'; \
+ ${ECHO} ' dbg_log "$${name}: $$1"'; \
+ ${ECHO} '}'; \
+ ${ECHO} 'err() {'; \
+ ${ECHO} ' echo "$${name}: ERROR: $$1" >&2'; \
+ ${ECHO} ' dbg_log "$${name}: ERROR: $$1"'; \
+ ${ECHO} '}'; \
+ ${ECHO} 'dbg_log() {'; \
+ ${ECHO} ' [ "$$NODE_DEBUG" = yes ] && (echo "$$1" >>/tmp/nodejs-$$$$.log)'; \
+ ${ECHO} '}'; \
+ ${ECHO} ''; \
+ ${ECHO} 'dbg_log "called with arguments: $$*"'; \
+ ${ECHO} ''; \
+ ${ECHO} 'cmd_clone_remote() {'; \
+ ${ECHO} ' local mirror="$$1"'; \
+ ${ECHO} ' local dir="$$2"'; \
+ ${ECHO} ' msg "Git clone requested: mirror=$$mirror -> dir=$${dir}"'; \
+ ${ECHO} ' local fname_regex=$$(echo $$mirror | sed -E "s/https:\/\/github\.com\/([^/]+)\/([^/]+)\.git$$/^\1-\2-[[:alnum:].]*_GH0.tar.gz$$/g")'; \
+ ${ECHO} ' local fname=$$(find_file "$${fname_regex}")'; \
+ ${ECHO} ' if [ -n "$${fname}" ]; then'; \
+ ${ECHO} ' msg "Found distfile=$$fname for $$mirror"'; \
+ ${ECHO} ' (cd $${dir} && tar xzf $${DISTDIR}/$${fname} --strip 1)'; \
+ ${ECHO} ' return $$?'; \
+ ${ECHO} ' else'; \
+ ${ECHO} ' err "Failed to find distfile for $$mirror"'; \
+ ${ECHO} ' return 1'; \
+ ${ECHO} ' fi'; \
+ ${ECHO} '}'; \
+ ${ECHO} 'cmd_clone_local() {'; \
+ ${ECHO} ' local src="$$1"'; \
+ ${ECHO} ' local dst="$$2"'; \
+ ${ECHO} ' msg "copy $$src -> $$dst"'; \
+ ${ECHO} ' (cd $${src} && tar czf - .) | (cd $${dst} && tar xzf -)'; \
+ ${ECHO} '}'; \
+ ${ECHO} ''; \
+ ${ECHO} 'cmd_checkout() {'; \
+ ${ECHO} ' msg "do nothing for checkout of $$1 in `pwd`"'; \
+ ${ECHO} '}'; \
+ ${ECHO} ''; \
+ ${ECHO} 'find_file() {'; \
+ ${ECHO} ' for f in $${NODE_ORIG_DISTFILES}; do'; \
+ ${ECHO} ' if expr "$${f}" : "$${fname_regex}" > /dev/null; then'; \
+ ${ECHO} ' echo "$$f"'; \
+ ${ECHO} ' return'; \
+ ${ECHO} ' fi'; \
+ ${ECHO} ' done'; \
+ ${ECHO} '}'; \
+ ${ECHO} ''; \
+ ${ECHO} 'case $$1 in'; \
+ ${ECHO} 'clone)'; \
+ ${ECHO} ' shift'; \
+ ${ECHO} ' while [ $$# -gt 0 ]; do'; \
+ ${ECHO} ' key="$$1"'; \
+ ${ECHO} ' case $$key in'; \
+ ${ECHO} ' --template=*)'; \
+ ${ECHO} ' ;;'; \
+ ${ECHO} ' --mirror)'; \
+ ${ECHO} ' MIRROR="$$2"'; \
+ ${ECHO} ' shift'; \
+ ${ECHO} ' ;;'; \
+ ${ECHO} ' -*)'; \
+ ${ECHO} ' err "Unknown argument: $$key" && exit 1'; \
+ ${ECHO} ' ;;'; \
+ ${ECHO} ' *)'; \
+ ${ECHO} ' if [ $$# -eq 1 -a -n "$$MIRROR" ]; then'; \
+ ${ECHO} ' cmd_clone_remote "$${MIRROR}" "$$key"'; \
+ ${ECHO} ' exit $$?'; \
+ ${ECHO} ' fi'; \
+ ${ECHO} ' if [ $$# -eq 2 -a -z "$$MIRROR" ]; then'; \
+ ${ECHO} ' cmd_clone_local "$$1" "$$2"'; \
+ ${ECHO} ' exit $$?'; \
+ ${ECHO} ' fi'; \
+ ${ECHO} ' err "Unknown argument #=$$#: $$key"'; \
+ ${ECHO} ' exit 1'; \
+ ${ECHO} ' ;;'; \
+ ${ECHO} ' esac'; \
+ ${ECHO} ' shift'; \
+ ${ECHO} ' done'; \
+ ${ECHO} ' ;;'; \
+ ${ECHO} 'rev-list)'; \
+ ${ECHO} ' shift'; \
+ ${ECHO} ' while [ $$# -gt 0 ]; do'; \
+ ${ECHO} ' key="$$1"'; \
+ ${ECHO} ' case $$key in'; \
+ ${ECHO} ' -n1)'; \
+ ${ECHO} ' shift'; \
+ ${ECHO} ' [ $$# -eq 1 ] || ! err "Unknown argument: $$key" || exit 1'; \
+ ${ECHO} ' msg "Returning same revision $$1"'; \
+ ${ECHO} ' echo $$1'; \
+ ${ECHO} ' exit 0'; \
+ ${ECHO} ' ;;'; \
+ ${ECHO} ' *)'; \
+ ${ECHO} ' err "Unknown argument: $$key" && exit 1'; \
+ ${ECHO} ' ;;'; \
+ ${ECHO} ' esac'; \
+ ${ECHO} ' shift'; \
+ ${ECHO} ' done'; \
+ ${ECHO} ' err "rev-list without arguments" && exit 1'; \
+ ${ECHO} ' ;;'; \
+ ${ECHO} 'checkout)'; \
+ ${ECHO} ' shift'; \
+ ${ECHO} ' if [ $$# -eq 1 ]; then'; \
+ ${ECHO} ' cmd_checkout "$$1"'; \
+ ${ECHO} ' exit 0'; \
+ ${ECHO} ' fi'; \
+ ${ECHO} ' ;;'; \
+ ${ECHO} 'config)'; \
+ ${ECHO} ' echo ""'; \
+ ${ECHO} ' ;;'; \
+ ${ECHO} '*)'; \
+ ${ECHO} ' err "Unknown command: $$1" && exit 1'; \
+ ${ECHO} ' ;;'; \
+ ${ECHO} 'esac'; \
+ ${ECHO} '') >> ${_NODE_FAKE_GIT}
+ @${CHMOD} +x ${_NODE_FAKE_GIT}
+ #@${LN} -s ${_NODE_FAKE_GIT} ${_NODE_FAKE_GIT_LINK}
+ @${ECHO} "git = ${_NODE_FAKE_GIT}" >> ${_NODE_NPMRC_FETCH}
+
+makelink: .EXEC .PHONY
+ #@${LN} -s ${LOCALBASE}/bin/gmake ${_NODE_MAKE_LINK}
+
+fakemake: .EXEC .PHONY
+ @(${ECHO} '#!/bin/sh'; \
+ ${ECHO} ''; \
+ ${ECHO} '${MAKE_ENV} PATH=$$PATH:${LOCALBASE}/bin ${LOCALBASE}/bin/gmake ${MAKE_ARGS} $$@'; \
+ ${ECHO} '') >> ${_NODE_FAKE_GMAKE}
+ @${CHMOD} +x ${_NODE_FAKE_GMAKE}
+
+.if !target(nodejs-patch-fetch)
+nodejs-patch-fetch:
+.endif
+
+_USES_fetch+= 750:npm-fetch
+npm-fetch: tmpdirs_fetch fakegit makelink
+ @${MKDIR} ${_NODE_FETCH_WORKDIR}
+ @cd ${_NODE_FETCH_WORKDIR}; \
+ force_fetch=false; \
+ for afile in ${FORCE_FETCH}; do \
+ afile=$${afile##*/}; \
+ if [ "x$$afile" = "x${NODE_DISTFILE}" ]; then \
+ force_fetch=true; \
+ fi; \
+ done; \
+ if [ ! -f ${NODE_DISTFILE} -o "$$force_fetch" = "true" ]; then \
+ ${RM} -rf ${_NODE_PROJECT_FILE} ${_NODE_DIR} ${NODE_DISTFILE}; \
+ for url in ${_NODE_MASTER_SITE_BACKUP_URLS}; do \
+ if ${ECHO_MSG} "===> Attempting to fetch ${PORTNAME} from the master backup site" && \
+ ${SETENV} ${FETCH_ENV} ${FETCH_CMD} ${FETCH_BEFORE_ARGS} $${url} ${FETCH_AFTER_ARGS}; then \
+ return 0; \
+ fi; \
+ done && \
+ if ${ECHO_MSG} "===> Extracting node project source for ${PKGNAME}" && \
+ ${MKDIR} ${_NODE_DIR} && \
+ for main_distfile in ${NODE_ORIG_DISTFILES:N*\:*}; do \
+ ${EXTRACT_CMD} ${EXTRACT_BEFORE_ARGS} $${main_distfile} ${EXTRACT_AFTER_ARGS} \
+ -C ${_NODE_DIR} --strip 1; \
+ done && \
+ for sp in ${NODE_SUB_PROJECTS}; do \
+ for df in `${ECHO} ${NODE_ORIG_DISTFILES} | tr ' ' '\n' | grep :$${sp}$$`; do \
+ ${MKDIR} ${_NODE_DIR}/$${sp} && \
+ ${EXTRACT_CMD} ${EXTRACT_BEFORE_ARGS} ${DISTDIR}/`${ECHO} $${df} | ${SED} -e 's/:[^:]*$$//g'` ${EXTRACT_AFTER_ARGS} \
+ -C ${_NODE_DIR}/$${sp} --strip 1; \
+ done; \
+ done && \
+ (cd ${_NODE_DIR} && ${MAKE} -f ${MASTERDIR}/Makefile nodejs-patch-fetch) && \
+ for sm in ${NODE_SUB_MODULES}; do \
+ sm_path=$${sm%%:*}; \
+ sm_group=$${sm##*:}; \
+ for df in `${ECHO} ${NODE_ORIG_DISTFILES} | tr ' ' '\n' | grep :$${sm_group}$$`; do \
+ ${EXTRACT_CMD} ${EXTRACT_BEFORE_ARGS} ${DISTDIR}/`${ECHO} $${df} | ${SED} -e 's/:[^:]*$$//g'` ${EXTRACT_AFTER_ARGS} \
+ -C ${_NODE_DIR}/$${sm_path} --strip 1; \
+ done; \
+ done && \
+ ${ECHO_MSG} "===> Preparing the node project for ${PKGNAME}" && \
+ cd ${_NODE_DIR} && \
+ ([ -z "${NODE_SRCDIR}" ] || \
+ (${MKDIR} node_modules && \
+ ${MV} ${NODE_SRCDIR} node_modules/${NODE_SUBDIR} \
+ ) \
+ ) && cd ${_NODE_DO_CD} && \
+ for m in ${NODE_MODULES_ADD}; do \
+ mdir=$${m%%/*} && \
+ mmod=$${m##*/} && \
+ if [ $${mdir} = $${m} ]; then \
+ mdir=.; \
+ fi && \
+ (cd $${mdir} && ${JQ_CMD} -s ".[0] * `${ECHO} $${mmod} | ${SED} -E 's/([[:alnum:]-]+):([[:digit:].]+)/{"dependencies":{"\1":"\2"}}/'`" \
+ package.json > package-new.json && ${MV} package-new.json package.json); \
+ done && \
+ for m in ${NODE_MODULES_DEL}; do \
+ mdir=$${m%%/*} && \
+ mmod=$${m##*/} && \
+ if [ $${mdir} = $${m} ]; then \
+ mdir=.; \
+ fi && \
+ (cd $${mdir} && ${JQ_CMD} -s ".[0] | del(.[\"dependencies\"][\"$${mmod}\"])" \
+ package.json > package-new.json && ${MV} package-new.json package.json); \
+ done && \
+ ([ -z ${_NODE_USES_MERGE_PKG_DEPS} ] || \
+ (${JQ_CMD} -s '(.[0] | del(.["packageDependencies"])) * (.[0]["packageDependencies"] | {"dependencies": .})' \
+ package.json > package-new.json && ${MV} package-new.json package.json)) && \
+ ([ -f "${SHRINKWRAP_FILE}" ] || \
+ ${ECHO} "Warning: no shrinkwrap file, you need to run 'make makeshrinkwrap'" >&2) && \
+ ([ ! -f "${SHRINKWRAP_FILE}" ] || \
+ ${CP} ${SHRINKWRAP_FILE} npm-shrinkwrap.json) && \
+ for sp in ${NODE_SUB_PROJECTS}; do \
+ cd $${sp} && \
+ ([ -f "${FILESDIR}/$${sp}/${SHRINKWRAP_NAME}" ] || \
+ ${ECHO} "Warning: no shrinkwrap file for subproject $${sp}, you need to run 'make makeshrinkwrap'" >&2) && \
+ ([ ! -f "${FILESDIR}/$${sp}/${SHRINKWRAP_NAME}" ] || \
+ ${CP} ${FILESDIR}/$${sp}/${SHRINKWRAP_NAME} npm-shrinkwrap.json) && \
+ cd ..; \
+ done && \
+ ${ECHO_MSG} "===> Downloading the project nodejs dependencies for ${PKGNAME}" && \
+ (cd ${NPM_BUILD_DIR} && ${NPM_ENV_FETCH} ${NPM_CMD} install ${NPM_FETCH_ARGS}) && \
+ for sp in ${NODE_SUB_PROJECTS}; do \
+ ${ECHO_MSG} "===> Downloading the project dependencies for ${PKGNAME}/$${sp}" && \
+ (cd $${sp} && ${NPM_ENV_FETCH} ${NPM_CMD} install ${NPM_FETCH_ARGS}); \
+ done && \
+ cd ${_NODE_FETCH_WORKDIR} && \
+ ${RM} -rf ${_NODE_TMP_BASE_FETCH} && \
+ ${ECHO_MSG} "===> Packaging the final distfile for ${PKGNAME}" && \
+ ${FIND} ${_NODE_DIR} -and -exec ${TOUCH} -h -d 1970-01-01T00:00:00Z {} + && \
+ ${FIND} ${_NODE_DIR} -print0 | sort -z | \
+ ${TAR} czf ${NODE_DISTFILE} --options gzip:!timestamp --no-recursion --null -T - && \
+ ${RM} -rf ${_NODE_DIR}; then \
+ return 0; \
+ fi; \
+ ${ECHO_MSG} "===> Fetch failed for ${PKGNAME}"; \
+ exit 1; \
+ fi;
+
+do-extract:
+ @cd ${WRKDIR} && \
+ tar xzf ${DISTDIR}/${NODE_DISTFILE}
+
+_USES_patch+= 750:patch-gyp-cflags
+patch-gyp-cflags:
+ @${FIND} ${WRKSRC} -name "*.gyp" -and -exec ${REINPLACE_CMD} -e "s|cflags': \[|cflags': ['-I${LOCALBASE}/include/node',|g" {} \;
+
+npm-build: tmpdirs_build fakemake
+ @cd ${WRKSRC}/${_NODE_DO_CD} && \
+ ${ECHO} "===> NPM build for ${PKGNAME}" && \
+ (cd ${NPM_BUILD_DIR} && ${NPM_ENV_BUILD} ${NPM_CMD} rebuild ${NPM_BUILD_ARGS}) && \
+ for sp in ${NODE_SUB_PROJECTS}; do \
+ ${ECHO} "===> NPM build for ${PKGNAME}/$${sp}" && \
+ (cd $${sp} && ${NPM_ENV_BUILD} ${NPM_CMD} rebuild ${NPM_BUILD_ARGS}); \
+ done;
+
+.if defined(_NODE_USES_GRUNT)
+grunt-build:
+ @${ECHO} "===> Grunt build for ${PKGNAME}"
+ @cd ${WRKSRC}/${_NODE_DO_CD} && \
+ ${GRUNT_ENV} ${GRUNT_CMD} ${NODE_GRUNT_TARGETS} ${GRUNT_BUILD_ARGS}
+opt-grunt-build: grunt-build
+.else
+opt-grunt-build:
+.endif
+
+.if !target(do-pre-build)
+do-pre-build:
+.endif
+.if !target(do-post-build)
+do-post-build:
+.endif
+
+# TODO npm-clean ?
+npm-prune:
+ @${ECHO} "===> Pruning for ${PKGNAME}"
+ @cd ${WRKSRC}/${_NODE_DO_CD} && \
+ ${NPM_ENV_BUILD} ${NPM_CMD} prune ${NPM_PRUNE_ARGS} && \
+ for sp in ${NODE_SUB_PROJECTS}; do \
+ (cd $${sp} && ${NPM_ENV_BUILD} ${NPM_CMD} prune ${NPM_PRUNE_ARGS}) \
+ done;
+clean-files:
+ @${ECHO} "===> Cleaning files for ${PKGNAME}"
+ @cd ${WRKSRC}/${_NODE_DO_CD} && \
+ for f in ${NODE_FILES_TO_CLEAN}; do \
+ ${FIND} -d . -name "$${f}" -and -exec ${RM} -rf {} \;; \
+ done && \
+ ${FIND} -d . -type d -empty -exec rmdir {} \;
+
+do-build: do-pre-build npm-build opt-grunt-build do-post-build opt-coffee-migrate npm-prune clean-files
+
+.if defined(_NODE_USES_COFFEE)
+coffee-migrate:
+ @${ECHO} "===> Performing coffee-migration for ${PKGNAME}" && \
+ ${COFFEE_CMD} --output ${WRKSRC} --compile ${WRKSRC} && \
+ ${FIND} ${WRKSRC} -name "*.coffee" -and -exec ${RM} -rf {} \;
+opt-coffee-migrate: coffee-migrate
+.else
+opt-coffee-migrate:
+.endif
+
+_USES_build+= 751:delete-gyp-pyc
+delete-gyp-pyc:
+ @${ECHO} "===> Deleting created .pyc files that npm should have installed"
+ @${RM} -rf `${FIND} ${LOCALBASE}/lib/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp -name "*.pyc"`
+
+do-install:
+ @${ECHO} "===> Staging for ${PKGNAME}"
+ @${MKDIR} ${STAGEDIR}${NODE_INSTALL_BASE}
+ @${CP} -r ${WRKSRC} ${STAGEDIR}${NODE_INSTALL_DIR}
+ @${RM} `${FIND} ${STAGEDIR}${NODE_INSTALL_DIR} -name "*.orig"`
+ @${RM} `${FIND} ${STAGEDIR}${NODE_INSTALL_DIR} -name npm-shrinkwrap.json`
+ @${RM} -rf `${FIND} ${STAGEDIR}${NODE_INSTALL_DIR} -name .deps`
+ @${FIND} ${STAGEDIR}${NODE_INSTALL_DIR} -name "*.o" -and -exec ${STRIP_CMD} {} \;
+ @${FIND} ${STAGEDIR}${NODE_INSTALL_DIR} -name "*.node" -and -exec ${STRIP_CMD} {} \;
+
+.endif