#!/usr/bin/env python"""Generic Setup script, takes package info from __pkginfo__.py file:organization: Logilab:copyright: 2001-2010 LOGILAB S.A. (Paris, FRANCE), license is LGPL v2.:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr:license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses"""# pylint: disable-msg=W0142,W0403,W0404,W0613,W0622,W0622,W0704,R0904,C0103,E0611## This program is free software; you can redistribute it and/or modify it under# the terms of the GNU General Public License as published by the Free Software# Foundation; either version 2 of the License, or (at your option) any later# version.## This program is distributed in the hope that it will be useful, but WITHOUT# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.## You should have received a copy of the GNU General Public License along with# this program; if not, write to the Free Software Foundation, Inc.,# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.importosimportsysimportshutilfromos.pathimportisdir,exists,join,walktry:ifos.environ.get('NO_SETUPTOOLS'):raiseImportError()# do as there is no setuptoolsfromsetuptoolsimportsetupfromsetuptools.commandimportinstall_libUSE_SETUPTOOLS=TrueexceptImportError:fromdistutils.coreimportsetupfromdistutils.commandimportinstall_libUSE_SETUPTOOLS=False# import required featuresfrom__pkginfo__importmodname,version,license,description,web, \author,author_emailifexists('README'):long_description=file('README').read()else:long_description=''# import optional featuresimport__pkginfo__ifUSE_SETUPTOOLS:requires={}forentryin("__depends__","__recommends__"):requires.update(getattr(__pkginfo__,entry,{}))install_requires=[("%s%s"%(d,vandvor"")).strip()ford,vinrequires.iteritems()]else:install_requires=[]distname=getattr(__pkginfo__,'distname',modname)scripts=getattr(__pkginfo__,'scripts',())include_dirs=getattr(__pkginfo__,'include_dirs',())data_files=getattr(__pkginfo__,'data_files',None)subpackage_of=getattr(__pkginfo__,'subpackage_of',None)ext_modules=getattr(__pkginfo__,'ext_modules',None)BASE_BLACKLIST=('CVS','debian','dist','build','__buildlog')IGNORED_EXTENSIONS=('.pyc','.pyo','.elc')defensure_scripts(linux_scripts):""" Creates the proper script names required for each platform (taken from 4Suite) """fromdistutilsimportutilifutil.get_platform()[:3]=='win':scripts_=[script+'.bat'forscriptinlinux_scripts]else:scripts_=linux_scriptsreturnscripts_defget_packages(directory,prefix):"""return a list of subpackages for the given directory """result=[]forpackageinos.listdir(directory):absfile=join(directory,package)ifisdir(absfile):ifexists(join(absfile,'__init__.py'))or \packagein('test','tests'):ifprefix:result.append('%s.%s'%(prefix,package))else:result.append(package)result+=get_packages(absfile,result[-1])returnresultdefexport(from_dir,to_dir,blacklist=BASE_BLACKLIST,ignore_ext=IGNORED_EXTENSIONS,verbose=True):"""make a mirror of from_dir in to_dir, omitting directories and files listed in the black list """defmake_mirror(arg,directory,fnames):"""walk handler"""fornorecursinblacklist:try:fnames.remove(norecurs)exceptValueError:passforfilenameinfnames:# don't include binary filesiffilename[-4:]inignore_ext:continueiffilename[-1]=='~':continuesrc='%s/%s'%(directory,filename)dest=to_dir+src[len(from_dir):]ifverbose:print>>sys.stderr,src,'->',destifos.path.isdir(src):ifnotexists(dest):os.mkdir(dest)else:ifexists(dest):os.remove(dest)shutil.copy2(src,dest)try:os.mkdir(to_dir)exceptOSError,ex:# file exists ?importerrnoifex.errno!=errno.EEXIST:raisewalk(from_dir,make_mirror,None)EMPTY_FILE='"""generated file, don\'t modify or your data will be lost"""\n'classMyInstallLib(install_lib.install_lib):"""extend install_lib command to handle package __init__.py and include_dirs variable if necessary """defrun(self):"""overridden from install_lib class"""install_lib.install_lib.run(self)# create Products.__init__.py if neededifsubpackage_of:product_init=join(self.install_dir,subpackage_of,'__init__.py')ifnotexists(product_init):self.announce('creating %s'%product_init)stream=open(product_init,'w')stream.write(EMPTY_FILE)stream.close()# manually install included directories if anyifinclude_dirs:ifsubpackage_of:base=join(subpackage_of,modname)else:base=modnamefordirectoryininclude_dirs:dest=join(self.install_dir,base,directory)export(directory,dest,verbose=False)definstall(**kwargs):"""setup entry point"""ifnotUSE_SETUPTOOLSand'--install-layout=deb'insys.argvand \sys.versioninfo<(2,5,4):sys.argv.remove('--install-layout=deb')print"W: remove '--install-layout=deb' option"ifsubpackage_of:package=subpackage_of+'.'+modnamekwargs['package_dir']={package:'.'}packages=[package]+get_packages(os.getcwd(),package)ifUSE_SETUPTOOLS:kwargs['namespace_packages']=[subpackage_of]else:kwargs['package_dir']={modname:'.'}packages=[modname]+get_packages(os.getcwd(),modname)kwargs['packages']=packagesreturnsetup(name=distname,version=version,license=license,url=web,description=description,long_description=long_description,author=author,author_email=author_email,scripts=ensure_scripts(scripts),data_files=data_files,ext_modules=ext_modules,install_requires=install_requires,#dependency_links=["http://alain:alain@intranet.logilab.fr/~alain/"],cmdclass={'install_lib':MyInstallLib},**kwargs)if__name__=='__main__':install()