git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@581 c06c8d41-db1a-0410-9941-cceddc491573
Q7LOC5X3KKWAKBC6OSHD4ED7EQEMCOPGYYZ43CVABFJXAZCDZO3AC # build_dcss_release.rb# Builds DOS and Windows binaries for a Stone Soup release.# Needs rubyzip to be installed.require 'fileutils'require 'zip/zipfilesystem'SVN_BASE_URL = 'https://svn.sourceforge.net/svnroot/crawl-ref/'SVN_BRANCH = 'branches/stone_soup-0.1.5'SVN_URL = SVN_BASE_URL + SVN_BRANCH + '/crawl-ref'# If empty, nothing is done. Useful to sync svk mirrors.SVN_PRESYNC = ''SVN = 'svn'BUILDS = [ Proc.new { build_win32 },Proc.new { build_dos } ].reverseW32MAKE = 'mingw32-make'DOSMAKE = 'make'UPX = 'upx'SVN_CO_DIR = 'stone_soup'DEV_NULL = 'nul'CLEANPATH = ENV['PATH']# Leave empty if svn is already in the pathSVN_PATH_PREFIX = 'C:\etc\misc\svk\bin;C:\etc\misc\svn\bin;'W32MAKE_PATH_PREFIX = 'C:\etc\MinGW\bin;C:\etc\misc\yacc;'DOSMAKE_PATH_PREFIX = 'C:\etc\djgpp\bin;'BUILD_HOME = File.join( FileUtils.pwd(), 'release' )# Relative to source directoryCRAWL_NDB_PATH = 'rel/crawl.exe'CRAWL_DBG_PATH = 'dbg/crawl.exe'CRAWL_DOS_PATH = 'crawl.exe'PACKAGE_PATH = BUILD_HOMEdef build_soupcheckoutmakepackageenddef setup_svn_envENV['PATH'] = SVN_PATH_PREFIX + CLEANPATHenddef setup_build_homeFileUtils.mkdir_p(BUILD_HOME)Dir.chdir(BUILD_HOME)enddef full_checkoutputs "#{SVN} co #{SVN_URL} #{SVN_CO_DIR}"system "#{SVN} co #{SVN_URL} #{SVN_CO_DIR}" orraise "#{SVN} co failed: #$?"Dir.chdir SVN_CO_DIRenddef checkoutsetup_svn_envif SVN_PRESYNC and not SVN_PRESYNC.empty?puts "Running presync: '#{SVN_PRESYNC}'"system(SVN_PRESYNC) or raise "#{SVN_PRESYNC} failed: #$?!"endsetup_build_homeclean_directory SVN_CO_DIR if File.directory? SVN_CO_DIRfull_checkoutenddef clean_directory(*dirs)dirs.each do |dir|currdir = FileUtils.pwdif currdir != BUILD_HOMEraise "In #{currdir}, need to be in #{BUILD_HOME}!"endraise "Evil directory name: #{dir}" if dir =~ /\.\./puts "Trying to remove #{dir}"FileUtils.rm_r dir, :verbose => trueendenddef path_prefix(prefix)ENV['PATH'] = prefix + CLEANPATH unless ENV['PATH'].index(prefix)enddef clean_objects[ '.', 'rel', 'dbg', 'util' ].each do |dir|if File.directory? dirFileUtils.rm( Dir[dir + '/*.o'], :force => true )endendenddef clean_w32build_areaclean_objectssystem "#{W32MAKE} -f makefile.mgw clean"enddef clean_dosbuild_areaclean_objectssystem "#{DOSMAKE} -f makefile.dos clean"enddef makeBUILDS.each do |builder|Dir.chdir( File.join(BUILD_HOME, SVN_CO_DIR) )builder.callendenddef setup_w32make_envDir.chdir 'source'path_prefix W32MAKE_PATH_PREFIXclean_w32build_areaenddef setup_dosmake_envDir.chdir 'source'path_prefix DOSMAKE_PATH_PREFIXclean_dosbuild_areaend$release_version = nildef release_versionif not $release_versionraise "Can't find version.h" unless File.file? 'version.h'IO.readlines('version.h').each do |line|if line =~ /VERSION\s+"(\d\.\d(?:\.\d)?)/$release_version = $1if line =~ /-svn/raise "Version number is #$1-svn! Remove the -svn suffix."endbreakendendend$release_version or raise "Unable to read version at #{FileUtils.pwd}"enddef build_dossetup_dosmake_envputs "\nBuilding stone_soup (ndebug) for #{release_version} DOS"system( %{ #{DOSMAKE} -f makefile.dos DOYACC=y "EXTRA_FLAGS=-O2 } +%{-DCLUA_BINDINGS -DREGEX_PCRE" } +%{"LIB=-static -llua -lpcre"} ) orraise "#{DOSMAKE} failed: #$?"upx CRAWL_DOS_PATHenddef build_win32setup_w32make_envputs "\nBuilding stone_soup (non-debug) for #{release_version} release!"system( %{#{W32MAKE} -f makefile.mgw DOYACC=y "EXTRA_FLAGS=-O2 } +%{-DCLUA_BINDINGS -DREGEX_PCRE" } +%{"LIB=-lwinmm -static -llua -llualib -lpcre"} ) orraise "#{W32MAKE} failed: #$?"clean_w32build_areaputs "\nBuilding stone_soup (debug) for #{release_version}!"system( %{#{W32MAKE} -f makefile.mgw debug DEBUG_CRAWL=y "EXTRA_FLAGS=-O2 } +%{-DCLUA_BINDINGS -DREGEX_PCRE -DFULLDEBUG -DWIZARD" } +%{"LIB=-lwinmm -static -llua -llualib -lpcre" } +%{DOYACC=y} ) orraise "#{W32MAKE} failed: #$?"upx CRAWL_NDB_PATH, CRAWL_DBG_PATHenddef upx(*files)return unless UPX and not UPX.empty?files.each do |file|system "#{UPX} #{file}" or raise "#{UPX} failed: #$?"endenddef makezip(path, name, exe)zipname = File.join(path, name) + '.zip'puts "Creating zip archive at #{zipname}"if File.exists? zipnameFileUtils.rm(zipname)endZip::ZipFile.open( zipname, Zip::ZipFile::CREATE ) do |zip|zip.dir.mkdir(name)zip.dir.chdir name# The exe itselfzip.add 'source/' + exe# Add base documentationzip.add [ 'CREDITS', 'licence.txt', 'readme.txt' ] + Dir['README*']# Add base configzip.add [ 'init.txt', 'macro.txt' ]zip.add( Dir['docs/*'].find_all { |f| not File.directory?(f) },:keep_paths => true )zip.add( Dir['source/lua/*'], :prefix => 'lua' )zip.add( Dir['source/dat/*'], :prefix => 'dat' )endenddef packageDir.chdir( File.join(BUILD_HOME, SVN_CO_DIR) )# Wipe all existing zips!FileUtils.rm( Dir[ File.join(PACKAGE_PATH, '*.zip') ] )[ [ "stone_soup-#{release_version}-win32", CRAWL_NDB_PATH ],[ "stone_soup-#{release_version}-win32-debug", CRAWL_DBG_PATH ],[ "ss#{release_version.tr '.', ''}dos", CRAWL_DOS_PATH ]].each do |pkg, exe|makezip(PACKAGE_PATH, pkg, exe)endend########################################################################### Zip extensionsclass Zip::ZipFiledef mkdir_p(dirpath)dirpath.tr! '\\', '/'segments = File.split(dirpath)fullpath = nilsegments.each do |dir|next if dir == '.'fullpath = fullpath ? File.join(fullpath, dir) : dirself.dir.mkdir fullpath unless self.file.directory? fullpathendenddef add(files, options = {})files = [ files ] unless files.respond_to? :to_aryfiles.each do |f|entryname = options[:keep_paths]? f : File.basename(f)entryname = File.join(options[:prefix], entryname) if options[:prefix]if File.directory? f# We DON'T add the contents of the directory automagicallyself.mkdir_p entrynameelsedirname = File.dirname(entryname)self.mkdir_p(dirname) unless dirname == '.'self.file.open(entryname, 'w') do |outf|File.open(f, 'rb') do |inf|outf.write( inf.read )endendendendendendbuild_soup