<?xml version="1.0" encoding="UTF-8"?> <!-- build file for phing --> <project default="help" basedir="." name="${project.name}"> <!-- Human-readable info about our component --> <property file="build.properties" /> <taskdef name="now" classname="Phix_Project.ComponentManager.Phing.NowTask" /> <now name="date.now"/> <if> <and> <isset property="project.snapshot"/> <istrue value="${project.snapshot}"/> </and> <then> <property name="project.version" value="${project.majorVersion}.${project.minorVersion}.${project.patchLevel}snapshot${date.now}" /> <property name="project.stability" value="snapshot" /> </then> <else> <property name="project.version" value="${project.majorVersion}.${project.minorVersion}.${project.patchLevel}" /> <property name="project.stability" value="stable" /> </else> </if> <property name="project.apiversion" value="${project.majorVersion}.${project.minorVersion}" /> <!-- Paths to the directories that we work with --> <property name="project.srcdir" value="${project.basedir}/src" override="true" /> <property name="project.src.phpdir" value="${project.srcdir}/php" override="true" /> <property name="project.src.bindir" value="${project.srcdir}/bin" override="true" /> <property name="project.src.datadir" value="${project.srcdir}/data" override="true" /> <property name="project.src.docdir" value="${project.srcdir}/docs" override="true" /> <property name="project.src.testdir" value="${project.srcdir}/tests" override="true" /> <property name="project.src.wwwdir" value="${project.srcdir}/www" override="true" /> <property name="project.src.testunitdir" value="${project.src.testdir}/unit-tests" override="true" /> <property name="project.src.testintdir" value="${project.src.testdir}/integration-tests" override="true" /> <property name="project.src.testfuncdir" value="${project.src.testdir}/functional-tests" override="true" /> <property name="project.reviewdir" value="${project.basedir}/review" override="true" /> <property name="project.review.logsdir" value="${project.basedir}/review/logs" override="true" /> <property name="project.review.docsdir" value="${project.reviewdir}/docs" override="true" /> <property name="project.review.codebrowserdir" value="${project.reviewdir}/code-browser" override="true" /> <property name="project.review.codecoveragedir" value="${project.reviewdir}/code-coverage" override="true" /> <property name="project.builddir" value="${project.basedir}/.build" override="true" /> <property name="project.pkgdir" value="${project.builddir}/${project.name}-${project.version}" override="true" /> <property name="project.tmpdir" value="${project.basedir}/.tmp" override="true" /> <property name="project.vendordir" value="${project.basedir}/vendor" override="true" /> <property name="project.vendor.bindir" value="${project.vendordir}/bin" override="true" /> <property name="project.vendor.datadir" value="${project.vendordir}/data" override="true" /> <property name="project.vendor.phpdir" value="${project.vendordir}/php" override="true" /> <property name="project.vendor.testdir" value="${project.vendordir}/tests" override="true" /> <property name="project.vendor.docdir" value="${project.vendordir}/docs" override="true" /> <property name="project.vendor.wwwdir" value="${project.vendordir}/www" override="true" /> <property name="project.distdir" value="${project.basedir}/dist" /> <property name="project.distdir.lastBuilt" value="${project.basedir}/dist/lastBuilt" /> <property name="project.tarfilename" value="${project.name}-${project.version}.tgz" /> <property name="project.tarfile" value="${project.distdir}/${project.tarfilename}" /> <!-- what was the last PEAR package we created, if any? --> <if> <available file="${project.distdir.lastBuilt}"/> <then> <property file="${project.distdir.lastBuilt}"/> </then> <else> <property name="project.lastBuiltTarfile" value="false"/> </else> </if> <!-- override this if you want to run additional PEAR commands --> <property name="pear.cmd" value="" override="true" /> <!-- lists of the files that make up our package --> <fileset dir="${project.src.bindir}" id="binfiles"> <include name="**/**"/> <exclude name="**/.DS_Store"/> <exclude name="**/.empty"/> <exclude name="**/.svn"/> </fileset> <fileset dir="${project.src.datadir}" id="datafiles"> <include name="**/**"/> <exclude name="**/.DS_Store"/> <exclude name="**/.empty"/> <exclude name="**/.svn"/> </fileset> <fileset dir="${project.src.phpdir}" id="phpfiles"> <include name="**/**"/> <exclude name="**/.DS_Store"/> <exclude name="**/.empty"/> <exclude name="**/.svn"/> </fileset> <fileset dir="${project.src.testunitdir}/php" id="testfiles"> <include name="**/**"/> <exclude name="**/.DS_Store"/> <exclude name="**/.empty"/> <exclude name="**/.svn"/> </fileset> <fileset dir="${project.src.wwwdir}" id="wwwfiles"> <include name="**/**" /> <exclude name="**/.DS_Store"/> <exclude name="**/.empty"/> <exclude name="**/.svn"/> </fileset> <fileset dir="${project.src.docdir}" id="docfiles"> <include name="**/**" /> <exclude name="**/.DS_Store"/> <exclude name="**/.empty"/> <exclude name="**/.svn"/> </fileset> <fileset dir="${project.basedir}" id="topleveldocfiles"> <include name="*.txt" /> <include name="*.md" /> </fileset> <taskdef name="phingcallifexists" classname="Phix_Project.ComponentManager.Phing.PhingCallIfExistsTask" /> <import file="build.local.xml"/> <!-- Tell the user what this build file supports --> <target name="help"> <echo message="${project.name} ${project.version}: build.xml targets:" /> <echo message="" /> <echo message="Setup your dev environment:" /> <echo message="" /> <echo message=" build-vendor" /> <echo message=" Populate vendor/ with this package's dependencies" /> <echo message=" vendor-pear" /> <echo message=" Run additional PEAR commands inside the vendor folder" /> <echo message="" /> <echo message="Develop your code:" /> <echo message="" /> <echo message=" lint" /> <echo message=" Check the PHP files for syntax errors" /> <echo message=" test" /> <echo message=" Run the component's PHPUnit tests" /> <echo message=" code-review" /> <echo message=" Run all of the code quality targets:" /> <echo message="" /> <echo message=" code-browser" /> <echo message=" Run code quality tests for PHP_CodeBrowser" /> <echo message=" phpcpd" /> <echo message=" Check for cut and paste problems" /> <echo message=" phploc" /> <echo message=" Calculate the size of your PHP project" /> <echo message=" phpdoc" /> <echo message=" Create the PHP docs from source code" /> <echo message="" /> <echo message="Publish your component:" /> <echo message="" /> <echo message=" pear-package" /> <echo message=" Create a PEAR-compatible package" /> <echo message=" publish-local" /> <echo message=" Publish your PEAR-compatible package into a local copy" /> <echo message=" of your PEAR channel" /> <echo message=" install-vendor" /> <echo message=" Install this component from source into vendor/" /> <echo message=" install-system" /> <echo message=" Install this component from source for all local users" /> <echo message=" You must be root to run this target on Linux!!" /> <echo message=""/> <echo message="Maintain your component:"/> <echo message=""/> <echo message=" upgrade-skeleton"/> <echo message=" Upgrade the skeleton files for this component"/> <echo message=""/> <echo message="Additional targets:" /> <echo message=""/> <echo message=" clean" /> <echo message=" Remove all temporary folders created by this build file" /> <echo message=" version" /> <echo message=" Show this component's version from build.properties" /> <echo message="" /> <phingcallifexists target="local.help" /> </target> <!-- Show the current version, as set in build.properties --> <!-- This is just to be a time-saver --> <target name="version"> <echo message="${project.version}" /> </target> <!-- Run PHP lint on all of the source code --> <target name="lint"> <phplint> <fileset dir="${project.src.phpdir}"> <include name="**/*.php" /> </fileset> </phplint> <phingcallifexists target="local.lint" /> </target> <!-- Run the unit tests for this module --> <target name="run-unittests" depends="lint"> <!-- Make sure vendor/ folder exists --> <if> <not> <available file="${project.vendordir}" type="dir"/> </not> <then> <phingcall target="build-vendor"/> </then> </if> <!-- do we have any tests? --> <!-- currently cannot think of a reliable way to test this in phing --> <!-- run the tests --> <delete dir="${project.review.codecoveragedir}" /> <mkdir dir="${project.review.codecoveragedir}" /> <mkdir dir="${project.review.logsdir}" /> <exec command="phpunit" checkreturn="true" logoutput="true"/> <echo/> <echo>The code coverage report is in file://${project.review.codecoveragedir}</echo> <echo/> </target> <!-- Run all the tests for this module --> <target name="test" depends="run-unittests"> <phingcallifexists target="local.test"/> </target> <!-- Run the code review quality tests --> <target name="code-review" depends="run-unittests, code-browser, phpcpd, pdepend, phploc"> <phingcallifexists target="local.code-review"/> </target> <!-- Run all of the targets for setting up the code browser --> <target name="code-browser" depends="phpmd, phpcs, phpcb"> <phingcallifexists target="local.code-browser"/> </target> <target name="pdepend"> <mkdir dir="${project.review.logsdir}" /> <exec command="pdepend --phpunit-xml=${project.review.logsdir}/pdepend.xml --jdepend-xml=${project.review.logsdir}/jdepend.xml --jdepend-chart=${project.review.logsdir}/dependencies.svg --overview-pyramid=${project.review.logsdir}/overview-pyramid.svg ${project.src.phpdir}" logoutput="true"/> </target> <!-- Generate package docs --> <target name="phpdoc"> <mkdir dir="${project.review.logsdir}" /> <exec command="phpdoc -d ${project.src.phpdir} -t ${project.review.docsdir}" logoutput="true"/> <echo message="You will find the PHPDoc for your project at: ${project.review.docsdir}/index.html"/> <phingcallifexists target="local.phpdoc"/> </target> <!-- Check code for code smells --> <target name="phpmd"> <mkdir dir="${project.review.logsdir}" /> <exec command="phpmd ${project.src.phpdir} xml codesize,design,naming,unusedcode --reportfile ${project.review.logsdir}/phpmd.xml" logoutput="true" /> </target> <target name="phpcpd"> <mkdir dir="${project.review.logsdir}"/> <exec command="phpcpd --log-pmd ${project.review.logsdir}/pmd-cpd.xml ${project.src.phpdir}" logoutput="true" /> </target> <!-- Check the code for style violations --> <target name="phpcs"> <mkdir dir="${project.review.logsdir}" /> <exec command="phpcs --report=xml --report-file=${project.review.logsdir}/checkstyle.xml --standard=${checkstyle.standard} --extensions=php ${project.src.phpdir}" logoutput="true"/> </target> <!-- Build the code-browser files --> <target name="phpcb" depends="phpmd"> <delete dir="${project.review.codebrowserdir}" /> <mkdir dir="${project.review.codebrowserdir}" /> <exec command="phpcb --log ${project.review.logsdir} --source ${project.src.phpdir} --output ${project.review.codebrowserdir}" logoutput="true" /> </target> <!-- Work out the size of the project --> <target name="phploc"> <mkdir dir="${project.review.logsdir}" /> <exec command="phploc --log-xml ${project.review.logsdir}/phploc.xml --log-csv ${project.review.logsdir}/phploc.csv ${project.src.phpdir}" logoutput="true" /> </target> <!-- Populate vendor with the dependencies for this component --> <target name="build-vendor" depends="pear-package,setup-vendor"> <echo>Populating vendor/ with dependencies</echo> <exec command="phix pear:register-channels" checkreturn="true" logoutput="true" /> <exec command="pear -c ${project.tmpdir}/pear-config install --alldeps ${project.tarfile}" logoutput="true" checkreturn="true"/> <echo/> <echo>Your vendor/ folder has been built.</echo> <echo>You only need to run 'phing build-vendor' again if you change the</echo> <echo>dependencies listed in your package.xml file.</echo> <echo/> <phingcallifexists target="local.buildvendor"/> </target> <!-- Setup the vendor folder --> <target name="setup-vendor"> <echo>Creating vendor/ as a sandboxed PEAR install folder</echo> <delete dir="${project.vendordir}" /> <mkdir dir="${project.vendordir}" /> <delete dir="${project.tmpdir}" /> <mkdir dir="${project.tmpdir}" /> <exec command="pear config-create ${project.tmpdir} ${project.tmpdir}/pear-config" checkreturn="true" logoutput="true" /> <exec command="pear -c ${project.tmpdir}/pear-config config-set preferred_state alpha" checkreturn="true" logoutput="true" /> <exec command="pear -c ${project.tmpdir}/pear-config config-set php_dir ${project.vendor.phpdir}" checkreturn="true" logoutput="true" /> <exec command="pear -c ${project.tmpdir}/pear-config config-set bin_dir ${project.vendor.bindir}" checkreturn="true" logoutput="true" /> <exec command="pear -c ${project.tmpdir}/pear-config config-set data_dir ${project.vendor.datadir}" checkreturn="true" logoutput="true" /> <exec command="pear -c ${project.tmpdir}/pear-config config-set doc_dir ${project.vendor.docdir}" checkreturn="true" logoutput="true" /> <exec command="pear -c ${project.tmpdir}/pear-config config-set test_dir ${project.vendor.testdir}" checkreturn="true" logoutput="true" /> <exec command="pear -c ${project.tmpdir}/pear-config config-set www_dir ${project.vendor.wwwdir}" checkreturn="true" logoutput="true" /> </target> <!-- Create the PEAR package, ready for release --> <target name="pear-package"> <echo>Building release directory</echo> <delete dir="${project.builddir}" /> <mkdir dir="${project.pkgdir}" /> <if> <available file="${project.src.bindir}"/> <then> <copy todir="${project.pkgdir}"> <fileset refid="binfiles"/> </copy> </then> </if> <if> <available file="${project.src.datadir}"/> <then> <copy todir="${project.pkgdir}"> <fileset refid="datafiles"/> </copy> </then> </if> <if> <available file="${project.src.docdir}"/> <then> <copy todir="${project.pkgdir}"> <fileset refid="docfiles"/> </copy> </then> </if> <if> <available file="${project.src.phpdir}"/> <then> <copy todir="${project.pkgdir}"> <fileset refid="phpfiles"/> </copy> </then> </if> <if> <available file="${project.src.testunitdir}"/> <then> <copy todir="${project.pkgdir}"> <fileset refid="testfiles"/> </copy> </then> </if> <if> <available file="${project.src.wwwdir}"/> <then> <copy todir="${project.pkgdir}"> <fileset refid="wwwfiles"/> </copy> </then> </if> <copy todir="${project.pkgdir}"> <fileset refid="topleveldocfiles"/> </copy> <copy todir="${project.builddir}"> <fileset dir="."> <include name="package.xml" /> </fileset> </copy> <exec command="phix pear:expand-package-xml" checkreturn="yes" logoutput="yes"/> <echo>Creating ${project.tarfile} PEAR package</echo> <mkdir dir="${project.distdir}" /> <delete file="${project.tarfile}" /> <tar destfile="${project.tarfile}" compression="gzip"> <fileset dir="${project.builddir}"> <include name="**/**" /> </fileset> </tar> <!-- remember the tarball we have just build --> <property name="project.lastBuiltTarfile" value="${project.tarfile}" override="true"/> <echo file="${project.distdir.lastBuilt}" append="false">project.lastBuiltTarfile=${project.tarfile}</echo> <!-- write a message to say which file we built last --> <echo>Your PEAR package is in ${project.tarfile}</echo> <phingcallifexists target="local.pear-package"/> </target> <!-- Install the code --> <target name="install-vendor"> <if> <not> <contains string="${project.lastBuiltTarfile}" substring="${project.name}"/> </not> <then> <fail message="Please run 'phing pear-package' first, then try again."/> </then> </if> <if> <not> <available file="${project.vendordir"/> </not> <then> <phingcall target="build-vendor" /> </then> </if> <if> <available file="${project.lastBuiltTarfile}"/> <then> <exec command="pear -c ${project.tmpdir}/pear-config install --alldeps -f ${project.lastBuiltTarfile}" logoutput="true" checkreturn="true"/> <phingcallifexists target="local.install-vendor"/> </then> <else> <echo>Cannot find PEAR package file ${project.lastBuiltTarfile}</echo> <fail message="Run 'phing pear-package' to create a new PEAR package, then try again."/> </else> </if> </target> <!-- install a package system-wide --> <target name="install-system"> <if> <not> <contains string="${project.lastBuiltTarfile}" substring="${project.name}"/> </not> <then> <echo>Please run 'phing pear-package' first, then try again.</echo> </then> <elseif> <available file="${project.lastBuiltTarfile}"/> <then> <exec command="pear install -f -a ${project.lastBuiltTarfile}" checkreturn="true" logoutput="true" /> <phingcallifexists target="local.install-system"/> </then> </elseif> <else> <echo>Cannot find PEAR package file ${project.lastBuiltTarfile}</echo> <echo>Run 'phing pear-package' to create a new PEAR package, then try again</echo> </else> </if> </target> <!-- Publish to local copy of PEAR channel --> <target name="publish-local" depends="pear-package"> <if> <not> <contains string="${project.lastBuiltTarfile}" substring="${project.name}"/> </not> <then> <echo>Please run 'phing pear-package' first, then try again.</echo> </then> <elseif> <available file="${project.lastBuiltTarfile}"/> <then> <!-- get rid of any existing snapshots we may have published --> <foreach param="packagefile" absparam="abspackagefile" target="pirum-remove-package"> <fileset dir="${pear.local}/get"> <include name="${project.name}*snapshot*.tgz" /> </fileset> </foreach> <!-- publish the new PEAR package --> <exec command="pirum add ${pear.local} ${project.lastBuiltTarfile}" checkreturn="true" logoutput="true" /> <phingcallifexists target="local.publish-local"/> </then> </elseif> <else> <echo>Cannot find PEAR package file ${project.lastBuiltTarfile}</echo> <echo>Run 'phing pear-package' to create a new PEAR package, then try again</echo> </else> </if> </target> <target name="pirum-remove-package"> <exec command="pirum remove ${pear.local} ${packagefile}" logoutput="true" checkreturn="true" /> </target> <!-- Run additional PEAR commands in the vendor folder --> <target name="vendor-pear"> <exec command="pear -c ${project.tmpdir}/pear-config ${pear.cmd}" logoutput="true" checkreturn="true" /> </target> <!-- Upgrade the skeleton files here and now --> <target name="upgrade-skeleton"> <exec command="phix ${component.type}:upgrade ." logoutput="true" checkreturn="true" /> <phingcallifexists target="local.upgrade-skeleton"/> </target> <!-- Clean up the mess --> <target name="clean"> <delete dir="${project.builddir}" /> <delete dir="${project.distdir}" /> <delete dir="${project.reviewdir}" /> <delete dir="${project.pkgdir}" /> <delete dir="${project.distdir}" /> <delete dir="${project.tmpdir}" /> <phingcallifexists target="local.clean"/> </target> </project> <!-- vim: set tabstop=2 shiftwidth=2 expandtab: -->