Tweak biology/seqan version 1.3.1_3
[dports.git] / Mk / bsd.port.subdir.mk
1 #       from: @(#)bsd.subdir.mk 5.9 (Berkeley) 2/1/91
2 # $FreeBSD$
3 #
4 # The include file <bsd.port.subdir.mk> contains the default targets
5 # for building ports subdirectories.
6 #
7 #
8 # +++ variables +++
9 #
10 # STRIP         - The flag passed to the install program to cause the binary
11 #                 to be stripped.  This is to be used when building your
12 #                 own install script so that the entire system can be made
13 #                 stripped/not-stripped using a single knob. [-s]
14 #
15 # OPSYS         - Get the operating system type [`uname -s`]
16 #
17 # SUBDIR        - A list of subdirectories that should be built as well.
18 #                 Each of the targets will execute the same target in the
19 #                 subdirectories.
20 #
21 #
22 # +++ targets +++
23 #
24 #       README.html:
25 #               Creating README.html for package.
26 #
27 #       afterinstall, all, beforeinstall, build, checksum, clean,
28 #       clean-for-cdrom, clean-restricted,
29 #       clean-for-cdrom-list, clean-restricted-list,
30 #       configure, deinstall,
31 #       depend, depends, describe, extract, fetch, fetch-list,
32 #       ignorelist, ignorelist-verbose,
33 #       install, maintainer, makesum, package, readmes, realinstall, reinstall,
34 #       tags
35 #
36 #       search:
37 #               Search for ports using either 'make search key=<keyword>'
38 #               or 'make search name=<keyword>'.
39
40 PORTSDIR?=              /usr/ports
41 TEMPLATES?=             ${PORTSDIR}/Templates
42 .if defined(PORTSTOP)
43 README=                 ${TEMPLATES}/README.top
44 .else
45 README=                 ${TEMPLATES}/README.category
46 .endif
47 MOVEDDIR?=              ${PORTSDIR}
48 MOVEDFILE?=             MOVED
49
50 .include "${PORTSDIR}/Mk/bsd.commands.mk"
51
52 .MAIN: all
53
54 .if !defined(DEBUG_FLAGS)
55 STRIP?= -s
56 .endif
57
58 # These are variables that are invariant for the lifetime of a recursive port traversal
59 # (index build, etc), so it is more efficient to precompute them here and pass them in
60 # to child makes explicitly, instead of recomputing them tens of thousands of times.
61
62 .if !defined(NOPRECIOUSMAKEVARS)
63 .if !defined(ARCH)
64 ARCH!=  ${UNAME} -p
65 .endif
66
67 .if !defined(OSVERSION)
68 OSVERSION=      9999999
69 .endif
70
71 .if !defined(DFLYVERSION)
72 .  if exists(/usr/include/sys/param.h)
73 DFLYVERSION!=   ${AWK} '/^\#define[[:blank:]]__DragonFly_version/ {print $$3}' < /usr/include/sys/param.h
74 .  elif exists(${SRC_BASE}/sys/sys/param.h)
75 DFLYVERSION!=   ${AWK} '/^\#define[[:blank:]]__DragonFly_version/ {print $$3}' < ${SRC_BASE}/sys/sys/param.h
76 .  else
77 DFLYVERSION!=   ${SYSCTL} -n kern.osreldate
78 .  endif
79 .endif
80
81 WITH_PKG=       yes
82 WITH_PKGNG=     yes
83
84 .if !defined(_OSRELEASE)
85 _OSRELEASE!=                    ${UNAME} -r
86 .endif
87 .if !defined(OSREL)
88 OSREL=  ${_OSRELEASE:C/[-(].*//}
89 .endif
90
91 .if !defined(OPSYS)
92 OPSYS!= ${UNAME} -s
93 .endif
94
95 .if ${ARCH} == "amd64" || ${ARCH} =="ia64"
96 .if !defined(HAVE_COMPAT_IA32_KERN)
97 HAVE_COMPAT_IA32_KERN!= if ${SYSCTL} -n compat.ia32.maxvmem >/dev/null 2>&1; then echo YES; fi; echo
98 .if empty(HAVE_COMPAT_IA32_KERN)
99 .undef HAVE_COMPAT_IA32_KERN
100 .endif
101 .endif
102 .endif
103
104 .if !defined(CONFIGURE_MAX_CMD_LEN)
105 CONFIGURE_MAX_CMD_LEN!= ${SYSCTL} -n kern.argmax
106 .endif
107
108 .if !defined(_JAVA_VERSION_LIST_REGEXP)
109 _JAVA_VERSION_LIST_REGEXP!=     ${MAKE} -V _JAVA_VERSION_LIST_REGEXP USE_JAVA=1 -f ${PORTSDIR}/Mk/bsd.port.mk
110 .endif
111
112 .if !defined(_JAVA_VENDOR_LIST_REGEXP)
113 _JAVA_VENDOR_LIST_REGEXP!=      ${MAKE} -V _JAVA_VENDOR_LIST_REGEXP USE_JAVA=1 -f ${PORTSDIR}/Mk/bsd.port.mk
114 .endif
115
116 .if !defined(_JAVA_OS_LIST_REGEXP)
117 _JAVA_OS_LIST_REGEXP!=          ${MAKE} -V _JAVA_OS_LIST_REGEXP USE_JAVA=1 -f ${PORTSDIR}/Mk/bsd.port.mk
118 .endif
119
120 .if !defined(_JAVA_PORTS_INSTALLED)
121 _JAVA_PORTS_INSTALLED!=         ${MAKE} -V _JAVA_PORTS_INSTALLED USE_JAVA=1 -f ${PORTSDIR}/Mk/bsd.port.mk
122 .endif
123
124 .if !defined(UID)
125 UID!=   ${ID} -u
126 .endif
127
128 .endif
129
130 INDEXDIR?=      ${PORTSDIR}
131 INDEXFILE?=     INDEX-${DFLYVERSION:C/([0-9]*)[0-9]{5}/\1/}
132
133 # local customization of the ports tree
134 .if exists(${.CURDIR}/Makefile.local)
135 .include "${.CURDIR}/Makefile.local"
136 .endif
137
138 TARGETS+=       all
139 TARGETS+=       build
140 TARGETS+=       checksum
141 TARGETS+=       clean
142 TARGETS+=       clean-for-cdrom
143 TARGETS+=       clean-for-cdrom-list
144 TARGETS+=       clean-restricted
145 TARGETS+=       clean-restricted-list
146 TARGETS+=       configure
147 TARGETS+=       deinstall
148 TARGETS+=       depend
149 TARGETS+=       depends
150 TARGETS+=       distclean
151 TARGETS+=       extract
152 TARGETS+=       fetch
153 TARGETS+=       fetch-list
154 TARGETS+=       ignorelist
155 TARGETS+=       ignorelist-verbose
156 TARGETS+=       makesum
157 TARGETS+=       maintainer
158 TARGETS+=       package
159 TARGETS+=       package-recursive
160 TARGETS+=       realinstall
161 TARGETS+=       reinstall
162 TARGETS+=       tags
163
164 .for __target in ${TARGETS}
165 .if !target(${__target})
166 .if defined(SUBDIR) && !empty(SUBDIR)
167 ${__target}: ${SUBDIR:S/^/_/:S/$/.${__target}/}
168 .else
169 ${__target}:
170 .endif
171 .endif
172 .endfor
173
174 .if defined(SUBDIR) && !empty(SUBDIR)
175
176 .for __target in ${TARGETS} checksubdirs describe readmes
177 ${SUBDIR:S/^/_/:S/$/.${__target}/}: _SUBDIRUSE
178 .endfor
179
180 _SUBDIRUSE: .USE
181         @OK=""; sub=${.TARGET:S/^_//:R}; \
182         for dud in $$DUDS; do \
183                 if [ $${dud} = $$sub ]; then \
184                         OK="false"; \
185                         ${ECHO_MSG} "===> ${DIRPRFX}$$sub skipped"; \
186                 fi; \
187         done; \
188         if test -d ${.CURDIR}/$${sub}.${MACHINE_ARCH}; then \
189                 edir=$${sub}.${MACHINE_ARCH}; \
190         elif test -d ${.CURDIR}/$${sub}; then \
191                 edir=$${sub}; \
192         else \
193                 OK="false"; \
194                 ${ECHO_MSG} "===> ${DIRPRFX}$${sub} non-existent"; \
195         fi; \
196         if [ "$$OK" = "" ]; then \
197                 ${ECHO_MSG} "===> ${DIRPRFX}$${edir}"; \
198                 cd ${.CURDIR}/$${edir}; \
199                 ${MAKE} -B ${.TARGET:E:realinstall=install} \
200                         DIRPRFX=${DIRPRFX}$$edir/; \
201         fi
202
203 .for _subdir in ${SUBDIR:S/^/_/}
204 ${_subdir}::   ${_subdir:S/$/.all/}
205 .endfor
206
207 .endif
208
209 .if !target(install)
210 .if !target(beforeinstall)
211 beforeinstall:
212 .endif
213 .if !target(afterinstall)
214 afterinstall:
215 .endif
216 install: afterinstall
217 afterinstall: realinstall
218 realinstall: beforeinstall ${SUBDIR:S/^/_/:S/$/.realinstall/}
219 .endif
220
221 IGNOREDIR=      Mk Templates Tools distfiles packages pkg Keywords
222
223 .if !target(checksubdirs)
224 .if defined(PORTSTOP)
225 checksubdirs: checksubdir ${SUBDIR:S/^/_/:S/$/.checksubdirs/}
226 .else
227 checksubdirs: checksubdir
228 .endif
229 .endif
230
231 .if !target(checksubdir)
232 checksubdir:
233         @for d in *; do \
234           if [ -d "$$d" ]; then \
235             found=0; \
236             for s in ${SUBDIR} ${IGNOREDIR}; do \
237               if [ "x$$s" = "x$$d" ]; then \
238                 found=1; \
239                 break; \
240               fi; \
241             done; \
242             if [ $$found = 0 ]; then \
243               ${ECHO_MSG} "Warning: directory $$d not in SUBDIR"; \
244             fi; \
245           fi; \
246         done
247         @for s in ${SUBDIR}; do \
248           if ! [ -d ${.CURDIR}/$$s ]; then \
249             ${ECHO_MSG} "Warning: directory $$s in SUBDIR does not exist"; \
250           fi \
251         done
252 .endif
253
254 .if !target(describe)
255 .if defined(PORTSTOP)
256 # This is a bit convoluted to deal with the fact that make will overlap I/O from child make processes
257 # if they write more than 2k: this will corrupt the INDEX file.  make -P does not do this, but it adds
258 # extraneous output and redirects stderr, so we lose error reporting from child makes.  Instead we have
259 # to roll our own implementation of make -P and make sure that each child make writes to their own file,
260 # which we will combine at the end.  This gives substantial performance benefits over doing a make -j1
261
262 .if defined(BUILDING_INDEX)
263 describe: ${SUBDIR:S/^/describe./}
264
265 .for i in ${SUBDIR}
266 describe.$i:
267         @cd ${.CURDIR}; ${MAKE} -B ${i:S/^/_/:S/$/.describe/} > ${INDEX_TMPDIR}/${INDEXFILE}.desc.${i}
268 .endfor
269 .else
270 describe: ${SUBDIR:S/^/_/:S/$/.describe/}
271 .endif
272 .else
273 describe:
274         @for sub in ${SUBDIR}; do \
275         if ${TEST} -d ${.CURDIR}/$${sub}; then \
276                 ${ECHO_MSG} "===> ${DIRPRFX}$${sub}"; \
277                 cd ${.CURDIR}/$${sub}; \
278                 ${MAKE} -B describe || \
279                         (${ECHO_CMD} "===> ${DIRPRFX}$${sub} failed" >&2; \
280                         exit 1) ;\
281         else \
282                 ${ECHO_MSG} "===> ${DIRPRFX}$${sub} non-existent"; \
283         fi; \
284         done
285 .endif
286 .endif
287
288 .if !target(readmes)
289 .if defined(PORTSTOP)
290 readmes: readme ${SUBDIR:S/^/_/:S/$/.readmes/}
291         @${ECHO_MSG} "===>   Creating README.html for all ports"
292         @perl ${PORTSDIR}/Tools/make_readmes < ${INDEXDIR}/${INDEXFILE}
293 .else
294 readmes: readme
295 .endif
296 .endif
297
298 .if !target(readme)
299 readme:
300         @${RM} -f README.html
301         @${MAKE} README.html
302 .endif
303
304 HTMLIFY=        ${SED} -e 's/&/\&amp;/g' -e 's/>/\&gt;/g' -e 's/</\&lt;/g'
305
306 package-name:
307         @${ECHO_CMD} ${.CURDIR} | ${SED} -e 's^.*/^^'
308
309 README.html:
310         @${ECHO_CMD} "===>  Creating README.html"
311         @> $@.tmp
312 .for entry in ${SUBDIR}
313 .if exists(${entry})
314 .if defined(PORTSTOP)
315         @${ECHO_CMD} -n '<a href="'${entry}/README.html'">'"`${ECHO_CMD} ${entry} | ${HTMLIFY}`"'</a>: ' >> $@.tmp
316 .else
317         @${ECHO_CMD} -n '<a href="'${entry}/README.html'">'"`cd ${entry}; ${MAKE} package-name | ${HTMLIFY}`</a>: " >> $@.tmp
318 .endif
319         @${ECHO_CMD} `cd ${entry}; ${MAKE} -V COMMENT` | ${HTMLIFY} >> $@.tmp
320 .endif
321 .endfor
322         @${SORT} -t '>' +1 -2 $@.tmp > $@.tmp2
323 .if exists(${DESCR})
324         @${HTMLIFY} ${DESCR} > $@.tmp3
325 .else
326         @> $@.tmp3
327 .endif
328 .if defined(COMMENT)
329         @${ECHO_CMD} "${COMMENT}" | ${HTMLIFY} > $@.tmp4
330 .else
331         @> $@.tmp4
332 .endif
333         @${CAT} ${README} | \
334                 ${SED} -e 's/%%CATEGORY%%/'"`basename ${.CURDIR}`"'/g' \
335                         -e '/%%COMMENT%%/r$@.tmp4' \
336                         -e '/%%COMMENT%%/d' \
337                         -e '/%%DESCR%%/r$@.tmp3' \
338                         -e '/%%DESCR%%/d' \
339                         -e '/%%SUBDIR%%/r$@.tmp2' \
340                         -e '/%%SUBDIR%%/d' \
341                 > $@
342         @${RM} -f $@.tmp $@.tmp2 $@.tmp3 $@.tmp4
343
344 # Pass in the cached invariant variables to child makes.
345 # XXX Why are we trying to escape these characters using regexps and not using ':Q'?
346 .if !defined(NOPRECIOUSMAKEVARS)
347 .MAKEFLAGS: \
348         ARCH="${ARCH:S/"/"'"'"/g:S/\$/\$\$/g:S/\\/\\\\/g}" \
349         OPSYS="${OPSYS:S/"/"'"'"/g:S/\$/\$\$/g:S/\\/\\\\/g}" \
350         OSREL="${OSREL:S/"/"'"'"/g:S/\$/\$\$/g:S/\\/\\\\/g}" \
351         OSVERSION="${OSVERSION:S/"/"'"'"/g:S/\$/\$\$/g:S/\\/\\\\/g}" \
352         DFLYVERSION="${DFLYVERSION:Q}" \
353         UID="${UID:S/"/"'"'"/g:S/\$/\$\$/g:S/\\/\\\\/g}" \
354         HAVE_COMPAT_IA32_KERN="${HAVE_COMPAT_IA32_KERN}" \
355         CONFIGURE_MAX_CMD_LEN="${CONFIGURE_MAX_CMD_LEN}" \
356         _JAVA_VERSION_LIST_REGEXP="${_JAVA_VERSION_LIST_REGEXP:Q}" \
357         _JAVA_VENDOR_LIST_REGEXP="${_JAVA_VENDOR_LIST_REGEXP:Q}" \
358         _JAVA_OS_LIST_REGEXP="${_JAVA_OS_LIST_REGEXP:Q}" \
359         _JAVA_PORTS_INSTALLED="${_JAVA_PORTS_INSTALLED}"
360 .endif
361
362 PORTSEARCH_DISPLAY_FIELDS?=name,path,info,maint,index,bdeps,rdeps,www
363 PORTSEARCH_KEYLIM?=0
364 PORTSEARCH_XKEYLIM?=0
365 PORTSEARCH_IGNORECASE?=1
366 PORTSEARCH_MOVED?=1
367
368 _PORTSEARCH=    \
369         here=${.CURDIR}; \
370         if [ ! -r ${INDEXDIR}/${INDEXFILE} ] ; then \
371                 ${ECHO_MSG} "The ${.TARGET} target requires ${INDEXFILE}. Please run make index or make fetchindex."; \
372         else \
373         cd ${PORTSDIR}; \
374         if [ -z "$$key"   -a -z "$$xkey"   -a \
375              -z "$$name"  -a -z "$$xname"  -a \
376              -z "$$path"  -a -z "$$xpath"  -a \
377              -z "$$info"  -a -z "$$xinfo"  -a \
378              -z "$$maint" -a -z "$$xmaint" -a \
379              -z "$$cat"   -a -z "$$xcat"   -a \
380              -z "$$bdeps" -a -z "$$xbdeps" -a \
381              -z "$$rdeps" -a -z "$$xrdeps" -a \
382              -z "$$www"   -a -z "$$xwww"   ]; \
383         then \
384           ${ECHO_MSG} "The ${.TARGET} target requires a keyword parameter or name parameter,"; \
385           ${ECHO_MSG} "e.g.: \"make ${.TARGET} key=somekeyword\""; \
386           ${ECHO_MSG} "or    \"make ${.TARGET} name=somekeyword\""; \
387           exit; \
388         fi; \
389         ${AWK} -F\| -v there="$$here/" -v top="$$(pwd -P)" \
390             -v key="$$key"          -v xkey="$$xkey" \
391             -v name="$$name"        -v xname="$$xname" \
392             -v path="$$path"        -v xpath="$$xpath" \
393             -v info="$$info"        -v xinfo="$$xinfo" \
394             -v maint="$$maint"      -v xmaint="$$xmaint" \
395             -v cat="$$cat"          -v xcat="$$xcat" \
396             -v bdeps="$$bdeps"      -v xbdeps="$$xbdeps" \
397             -v rdeps="$$rdeps"      -v xrdeps="$$xrdeps" \
398             -v www="$$www"          -v xwww="$$xwww" \
399             -v icase="$${icase:-${PORTSEARCH_IGNORECASE}}" \
400             -v keylim="$${keylim:-${PORTSEARCH_KEYLIM}}" \
401             -v xkeylim="$${xkeylim:-${PORTSEARCH_XKEYLIM}}" \
402             -v display="$${display:-${PORTSEARCH_DISPLAY_FIELDS}}" \
403             -v xdisplay="$$xdisplay" \
404         'BEGIN { \
405             gsub(/\+/,"\\+",name); \
406             if (substr(there, 1, length(top)) == top) \
407               there = "${PORTSDIR}" substr(there, 1 + length(top)); \
408             therelen = length(there); \
409             keylen = length(key); keylim = keylim && keylen; \
410             if (!keylim && keylen) \
411               parms[0] = (icase ? tolower(key) : key); \
412             xkeylen = length(xkey); xkeylim = xkeylim && xkeylen; \
413             if (!xkeylim && xkeylen) \
414               xparms[0] = (icase ? tolower(xkey) : xkey); \
415                 if (icase) { \
416             if (length(name))  parms[1]  = tolower(name);  if (length(xname))  xparms[1]  = tolower(xname); \
417             if (length(path))  parms[2]  = tolower(path);  if (length(xpath))  xparms[2]  = tolower(xpath); \
418             if (length(info))  parms[4]  = tolower(info);  if (length(xinfo))  xparms[4]  = tolower(xinfo); \
419             if (length(maint)) parms[6]  = tolower(maint); if (length(xmaint)) xparms[6]  = tolower(xmaint); \
420             if (length(cat))   parms[7]  = tolower(cat);   if (length(xcat))   xparms[7]  = tolower(xcat); \
421             if (length(bdeps)) parms[8]  = tolower(bdeps); if (length(xbdeps)) xparms[8]  = tolower(xbdeps); \
422             if (length(rdeps)) parms[9]  = tolower(rdeps); if (length(xrdeps)) xparms[9]  = tolower(xrdeps); \
423             if (length(www))   parms[10] = tolower(www);   if (length(xwww))   xparms[10] = tolower(xwww); \
424           } else { \
425             if (length(name))  parms[1]  = name;  if (length(xname))  xparms[1]  = xname; \
426             if (length(path))  parms[2]  = path;  if (length(xpath))  xparms[2]  = xpath; \
427             if (length(info))  parms[4]  = info;  if (length(xinfo))  xparms[4]  = xinfo; \
428             if (length(maint)) parms[6]  = maint; if (length(xmaint)) xparms[6]  = xmaint; \
429             if (length(cat))   parms[7]  = cat;   if (length(xcat))   xparms[7]  = xcat; \
430             if (length(bdeps)) parms[8]  = bdeps; if (length(xbdeps)) xparms[8]  = xbdeps; \
431             if (length(rdeps)) parms[9]  = rdeps; if (length(xrdeps)) xparms[9]  = xrdeps; \
432             if (length(www))   parms[10] = www;   if (length(xwww))   xparms[10] = xwww; \
433           } \
434             fields["name"]  = 1;  names[1]  = "Port"; \
435             fields["path"]  = 2;  names[2]  = "Path"; \
436             fields["info"]  = 4;  names[4]  = "Info"; \
437             fields["maint"] = 6;  names[6]  = "Maint"; \
438             fields["cat"]   = 7;  names[7]  = "Index"; \
439             fields["bdeps"] = 8;  names[8]  = "B-deps"; \
440             fields["rdeps"] = 9;  names[9]  = "R-deps"; \
441             fields["www"]   = 10; names[10] = "WWW"; \
442             split(display, d, /,[ \t]*/); \
443             split(xdisplay, xd, /,[ \t]*/); \
444             for (i in d) { \
445             toprint = 1; \
446               for (j in xd) { \
447                 if (d[i] == xd[j] ) { \
448                        toprint=0; \
449                        break; \
450                  }\
451               } \
452             if (toprint == 1 ) disp[fields[d[i]]] = 1; \
453             } \
454           } \
455           { \
456             if (match($$2, "^/usr/ports/[^/]*/[^/]*$$") > 0) \
457               sub("^/usr/ports", "${PORTSDIR}", $$2); \
458             if (substr($$2, 1, therelen) != there) \
459               next; \
460             for (i in parms) \
461               if ((icase ? tolower($$i) : $$i) !~ parms[i]) \
462                 next; \
463             for (i in xparms) \
464               if ((icase ? tolower($$i) : $$i) ~ xparms[i]) \
465                 next; \
466             found = 0; \
467             for (i = 1; i < 11; i++) \
468               if (i in disp) { \
469                 if (xkeylim && (icase ? tolower($$i) : $$i) ~ xkey) \
470                   next; \
471                 if (!found && keylim && (icase ? tolower($$i) : $$i) ~ key) \
472                   found = 1; \
473               } \
474             if (keylim && !found) \
475               next; \
476             for (i = 1; i < 11; i++) \
477               if (i in disp) \
478                 printf("%s:\t%s\n", names[i], $$i); \
479             print(""); \
480           }' ${INDEXDIR}/${INDEXFILE}; \
481           if [ "$$name" -o "$$xname" ] && [ ${PORTSEARCH_MOVED} -gt 0 ]; \
482           then \
483             ${AWK} -F\| -v name="$$name"        -v xname="$$xname" \
484                 -v icase="$${icase:-${PORTSEARCH_IGNORECASE}}" \
485             'BEGIN { \
486                 if (icase) { \
487                 if (length(name))  name = tolower(name);  if (length(xname))  xname = tolower(xname); \
488                 } \
489                 fields["name"]  = 1;  names[1]  = "Port"; \
490                 fields["destination"]  = 2;  names[2]  = "Moved"; \
491                 fields["date"]  = 3;  names[3]  = "Date"; \
492                 fileds["reason"] = 4;  names[4] = "Reason"; \
493              } \
494             { \
495                 oldname = $$1;  newname = $$2; \
496                 if (oldname ~ /^\#/) next; \
497                 sub(".*\/", "", oldname);  newname = sub(".*\/", "", newname); \
498                 if (((icase ? tolower(oldname) : oldname) ~ name) || \
499                   ((icase ? tolower(newname) : newname) ~ name)) { \
500                     for (i = 1; i <= 4; i++) { \
501                         printf("%s:\t%s\n", names[i], $$i); \
502                     } \
503                 print(""); \
504                 } \
505             }' ${MOVEDDIR}/${MOVEDFILE}; \
506           fi \
507         fi 
508
509 search:
510         @${_PORTSEARCH}
511
512 quicksearch:
513         @export display="name,path,info" ; \
514         ${_PORTSEARCH}