csd 0.1.9 → 0.1.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. data/.gitignore +5 -1
  2. data/Rakefile +7 -7
  3. data/VERSION +1 -1
  4. data/bin/ai +1 -1
  5. data/csd.gemspec +21 -9
  6. data/lib/csd.rb +15 -8
  7. data/lib/csd/application/decklink.rb +27 -0
  8. data/lib/csd/application/decklink/about.yml +7 -0
  9. data/lib/csd/application/decklink/base.rb +62 -0
  10. data/lib/csd/application/default.rb +5 -1
  11. data/lib/csd/application/default/base.rb +10 -0
  12. data/lib/csd/application/minisip.rb +8 -5
  13. data/lib/csd/application/minisip/about.yml +1 -1
  14. data/lib/csd/application/minisip/base.rb +29 -90
  15. data/lib/csd/application/minisip/component.rb +8 -0
  16. data/lib/csd/application/minisip/component/core.rb +288 -0
  17. data/lib/csd/application/minisip/component/ffmpeg.rb +78 -0
  18. data/lib/csd/application/minisip/component/gnome.rb +48 -0
  19. data/lib/csd/application/minisip/component/hdviper.rb +49 -0
  20. data/lib/csd/application/minisip/component/plugins.rb +53 -0
  21. data/lib/csd/application/minisip/component/x264.rb +42 -0
  22. data/lib/csd/application/minisip/error.rb +11 -5
  23. data/lib/csd/application/minisip/options/common.rb +4 -4
  24. data/lib/csd/application/minisip/options/compile.rb +10 -16
  25. data/lib/csd/application/minisip/unix.rb +19 -159
  26. data/lib/csd/application/minisip/unix/darwin.rb +1 -11
  27. data/lib/csd/application/minisip/unix/linux.rb +1 -1
  28. data/lib/csd/application/minisip/unix/linux/debian.rb +6 -14
  29. data/lib/csd/application/minisip/unix/linux/debian/ubuntu10.rb +6 -4
  30. data/lib/csd/applications.rb +16 -21
  31. data/lib/csd/commands.rb +34 -7
  32. data/lib/csd/error.rb +27 -11
  33. data/lib/csd/extensions/core/kernel.rb +9 -19
  34. data/lib/csd/extensions/core/object.rb +1 -0
  35. data/lib/csd/extensions/core/string.rb +1 -1
  36. data/lib/csd/extensions/gem/platform.rb +9 -3
  37. data/lib/csd/options_parser.rb +3 -3
  38. data/lib/csd/user_interface/base.rb +8 -5
  39. data/lib/csd/user_interface/cli.rb +9 -1
  40. data/lib/csd/user_interface/silent.rb +7 -4
  41. data/lib/csd/vendor/zentest/zentest_assertions.rb +39 -35
  42. data/test/application/test_minisip.rb +65 -26
  43. data/test/functional/test_applications.rb +4 -4
  44. data/test/functional/test_commands.rb +26 -2
  45. data/test/helper.rb +9 -5
  46. data/test/unit/test_pathname.rb +1 -1
  47. data/test/unit/test_platform.rb +30 -0
  48. metadata +18 -6
