#!/usr/bin/env python """ Dirty script for building package for PPA by WangLu 2011.01.13 modified for pdf2htmlEX 2012.08.28 modified for general git repo 2013.05.30 """ # CONSIDER PORTING to either BASH or PERL (as used by dpkg-buldpackage) # CONSIDER BINARY ONLY PACKAGE based on appDir or docerDir # # See: https://blog.serverdensity.com/how-to-create-a-debian-deb-package/ # See: http://www.sj-vs.net/creating-a-simple-debian-deb-package-based-on-a-directory-structure/ # See: https://unix.stackexchange.com/questions/30303/how-to-create-a-deb-file-manually # See: https://askubuntu.com/questions/1130558/how-to-build-deb-package-for-ubuntu-18-04 # See: https://blog.knoldus.com/create-a-debian-package-using-dpkg-deb-tool/ # See: http://www.tldp.org/HOWTO/html_single/Debian-Binary-Package-Building-HOWTO/ # See: https://coderwall.com/p/urkybq/how-to-create-debian-package-from-source # # NOTES: # 1. Should use something to force update of changelog # 2. How best to compute dpkg version # 3. Distribute only binary package (no source package -- link to main github repo) # 4. Use ppa: https://launchpad.net/~pdf2htmlex/+archive/ubuntu/pdf2htmlex # 5. Rename poppler-data destination to poppler-pdf2htmlEX # 6. Ensure source code location of poppler-data has been updated import os import sys import re import time package='pdf2htmlex' ppa_name='ppa:pdf2htmlex/pdf2htmlex' supported_distributions=('disco',) dist_pattern=re.compile('|'.join(['\\) '+i for i in supported_distributions])) archive_cmd='cd pdf2htmlEX/build && (rm CMakeCache.txt || true) && cmake .. && make dist' archive_suffix='.tar.bz2' #if os.path.exists('imageBuild/debianDir'): # sys.stdout.write('Build area already exists, delete to continue?(y/n)') # sys.stdout.flush() # ans = raw_input().lower() # while ans not in ['y', 'n']: # sys.stdout.write('I don\'t understand, enter \'y\' or \'n\':') # ans = raw_input().lower() # # if ans == 'n': # print 'Skipped.' # sys.exit(0) # if os.system('rm -rf imageBuild/debianDir') != 0: print 'Failed to clean up old build directory' sys.exit(-1) print 'Generating version...' try: version = re.findall( r'set\(PDF2HTMLEX_VERSION\s*"([^"]*)"\)', open('pdf2htmlEX/CMakeLists.txt').read() )[0] except: print 'Cannot get package name and version number' sys.exit(-1) try: rev = open('.git/refs/heads/master').read()[:5] except: print 'Cannot get revision number' sys.exit(-1) projectdir=os.getcwd() today_timestr = time.strftime('%Y%m%d') deb_version = version+'-1~git'+today_timestr+'r'+rev full_deb_version = deb_version+'-0ubuntu1' print 'Version: %s' % (version,) print 'Full Version: %s' % (full_deb_version,) #check if we need to update debian/changelog with open('debian/changelog') as f: if re.findall(r'\(([^)]+)\)', f.readline())[0] == full_deb_version: print print 'No need to update debian/changelog, skipping' else: print print 'Writing debian/changelog' if os.system('dch -v "%s"' % (full_deb_version,)) != 0: print 'Failed when updating debian/changelog' sys.exit(-1) # changelog may have been updated, reopen it with open('debian/changelog') as f: #check dist mark of changelog changelog = f.read() m = dist_pattern.search(changelog) if m is None or m.pos >= changelog.find('\n'): print 'Cannot locate the dist name in the first line of changelog' sys.exit(-1) print print 'Preparing build ...' # handling files if os.system(archive_cmd) != 0: print 'Failed in creating tarball' sys.exit(-1) orig_tar_filename = package+'-'+version+archive_suffix os.mkdir('imageBuild/debianDir') if os.system('test -e pdf2htmlEX/build/%s && cp pdf2htmlEX/build/%s imageBuild/debianDir/' % (orig_tar_filename, orig_tar_filename)) != 0: print 'Cannot copy tarball file to build area' sys.exit(-1) deb_orig_tar_filename = package+'_'+deb_version+'.orig'+archive_suffix try: os.chdir('imageBuild/debianDir') except: print 'Cannot find imageBuild/debianDir' sys.exit(-1) # remove old dir os.system('rm -rf %s' % (package+'-'+version,)) if os.system('mv %s %s && tar -xvf %s' % (orig_tar_filename, deb_orig_tar_filename, deb_orig_tar_filename)) != 0: print 'Cannot extract tarball' sys.exit(-1) try: os.chdir(package+'-'+version) except: print 'Cannot enter project dir' sys.exit(-1) os.system('cp -r %s/debian .' % (projectdir,)) for cur_dist in supported_distributions: print print 'Building for ' + cur_dist + ' ...' # substitute distribution name with open('debian/changelog', 'w') as f: f.write(dist_pattern.sub('~%s1) %s' % (cur_dist, cur_dist), changelog, 1)) # No PPA Orginization set up, only building dpkg # # building for ppa # if os.system('debuild -S -sa') != 0: # print 'Failed in debuild' # sys.exit(-1) # # print # sys.stdout.write('Everything seems to be good so far, upload?(y/n)') # sys.stdout.flush() # ans = raw_input().lower() # while ans not in ['y', 'n']: # sys.stdout.write('I don\'t understand, enter \'y\' or \'n\':') # ans = raw_input().lower() # # if ans == 'n': # print 'Skipped.' # sys.exit(0) # # print 'Uploading' # if os.system('dput %s ../%s' % (ppa_name, package+'_'+full_deb_version+'~'+cur_dist+'1_source.changes')) != 0: # print 'Failed in uploading by dput' # sys.exit(-1) # building for dpkg if os.system('dpkg-buildpackage -b --no-sign') != 0: print 'Failed in dpkg-buildpackage' sys.exit(-1) print 'Build area not cleaned.' print 'All done. Cool!'