2016-01-18 19:29:56 +00:00
# coding: utf-8
2010-07-25 19:41:08 +00:00
2015-04-05 11:36:50 +00:00
if Signal . list . key? ( 'ALRM' )
Signal . trap ( 'ALRM' ) { | signo | }
end
2014-01-08 12:58:37 +00:00
version = RUBY_VERSION . gsub ( / [^0-9 \ .]+ / , " " ) . split ( / \ . / ) . collect ( & :to_i )
version << 0 while version . size < 3
if ( version [ 0 ] < 2 ) && ( version [ 1 ] < 9 )
fail " Ruby 1.9.x or newer is required for building "
end
2010-07-27 19:31:39 +00:00
# Change to base directory before doing anything
2010-08-05 20:18:29 +00:00
if FileUtils . pwd != File . dirname ( __FILE__ )
new_dir = File . absolute_path ( File . dirname ( __FILE__ ) )
puts " Entering directory ` #{ new_dir } ' "
Dir . chdir new_dir
end
2010-07-27 19:00:50 +00:00
2010-07-27 19:31:39 +00:00
# Set number of threads to use if it is unset and we're running with
2017-01-07 15:33:57 +00:00
# drake.
2010-07-27 19:31:39 +00:00
if Rake . application . options . respond_to? ( :threads ) && [ nil , 0 , 1 ] . include? ( Rake . application . options . threads ) && ! ENV [ 'DRAKETHREADS' ] . nil?
Rake . application . options . threads = ENV [ 'DRAKETHREADS' ] . to_i
end
2017-01-07 15:33:57 +00:00
# For newer rake turn on parallel processing, too. Newer rake versions
# use an OpenStruct, though, so testing with responds_to? won't work.
version = Rake :: VERSION . gsub ( %r{ [^0-9 \ .]+ } , " " ) . split ( %r{ \ . } ) . map ( & :to_i )
2017-10-17 18:44:16 +00:00
if ( version [ 0 ] > 10 ) || ( ( version [ 0 ] == 10 ) && ( version [ 1 ] > = 3 ) )
2017-01-07 15:33:57 +00:00
Rake . application . options . always_multitask = true
end
2010-07-25 19:41:08 +00:00
require " pp "
2017-05-20 16:05:45 +00:00
module Mtx
end
2012-08-13 06:46:37 +00:00
require_relative " rake.d/extensions "
2013-12-25 12:00:28 +00:00
require_relative " rake.d/config "
2017-08-20 17:46:57 +00:00
$config = read_build_config
2016-04-10 13:22:19 +00:00
$verbose = ENV [ 'V' ] . to_bool
2012-08-07 20:48:28 +00:00
$build_system_modules = { }
2013-12-25 12:00:28 +00:00
$have_gtest = ( c ( :GTEST_TYPE ) == " system " ) || ( c ( :GTEST_TYPE ) == " internal " )
2013-07-04 19:04:29 +00:00
$gtest_apps = [ ]
2012-08-07 20:48:28 +00:00
2010-09-04 15:14:50 +00:00
require_relative " rake.d/helpers "
require_relative " rake.d/target "
require_relative " rake.d/application "
2017-05-20 16:05:45 +00:00
require_relative " rake.d/installer "
2010-09-04 15:14:50 +00:00
require_relative " rake.d/library "
2014-01-25 11:23:02 +00:00
require_relative " rake.d/format_string_verifier "
2016-03-22 09:20:12 +00:00
require_relative " rake.d/pch "
2016-02-28 09:49:57 +00:00
require_relative " rake.d/po "
2017-07-15 09:57:45 +00:00
require_relative " rake.d/source_tests "
2014-09-01 13:16:04 +00:00
require_relative " rake.d/tarball "
2012-08-07 20:48:28 +00:00
require_relative 'rake.d/gtest' if $have_gtest
2010-07-25 19:41:08 +00:00
2010-07-26 10:29:18 +00:00
def setup_globals
2016-05-05 14:06:06 +00:00
$building_for = {
2017-04-02 19:56:30 +00:00
:linux = > %r{ linux }i . match ( c ( :host ) ) ,
:macos = > %r{ darwin }i . match ( c ( :host ) ) ,
:windows = > %r{ mingw }i . match ( c ( :host ) ) ,
2016-05-05 14:06:06 +00:00
}
2015-08-15 16:53:12 +00:00
$build_mkvtoolnix_gui || = c? ( :USE_QT )
2016-05-05 14:06:06 +00:00
$build_mkvinfo_gui = c? ( :USE_QT ) && ( $building_for [ :windows ] || $building_for [ :macos ] )
2015-03-27 09:04:33 +00:00
$build_tools || = c? ( :BUILD_TOOLS )
2012-04-16 11:55:09 +00:00
2010-07-27 17:27:06 +00:00
$programs = %w{ mkvmerge mkvinfo mkvextract mkvpropedit }
2016-05-05 14:06:06 +00:00
$programs << " mkvinfo-gui " if $build_mkvinfo_gui
2012-04-16 11:55:09 +00:00
$programs << " mkvtoolnix-gui " if $build_mkvtoolnix_gui
2017-03-19 17:44:00 +00:00
$tools = %w{ ac3parser base64tool checksum diracparser ebml_validator hevc_dump hevcc_dump mpls_dump vc1parser }
2010-07-27 17:27:06 +00:00
2015-08-15 16:27:44 +00:00
$application_subdirs = { " mkvtoolnix-gui " = > " mkvtoolnix-gui/ " }
2010-07-27 17:27:06 +00:00
$applications = $programs . collect { | name | " src/ #{ $application_subdirs [ name ] } #{ name } " + c ( :EXEEXT ) }
2016-05-05 14:06:06 +00:00
$manpages = $programs . reject { | name | %r{ mkvinfo-gui } . match ( name ) } . map { | name | " doc/man/ #{ name } .1 " }
2015-05-30 09:11:08 +00:00
$manpages << " doc/man/mkvtoolnix-gui.1 " if $build_mkvtoolnix_gui
2010-07-27 17:27:06 +00:00
2015-03-30 23:32:37 +00:00
$system_includes = " -I. -Ilib -Ilib/avilib-0.6.10 -Isrc "
2017-02-13 20:37:29 +00:00
$system_includes += " -Ilib/utf8-cpp/source " if c? ( :UTF8CPP_INTERNAL )
$system_includes += " -Ilib/pugixml/src " if c? ( :PUGIXML_INTERNAL )
2014-12-05 11:35:39 +00:00
$system_libdirs = " -Llib/avilib-0.6.10 -Llib/librmff -Lsrc/common "
2015-08-15 16:27:44 +00:00
$source_directories = %w{ lib/avilib-0.6.10 lib/librmff src/common src/extract src/info src/input src/merge src/mkvtoolnix-gui src/mpegparser src/output src/propedit }
2015-03-31 18:45:06 +00:00
$all_sources = $source_directories . collect { | dir | FileList [ " #{ dir } /**/*.c " , " #{ dir } /**/*.cpp " ] . to_a } . flatten . sort
$all_headers = $source_directories . collect { | dir | FileList [ " #{ dir } /**/*.h " , ] . to_a } . flatten . sort
2010-07-27 17:27:06 +00:00
$all_objects = $all_sources . collect { | file | file . ext ( 'o' ) }
2016-02-28 09:49:57 +00:00
$all_app_po_files = FileList [ " po/*.po " ] . to_a . sort
$all_man_po_files = FileList [ " doc/man/po4a/po/*.po " ] . to_a . sort
$all_po_files = $all_app_po_files + $all_man_po_files
2010-07-27 17:27:06 +00:00
2015-04-14 19:29:09 +00:00
$gui_ui_files = FileList [ " src/mkvtoolnix-gui/forms/**/*.ui " ] . to_a
$gui_ui_h_files = $gui_ui_files . collect { | file | file . ext 'h' }
2015-04-03 13:07:27 +00:00
2010-07-27 17:27:06 +00:00
$top_srcdir = c ( :top_srcdir )
2012-03-18 09:55:42 +00:00
$dependency_dir = " #{ $top_srcdir } /rake.d/dependency.d "
$dependency_tmp_dir = " #{ $dependency_dir } /tmp "
2010-07-27 17:27:06 +00:00
$languages = {
2016-08-07 09:09:40 +00:00
:programs = > c ( :TRANSLATIONS ) . split ( / \ s+ / ) ,
2010-07-27 17:27:06 +00:00
:manpages = > c ( :MANPAGES_TRANSLATIONS ) . split ( / \ s+ / ) ,
}
$translations = {
2016-08-07 09:09:40 +00:00
:programs = > $languages [ :programs ] . collect { | language | " po/ #{ language } .mo " } ,
:manpages = > ! c? ( :PO4A_WORKS ) ? [ ] : $languages [ :manpages ] . collect { | language | $manpages . collect { | manpage | manpage . gsub ( / man \/ / , " man/ #{ language } / " ) } } . flatten ,
2010-07-27 17:27:06 +00:00
}
$available_languages = {
2016-08-07 09:09:40 +00:00
:programs = > FileList [ " #{ $top_srcdir } /po/*.po " ] . collect { | name | File . basename name , '.po' } ,
2015-08-15 16:27:44 +00:00
:manpages = > FileList [ " #{ $top_srcdir } /doc/man/po4a/po/*.po " ] . collect { | name | File . basename name , '.po' } ,
2010-07-27 17:27:06 +00:00
}
2010-07-27 19:49:51 +00:00
2015-08-29 16:57:30 +00:00
$unwrapped_po = %{ ca es eu it nl uk pl sr_RS@latin tr }
2015-03-24 12:14:55 +00:00
$po_multiple_sources = %{ sv }
2014-08-24 12:40:12 +00:00
2017-11-16 14:15:29 +00:00
$benchmark_sources = FileList [ " src/benchmark/*.cpp " ] . to_a if c? ( :GOOGLE_BENCHMARK )
2013-10-26 10:12:24 +00:00
cflags_common = " -Wall -Wno-comment -Wfatal-errors #{ c ( :WLOGICAL_OP ) } #{ c ( :WNO_MISMATCHED_TAGS ) } #{ c ( :WNO_SELF_ASSIGN ) } #{ c ( :QUNUSED_ARGUMENTS ) } "
2015-03-25 16:51:30 +00:00
cflags_common += " #{ c ( :WNO_INCONSISTENT_MISSING_OVERRIDE ) } #{ c ( :WNO_POTENTIALLY_EVALUATED_EXPRESSION ) } "
2015-04-28 11:21:40 +00:00
cflags_common += " #{ c ( :OPTIMIZATION_CFLAGS ) } -D_FILE_OFFSET_BITS=64 "
2015-02-12 13:35:48 +00:00
cflags_common += " -DMTX_LOCALE_DIR= \\ \" #{ c ( :localedir ) } \\ \" -DMTX_PKG_DATA_DIR= \\ \" #{ c ( :pkgdatadir ) } \\ \" -DMTX_DOC_DIR= \\ \" #{ c ( :docdir ) } \\ \" "
2015-08-11 13:02:58 +00:00
cflags_common += " #{ c ( :FSTACK_PROTECTOR ) } "
2015-09-16 08:01:37 +00:00
cflags_common += " -fsanitize=undefined " if c? ( :UBSAN )
2017-01-13 16:11:41 +00:00
cflags_common += " -fsanitize=address -fno-omit-frame-pointer " if c? ( :ADDRSAN )
2015-04-28 18:43:37 +00:00
cflags_common += " -Ilib/libebml -Ilib/libmatroska " if c? ( :EBML_MATROSKA_INTERNAL )
2017-02-13 19:47:45 +00:00
cflags_common += " #{ c ( :MATROSKA_CFLAGS ) } #{ c ( :EBML_CFLAGS ) } #{ c ( :PUGIXML_CFLAGS ) } #{ c ( :EXTRA_CFLAGS ) } #{ c ( :DEBUG_CFLAGS ) } #{ c ( :PROFILING_CFLAGS ) } #{ c ( :USER_CPPFLAGS ) } "
2017-07-06 18:18:38 +00:00
cflags_common += " -mno-ms-bitfields -DWINVER=0x0601 -D_WIN32_WINNT=0x0601 " if $building_for [ :windows ] # 0x0601 = Windows 7/Server 2008 R2
2017-04-02 19:56:30 +00:00
cflags_common += " -march=i686 " if $building_for [ :windows ] && / i686 / . match ( c ( :host ) )
cflags_common += " -fPIC " if c? ( :USE_QT ) && ! $building_for [ :windows ]
cflags_common += " -DQT_STATICPLUGIN " if c? ( :USE_QT ) && $building_for [ :windows ]
2017-12-12 08:59:34 +00:00
cflags_common += " -DMTX_APPIMAGE " if c? ( :APPIMAGE_BUILD ) && ! $building_for [ :windows ]
2015-04-28 18:43:37 +00:00
cflags = " #{ cflags_common } #{ c ( :USER_CFLAGS ) } "
cxxflags = " #{ cflags_common } #{ c ( :STD_CXX ) } "
2015-05-23 17:28:57 +00:00
cxxflags += " -Wnon-virtual-dtor -Woverloaded-virtual -Wextra -Wno-missing-field-initializers #{ c ( :WNO_MAYBE_UNINITIALIZED ) } "
2017-03-31 07:07:22 +00:00
cxxflags += " #{ c ( :QT_CFLAGS ) } #{ c ( :BOOST_CPPFLAGS ) } #{ c ( :USER_CXXFLAGS ) } "
2015-04-28 18:43:37 +00:00
2015-04-28 11:21:40 +00:00
ldflags = " "
2017-11-18 09:24:16 +00:00
ldflags += " -fuse-ld=lld " if ( c ( :COMPILER_TYPE ) == " clang " ) && ! c ( :LLVM_LLD ) . empty?
2015-04-28 11:21:40 +00:00
ldflags += " -Llib/libebml/src -Llib/libmatroska/src " if c? ( :EBML_MATROSKA_INTERNAL )
ldflags += " #{ c ( :EXTRA_LDFLAGS ) } #{ c ( :PROFILING_LIBS ) } #{ c ( :USER_LDFLAGS ) } #{ c ( :LDFLAGS_RPATHS ) } #{ c ( :BOOST_LDFLAGS ) } "
2017-04-02 19:56:30 +00:00
ldflags += " -Wl,--dynamicbase,--nxcompat " if $building_for [ :windows ]
2017-01-13 16:11:41 +00:00
ldflags += " -fsanitize=undefined " if c? ( :UBSAN )
ldflags += " -fsanitize=address -fno-omit-frame-pointer " if c? ( :ADDRSAN )
2015-08-11 14:39:20 +00:00
ldflags += " #{ c ( :FSTACK_PROTECTOR ) } "
2015-04-28 18:43:37 +00:00
2015-08-15 16:27:44 +00:00
windres = " "
2015-05-03 15:51:22 +00:00
windres += " -DMINGW_PROCESSOR_ARCH_AMD64=1 " if c ( :MINGW_PROCESSOR_ARCH ) == 'amd64'
2015-04-28 18:43:37 +00:00
2017-04-05 12:02:24 +00:00
mocflags = $building_for [ :macos ] ? " -DSYS_APPLE " : $building_for [ :windows ] ? " -DSYS_WINDOWS " : " "
2015-07-04 16:21:26 +00:00
2010-08-01 10:53:34 +00:00
$flags = {
2015-04-28 18:43:37 +00:00
:cflags = > cflags ,
:cxxflags = > cxxflags ,
2015-04-28 11:21:40 +00:00
:ldflags = > ldflags ,
2015-04-28 18:43:37 +00:00
:windres = > windres ,
2015-07-04 16:21:26 +00:00
:moc = > mocflags ,
2010-08-01 10:53:34 +00:00
}
2012-08-07 20:48:28 +00:00
2017-08-20 17:46:57 +00:00
setup_macos_specifics if $building_for [ :macos ]
2012-08-07 20:48:28 +00:00
$build_system_modules . values . each { | bsm | bsm [ :setup ] . call if bsm [ :setup ] }
2010-07-26 10:29:18 +00:00
end
2012-02-06 11:39:59 +00:00
def setup_overrides
2016-08-07 09:09:40 +00:00
[ :programs , :manpages ] . each do | type |
2012-02-06 11:39:59 +00:00
value = c ( " AVAILABLE_LANGUAGES_ #{ type . to_s . upcase } " )
$available_languages [ type ] = value . split ( / \ s+ / ) unless value . empty?
end
end
2017-08-20 17:46:57 +00:00
def setup_macos_specifics
$macos_config = read_config_file ( " tools/macos/config.sh " )
if ENV [ 'MACOSX_DEPLOYMENT_TARGET' ] . to_s . empty? && ! $macos_config [ :MACOSX_DEPLOYMENT_TARGET ] . to_s . empty?
ENV [ 'MACOSX_DEPLOYMENT_TARGET' ] = $macos_config [ :MACOSX_DEPLOYMENT_TARGET ]
end
end
2010-07-26 11:30:59 +00:00
def define_default_task
desc " Build everything "
2010-07-26 19:47:37 +00:00
# The applications themselves
2010-07-26 11:30:59 +00:00
targets = $applications . clone
2010-07-26 19:47:37 +00:00
2015-03-27 09:04:33 +00:00
targets << " apps:tools " if $build_tools
2017-04-23 16:37:26 +00:00
targets += ( c ( :ADDITIONAL_TARGETS ) || '' ) . split ( %r{ + } )
2010-07-27 19:49:51 +00:00
2012-08-07 20:48:28 +00:00
# Build the unit tests only if requested
2012-08-26 10:36:14 +00:00
targets << ( $run_unit_tests ? 'tests:run_unit' : 'tests:unit' ) if $have_gtest
2012-08-07 20:48:28 +00:00
2010-07-26 19:47:37 +00:00
# The tags file -- but only if it exists already
2012-03-26 18:19:14 +00:00
if File . exists? ( " TAGS " )
targets << " TAGS " if ! c ( :ETAGS ) . empty?
targets << " BROWSE " if ! c ( :EBROWSE ) . empty?
end
2010-07-26 11:30:59 +00:00
2011-08-03 18:42:32 +00:00
# Build developer documentation?
targets << " doc/development.html " if ! c ( :PANDOC ) . empty?
2010-07-26 11:30:59 +00:00
# Build man pages and translations?
2017-01-25 19:51:47 +00:00
targets << " manpages "
targets << " translations:manpages " if c? ( :PO4A_WORKS )
2010-07-26 11:30:59 +00:00
2010-07-26 19:31:57 +00:00
# Build translations for the programs
2016-08-07 09:09:40 +00:00
targets << " translations:programs "
2010-07-26 19:31:57 +00:00
2015-06-03 18:06:34 +00:00
# The Qt translation files: only for Windows
2017-04-02 19:56:30 +00:00
targets << " translations:qt " if $building_for [ :windows ] && ! c ( :LCONVERT ) . blank?
2015-06-03 18:06:34 +00:00
2015-11-21 14:07:39 +00:00
# Build ebml_validator by default when not cross-compiling as it is
# needed for running the tests.
targets << " apps:tools:ebml_validator " if c ( :host ) == c ( :build )
2017-11-16 14:15:29 +00:00
targets << " src/benchmark/benchmark " if c? ( :GOOGLE_BENCHMARK ) && ! $benchmark_sources . empty?
2010-07-27 13:08:23 +00:00
task :default = > targets do
puts " Done. Enjoy :) "
end
2010-07-26 11:30:59 +00:00
end
2010-07-26 10:29:18 +00:00
# main
setup_globals
2012-02-06 11:39:59 +00:00
setup_overrides
2010-07-26 10:29:18 +00:00
import_dependencies
2010-07-25 19:41:08 +00:00
# Default task
2010-07-26 11:30:59 +00:00
define_default_task
2010-07-25 19:41:08 +00:00
2016-03-26 10:56:40 +00:00
# A helper task to check if there are any unstaged changes.
task :no_unstaged_changes do
has_changes = false
has_changes = true if ! system ( " git rev-parse --verify HEAD &> /dev/null " ) || $? . exitstatus != 0
has_changes = true if ! system ( " git update-index -q --ignore-submodules --refresh &> /dev/null " ) || $? . exitstatus != 0
has_changes = true if ! system ( " git diff-files --quiet --ignore-submodules &> /dev/null " ) || $? . exitstatus != 0
has_changes = true if ! system ( " git diff-index --cached --quiet --ignore-submodules HEAD -- &> /dev/null " ) || $? . exitstatus != 0
fail " There are unstaged changes; the operation cannot continue. " if has_changes
end
2010-07-27 07:25:02 +00:00
desc " Build all applications "
task :apps = > $applications
2010-07-25 19:41:08 +00:00
2011-10-16 17:43:10 +00:00
desc " Build all command line applications "
namespace :apps do
task :cli = > %w{ apps:mkvmerge apps:mkvinfo apps:mkvextract apps:mkvpropedit }
2014-07-26 17:15:18 +00:00
desc " Strip all apps "
task :strip = > $applications do
2016-03-26 11:34:52 +00:00
runq " strip " , nil , " #{ c ( :STRIP ) } #{ $applications . join ( ' ' ) } "
2014-07-26 17:15:18 +00:00
end
2011-10-16 17:43:10 +00:00
end
2010-07-25 19:41:08 +00:00
# Store compiler block for re-use
2017-01-07 15:29:15 +00:00
cxx_compiler = lambda do | * args |
t = args . first
2012-03-18 09:55:42 +00:00
create_dependency_dirs
2016-03-22 09:20:12 +00:00
source = t . source ? t . source : t . prerequisites . first
dep = dependency_output_name_for t . name
pchi = PCH . info_for_user ( source , t . name )
pchu = pchi . use_flags ? " #{ pchi . use_flags } " : " "
pchx = pchi . extra_flags ? " #{ pchi . extra_flags } " : " "
lang = pchi . language ? pchi . language : " c++ "
args = [
2016-03-26 11:34:52 +00:00
" cxx " , source ,
2016-03-22 09:20:12 +00:00
" #{ c ( :CXX ) } #{ $flags [ :cxxflags ] } #{ pchu } #{ pchx } #{ $system_includes } -c -MMD -MF #{ dep } -o #{ t . name } -x #{ lang } #{ source } " ,
:allow_failure = > true
]
if pchi . pretty_flags
2016-03-26 14:26:51 +00:00
PCH . runq ( * args [ 0 .. 2 ] , args [ 3 ] . merge ( pchi . pretty_flags ) )
2016-03-22 09:20:12 +00:00
else
runq ( * args )
end
2010-07-26 10:29:18 +00:00
2012-03-18 09:55:42 +00:00
handle_deps t . name , last_exit_code , true
2010-07-25 19:41:08 +00:00
end
# Pattern rules
rule '.o' = > '.cpp' , & cxx_compiler
2012-08-07 20:48:28 +00:00
rule '.o' = > '.cc' , & cxx_compiler
2010-07-25 19:41:08 +00:00
rule '.o' = > '.c' do | t |
2012-03-18 09:55:42 +00:00
create_dependency_dirs
dep = dependency_output_name_for t . name
2016-03-26 11:34:52 +00:00
runq " cc " , t . source , " #{ c ( :CC ) } #{ $flags [ :cflags ] } #{ $system_includes } -c -MMD -MF #{ dep } -o #{ t . name } #{ t . sources . join ( " " ) } " , :allow_failure = > true
2010-07-26 10:29:18 +00:00
handle_deps t . name , last_exit_code
2010-07-25 19:41:08 +00:00
end
rule '.o' = > '.rc' do | t |
2016-03-26 11:34:52 +00:00
runq " windres " , t . source , " #{ c ( :WINDRES ) } #{ $flags [ :windres ] } -o #{ t . name } #{ t . sources . join ( " " ) } "
2010-07-25 19:41:08 +00:00
end
2011-11-23 23:50:00 +00:00
# Resources depend on the manifest.xml file for Windows builds.
2017-04-02 19:56:30 +00:00
if $building_for [ :windows ]
2011-11-23 23:50:00 +00:00
$programs . each do | program |
path = program . gsub ( / ^mkv / , '' )
2015-05-09 07:41:04 +00:00
icon = program == 'mkvinfo' ? 'share/icons/windows/mkvinfo.ico' : 'share/icons/windows/mkvtoolnix-gui.ico'
2014-01-02 20:23:13 +00:00
file " src/ #{ path } /resources.o " = > [ " src/ #{ path } /manifest- #{ c ( :MINGW_PROCESSOR_ARCH ) } .xml " , " src/ #{ path } /resources.rc " , icon ]
2011-11-23 23:50:00 +00:00
end
end
2010-07-25 19:41:08 +00:00
rule '.mo' = > '.po' do | t |
2016-03-26 11:34:52 +00:00
runq " msgfmt " , t . source , " msgfmt -c -o #{ t . name } #{ t . sources . join ( " " ) } "
2010-07-25 19:41:08 +00:00
end
2015-06-03 18:06:34 +00:00
if ! c ( :LCONVERT ) . blank?
rule '.qm' = > '.ts' do | t |
2016-03-26 11:34:52 +00:00
runq " lconvert " , t . source , " #{ c ( :LCONVERT ) } -o #{ t . name } -i #{ t . sources . join ( " " ) } "
2015-06-03 18:06:34 +00:00
end
end
2010-07-25 19:41:08 +00:00
# man pages from DocBook XML
2017-01-25 19:51:47 +00:00
rule '.1' = > '.xml' do | t |
filter = lambda do | code , lines |
2017-09-29 16:31:45 +00:00
if ( 0 == code ) && lines . any? { | line | / ^error|parser error /i . match ( line ) }
2017-01-25 19:51:47 +00:00
File . unlink ( t . name ) if File . exists? ( t . name )
result = 1
2017-10-11 13:13:48 +00:00
puts lines . join ( '' )
2017-09-29 16:31:45 +00:00
elsif 0 != code
result = code
puts lines . join ( '' )
2017-01-25 19:51:47 +00:00
else
result = 0
2017-09-29 16:31:45 +00:00
puts lines . join ( '' ) if $verbose
2012-02-25 14:05:14 +00:00
end
2017-01-25 19:51:47 +00:00
result
2010-10-31 14:40:45 +00:00
end
2010-12-26 00:50:21 +00:00
2017-07-22 13:37:14 +00:00
stylesheet = " #{ c ( :DOCBOOK_ROOT ) } /manpages/docbook.xsl "
if ! FileTest . exists? ( stylesheet )
puts " Error: the DocBook stylesheet ' #{ stylesheet } ' does not exist. "
exit 1
end
runq " xsltproc " , t . source , " #{ c ( :XSLTPROC ) } #{ c ( :XSLTPROC_FLAGS ) } -o #{ t . name } #{ stylesheet } #{ t . sources . join ( " " ) } " , :filter_output = > filter
2017-01-25 19:51:47 +00:00
end
$manpages . each do | manpage |
file manpage = > manpage . ext ( 'xml' )
$available_languages [ :manpages ] . each do | language |
localized_manpage = manpage . gsub ( / .* \/ / , " doc/man/ #{ language } / " )
file localized_manpage = > localized_manpage . ext ( 'xml' )
2010-12-26 00:50:21 +00:00
end
2010-07-25 19:41:08 +00:00
end
# Qt files
rule '.h' = > '.ui' do | t |
2016-11-20 16:17:24 +00:00
runq " uic " , t . source , " #{ c ( :UIC ) } --translate QTR #{ t . sources . join ( " " ) } > #{ t . name } "
2010-07-25 19:41:08 +00:00
end
2012-04-10 15:37:55 +00:00
rule '.cpp' = > '.qrc' do | t |
2016-03-26 11:34:52 +00:00
runq " rcc " , t . source , " #{ c ( :RCC ) } #{ t . sources . join ( " " ) } > #{ t . name } "
2012-04-10 15:37:55 +00:00
end
2012-04-09 15:48:38 +00:00
rule '.moc' = > '.h' do | t |
2016-03-26 11:34:52 +00:00
runq " moc " , t . source , " #{ c ( :MOC ) } #{ c ( :QT_CFLAGS ) } #{ $system_includes } #{ $flags [ :moc ] } -nw #{ t . source } > #{ t . name } "
2012-04-09 15:48:38 +00:00
end
rule '.moco' = > '.moc' do | t |
cxx_compiler . call t
2010-07-25 19:41:08 +00:00
end
2010-07-26 11:06:24 +00:00
# Tag files
desc " Create tags file for Emacs "
task :tags = > " TAGS "
2012-03-26 18:19:14 +00:00
desc " Create browse file for Emacs "
task :browse = > " BROWSE "
2010-07-26 11:06:24 +00:00
file " TAGS " = > $all_sources do | t |
2016-03-26 11:34:52 +00:00
runq 'etags' , nil , " #{ c ( :ETAGS ) } -o #{ t . name } #{ t . prerequisites . join ( " " ) } "
2010-07-26 11:06:24 +00:00
end
2012-03-26 18:19:14 +00:00
file " BROWSE " = > ( $all_sources + $all_headers ) do | t |
2016-03-26 11:34:52 +00:00
runq 'ebrowse' , nil , " #{ c ( :EBROWSE ) } -o #{ t . name } #{ t . prerequisites . join ( " " ) } "
2012-03-26 18:19:14 +00:00
end
2011-08-03 18:42:32 +00:00
file " doc/development.html " = > [ " doc/development.md " , " doc/pandoc-template.html " ] do | t |
2016-03-26 11:34:52 +00:00
runq " pandoc " , t . prerequisites . first , <<COMMAND
#{c(:PANDOC)} -o #{t.name} --standalone --from markdown_strict --to html --number-sections --table-of-contents --css=pandoc.css --template=doc/pandoc-template.html doc/development.md
COMMAND
2011-08-03 18:42:32 +00:00
end
2015-04-14 19:29:09 +00:00
file " po/mkvtoolnix.pot " = > $all_sources + $all_headers + $gui_ui_h_files + %w{ Rakefile } do | t |
sources = ( t . prerequisites . dup - %w{ Rakefile } ) . sort . uniq
keywords = %w{ --keyword=Y --keyword=NY:1,2 } # singular & plural forms returning std::string
2016-07-11 19:52:43 +00:00
keywords += %w{ --keyword=YF --keyword=NYF:1,2 } # singular & plural forms returning std::string which aren't format strings
2015-04-14 19:29:09 +00:00
keywords += %w{ --keyword=YT } # singular form returning translatable_string_c
keywords += %w{ --keyword=QTR } # singular form returning QString, used by uic
keywords += %w{ --keyword=QY --keyword=QNY:1,2 } # singular & plural forms returning QString
2015-12-24 09:11:10 +00:00
keywords += %w{ --keyword=QYH } # singular form returning HTML-escaped QString
2015-04-14 19:29:09 +00:00
2016-07-10 15:44:39 +00:00
flags = %w{ --flag=QY:1:no-c-format --flag=QNY:1:no-c-format }
2016-07-11 19:52:43 +00:00
flags += %w{ --flag=YF:1:no-c-format --flag=YF:1:no-boost-format }
flags += %w{ --flag=NYF:1:no-c-format --flag=NYF:1:no-boost-format }
2016-07-10 15:44:39 +00:00
2015-04-14 19:29:09 +00:00
options = %w{ --default-domain=mkvtoolnix --from-code=UTF-8 --sort-output --boost }
options += [ " '--msgid-bugs-address=Moritz Bunkus <moritz@bunkus.org>' " ]
options += [ " '--copyright-holder=Moritz Bunkus <moritz@bunkus.org>' " , " --package-name=MKVToolNix " , " --package-version= #{ c ( :PACKAGE_VERSION ) } " , " --foreign-user " ]
2016-07-10 15:44:39 +00:00
runq " xgettext " , t . name , " xgettext #{ keywords . join ( " " ) } #{ flags . join ( " " ) } #{ options . join ( " " ) } -o #{ t . name } #{ sources . join ( " " ) } "
2011-11-05 13:29:02 +00:00
end
2010-07-27 17:27:06 +00:00
task :manpages = > $manpages
2010-07-27 07:25:02 +00:00
# Translations for the programs
namespace :translations do
desc " Create a template for translating the programs "
task :pot = > " po/mkvtoolnix.pot "
2011-11-03 23:34:05 +00:00
desc " Create a new .po file with an empty template "
task " new-po " = > " po/mkvtoolnix.pot " do
%w{ LANGUAGE EMAIL } . each { | e | fail " Variable ' #{ e } ' is not set " if ENV [ e ] . blank? }
require 'rexml/document'
2013-09-19 09:01:05 +00:00
iso639_file = " /usr/share/xml/iso-codes/iso_639.xml "
node = REXML :: XPath . first REXML :: Document . new ( File . new ( iso639_file ) ) , " //iso_639_entry[@name=' #{ ENV [ 'LANGUAGE' ] } '] "
locale = node ? node . attributes [ 'iso_639_1_code' ] : nil
if locale . blank?
if / ^ [a-z]{2} (?: _ [A-Z]{2} )? $ /x . match ( ENV [ 'LANGUAGE' ] )
locale = ENV [ 'LANGUAGE' ]
else
fail " Unknown language/ISO-639-1 code not found in #{ iso639_file } "
end
end
2011-11-03 23:34:05 +00:00
2016-03-28 09:32:00 +00:00
puts_action " create " , " po/ #{ locale } .po "
2011-11-03 23:34:05 +00:00
File . open " po/ #{ locale } .po " , " w " do | out |
2015-09-29 19:37:44 +00:00
now = Time . now
email = ENV [ 'EMAIL' ]
email = " YOUR NAME < #{ email } > " unless / < / . match ( email )
header = <<EOT
2011-11-03 23:34:05 +00:00
# translation of mkvtoolnix.pot to #{ENV['LANGUAGE']}
# Copyright (C) #{now.year} Moritz Bunkus
2017-12-20 21:15:40 +00:00
# This file is distributed under the same license as the MKVToolNix package.
2011-11-03 23:34:05 +00:00
#
msgid " "
EOT
2015-09-29 19:37:44 +00:00
content = IO .
readlines ( " po/mkvtoolnix.pot " ) .
join ( " " ) .
gsub ( / \ A.*?msgid "" \ n /m , header ) .
gsub ( / ^"PO-Revision-Date:.*?$ /m , %{ "PO-Revision-Date: #{ now . strftime ( '%Y-%m-%d %H:%M%z' ) } \\ n" } ) .
gsub ( / ^"Last-Translator:.*?$ /m , %{ "Last-Translator: #{ email } \\ n" } ) .
gsub ( / ^"Language-Team:.*?$ /m , %{ "Language-Team: #{ ENV [ 'LANGUAGE' ] } <moritz@bunkus.org> \\ n" } ) .
gsub ( / ^"Language: \\ n"$ / , %{ "Language: #{ locale } \\ n" } )
out . puts content
2011-11-03 23:34:05 +00:00
end
2017-12-20 21:15:40 +00:00
puts " Remember to look up the plural forms in this document: \n http://docs.translatehouse.org/projects/localization-guide/en/latest/l10n/pluralforms.html "
2011-11-03 23:34:05 +00:00
end
2016-01-15 10:57:32 +00:00
def verify_format_strings languages
2014-01-25 11:23:02 +00:00
is_ok = true
languages .
collect { | language | " po/ #{ language } .po " } .
sort .
each do | file_name |
puts " VERIFY #{ file_name } "
is_ok && = FormatStringVerifier . new . verify file_name
end
2016-01-15 10:57:32 +00:00
is_ok
end
desc " Verify format strings in translations "
task " verify-format-strings " do
languages = ( ENV [ 'LANGUAGES' ] || '' ) . split ( / + / )
2016-08-07 09:09:40 +00:00
languages = $available_languages [ :programs ] if languages . empty?
2016-01-15 10:57:32 +00:00
exit 1 if ! verify_format_strings ( languages )
end
desc " Verify format strings in staged translations "
task " verify-format-strings-staged " do
languages = ` git --no-pager diff --cached --name-only ` .
split ( / \ n / ) .
select { | file | / po \/ .* \ .po$ / . match ( file ) } .
map { | file | file . gsub ( / .* \/ / , '' ) . gsub ( / \ .po / , '' ) }
if languages . empty?
puts " Error: Nothing staged "
exit 2
end
exit 1 if ! verify_format_strings ( languages )
2010-12-25 20:16:50 +00:00
end
2016-02-28 09:49:57 +00:00
$all_po_files . each do | po_file |
task " normalize-po- #{ po_file } " do
normalize_po po_file
end
end
desc " Normalize all .po files to a standard format "
task " normalize-po " = > $all_po_files . map { | e | " translations:normalize-po- #{ e } " }
2016-08-07 09:09:40 +00:00
[ :programs , :manpages ] . each { | type | task type = > $translations [ type ] }
2010-07-27 17:27:06 +00:00
2015-06-03 18:06:34 +00:00
task :qt = > FileList [ " #{ $top_srcdir } /po/qt/*.ts " ] . collect { | file | file . ext 'qm' }
2017-01-25 19:51:47 +00:00
if c? ( :PO4A_WORKS )
2017-10-13 19:35:16 +00:00
filter = lambda do | code , lines |
lines = lines . reject { | l | %r{ seems outdated.*differ between|please consider running po4a-updatepo|^$ }i . match ( l ) }
puts lines . join ( '' ) unless lines . empty?
code
end
2017-01-25 19:51:47 +00:00
$available_languages [ :manpages ] . each do | language |
$manpages . each do | manpage |
name = manpage . gsub ( / man \/ / , " man/ #{ language } / " )
file name = > [ name . ext ( 'xml' ) , " doc/man/po4a/po/ #{ language } .po " ]
file name . ext ( 'xml' ) = > [ manpage . ext ( '.xml' ) , " doc/man/po4a/po/ #{ language } .po " ] do | t |
2017-10-13 19:35:16 +00:00
runq " po4a " , " #{ manpage . ext ( '.xml' ) } ( #{ language } ) " , " #{ c ( :PO4A_TRANSLATE ) } #{ c ( :PO4A_TRANSLATE_FLAGS ) } -m #{ manpage . ext ( '.xml' ) } -p doc/man/po4a/po/ #{ language } .po -l #{ t . name } " , :filter_output = > filter
2017-01-25 19:51:47 +00:00
end
2010-08-01 10:24:54 +00:00
end
2010-07-27 18:49:35 +00:00
end
end
2010-07-27 17:47:40 +00:00
desc " Update all translation files "
2017-05-20 16:05:45 +00:00
task :update = > [ " translations:update:programs " , " translations:update:manpages " , " translations:update:translations " ]
2010-07-27 17:47:40 +00:00
namespace :update do
desc " Update the program's translation files "
2016-08-07 09:09:40 +00:00
task :programs = > [ " po/mkvtoolnix.pot " , ] + $available_languages [ :programs ] . collect { | language | " translations:update:programs: #{ language } " }
2010-07-27 17:47:40 +00:00
2016-08-07 09:09:40 +00:00
namespace :programs do
$available_languages [ :programs ] . each do | language |
2010-07-27 17:47:40 +00:00
task language = > " po/mkvtoolnix.pot " do | t |
po = " po/ #{ language } .po "
tmp_file = " #{ po } .new "
2014-08-24 12:40:12 +00:00
no_wrap = $unwrapped_po . include? ( language ) ? " " : " --no-wrap "
2016-03-26 11:34:52 +00:00
runq " msgmerge " , po , " msgmerge -q -s #{ no_wrap } #{ po } po/mkvtoolnix.pot > #{ tmp_file } " , :allow_failure = > true
2010-07-27 17:47:40 +00:00
exit_code = last_exit_code
if 0 != exit_code
File . unlink tmp_file
exit exit_code
end
2010-07-27 07:25:02 +00:00
2016-02-28 09:49:57 +00:00
FileUtils . move tmp_file , po
normalize_po po
2010-07-27 07:25:02 +00:00
end
2010-07-27 17:47:40 +00:00
end
end
2010-07-27 07:25:02 +00:00
2017-01-25 19:51:47 +00:00
if c? ( :PO4A_WORKS )
desc " Update the man pages' translation files "
task :manpages do
runq " po4a " , " doc/man/po4a/po4a.cfg " , " #{ c ( :PO4A ) } #{ c ( :PO4A_FLAGS ) } --msgmerge-opt=--no-wrap doc/man/po4a/po4a.cfg "
$all_man_po_files . each do | po_file |
normalize_po po_file
end
2010-07-27 07:25:02 +00:00
end
end
2017-05-20 16:05:45 +00:00
desc " Update the Windows installer's translation files "
2017-05-20 17:17:17 +00:00
task :installer do | t |
Mtx :: Installer . update_all_translation_files
end
2016-03-26 11:15:11 +00:00
end
2016-02-21 10:23:13 +00:00
2016-03-26 11:15:11 +00:00
namespace :transifex do
2016-02-28 10:44:58 +00:00
transifex_pull_targets = {
" man-pages " = > [ ] ,
" programs " = > [ ] ,
}
2016-02-21 10:23:13 +00:00
2016-03-26 11:15:11 +00:00
transifex_push_targets = {
" man-pages " = > [ ] ,
" programs " = > [ ] ,
}
2016-02-28 10:44:58 +00:00
$all_po_files . each do | po_file |
2016-03-26 11:15:11 +00:00
language = / \/ ([^ \/ ]+) \ .po$ / . match ( po_file ) [ 1 ]
resource = / doc \/ man / . match ( po_file ) ? " man-pages " : " programs "
pull_target = " pull- #{ resource } - #{ language } "
push_target = " push- #{ resource } - #{ language } "
2016-02-21 10:23:13 +00:00
2016-03-26 11:15:11 +00:00
transifex_pull_targets [ resource ] << " translations:transifex: #{ pull_target } "
transifex_push_targets [ resource ] << " translations:transifex: #{ push_target } "
2016-02-21 10:23:13 +00:00
2016-03-29 12:57:08 +00:00
desc " Fetch and merge #{ resource } translations from Transifex ( #{ language } ) " if list_targets? ( " transifex " , " transifex_pull " )
2016-03-26 11:15:11 +00:00
task pull_target = > :no_unstaged_changes do
2016-02-28 10:44:58 +00:00
transifex_pull_and_merge resource , language
2016-02-21 10:23:13 +00:00
end
2016-03-26 11:15:11 +00:00
2016-03-29 12:57:08 +00:00
desc " Push #{ resource } translations to Transifex ( #{ language } ) " if list_targets? ( " transifex " , " transifex_push " )
2016-03-26 11:15:11 +00:00
task push_target = > :no_unstaged_changes do
transifex_remove_fuzzy_and_push resource , language
end
2016-02-21 10:23:13 +00:00
end
2016-02-28 10:44:58 +00:00
desc " Fetch and merge program translations from Transifex "
2016-03-26 11:15:11 +00:00
task " pull-programs " = > transifex_pull_targets [ " programs " ]
2016-02-28 10:44:58 +00:00
desc " Fetch and merge man page translations from Transifex "
2016-03-26 11:15:11 +00:00
task " pull-man-pages " = > transifex_pull_targets [ " man-pages " ]
2016-02-28 10:44:58 +00:00
desc " Fetch and merge all translations from Transifex "
2016-03-26 11:15:11 +00:00
task " pull " = > transifex_pull_targets . values . flatten
2016-12-16 15:23:59 +00:00
desc " Push program translation source file to Transifex "
task " push-programs-source " = > " po/mkvtoolnix.pot " do
runq " tx push " , " po/mkvtoolnix.pot " , " tx push -s -r mkvtoolnix.programs > /dev/null "
end
2016-12-19 22:55:57 +00:00
desc " Push man page translation source file to Transifex "
task " push-man-pages-source " = > " doc/man/po4a/po/mkvtoolnix.pot " do
runq " tx push " , " doc/man/po4a/po/mkvtoolnix.pot " , " tx push -s -r mkvtoolnix.man-pages > /dev/null "
end
2016-12-22 19:58:19 +00:00
desc " Push program translations to Transifex "
task " push-programs " = > transifex_push_targets [ " programs " ]
desc " Push man page translations to Transifex "
task " push-man-pages " = > transifex_push_targets [ " man-pages " ]
desc " Push all translations to Transifex "
task " push " = > transifex_push_targets . values . flatten
2010-07-27 07:25:02 +00:00
end
2015-03-24 12:20:18 +00:00
[ :stats , :statistics ] . each_with_index do | task_name , idx |
2010-07-27 07:25:02 +00:00
desc " Generate statistics about translation coverage " if 0 == idx
2015-03-24 12:20:18 +00:00
task task_name do
2010-07-27 07:25:02 +00:00
FileList [ " po/*.po " , " doc/man/po4a/po/*.po " ] . each do | name |
command = " msgfmt --statistics -o /dev/null #{ name } 2>&1 "
2016-03-28 09:32:00 +00:00
if $verbose
2016-03-26 11:34:52 +00:00
runq " msgfmt " , name , command , :allow_failure = > true
2010-07-27 07:25:02 +00:00
else
puts " #{ name } : " + ` #{ command } ` . split ( / \ n / ) . first
end
end
end
end
end
2012-04-11 10:45:18 +00:00
# HTML generation for the man pages
2010-07-27 18:13:10 +00:00
targets = ( [ 'en' ] + $languages [ :manpages ] ) . collect do | language |
dir = language == 'en' ? '' : " / #{ language } "
FileList [ " doc/man #{ dir } /*.xml " ] . collect { | name | " man2html: #{ language } : #{ File . basename ( name , '.xml' ) } " }
end . flatten
%w{ manpages-html man2html } . each_with_index do | task_name , idx |
desc " Create HTML files for the man pages " if 0 == idx
task task_name = > targets
end
namespace :man2html do
( [ 'en' ] + $languages [ :manpages ] ) . collect do | language |
namespace language do
2015-10-25 09:29:56 +00:00
dir = language == 'en' ? '' : " / #{ language } "
xml = FileList [ " doc/man #{ dir } /*.xml " ] . to_a
html = xml . map { | name | name . ext ( " .html " ) }
xml . each do | name |
2015-02-25 19:29:32 +00:00
file name . ext ( 'html' ) = > %w{ manpages translations:manpages } do
2016-03-26 11:34:52 +00:00
runq " saxon-he " , name , " java -classpath lib/saxon-he/saxon9he.jar net.sf.saxon.Transform -o: #{ name . ext ( 'html' ) } -xsl:doc/stylesheets/docbook-to-html.xsl #{ name } "
2010-07-27 18:13:10 +00:00
end
2015-02-25 19:29:32 +00:00
task File . basename ( name , '.xml' ) = > name . ext ( 'html' )
2010-07-27 18:13:10 +00:00
end
2015-10-25 09:29:56 +00:00
task :all = > html
2010-07-27 18:13:10 +00:00
end
end
end
2012-04-11 10:45:18 +00:00
# Developer helper tasks
namespace :dev do
if $build_mkvtoolnix_gui
desc " Update Qt resource files "
task " update-qt-resources " do
require 'rexml/document'
qrc = " src/mkvtoolnix-gui/qt_resources.qrc "
doc = REXML :: Document . new File . new ( qrc )
existing = Hash . new
doc . elements . to_a ( " /RCC/qresource/file " ) . each do | node |
if File . exists? " src/mkvtoolnix-gui/ #{ node . text } "
existing [ node . text ] = true
else
puts " Removing <file> for non-existing #{ node . text } "
node . remove
end
end
parent = doc . elements . to_a ( " /RCC/qresource " ) [ 0 ]
FileList [ " share/icons/*/*.png " ] . select { | file | ! existing [ " ../../ #{ file } " ] } . each do | file |
puts " Adding <file> for #{ file } "
node = REXML :: Element . new " file "
node . attributes [ " alias " ] = file . gsub ( / share \/ / , '' )
node . text = " ../../ #{ file } "
parent << node
end
formatter = REXML :: Formatters :: Pretty . new 1
formatter . compact = true
formatter . width = 9999999
formatter . write doc , File . open ( qrc , " w " )
end
2015-04-03 13:07:27 +00:00
desc " Update Qt project file "
task " update-qt-project " do
2015-06-06 10:09:50 +00:00
project_file = " src/mkvtoolnix-gui/mkvtoolnix-gui.pro "
2015-04-03 13:07:27 +00:00
content = [ ]
skipping = false
IO . readlines ( project_file ) . collect { | line | line . chomp } . each do | line |
content << line unless skipping
if / ^FORMS \ b / . match line
skipping = true
2015-06-06 10:09:50 +00:00
content << $gui_ui_files . collect { | ui | ui . gsub! ( / .*forms \/ / , 'forms/' ) ; " #{ ui } " } . sort . join ( " \\ \n " )
2015-04-03 13:07:27 +00:00
elsif skipping && / ^ \ s*$ / . match ( line )
skipping = false
content << line
end
end
File . open ( project_file , " w " ) do | file |
file . puts content . join ( " \n " )
end
end
2012-04-11 10:45:18 +00:00
end
2014-09-01 13:16:04 +00:00
desc " Create source code tarball from current version in .. "
task :tarball do
create_source_tarball
end
desc " Create source code tarball from current version in .. with git revision in name "
task " tarball-rev " do
revision = ` git rev-parse --short HEAD ` . chomp
create_source_tarball " - #{ revision } "
end
2012-04-11 10:45:18 +00:00
end
2010-07-27 07:25:02 +00:00
# Installation tasks
desc " Install all applications and support files "
2017-01-25 19:51:47 +00:00
targets = [ " install:programs " , " install:manpages " , " install:translations:programs " ]
targets += [ " install:translations:manpages " ] if c? ( :PO4A_WORKS )
targets += [ " install:shared " ] if c? ( :USE_QT )
2010-07-27 16:52:12 +00:00
task :install = > targets
namespace :install do
2010-08-01 18:04:47 +00:00
application_name_mapper = lambda do | name |
2015-08-15 16:27:44 +00:00
File . basename name
2010-08-01 18:04:47 +00:00
end
2010-07-27 16:52:12 +00:00
task :programs = > $applications do
install_dir :bindir
2010-08-01 18:04:47 +00:00
$applications . each { | application | install_program " #{ c ( :bindir ) } / #{ application_name_mapper [ application ] } " , application }
2010-07-27 16:52:12 +00:00
end
task :shared do
install_dir :desktopdir , :mimepackagesdir
install_data :mimepackagesdir , FileList [ " #{ $top_srcdir } /share/mime/*.xml " ]
2017-04-19 14:10:08 +00:00
if c? ( :USE_QT )
install_data :desktopdir , " #{ $top_srcdir } /share/desktop/org.bunkus.mkvinfo.desktop "
install_data :desktopdir , " #{ $top_srcdir } /share/desktop/org.bunkus.mkvtoolnix-gui.desktop "
end
2010-07-27 16:52:12 +00:00
2015-05-09 07:41:04 +00:00
wanted_apps = %w{ mkvmerge mkvtoolnix-gui mkvinfo mkvextract mkvpropedit } . collect { | e | " #{ e } .png " } . to_hash_by
2012-06-17 17:05:12 +00:00
wanted_dirs = %w{ 16x16 24x24 32x32 48x48 64x64 96x96 128x128 256x256 } . to_hash_by
2012-04-11 10:00:48 +00:00
dirs_to_install = FileList [ " #{ $top_srcdir } /share/icons/* " ] . select { | dir | wanted_dirs [ dir . gsub ( / .*icons \/ / , '' ) . gsub ( / \/ .* / , '' ) ] } . sort . uniq
dirs_to_install . each do | dir |
2012-05-27 13:30:27 +00:00
dest_dir = " #{ c ( :icondir ) } / #{ dir . gsub ( / .*icons \/ / , '' ) } /apps "
install_dir dest_dir
install_data " #{ dest_dir } / " , FileList [ " #{ dir } /* " ] . to_a . select { | file | wanted_apps [ file . gsub ( / .* \/ / , '' ) ] }
2010-07-27 16:52:12 +00:00
end
2017-04-05 11:28:25 +00:00
if c? ( :USE_QT )
sounds_dir = " #{ c ( :pkgdatadir ) } /sounds "
install_dir sounds_dir
install_data sounds_dir , FileList [ " #{ $top_srcdir } /share/sounds/* " ]
end
2010-07-27 16:52:12 +00:00
end
2010-08-01 18:04:47 +00:00
man_page_name_mapper = lambda do | name |
2015-08-15 16:27:44 +00:00
File . basename name
2010-08-01 18:04:47 +00:00
end
2010-07-27 16:52:12 +00:00
task :manpages = > $manpages do
install_dir :man1dir
2010-08-01 18:04:47 +00:00
$manpages . each { | manpage | install_data " #{ c ( :man1dir ) } / #{ man_page_name_mapper [ manpage ] } " , manpage }
2010-07-27 16:52:12 +00:00
end
namespace :translations do
2017-01-25 19:51:47 +00:00
task :programs = > $translations [ :programs ] do
2016-08-07 09:09:40 +00:00
install_dir $languages [ :programs ] . collect { | language | " #{ c ( :localedir ) } / #{ language } /LC_MESSAGES " }
$languages [ :programs ] . each do | language |
2010-07-27 16:52:12 +00:00
install_data " #{ c ( :localedir ) } / #{ language } /LC_MESSAGES/mkvtoolnix.mo " , " po/ #{ language } .mo "
end
end
2017-01-25 19:51:47 +00:00
if c? ( :PO4A_WORKS )
task :manpages = > $translations [ :manpages ] do
install_dir $languages [ :manpages ] . collect { | language | " #{ c ( :mandir ) } / #{ language } /man1 " }
$languages [ :manpages ] . each do | language |
$manpages . each { | manpage | install_data " #{ c ( :mandir ) } / #{ language } /man1/ #{ man_page_name_mapper [ manpage ] } " , manpage . sub ( / man \/ / , " man/ #{ language } / " ) }
end
2010-07-27 16:52:12 +00:00
end
end
end
end
2010-07-27 07:25:02 +00:00
2010-07-25 19:41:08 +00:00
# Cleaning tasks
2010-07-26 10:56:42 +00:00
desc " Remove all compiled files "
2010-07-25 19:41:08 +00:00
task :clean do
2016-03-28 09:32:00 +00:00
puts_action " clean "
2012-04-09 14:32:46 +00:00
patterns = %w{
2015-11-04 18:12:40 +00:00
** / * . a
** / * . autosave
** / * . deps
** / * . dll
** / * . exe
** / * . exe
** / * . mo
** / * . moc
** / * . moco
** / * . o
** / * . pot
** / * . qm
2017-01-25 19:51:47 +00:00
doc / man / * . 1
2015-11-04 18:12:40 +00:00
doc / man / * . html
2017-01-25 19:51:47 +00:00
doc / man / * / * . 1
2015-11-04 18:12:40 +00:00
doc / man / * / * . html
doc / man / * / * . xml
2016-05-04 18:00:26 +00:00
src / * / qt_resources . cpp
2015-11-04 18:12:40 +00:00
src / info / ui / * . h
src / mkvtoolnix - gui / forms / ** / * . h
2017-11-16 14:15:29 +00:00
src / benchmark / benchmark
2015-11-04 18:12:40 +00:00
tests / unit / all
tests / unit / merge / merge
tests / unit / propedit / propedit
2012-04-09 14:32:46 +00:00
}
patterns += $applications + $tools . collect { | name | " src/tools/ #{ name } " }
2016-03-22 09:20:12 +00:00
patterns += PCH . clean_patterns
2012-04-09 14:32:46 +00:00
2016-03-22 09:20:12 +00:00
remove_files_by_patterns patterns
2012-04-09 14:32:46 +00:00
if Dir . exists? $dependency_dir
2016-03-28 09:32:00 +00:00
puts_vaction " rm -rf " , " #{ $dependency_dir } "
2012-04-09 14:32:46 +00:00
FileUtils . rm_rf $dependency_dir
end
2010-07-25 19:41:08 +00:00
end
2010-07-27 07:25:02 +00:00
namespace :clean do
desc " Remove all compiled and generated files ('tarball' clean) "
task :dist = > :clean do
2017-03-09 20:51:06 +00:00
run " rm -f config.h config.log config.cache build-config TAGS src/info/static_plugins.cpp src/mkvtoolnix-gui/static_plugins.cpp " , :allow_failure = > true
2010-07-25 19:41:08 +00:00
end
2010-07-27 07:25:02 +00:00
desc " Remove all compiled and generated files ('git' clean) "
task :maintainer = > " clean:dist " do
run " rm -f configure config.h.in " , :allow_failure = > true
end
2010-07-25 19:41:08 +00:00
2013-07-04 19:04:29 +00:00
desc " Remove compiled objects and programs in the unit test suite "
task :unittests do
patterns = %w{ tests/unit/*.o tests/unit/*/*.o tests/unit/*.a tests/unit/*/*.a }
patterns += $gtest_apps . collect { | app | " tests/unit/ #{ app } / #{ app } " }
2016-03-22 09:20:12 +00:00
remove_files_by_patterns patterns
2013-07-04 19:04:29 +00:00
end
2010-07-25 19:41:08 +00:00
end
2012-08-02 09:26:54 +00:00
# Tests
desc " Run all tests "
task :tests = > [ 'tests:products' ]
namespace :tests do
2016-06-04 08:49:38 +00:00
desc " Run product tests from 'tests' sub-directory (requires data files to be present) "
2012-08-02 09:26:54 +00:00
task :products do
run " cd tests && ./run.rb "
end
2017-07-15 09:57:45 +00:00
desc " Run built-in tests on source code files "
task :source do
Mtx :: SourceTests . test_include_guards
end
2012-08-02 09:26:54 +00:00
end
2010-07-25 19:41:08 +00:00
#
# avilib-0.6.10
# librmff
# spyder's MPEG parser
# src/common
# src/input
# src/output
#
2015-08-15 16:27:44 +00:00
[ { :name = > 'avi' , :dir = > 'lib/avilib-0.6.10' } ,
{ :name = > 'rmff' , :dir = > 'lib/librmff' } ,
{ :name = > 'pugixml' , :dir = > 'lib/pugixml/src' } ,
{ :name = > 'mpegparser' , :dir = > 'src/mpegparser' } ,
2015-04-10 19:08:43 +00:00
{ :name = > 'mtxcommon' , :dir = > [ 'src/common' ] + FileList [ 'src/common/*' ] . select { | e | FileTest . directory? e } } ,
2015-08-15 16:27:44 +00:00
{ :name = > 'mtxinput' , :dir = > 'src/input' } ,
{ :name = > 'mtxoutput' , :dir = > 'src/output' } ,
{ :name = > 'mtxmerge' , :dir = > 'src/merge' , :except = > [ 'mkvmerge.cpp' ] , } ,
2017-12-22 09:52:12 +00:00
{ :name = > 'mtxinfo' , :dir = > 'src/info' , :except = > %w{ qt_ui.cpp qt_kax_info.cpp mkvinfo.cpp mkvinfo-gui.cpp static_plugins.cpp } , } ,
2015-08-15 16:27:44 +00:00
{ :name = > 'mtxextract' , :dir = > 'src/extract' , :except = > [ 'mkvextract.cpp' ] , } ,
{ :name = > 'mtxpropedit' , :dir = > 'src/propedit' , :except = > [ 'mkvpropedit.cpp' ] , } ,
{ :name = > 'ebml' , :dir = > 'lib/libebml/src' } ,
{ :name = > 'matroska' , :dir = > 'lib/libmatroska/src' } ,
2010-07-25 19:41:08 +00:00
] . each do | lib |
Library .
new ( " #{ [ lib [ :dir ] ] . flatten . first } /lib #{ lib [ :name ] } " ) .
2012-08-13 19:20:50 +00:00
sources ( [ lib [ :dir ] ] . flatten , :type = > :dir , :except = > lib [ :except ] ) .
2010-07-25 19:41:08 +00:00
build_dll ( lib [ :name ] == 'mtxcommon' ) .
2013-03-03 19:59:49 +00:00
libraries ( :iconv , :z , :matroska , :ebml , :rpcrt4 ) .
2010-07-25 19:41:08 +00:00
create
end
2012-03-17 00:07:45 +00:00
# libraries required for all programs via mtxcommon
2012-08-07 20:48:28 +00:00
$common_libs = [
2012-03-17 00:07:45 +00:00
:mtxcommon ,
:magic ,
:matroska ,
:ebml ,
:z ,
2012-03-17 00:10:46 +00:00
:pugixml ,
2012-03-17 00:07:45 +00:00
:intl ,
2016-12-18 13:06:00 +00:00
:iconv ,
2012-03-17 00:07:45 +00:00
:boost_regex ,
:boost_filesystem ,
:boost_system ,
]
2015-02-18 10:44:45 +00:00
# custom libraries
$custom_libs = [
:static ,
]
2010-07-25 19:41:08 +00:00
#
# mkvmerge
#
Application . new ( " src/mkvmerge " ) .
2010-07-26 10:56:42 +00:00
description ( " Build the mkvmerge executable " ) .
2010-07-25 19:41:08 +00:00
aliases ( :mkvmerge ) .
2012-08-13 19:20:50 +00:00
sources ( " src/merge/mkvmerge.cpp " ) .
2017-04-02 19:56:30 +00:00
sources ( " src/merge/resources.o " , :if = > $building_for [ :windows ] ) .
2015-02-18 10:44:45 +00:00
libraries ( :mtxmerge , :mtxinput , :mtxoutput , :mtxmerge , $common_libs , :avi , :rmff , :mpegparser , :flac , :vorbis , :ogg , $custom_libs ) .
2010-07-25 19:41:08 +00:00
create
#
# mkvinfo
#
2016-06-29 10:57:57 +00:00
$mkvinfo_ui_files = FileList [ " src/info/ui/*.ui " ] . to_a
$mkvinfo_ui_h_files = $mkvinfo_ui_files . collect { | file | file . ext ( 'h' ) }
%w{ qt_ui.o qt_ui.moc } . each do | name |
file " src/info/ #{ name } " = > $mkvinfo_ui_h_files
end
2010-07-25 19:41:08 +00:00
Application . new ( " src/mkvinfo " ) .
2010-07-26 10:56:42 +00:00
description ( " Build the mkvinfo executable " ) .
2010-07-25 19:41:08 +00:00
aliases ( :mkvinfo ) .
2012-08-13 19:20:50 +00:00
sources ( " src/info/mkvinfo.cpp " ) .
2017-04-02 19:56:30 +00:00
sources ( " src/info/resources.o " , :if = > $building_for [ :windows ] ) .
2012-08-13 19:20:50 +00:00
libraries ( :mtxinfo , $common_libs ) .
2010-07-25 19:41:08 +00:00
only_if ( c? ( :USE_QT ) ) .
2017-04-02 19:56:30 +00:00
sources ( " src/info/sys_windows.o " , :if = > $building_for [ :windows ] ) .
2017-12-22 09:52:12 +00:00
sources ( " src/info/qt_ui.cpp " , " src/info/qt_ui.moc " , " src/info/qt_kax_info.cpp " , " src/info/qt_kax_info.moc " , " src/info/rightclick_tree_widget.moc " , $mkvinfo_ui_files ) .
2016-05-04 18:00:26 +00:00
sources ( 'src/info/qt_resources.cpp' ) .
2017-03-09 20:51:06 +00:00
sources ( 'src/info/static_plugins.cpp' , :if = > File . exist? ( 'src/info/static_plugins.cpp' ) ) .
2010-07-25 19:41:08 +00:00
libraries ( :qt ) .
2011-11-23 16:58:55 +00:00
end_if .
2015-02-18 10:44:45 +00:00
libraries ( $custom_libs ) .
2010-07-25 19:41:08 +00:00
create
2016-05-05 14:06:06 +00:00
if $build_mkvinfo_gui
Application . new ( " src/mkvinfo-gui " ) .
description ( " Build the mkvinfo-gui executable " ) .
aliases ( " mkvinfo-gui " ) .
sources ( " src/info/mkvinfo-gui.cpp " ) .
2017-04-02 19:56:30 +00:00
sources ( " src/info/resources.o " , :if = > $building_for [ :windows ] ) .
2017-03-09 20:51:06 +00:00
sources ( 'src/info/static_plugins.cpp' , :if = > File . exist? ( 'src/info/static_plugins.cpp' ) ) .
2016-05-05 14:06:06 +00:00
libraries ( :qt , $custom_libs ) .
2017-04-02 19:56:30 +00:00
libraries ( " -mwindows " , :if = > $building_for [ :windows ] ) .
2016-05-05 14:06:06 +00:00
create
end
2010-07-25 19:41:08 +00:00
#
# mkvextract
#
Application . new ( " src/mkvextract " ) .
2011-03-23 11:08:30 +00:00
description ( " Build the mkvextract executable " ) .
2010-07-25 19:41:08 +00:00
aliases ( :mkvextract ) .
2012-08-13 19:20:50 +00:00
sources ( " src/extract/mkvextract.cpp " ) .
2017-04-02 19:56:30 +00:00
sources ( " src/extract/resources.o " , :if = > $building_for [ :windows ] ) .
2015-02-18 10:44:45 +00:00
libraries ( :mtxextract , $common_libs , :avi , :rmff , :vorbis , :ogg , $custom_libs ) .
2010-07-25 19:41:08 +00:00
create
#
# mkvpropedit
#
Application . new ( " src/mkvpropedit " ) .
2010-07-26 10:56:42 +00:00
description ( " Build the mkvpropedit executable " ) .
2010-07-25 19:41:08 +00:00
aliases ( :mkvpropedit ) .
2012-08-13 19:20:50 +00:00
sources ( " src/propedit/propedit.cpp " ) .
2017-04-02 19:56:30 +00:00
sources ( " src/propedit/resources.o " , :if = > $building_for [ :windows ] ) .
2015-02-18 10:44:45 +00:00
libraries ( :mtxpropedit , $common_libs , $custom_libs ) .
2010-07-25 19:41:08 +00:00
create
2012-04-09 15:48:38 +00:00
#
2012-04-10 20:34:58 +00:00
# mkvtoolnix-gui
2012-04-09 15:48:38 +00:00
#
2012-04-10 20:34:58 +00:00
if $build_mkvtoolnix_gui
2015-04-03 13:07:27 +00:00
ui_h_files = $gui_ui_files . collect { | ui | ui . ext 'h' }
2017-04-02 19:56:30 +00:00
cpp_files = FileList [ 'src/mkvtoolnix-gui/**/*.cpp' ] . to_a . for_target!
h_files = FileList [ 'src/mkvtoolnix-gui/**/*.h' ] . to_a . for_target! - ui_h_files
2014-01-22 11:11:14 +00:00
cpp_content = read_files cpp_files
h_content = read_files h_files
qobject_h_files = h_files . select { | h | h_content [ h ] . any? { | line | / \ bQ_OBJECT \ b / . match line } }
2016-01-15 21:17:00 +00:00
form_include_re = %r{ ^ \ s* \ # \ s* include \ s+ \ " (mkvtoolnix-gui/forms/[^ \ "]+) }x
dependencies = { }
2012-04-09 15:48:38 +00:00
2014-01-22 11:11:14 +00:00
cpp_files . each do | cpp |
2016-01-15 21:17:00 +00:00
cpp_content [ cpp ] . each do | line |
next unless form_include_re . match line
dependencies [ cpp ] || = [ ]
dependencies [ cpp ] << " src/ #{ $1 } "
end
2012-04-25 18:16:03 +00:00
end
2016-01-15 21:17:00 +00:00
dependencies . each { | cpp , ui_hs | file cpp . ext ( 'o' ) = > ui_hs }
2012-04-10 20:34:58 +00:00
Application . new ( " src/mkvtoolnix-gui/mkvtoolnix-gui " ) .
description ( " Build the mkvtoolnix-gui executable " ) .
aliases ( " mkvtoolnix-gui " ) .
2014-01-22 11:11:14 +00:00
sources ( qobject_h_files . collect { | h | h . ext 'moc' } ) .
2015-04-03 13:07:27 +00:00
sources ( cpp_files , $gui_ui_files , 'src/mkvtoolnix-gui/qt_resources.cpp' ) .
2017-04-02 19:56:30 +00:00
sources ( " src/mkvtoolnix-gui/resources.o " , :if = > $building_for [ :windows ] ) .
2012-08-07 20:48:28 +00:00
libraries ( $common_libs , :qt ) .
2017-04-02 19:56:30 +00:00
libraries ( " -mwindows " , :powrprof , :if = > $building_for [ :windows ] ) .
2015-02-18 10:44:45 +00:00
libraries ( $custom_libs ) .
2012-04-09 15:48:38 +00:00
create
end
2017-11-16 14:15:29 +00:00
#
# benchmark
#
if c? ( :GOOGLE_BENCHMARK ) && ! $benchmark_sources . empty?
Application . new ( " src/benchmark/benchmark " ) .
description ( " Build the benchmark executable " ) .
aliases ( :benchmark , :bench ) .
sources ( $benchmark_sources ) .
2017-11-21 11:20:20 +00:00
libraries ( $common_libs , :benchmark , :qt ) .
2017-11-16 14:15:29 +00:00
create
end
2010-07-27 19:49:51 +00:00
#
# Applications in src/tools
#
2014-07-15 18:16:14 +00:00
namespace :apps do
task :tools = > $tools . collect { | name | " apps:tools: #{ name } " }
end
2010-07-27 19:49:51 +00:00
2014-07-15 18:16:14 +00:00
#
# tools: ac3parser
#
Application . new ( " src/tools/ac3parser " ) .
description ( " Build the ac3parser executable " ) .
aliases ( " tools:ac3parser " ) .
sources ( " src/tools/ac3parser.cpp " ) .
libraries ( $common_libs ) .
create
2012-02-25 18:23:02 +00:00
2014-07-15 18:16:14 +00:00
#
# tools: base64tool
#
Application . new ( " src/tools/base64tool " ) .
description ( " Build the base64tool executable " ) .
aliases ( " tools:base64tool " ) .
sources ( " src/tools/base64tool.cpp " ) .
libraries ( $common_libs ) .
create
2010-07-27 19:49:51 +00:00
2015-01-03 13:18:12 +00:00
#
# tools: checksum
#
Application . new ( " src/tools/checksum " ) .
description ( " Build the checksum executable " ) .
aliases ( " tools:checksum " ) .
sources ( " src/tools/checksum.cpp " ) .
libraries ( $common_libs ) .
create
2014-07-15 18:16:14 +00:00
#
# tools: diracparser
#
Application . new ( " src/tools/diracparser " ) .
description ( " Build the diracparser executable " ) .
aliases ( " tools:diracparser " ) .
sources ( " src/tools/diracparser.cpp " ) .
libraries ( $common_libs ) .
create
2010-07-27 19:49:51 +00:00
2014-07-15 18:16:14 +00:00
#
# tools: ebml_validator
#
Application . new ( " src/tools/ebml_validator " ) .
description ( " Build the ebml_validator executable " ) .
aliases ( " tools:ebml_validator " ) .
sources ( " src/tools/ebml_validator.cpp " , " src/tools/element_info.cpp " ) .
libraries ( $common_libs ) .
create
2010-07-27 19:49:51 +00:00
2015-03-27 09:05:00 +00:00
#
# tools: hevc_dump
#
Application . new ( " src/tools/hevc_dump " ) .
description ( " Build the hevc_dump executable " ) .
aliases ( " tools:hevc_dump " ) .
sources ( " src/tools/hevc_dump.cpp " ) .
libraries ( $common_libs ) .
create
2017-03-19 17:44:00 +00:00
#
# tools: hevcs_dump
#
Application . new ( " src/tools/hevcc_dump " ) .
description ( " Build the hevcc_dump executable " ) .
aliases ( " tools:hevcc_dump " ) .
sources ( " src/tools/hevcc_dump.cpp " ) .
libraries ( $common_libs ) .
create
2014-07-15 18:16:14 +00:00
#
# tools: mpls_dump
#
Application . new ( " src/tools/mpls_dump " ) .
description ( " Build the mpls_dump executable " ) .
aliases ( " tools:mpls_dump " ) .
sources ( " src/tools/mpls_dump.cpp " ) .
libraries ( $common_libs ) .
create
2014-02-04 19:14:07 +00:00
2014-07-15 18:16:14 +00:00
#
# tools: vc1parser
#
Application . new ( " src/tools/vc1parser " ) .
description ( " Build the vc1parser executable " ) .
aliases ( " tools:vc1parser " ) .
sources ( " src/tools/vc1parser.cpp " ) .
libraries ( $common_libs ) .
create
2012-04-25 21:47:51 +00:00
2016-03-22 09:20:12 +00:00
# Engage pch system
PCH . engage ( & cxx_compiler )
2012-08-07 20:48:28 +00:00
$build_system_modules . values . each { | bsm | bsm [ :define_tasks ] . call if bsm [ :define_tasks ] }
2012-04-25 21:47:51 +00:00
# Local Variables:
# mode: ruby
# End: