Line 0
Link Here
|
|
|
1 |
# $FreeBSD$ |
2 |
# |
3 |
# handle node projects |
4 |
# |
5 |
# Feature: NODE |
6 |
# Usage: USE_NODE=yes |
7 |
# |
8 |
# MAINTAINER: portmgr@FreeBSD.org |
9 |
|
10 |
.if !defined(_INCLUDE_USES_NODE_MK) |
11 |
_INCLUDE_USES_NODE_MK= yes |
12 |
|
13 |
## XXX pending https://github.com/npm/npm/issues/10406 |
14 |
NO_CHECKSUM= yes |
15 |
|
16 |
FETCH_DEPENDS= npm:${PORTSDIR}/www/npm |
17 |
BUILD_DEPENDS= npm:${PORTSDIR}/www/npm |
18 |
RUN_DEPENDS= node:${PORTSDIR}/www/node |
19 |
|
20 |
.if defined(NODE_MODULES) |
21 |
FETCH_DEPENDS+= jq:${PORTSDIR}/textproc/jq |
22 |
JQ_CMD= ${LOCALBASE}/bin/jq |
23 |
.endif |
24 |
|
25 |
.if defined(NODE_GH_ACCOUNT) |
26 |
. if ! defined(NODE_GH_PROJECT) |
27 |
NODE_GH_PROJECT= ${PORTNAME} |
28 |
. endif |
29 |
. if ! defined(NODE_GH_TAGNAME) |
30 |
NODE_GH_TAGNAME= ${DISTVERSIONFULL} |
31 |
. endif |
32 |
_NODE_PROJECT_FILE= ${NODE_GH_ACCOUNT}-${NODE_GH_PROJECT}-${NODE_GH_TAGNAME}-node-project.tar.gz |
33 |
_NODE_DIST_FILE= ${NODE_GH_PROJECT}-${NODE_GH_TAGNAME}.tar.gz |
34 |
_NODE_DIR= ${NODE_GH_PROJECT}-${NODE_GH_TAGNAME} |
35 |
_NODE_GH_URL= https://codeload.github.com/${NODE_GH_ACCOUNT}/${NODE_GH_PROJECT}/tar.gz/${NODE_GH_TAGNAME}?dummy=/${_NODE_PROJECT_FILE} |
36 |
.endif |
37 |
|
38 |
# commands |
39 |
NPM_CMD= ${LOCALBASE}/bin/npm |
40 |
NODE_CMD= ${LOCALBASE}/bin/node |
41 |
|
42 |
# variables |
43 |
NPM_ENV+= C=cc CXX=c++ |
44 |
NPM_FETCH_ARGS= --loglevel warn --ignore-scripts |
45 |
NPM_SHRINKWRAP_ARGS= --dev |
46 |
SHRINKWRAP_FILE= ${FILESDIR}/npm-shrinkwrap.json |
47 |
NODE_INSTALL_BASE= ${LOCALBASE}/share/node-projects |
48 |
NODE_INSTALL_DIR= ${NODE_INSTALL_BASE}/${NODE_GH_ACCOUNT}-${NODE_GH_PROJECT} |
49 |
_NODE_MASTER_SITE_BACKUP_URLS= ${MASTER_SITE_BACKUP}${_NODE_DIST_FILE} |
50 |
.if defined(NODE_SRCDIR) |
51 |
_NODE_DO_CD=node_modules/${NODE_SUBDIR} |
52 |
.else |
53 |
_NODE_DO_CD=. |
54 |
.endif |
55 |
|
56 |
makeshrinkwrap: do-fetch |
57 |
@cd ${_DISTDIR}; \ |
58 |
${TAR} xzf ${_NODE_DIST_FILE} && \ |
59 |
cd ${_NODE_DIR} && \ |
60 |
cd ${_NODE_DO_CD} && \ |
61 |
${NPM_CMD} shrinkwrap ${NPM_SHRINKWRAP_ARGS} && \ |
62 |
${CP} npm-shrinkwrap.json ${SHRINKWRAP_FILE} && \ |
63 |
cd ${_DISTDIR} && \ |
64 |
${RM} -r ${_NODE_DIR} |
65 |
|
66 |
do-fetch: |
67 |
@${MKDIR} ${_DISTDIR} |
68 |
@cd ${_DISTDIR}; \ |
69 |
force_fetch=false; \ |
70 |
for afile in ${FORCE_FETCH}; do \ |
71 |
afile=$${afile##*/}; \ |
72 |
if [ "x$$afile" = "x${_NODE_DIST_FILE}" ]; then \ |
73 |
force_fetch=true; \ |
74 |
fi; \ |
75 |
done; \ |
76 |
if [ ! -f ${_NODE_DIST_FILE} -o "$$force_fetch" = "true" ]; then \ |
77 |
${RM} -rf ${_NODE_PROJECT_FILE} ${_NODE_DIR} ${_NODE_DIST_FILE}; \ |
78 |
for url in ${_NODE_MASTER_SITE_BACKUP_URLS}; do \ |
79 |
if ${ECHO_MSG} "=> Attempting to fetch ${PORTNAME} from the master backup site" && \ |
80 |
${SETENV} ${FETCH_ENV} ${FETCH_CMD} ${FETCH_BEFORE_ARGS} $${url} ${FETCH_AFTER_ARGS}; then \ |
81 |
return 0; \ |
82 |
fi; \ |
83 |
done; \ |
84 |
for url in ${_NODE_GH_URL}; do \ |
85 |
if ${ECHO_MSG} "=> Attempting to fetch ${PORTNAME} from github" && \ |
86 |
${SETENV} ${FETCH_ENV} ${FETCH_CMD} ${FETCH_BEFORE_ARGS} $${url} ${FETCH_AFTER_ARGS} && \ |
87 |
${ECHO_MSG} "=> Extracting node project source" && \ |
88 |
${EXTRACT_CMD} ${EXTRACT_BEFORE_ARGS} ${_NODE_PROJECT_FILE} ${EXTRACT_AFTER_ARGS} && \ |
89 |
${RM} ${_NODE_PROJECT_FILE} && \ |
90 |
${ECHO_MSG} "=> Preparing the node project" && \ |
91 |
cd ${_NODE_DIR} && \ |
92 |
([ -z "${NODE_SRCDIR}" ] || \ |
93 |
(${MKDIR} node_modules && \ |
94 |
${MV} ${NODE_SRCDIR} node_modules/${NODE_SUBDIR} \ |
95 |
) \ |
96 |
) && cd ${_NODE_DO_CD} && \ |
97 |
for m in ${NODE_MODULES}; do \ |
98 |
${ECHO} $${m} | ${SED} -E "s/^([[:alnum:]]+):([[:digit:].]+)/{\"dependencies\":{\"\1\":\"\2\"}}/" > package-delta.json && \ |
99 |
${JQ_CMD} -s '.[0] * .[1]' package.json package-delta.json > package-new.json && \ |
100 |
${MV} package-new.json package.json && \ |
101 |
${RM} package-delta.json; \ |
102 |
done && \ |
103 |
([ -f "${SHRINKWRAP_FILE}" ] || ${ECHO} "Warning: no shrinkwrap file, you need to run 'make makeshrinkwrap' >&2") && \ |
104 |
([ ! -f "${SHRINKWRAP_FILE}" ] || \ |
105 |
${CP} ${SHRINKWRAP_FILE} npm-shrinkwrap.json) && \ |
106 |
${ECHO_MSG} "=> Downloading the project dependencies" && \ |
107 |
${NPM_ENV} ${NPM_CMD} install ${NPM_FETCH_ARGS} && \ |
108 |
cd ${_DISTDIR} && \ |
109 |
${FIND} ${_NODE_DIR} -and -exec ${TOUCH} -h -d 1970-01-01T00:00:00Z {} + && \ |
110 |
${FIND} ${_NODE_DIR} -print0 | sort -z | \ |
111 |
${TAR} czf ${_NODE_DIST_FILE} --options gzip:!timestamp --no-recursion --null -T - && \ |
112 |
${RM} -rf ${_NODE_DIR}; then \ |
113 |
return 0; \ |
114 |
fi; \ |
115 |
done; \ |
116 |
${ECHO_MSG} "=> Fetch failed for ${PORTNAME}"; \ |
117 |
exit 1; \ |
118 |
fi; |
119 |
|
120 |
do-build: |
121 |
@cd ${WRKSRC} && \ |
122 |
cd ${_NODE_DO_CD} && \ |
123 |
${NPM_ENV} ${NPM_CMD} rebuild ${NPM_BUILD_ARGS} |
124 |
|
125 |
do-install: |
126 |
@${ECHO} "=> Staging ${PKGNAME}" |
127 |
@${MKDIR} ${STAGEDIR}${NODE_INSTALL_BASE} |
128 |
@${CP} -r ${WRKSRC} ${STAGEDIR}${NODE_INSTALL_DIR} |
129 |
@${RM} `${FIND} ${STAGEDIR}${NODE_INSTALL_DIR} -name Makefile` |
130 |
@${RM} `${FIND} ${STAGEDIR}${NODE_INSTALL_DIR} -name "*.bat"` |
131 |
@${RM} `${FIND} ${STAGEDIR}${NODE_INSTALL_DIR} -name "*.log"` |
132 |
@${RM} `${FIND} ${STAGEDIR}${NODE_INSTALL_DIR} -name "*.orig"` |
133 |
@${RM} `${FIND} ${STAGEDIR}${NODE_INSTALL_DIR} -name "*.bak"` |
134 |
@${RM} `${FIND} ${STAGEDIR}${NODE_INSTALL_DIR} -name ".git*"` |
135 |
@${RM} `${FIND} ${STAGEDIR}${NODE_INSTALL_DIR} -name npm-shrinkwrap.json` |
136 |
@${STRIP_CMD} `${FIND} ${STAGEDIR}${NODE_INSTALL_DIR} -name "*.o"` |
137 |
@${STRIP_CMD} `${FIND} ${STAGEDIR}${NODE_INSTALL_DIR} -name "*.node"` |
138 |
|
139 |
.endif |