@@ -0,0 +1,8 @@
1
+ # -*- encoding: UTF-8 -*-
2
+ require 'csd/application/minisip/component/core'
3
+ require 'csd/application/minisip/component/ffmpeg'
4
+ require 'csd/application/minisip/component/gnome'
5
+ require 'csd/application/minisip/component/hdviper'
6
+ require 'csd/application/minisip/component/plugins'
7
+ require 'csd/application/minisip/component/x264'
8
+
@@ -0,0 +1,288 @@
1
+ # -*- encoding: UTF-8 -*-
2
+
3
+ module CSD
4
+ module Application
5
+ module Minisip
6
+ # This namespace is reserved for sub-components of this application. This is done for better readability and modularity
7
+ # (i.e. less risky to fail in production).
8
+ #
9
+ module Component
10
+ # This MiniSIP component is the very minisip source code itself.
11
+ #
12
+ module Core
13
+
14
+ # This is an +Array+ containing the names of the internal MiniSIP libraries. Note that they
15
+ # are sorted according to the sequence in which they need to be compiled (because they depend on each other).
16
+ #
17
+ LIBRARIES = %w{ libmutil libmnetutil libmcrypto libmikey libmsip libmstun libminisip minisip }
18
+
19
+ class << self
20
+
21
+ # This method processes the MiniSIP Core component and does everything needed for compiling it. Note that
22
+ # it is not responsible for checking depenencies here. It will just focus on compiling the internal MiniSIP libraries.
23
+ #
24
+ def compile
25
+ UI.debug "#{self}.compile was called"
26
+ ffmpeg_available = Cmd.run('ffmpeg -h', :internal => true, :die_on_failure => false).success?
27
+ if ffmpeg_available and Options.configure and !Options.reveal and libraries.include?('libminisip')
28
+ if Gem::Platform.local.debian?
29
+ # Note that FFmpeg must have been installed via apt-get or via the AI in order for this to work!
30
+ UI.info "Removing FFmpeg before re-compiling MiniSIP".green.bold
31
+ Cmd.run "sudo apt-get remove ffmpeg --yes", :announce_pwd => false
32
+ else
33
+ # On other linux distributions we don't know how to remove ffmpeg
34
+ raise Error::Minisip::Core::FFmpegInstalled, "Please remove ffmpeg from your system first, or run the #{CSD.executable} with --no-configure"
35
+ end
36
+ end
37
+ if Path.repository.directory? and !Options.reveal
38
+ UI.warn "The MiniSIP source code will not be downloaded, because the directory #{Path.repository.enquote} already exists."
39
+ else
40
+ checkout
41
+ modify_source_code
42
+ end
43
+ modify_dirlist
44
+ # We would like to re-compile MiniSIP no matter what options were given as command-line arguments.
45
+ compile_libraries
46
+ link_libraries
47
+ end
48
+
49
+ # This method provides upfront information to the user about how the MiniSIP Core component will be processed.
50
+ #
51
+ def introduction
52
+ UI.info " MiniSIP".green.bold
53
+ # If the repository directory already exists, we indicate that here
54
+ download_text = Path.repository.directory? ? " - located at: " : " - downloading to: "
55
+ UI.info download_text.green + Path.repository.to_s.yellow
56
+ # Now let's present which libraries will be compiled with which commands
57
+ UI.info " - libraries to process: ".green + libraries.join(', ').yellow
58
+ UI.info " - with these commands: ".green + [('bootstrap' if Options.bootstrap), ('configure' if Options.configure), ('make' if Options.make), ('make install' if Options.make_install)].compact.join(', ').yellow
59
+ end
60
+
61
+ # Determines which libraries of MiniSIP should be processed, because the --only parameter might be set
62
+ # by the user, requesting for only a subset of the libraries.
63
+ #
64
+ def libraries
65
+ Options.only ? LIBRARIES.map { |lib| lib if Options.only.to_a.include?(lib) }.compact : LIBRARIES
66
+ end
67
+
68
+ # This method downloads the minisip source code in the right version. If the <tt>Options.branch</tt>
69
+ # parameter is set to a branchname of the source code repository, that branch will be downloaded. Currently
70
+ # this function uses the intermediary Github repository to make sure that
71
+ # * the downloaded version is not a risky cutting-edge trunk
72
+ # * the download works even if the vendor's repository is down (again)
73
+ # That means that the Github repository (or any other intermediary repository) should be manually updated
74
+ # by an TTA AI developer, after having made sure that that source code version is working properly.
75
+ #
76
+ def checkout
77
+ Cmd.git_clone 'MiniSIP repository', 'http://github.com/csd/minisip.git', Path.repository
78
+ if Options.branch
79
+ Cmd.cd Path.repository, :internal => true
80
+ Cmd.run "git pull origin #{Options.branch}"
81
+ end
82
+ end
83
+
84
+ # Some places in the MiniSIP source code have to be modified before it can be compiled.
85
+ # In this case, an absolute path must be replaced with the current absolute prefix path.
86
+ # Furthermore, modifications of some constants will be done, because this is more compatible
87
+ # with the most recent FFmpeg version. In fact, MiniSIP won't compile if FFmpeg is present
88
+ # and this has not been modified.
89
+ # See http://www.howgeek.com/2010/03/01/ffmpeg-php-error-‘pix_fmt_rgba32’-undeclared-first-use-in-this-function
90
+ # and http://ffmpeg.org/doxygen/0.5/pixfmt_8h.html#33d341c4f443d24492a95fb7641d0986 for more information.
91
+ #
92
+ def modify_source_code
93
+ UI.info "Fixing MiniSIP OpenGL GUI source code".green.bold
94
+ Cmd.replace(Path.repository_open_gl_display, '/home/erik', Path.build)
95
+ if Options.ffmpeg_first
96
+ Cmd.replace(Path.repository_avcoder_cxx, 'PIX_FMT_RGBA32', 'PIX_FMT_RGB32')
97
+ Cmd.replace(Path.repository_avdecoder_cxx, 'PIX_FMT_RGBA32', 'PIX_FMT_RGB32')
98
+ end
99
+ end
100
+
101
+ # Usually, Ubuntu ignores <tt>/usr/local/share/aclocal</tt>. So we need to create a file called
102
+ # +dirlist+ in <tt>/usr/share/aclocal</tt> which contains the path to the other directory.
103
+ #
104
+ def modify_dirlist
105
+ Path.dirlist = Pathname.new File.join('/', 'usr', 'share', 'aclocal', 'dirlist')
106
+ if !Path.dirlist.file? and Gem::Platform.local.debian?
107
+ UI.info "Fixing broken Debian aclocal path".green.bold
108
+ Path.new_dirlist = Pathname.new File.join(Dir.mktmpdir, 'dirlist')
109
+ Cmd.touch_and_replace_content Path.new_dirlist, '/usr/local/share/aclocal'
110
+ Cmd.run "sudo mv #{Path.new_dirlist} #{Path.dirlist}", :announce_pwd => false
111
+ end
112
+ end
113
+
114
+ def link_libraries
115
+ UI.info "Linking shared MiniSIP libraries"
116
+ Cmd.run "sudo ldconfig #{Path.build_lib_libminisip_so}", :announce_pwd => false
117
+ end
118
+
119
+ def libminisip_cpp_flags
120
+ if Options.ffmpeg_first
121
+ %{CPPFLAGS="-I#{Path.hdviper_x264} -I#{Path.hdviper_x264_test_x264api} -I#{Path.ffmpeg_libavutil} -I#{Path.ffmpeg_libavcodec} -I#{Path.ffmpeg_libswscale} -I#{Path.repository_grabber} -I#{Path.repository_decklinksdk}"}
122
+ else
123
+ %{CPPFLAGS="-I#{Path.hdviper_x264} -I#{Path.hdviper_x264_test_x264api} -I#{Path.repository_grabber} -I#{Path.repository_decklinksdk}"}
124
+ end
125
+ end
126
+
127
+ def libminisip_ld_flags
128
+ %{LDFLAGS="#{Path.hdviper_libx264api} #{Path.hdviper_libtidx264} -lpthread -lrt"}
129
+ end
130
+
131
+ # Iteratively processes the internal MiniSIP libraries (+bootstrap+, +configure+, +make+, +make install+).
132
+ #
133
+ def compile_libraries
134
+ create_build_dir
135
+ libraries.each do |library|
136
+ directory = Pathname.new(File.join(Path.repository, library))
137
+ if Cmd.cd(directory, :internal => true).success? or Options.reveal
138
+ UI.info "Processing MiniSIP -> #{library}".green.bold
139
+ bootstrap
140
+ configure library
141
+ make
142
+ make_install
143
+ else
144
+ UI.warn "Skipping MiniSIP library #{library} because it could not be found in #{directory.enquote}"
145
+ end
146
+ end
147
+ end
148
+
149
+ # Creates all build directories such as +lib+, +share+, +bin+, etc.
150
+ #
151
+ def create_build_dir
152
+ # In sudo mode, we don't need to create these. They already exist in the OS.
153
+ return unless Options.this_user
154
+ UI.info "Creating target build directories".green.bold
155
+ [Path.build, Path.build_include, Path.build_lib, Path.build_share, Path.build_share_aclocal].each { |target| Cmd.mkdir target }
156
+ end
157
+
158
+ # This method runs the `bootstrap´ command in the current directory unless --no-bootstrap was given.
159
+ # It is only used for the internal MiniSIP libraries.
160
+ #
161
+ def bootstrap
162
+ bootstrap! if Options.bootstrap
163
+ end
164
+
165
+ # This method forces running the `bootstrap´ command in the current directory.
166
+ # It is only used for the internal MiniSIP libraries.
167
+ #
168
+ def bootstrap!
169
+ if Options.this_user
170
+ Cmd.run(%Q{./bootstrap -I "#{Path.build_share_aclocal}"})
171
+ else
172
+ Cmd.run("./bootstrap")
173
+ end
174
+ end
175
+
176
+ def configure(name='')
177
+ configure! name if Options.configure
178
+ end
179
+
180
+ def configure!(name='')
181
+ individual_options = case name
182
+ when 'libminisip'
183
+ %Q{--enable-debug --enable-video --enable-opengl --disable-mil --enable-decklink --disable-sdl #{libminisip_cpp_flags} #{libminisip_ld_flags}}
184
+ when 'minisip'
185
+ %Q{--enable-debug --enable-video --enable-opengl --enable-textui}
186
+ else
187
+ ''
188
+ end
189
+ common_options = Options.this_user ? %Q{--prefix="#{Path.build}" PKG_CONFIG_PATH="#{Path.build_lib_pkg_config}" ACLOCAL_FLAGS="#{Path.build_share_aclocal}" LD_LIBRARY_PATH="#{Path.build_lib}"} : ''
190
+ Cmd.run ['./configure', common_options, individual_options].join(' ')
191
+ end
192
+
193
+ def make
194
+ make! if Options.make
195
+ end
196
+
197
+ def make!
198
+ Cmd.run("make")
199
+ end
200
+
201
+ def make_install
202
+ make_install! if Options.make_install
203
+ end
204
+
205
+ def make_install!
206
+ if Options.this_user
207
+ Cmd.run("make install")
208
+ else
209
+ Cmd.run("sudo make install")
210
+ end
211
+ end
212
+
213
+ # Execute the MiniSIP GTK GUI.
214
+ #
215
+ def run_gtkgui
216
+ UI.info "Executing MiniSIP".green.bold
217
+ if Options.this_user
218
+ Cmd.run(Path.build_gtkgui, :die_on_failure => false, :announce_pwd => false)
219
+ else
220
+ Cmd.run('minisip_gtkgui')
221
+ end
222
+ end
223
+
224
+ def modify_libminisip_rules
225
+ if Path.repository_libminisip_rules_backup.file?
226
+ UI.warn "The libminisip rules seem to be fixed already, I won't touch them now. Delete #{Path.repository_libminisip_rules_backup.enquote} to enforce it."
227
+ else
228
+ Cmd.copy Path.repository_libminisip_rules, Path.repository_libminisip_rules_backup
229
+ Cmd.replace Path.repository_libminisip_rules, 'AUTOMATED_INSTALLER_PLACEHOLDER=""', [libminisip_cpp_flags, libminisip_ld_flags].join(' ')
230
+ end
231
+ end
232
+
233
+ # Iteratively makes debian packages of the internal MiniSIP libraries.
234
+ # TODO: Refactor this, it looks terribly sensitive.
235
+ # TODO: Check for GPL and LGLP license conflicts.
236
+ #
237
+ def package!
238
+ Cmd.mkdir(Path.packaging)
239
+ libraries.each do |library|
240
+ directory = Pathname.new(File.join(Path.repository, library))
241
+ next if Options.only and !Options.only.include?(library)
242
+ UI.info "Making #{library} with target dist".green.bold
243
+ if Cmd.cd(directory) or Options.reveal
244
+ Cmd.run("make dist")
245
+
246
+ tar_filename = File.basename(Dir[File.join(directory, '*.tar.gz')].first)
247
+ Cmd.move(File.join(directory, tar_filename.to_s), Path.packaging) if tar_filename or Options.reveal
248
+
249
+ if Cmd.cd(Path.packaging) or Options.reveal
250
+ Cmd.run("tar -xzf #{tar_filename}")
251
+ tar_dirname = File.basename(tar_filename.to_s, '.tar.gz')
252
+ if Cmd.cd(File.join(Path.packaging, tar_dirname))
253
+ Cmd.run("dpkg-buildpackage -rfakeroot")
254
+ if library == 'minisip'
255
+ if Cmd.cd(Path.packaging)
256
+ package = File.basename(Dir[File.join(Path.packaging, "#{library}*.deb")].first)
257
+ Cmd.run("sudo dpkg -i #{package}") if package or Options.reveal
258
+ end
259
+ else
260
+ if Cmd.cd(Path.packaging)
261
+ package = File.basename(Dir[File.join(Path.packaging, "#{library}0*.deb")].first)
262
+ Cmd.run("sudo dpkg -i #{package}") if package or Options.reveal
263
+ dev_package = File.basename(Dir[File.join(Path.packaging, "#{library}-dev*.deb")].first)
264
+ Cmd.run("sudo dpkg -i #{dev_package}") if dev_package or Options.reveal
265
+ end
266
+ end
267
+ else
268
+ UI.error "Could not enter #{File.join(Path.packaging, tar_dirname)}."
269
+ end
270
+
271
+ else
272
+ UI.error "Could not enter #{Path.packaging}."
273
+ end
274
+
275
+ else
276
+ UI.error "Could not enter #{directory}."
277
+ end
278
+ end
279
+ Cmd.cd '/'
280
+ Cmd.run('minisip_gtkgui')
281
+ end
282
+
283
+ end
284
+ end
285
+ end
286
+ end
287
+ end
288
+ end
@@ -0,0 +1,78 @@
1
+ # -*- encoding: UTF-8 -*-
2
+
3
+ module CSD
4
+ module Application
5
+ module Minisip
6
+ module Component
7
+ module FFmpeg
8
+ class << self
9
+
10
+ def compile
11
+ UI.debug "#{self}.compile was called"
12
+ if Path.ffmpeg_repository.directory? and !Options.reveal
13
+ UI.warn "FFmpeg will not be processed because the directory #{Path.ffmpeg_repository.enquote} already exists."
14
+ else
15
+ checkout
16
+ modify_libavutil if Options.ffmpeg_first
17
+ make
18
+ end
19
+ end
20
+
21
+ def introduction
22
+ if Path.ffmpeg_repository.directory?
23
+ UI.debug "There is no FFmpeg introduction, because the directory already exists: #{Path.ffmpeg_repository.enquote}"
24
+ else
25
+ UI.info " FFmpeg (incl. libswscale)".green.bold
26
+ UI.info " - downloading to: ".green + Path.ffmpeg_repository.to_s.yellow
27
+ UI.info " - compiling".green
28
+ end
29
+ end
30
+
31
+ def checkout
32
+ Cmd.git_clone('ffmpeg repository', 'http://github.com/csd/ffmpeg.git', Path.ffmpeg_repository)
33
+ Cmd.git_clone('ffmpeg libswscale sub-repository', 'http://github.com/csd/libswscale.git', Path.ffmpeg_libswscale)
34
+ end
35
+
36
+ # This flag is needed in order for stdint.h (by default in /usr/include) to define the constant +UINT64_C+.
37
+ # If it does not do that, libavutil (part of FFmpeg) will not be accepted by +configure+ libminisip.
38
+ # See http://code.google.com/p/ffmpegsource/issues/detail?id=11 for more other examples of this problem.
39
+ #
40
+ # *NOTE*: This flag actually does not work! That's what brings us to the next method: modify_libavutil
41
+ #
42
+ def c_flags
43
+ %{CFLAGS="-D__STDC_CONSTANT_MACROS"}
44
+ end
45
+
46
+ # The constant +UINT64_C+ has not been provided by the operating system even though the
47
+ # CFLAG "STDC_CONSTANT_MACROS" has been set. +UINT64_C+ should have been provided, but it was not.
48
+ # Thus we hack here and assume that this constant is set to "ULL", which is default for an ix386 architecture.
49
+ # In other words: This hack does not work on an amd-64 architecture. Yet it is only needed if FFmpeg
50
+ # is compiled _before_ MiniSIP.
51
+ #
52
+ def modify_libavutil
53
+ return
54
+ if Path.ffmpeg_libavutil_common_backup.file? and !Options.reveal
55
+ UI.warn "The libavutil common.h file seems to be fixed already, I won't touch it now. Delete #{Path.ffmpeg_libavutil_common_backup.enquote} to enforce it."
56
+ else
57
+ UI.info "Modifying the FFmpeg source code".green.bold
58
+ Cmd.copy Path.ffmpeg_libavutil_common, Path.ffmpeg_libavutil_common_backup
59
+ Cmd.replace Path.ffmpeg_libavutil_common, ' if ((a+0x80000000u) & ~UINT64_C(0xFFFFFFFF)) return (a>>63) ^ 0x7FFFFFFF;', " // MODIFIED BY THE AUTOMATED INSTALLER\n // if ((a+0x80000000u) & ~UINT64_C(0xFFFFFFFF)) return (a>>63) ^ 0x7FFFFFFF;\n if ((a+0x80000000u) & ~(0xFFFFFFFFULL)) return (a>>63) ^ 0x7FFFFFFF;"
60
+ end
61
+ end
62
+
63
+ # This method compiles FFmpeg, given that FFmpeg was downloaded before.
64
+ #
65
+ def make
66
+ UI.info "Compiling and installing FFmpeg".green.bold
67
+ Cmd.cd Path.ffmpeg_repository, :internal => true
68
+ Cmd.run("#{c_flags} ./configure --enable-gpl --enable-libx264 --enable-x11grab")
69
+ Cmd.run('make')
70
+ Cmd.run('sudo checkinstall --pkgname=ffmpeg --pkgversion "99:-`git log -1 --pretty=format:%h`" --backup=no --default')
71
+ end
72
+
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,48 @@
1
+ # -*- encoding: UTF-8 -*-
2
+
3
+ module CSD
4
+ module Application
5
+ module Minisip
6
+ module Component
7
+ module Gnome
8
+ class << self
9
+
10
+ DESKTOP_ENTRY = %{
11
+ [Desktop Entry]
12
+ Encoding=UTF-8
13
+ Name=MiniSIP Client
14
+ GenericName=Video conferencing client
15
+ Comment=Have a video conference in high-definition
16
+ Exec=minisip_gtkgui
17
+ Icon=minisip_gnome
18
+ Terminal=false
19
+ Type=Application
20
+ StartupNotify=true
21
+ Categories=Application;Internet;Network;Chat;AudioVideo}
22
+
23
+ def compile
24
+ UI.debug "#{self}.compile was called"
25
+ return unless Gem::Platform.local.debian? # TODO: Actually, Ubuntu only, not Debian. But I'm not so sure.
26
+ if Options.this_user
27
+ # This command opens the bin directory in Debian/Ubuntu as to show where the executables are located in a single-user mode installation.
28
+ UI.info "Revealing user-specific MiniSIP exectutables"
29
+ Cmd.run "nautilus #{Path.build_bin}"
30
+ else
31
+ create_desktop_entry
32
+ end
33
+ end
34
+
35
+ def create_desktop_entry
36
+ UI.info "Installing Gnome menu item".green.bold
37
+ Cmd.run("sudo cp #{Path.minisip_gnome_png} #{Path.minisip_gnome_pixmap}", :announce_pwd => false) unless Path.minisip_gnome_pixmap.file?
38
+ Path.new_desktop_entry = Pathname.new File.join(Dir.mktmpdir, 'minisip.desktop')
39
+ Cmd.touch_and_replace_content Path.new_desktop_entry, DESKTOP_ENTRY, :internal => true
40
+ Cmd.run "sudo mv #{Path.new_desktop_entry} #{Path.minisip_desktop_entry}", :announce_pwd => false
41
+ end
42
+
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,49 @@
1
+ # -*- encoding: UTF-8 -*-
2
+
3
+ module CSD
4
+ module Application
5
+ module Minisip
6
+ module Component
7
+ module HDVIPER
8
+ class << self
9
+
10
+ # This method processes HDVIPER.
11
+ #
12
+ def compile
13
+ UI.debug "#{self}.compile was called"
14
+ if Path.hdviper.directory? and !Options.reveal
15
+ UI.warn "HDVIPER will not be processed, because the directory #{Path.hdviper.enquote} already exists."
16
+ else
17
+ checkout
18
+ configure_and_make
19
+ end
20
+ end
21
+
22
+ # This method informs about the HDVIPER process.
23
+ #
24
+ def introduction
25
+ end
26
+
27
+ # This method downloads the HDVIPER source code.
28
+ #
29
+ def checkout
30
+ Cmd.git_clone('HDVIPER', 'http://github.com/csd/libraries.git', Path.hdviper)
31
+ end
32
+
33
+ # This method compiles HDVIPER, given that HDVIPER was downloaded before.
34
+ #
35
+ def configure_and_make
36
+ UI.info "Compiling HDVIPER".green.bold
37
+ Cmd.cd Path.hdviper_x264, :internal => true
38
+ Cmd.run('./configure')
39
+ Cmd.run('make')
40
+ Cmd.cd Path.hdviper_x264_test_x264api, :internal => true
41
+ Cmd.run('make')
42
+ end
43
+
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end