# Copyright (c) 2014-2020 Franco Fichtner # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. all: @cat ${.CURDIR}/README.md | ${PAGER} .include "Mk/defaults.mk" CORE_VERSION?= ${CORE_COMMIT:[1]} CORE_REVISION?= ${CORE_COMMIT:[2]} CORE_HASH?= ${CORE_COMMIT:[3]} .if "${CORE_REVISION}" != "" && "${CORE_REVISION}" != "0" CORE_PKGVERSION= ${CORE_VERSION}_${CORE_REVISION} .else CORE_PKGVERSION= ${CORE_VERSION} .endif CORE_ABI?= 20.1 CORE_ARCH?= ${ARCH} CORE_FLAVOUR?= ${FLAVOUR} CORE_PHP?= 72 CORE_PYTHON?= 37 CORE_RADVD?= # empty CORE_SURICATA?= -devel CORE_SYSLOGD?= # empty CORE_SYSLOGNG?= 3.25 CORE_UPDATE?= # empty .if "${CORE_FLAVOUR}" == OpenSSL CORE_REPOSITORY?= ${CORE_ABI}/latest .elif "${CORE_FLAVOUR}" == LibreSSL CORE_REPOSITORY?= ${CORE_ABI}/libressl .else CORE_REPOSITORY?= unsupported/${CORE_FLAVOUR:tl} .endif CORE_MESSAGE?= Carry on my wayward son CORE_NAME?= opnsense-devel CORE_TYPE?= development CORE_COMMENT?= ${CORE_PRODUCT} ${CORE_TYPE} package CORE_MAINTAINER?= project@opnsense.org CORE_ORIGIN?= opnsense/${CORE_NAME} CORE_PACKAGESITE?= https://pkg.opnsense.org CORE_PRODUCT?= OPNsense CORE_WWW?= https://opnsense.org/ CORE_COPYRIGHT_HOLDER?= Deciso B.V. CORE_COPYRIGHT_WWW?= https://www.deciso.com/ CORE_COPYRIGHT_YEARS?= 2014-2020 CORE_DEPENDS_amd64?= beep \ bsdinstaller \ suricata${CORE_SURICATA} CORE_DEPENDS_i386?= ${CORE_DEPENDS_amd64} CORE_DEPENDS?= ${CORE_DEPENDS_${CORE_ARCH}} \ ca_root_nss \ choparp \ cpustats \ dhcp6c \ dhcpleases \ dnsmasq \ dpinger \ expiretable \ filterlog \ ifinfo \ flock \ flowd \ hostapd \ isc-dhcp44-relay \ isc-dhcp44-server \ lighttpd \ monit \ mpd5 \ ntp \ openssh-portable \ openvpn \ opnsense-lang \ opnsense-update${CORE_UPDATE} \ pam_opnsense \ pftop \ php${CORE_PHP}-ctype \ php${CORE_PHP}-curl \ php${CORE_PHP}-dom \ php${CORE_PHP}-filter \ php${CORE_PHP}-gettext \ php${CORE_PHP}-google-api-php-client \ php${CORE_PHP}-hash \ php${CORE_PHP}-json \ php${CORE_PHP}-ldap \ php${CORE_PHP}-openssl \ php${CORE_PHP}-pdo \ php${CORE_PHP}-pecl-radius \ php${CORE_PHP}-phalcon \ php${CORE_PHP}-phpseclib \ php${CORE_PHP}-session \ php${CORE_PHP}-simplexml \ php${CORE_PHP}-sockets \ php${CORE_PHP}-sqlite3 \ php${CORE_PHP}-xml \ php${CORE_PHP}-zlib \ pkg \ py${CORE_PYTHON}-Jinja2 \ py${CORE_PYTHON}-dnspython \ py${CORE_PYTHON}-netaddr \ py${CORE_PYTHON}-requests \ py${CORE_PYTHON}-sqlite3 \ py${CORE_PYTHON}-ujson \ radvd${CORE_RADVD} \ rate \ rrdtool \ samplicator \ squid \ sshlockout_pf \ strongswan \ sudo \ syslog-ng${CORE_SYSLOGNG:S/.//g} \ syslogd${CORE_SYSLOGD} \ unbound \ wpa_supplicant \ zip WRKDIR?=${.CURDIR}/work WRKSRC?=${WRKDIR}/src PKGDIR?=${WRKDIR}/pkg MFCDIR?=${WRKDIR}/mfc WANTS= p5-File-Slurp php${CORE_PHP}-pear-PHP_CodeSniffer \ phpunit7-php${CORE_PHP} py${CORE_PYTHON}-pycodestyle .for WANT in ${WANTS} want-${WANT}: @${PKG} info ${WANT} > /dev/null .endfor mount: @if [ ! -f ${WRKDIR}/.mount_done ]; then \ echo -n "Enabling core.git live mount..."; \ sed ${SED_REPLACE} ${.CURDIR}/src/opnsense/version/core.in > \ ${.CURDIR}/src/opnsense/version/core; \ mount_unionfs ${.CURDIR}/src ${LOCALBASE}; \ touch ${WRKDIR}/.mount_done; \ echo "done"; \ service configd restart; \ fi umount: @if [ -f ${WRKDIR}/.mount_done ]; then \ echo -n "Disabling core.git live mount..."; \ umount -f ":${.CURDIR}/src"; \ rm ${WRKDIR}/.mount_done; \ echo "done"; \ service configd restart; \ fi manifest: @echo "name: \"${CORE_NAME}\"" @echo "version: \"${CORE_PKGVERSION}\"" @echo "origin: \"${CORE_ORIGIN}\"" @echo "comment: \"${CORE_COMMENT}\"" @echo "desc: \"${CORE_HASH}\"" @echo "maintainer: \"${CORE_MAINTAINER}\"" @echo "www: \"${CORE_WWW}\"" @echo "message: \"${CORE_MESSAGE}\"" @echo "categories: [ \"sysutils\", \"www\" ]" @echo "licenselogic: \"single\"" @echo "licenses: [ \"BSD2CLAUSE\" ]" @echo "prefix: ${LOCALBASE}" @echo "vital: true" @echo "deps: {" @for CORE_DEPEND in ${CORE_DEPENDS}; do \ if ! ${PKG} query ' %n: { version: "%v", origin: "%o" }' \ $${CORE_DEPEND}; then \ echo ">>> Missing dependency: $${CORE_DEPEND}" >&2; \ exit 1; \ fi; \ done @echo "}" name: @echo ${CORE_NAME} depends: @echo ${CORE_DEPENDS} .if ${.TARGETS:Mupgrade} PKG_FORMAT?= tar .else PKG_FORMAT?= txz .endif PKG_SCRIPTS= +PRE_INSTALL +POST_INSTALL \ +PRE_UPGRADE +POST_UPGRADE \ +PRE_DEINSTALL +POST_DEINSTALL scripts: .for PKG_SCRIPT in ${PKG_SCRIPTS} @if [ -f ${.CURDIR}/${PKG_SCRIPT} ]; then \ cp -- ${.CURDIR}/${PKG_SCRIPT} ${DESTDIR}/; \ fi .endfor install: @${MAKE} -C ${.CURDIR}/contrib install DESTDIR=${DESTDIR} @${MAKE} -C ${.CURDIR}/src install DESTDIR=${DESTDIR} ${MAKE_REPLACE} .if exists(${LOCALBASE}/opnsense/www/index.php) # try to update the current system if it looks like one @touch ${LOCALBASE}/opnsense/www/index.php .endif collect: @(cd ${.CURDIR}/src; find * -type f) | while read FILE; do \ if [ -f ${DESTDIR}${LOCALBASE}/$${FILE} ]; then \ tar -C ${DESTDIR}${LOCALBASE} -cpf - $${FILE} | \ tar -C ${.CURDIR}/src -xpf -; \ fi; \ done bootstrap: @${MAKE} -C ${.CURDIR}/src install-bootstrap DESTDIR=${DESTDIR} \ NO_SAMPLE=please ${MAKE_REPLACE} plist: @(${MAKE} -C ${.CURDIR}/contrib plist && \ ${MAKE} -C ${.CURDIR}/src plist) | sort plist-fix: @${MAKE} DESTDIR=${DESTDIR} plist > ${.CURDIR}/plist plist-check: @mkdir -p ${WRKDIR} @${MAKE} DESTDIR=${DESTDIR} plist > ${WRKDIR}/plist.new @cat ${.CURDIR}/plist > ${WRKDIR}/plist.old @if ! diff -uq ${WRKDIR}/plist.old ${WRKDIR}/plist.new > /dev/null ; then \ diff -u ${WRKDIR}/plist.old ${WRKDIR}/plist.new || true; \ echo ">>> Package file lists do not match. Please run 'make plist-fix'." >&2; \ rm ${WRKDIR}/plist.*; \ exit 1; \ fi @rm ${WRKDIR}/plist.* metadata: @mkdir -p ${DESTDIR} @${MAKE} DESTDIR=${DESTDIR} scripts @${MAKE} DESTDIR=${DESTDIR} manifest > ${DESTDIR}/+MANIFEST @${MAKE} DESTDIR=${DESTDIR} plist > ${DESTDIR}/plist package-check: @if [ -f ${WRKDIR}/.mount_done ]; then \ echo ">>> Cannot continue with live mount. Please run 'make umount'." >&2; \ exit 1; \ fi package: plist-check package-check clean-wrksrc .for CORE_DEPEND in ${CORE_DEPENDS} @if ! ${PKG} info ${CORE_DEPEND} > /dev/null; then ${PKG} install -yfA ${CORE_DEPEND}; fi .endfor @echo -n ">>> Generating metadata for ${CORE_NAME}-${CORE_PKGVERSION}..." @${MAKE} DESTDIR=${WRKSRC} CORE_FLAVOUR=${CORE_FLAVOUR} metadata @echo " done" @echo -n ">>> Staging files for ${CORE_NAME}-${CORE_PKGVERSION}..." @${MAKE} DESTDIR=${WRKSRC} CORE_FLAVOUR=${CORE_FLAVOUR} install @echo " done" @echo ">>> Packaging files for ${CORE_NAME}-${CORE_PKGVERSION}:" @PORTSDIR=${.CURDIR} ${PKG} create -f ${PKG_FORMAT} -v -m ${WRKSRC} \ -r ${WRKSRC} -p ${WRKSRC}/plist -o ${PKGDIR} upgrade-check: @if ! ${PKG} info ${CORE_NAME} > /dev/null; then \ echo ">>> Cannot find package. Please run 'opnsense-update -t ${CORE_NAME}'" >&2; \ exit 1; \ fi upgrade: upgrade-check clean-pkgdir package @${PKG} delete -fy ${CORE_NAME} || true @${PKG} add ${PKGDIR}/*.${PKG_FORMAT} @pluginctl webgui lint-shell: @find ${.CURDIR}/src ${.CURDIR}/Scripts \ -name "*.sh" -type f -print0 | xargs -0 -n1 sh -n lint-xml: @find ${.CURDIR}/src ${.CURDIR}/Scripts \ -name "*.xml*" -type f -print0 | xargs -0 -n1 xmllint --noout SCRIPTDIRS!= find ${.CURDIR}/src/opnsense/scripts -type d -depth 1 lint-exec: .for DIR in ${.CURDIR}/src/etc/rc.d ${.CURDIR}/src/etc/rc.syshook.d ${SCRIPTDIRS} .if exists(${DIR}) @find ${DIR} -path '**/htdocs_default' -prune -o -type f \ ! -name "*.xml" ! -name "*.csv" ! -name "*.sql" -print0 | \ xargs -0 -t -n1 test -x || \ (echo "Missing executable permission in ${DIR}"; exit 1) .endif .endfor lint-php: @find ${.CURDIR}/src \ ! -name "*.xml" ! -name "*.xml.sample" ! -name "*.eot" \ ! -name "*.svg" ! -name "*.woff" ! -name "*.woff2" \ ! -name "*.otf" ! -name "*.png" ! -name "*.js" \ ! -name "*.scss" ! -name "*.py" ! -name "*.ttf" \ ! -name "*.tgz" ! -name "*.xml.dist" ! -name "*.tgb" \ -type f -print0 | xargs -0 -n1 php -l lint: plist-check lint-shell lint-xml lint-exec lint-php sweep: find ${.CURDIR}/src -type f -name "*.map" -print0 | \ xargs -0 -n1 rm if grep -nr sourceMappingURL= ${.CURDIR}/src; then \ echo "Mentions of sourceMappingURL must be removed"; \ exit 1; \ fi find ${.CURDIR}/src ! -name "*.min.*" ! -name "*.svg" \ ! -name "*.ser" -type f -print0 | \ xargs -0 -n1 ${.CURDIR}/Scripts/cleanfile find ${.CURDIR}/Scripts ${.CURDIR}/.github -type f -print0 | \ xargs -0 -n1 ${.CURDIR}/Scripts/cleanfile find ${.CURDIR} -type f -depth 1 -print0 | \ xargs -0 -n1 ${.CURDIR}/Scripts/cleanfile STYLEDIRS?= src/etc/inc src/opnsense style-python: want-py${CORE_PYTHON}-pycodestyle @pycodestyle-${CORE_PYTHON:C/./&./1} --ignore=E501 ${.CURDIR}/src || true style-php: want-php${CORE_PHP}-pear-PHP_CodeSniffer @: > ${WRKDIR}/style.out .for STYLEDIR in ${STYLEDIRS} @(phpcs --standard=ruleset.xml ${.CURDIR}/${STYLEDIR} \ || true) >> ${WRKDIR}/style.out .endfor @echo -n "Total number of style warnings: " @grep '| WARNING' ${WRKDIR}/style.out | wc -l @echo -n "Total number of style errors: " @grep '| ERROR' ${WRKDIR}/style.out | wc -l @cat ${WRKDIR}/style.out | ${PAGER} @rm ${WRKDIR}/style.out style-fix: want-php${CORE_PHP}-pear-PHP_CodeSniffer .for STYLEDIR in ${STYLEDIRS} phpcbf --standard=ruleset.xml ${.CURDIR}/${STYLEDIR} || true .endfor style: style-python style-php license: want-p5-File-Slurp @${.CURDIR}/Scripts/license > ${.CURDIR}/LICENSE sync: license plist-fix dhparam: .for BITS in 1024 2048 4096 ${OPENSSL} dhparam -out \ ${.CURDIR}/src/etc/dh-parameters.${BITS}.sample ${BITS} .endfor ARGS= diff mfc # handle argument expansion for required targets .for TARGET in ${.TARGETS} _TARGET= ${TARGET:C/\-.*//} .if ${_TARGET} != ${TARGET} .for ARGUMENT in ${ARGS} .if ${_TARGET} == ${ARGUMENT} ${_TARGET}_ARGS+= ${TARGET:C/^[^\-]*(\-|\$)//:S/,/ /g} ${TARGET}: ${_TARGET} .endif .endfor ${_TARGET}_ARG= ${${_TARGET}_ARGS:[0]} .endif .endfor diff: @git diff --stat -p stable/${CORE_ABI} ${.CURDIR}/${diff_ARGS:[1]} mfc: clean-mfcdir .for MFC in ${mfc_ARGS} .if exists(${MFC}) @cp -r ${MFC} ${MFCDIR} @git checkout stable/${CORE_ABI} @rm -r ${MFC} @mv ${MFCDIR}/$$(basename ${MFC}) ${MFC} @git add . @if ! git diff --quiet HEAD; then \ git commit -m "${MFC}: sync with master"; \ fi .else @git checkout stable/${CORE_ABI} @git cherry-pick -x ${MFC} .endif @git checkout master .endfor test: want-phpunit7-php${CORE_PHP} @if [ "$$(${PKG} query %n-%v ${CORE_NAME})" != "${CORE_NAME}-${CORE_PKGVERSION}" ]; then \ echo "Installed version does not match, expected ${CORE_NAME}-${CORE_PKGVERSION}"; \ exit 1; \ fi @cd ${.CURDIR}/src/opnsense/mvc/tests && \ phpunit --configuration PHPunit.xml checkout: @${GIT} reset -q ${.CURDIR}/src && \ ${GIT} checkout -f ${.CURDIR}/src && \ ${GIT} clean -xdqf ${.CURDIR}/src clean-pkgdir: @rm -rf ${PKGDIR} @mkdir -p ${PKGDIR} clean-mfcdir: @rm -rf ${MFCDIR} @mkdir -p ${MFCDIR} clean-wrksrc: @rm -rf ${WRKSRC} @mkdir -p ${WRKSRC} clean: clean-pkgdir clean-wrksrc clean-mfcdir .PHONY: license plist