Blame view

scripts/sphinx-pre-install 21.7 KB
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
1
  #!/usr/bin/perl
c942fddf8   Thomas Gleixner   treewide: Replace...
2
  # SPDX-License-Identifier: GPL-2.0-or-later
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
3
  use strict;
2f9c50255   Mauro Carvalho Chehab   scripts: sphinx-p...
4
  # Copyright (c) 2017-2020 Mauro Carvalho Chehab <mchehab@kernel.org>
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
5
  #
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
6

8c69b77a0   Mike Rapoport   scripts/sphinx-pr...
7
8
9
10
11
  my $prefix = "./";
  $prefix = "$ENV{'srctree'}/" if ($ENV{'srctree'});
  
  my $conf = $prefix . "Documentation/conf.py";
  my $requirement_file = $prefix . "Documentation/sphinx/requirements.txt";
44f421651   Mauro Carvalho Chehab   scripts/sphinx-pr...
12
  my $virtenv_prefix = "sphinx_";
5be33182d   Mauro Carvalho Chehab   sphinx-pre-instal...
13

24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
14
15
16
17
18
19
20
21
22
23
  #
  # Static vars
  #
  
  my %missing;
  my $system_release;
  my $need = 0;
  my $optional = 0;
  my $need_symlink = 0;
  my $need_sphinx = 0;
2f9c50255   Mauro Carvalho Chehab   scripts: sphinx-p...
24
25
  my $need_venv = 0;
  my $need_virtualenv = 0;
77d09ad9d   Mauro Carvalho Chehab   scripts/sphinx-pr...
26
  my $rec_sphinx_upgrade = 0;
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
27
  my $install = "";
44f421651   Mauro Carvalho Chehab   scripts/sphinx-pr...
28
  my $virtenv_dir = "";
2f9c50255   Mauro Carvalho Chehab   scripts: sphinx-p...
29
  my $python_cmd = "";
44f421651   Mauro Carvalho Chehab   scripts/sphinx-pr...
30
  my $min_version;
2834a7412   Mauro Carvalho Chehab   scripts: sphinx-p...
31
  my $cur_version;
1ef70ced5   Mauro Carvalho Chehab   scripts: sphinx-p...
32
33
  my $rec_version = "1.7.9";	# PDF won't build here
  my $min_pdf_version = "2.4.4";	# Min version where pdf builds
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
34
35
36
37
38
39
40
  
  #
  # Command line arguments
  #
  
  my $pdf = 1;
  my $virtualenv = 1;
9b88ad546   Mauro Carvalho Chehab   scripts/sphinx-pr...
41
  my $version_check = 0;
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
42
43
44
45
46
47
  
  #
  # List of required texlive packages on Fedora and OpenSuse
  #
  
  my %texlive = (
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
  	'amsfonts.sty'       => 'texlive-amsfonts',
  	'amsmath.sty'        => 'texlive-amsmath',
  	'amssymb.sty'        => 'texlive-amsfonts',
  	'amsthm.sty'         => 'texlive-amscls',
  	'anyfontsize.sty'    => 'texlive-anyfontsize',
  	'atbegshi.sty'       => 'texlive-oberdiek',
  	'bm.sty'             => 'texlive-tools',
  	'capt-of.sty'        => 'texlive-capt-of',
  	'cmap.sty'           => 'texlive-cmap',
  	'ecrm1000.tfm'       => 'texlive-ec',
  	'eqparbox.sty'       => 'texlive-eqparbox',
  	'eu1enc.def'         => 'texlive-euenc',
  	'fancybox.sty'       => 'texlive-fancybox',
  	'fancyvrb.sty'       => 'texlive-fancyvrb',
  	'float.sty'          => 'texlive-float',
  	'fncychap.sty'       => 'texlive-fncychap',
  	'footnote.sty'       => 'texlive-mdwtools',
  	'framed.sty'         => 'texlive-framed',
  	'luatex85.sty'       => 'texlive-luatex85',
  	'multirow.sty'       => 'texlive-multirow',
  	'needspace.sty'      => 'texlive-needspace',
  	'palatino.sty'       => 'texlive-psnfss',
  	'parskip.sty'        => 'texlive-parskip',
  	'polyglossia.sty'    => 'texlive-polyglossia',
  	'tabulary.sty'       => 'texlive-tabulary',
  	'threeparttable.sty' => 'texlive-threeparttable',
  	'titlesec.sty'       => 'texlive-titlesec',
  	'ucs.sty'            => 'texlive-ucs',
  	'upquote.sty'        => 'texlive-upquote',
  	'wrapfig.sty'        => 'texlive-wrapfig',
  );
  
  #
  # Subroutines that checks if a feature exists
  #
  
  sub check_missing(%)
  {
  	my %map = %{$_[0]};
  
  	foreach my $prog (sort keys %missing) {
  		my $is_optional = $missing{$prog};
56e5a6339   Mauro Carvalho Chehab   scripts/sphinx-pr...
90
91
92
93
94
95
96
97
98
99
  		# At least on some LTS distros like CentOS 7, texlive doesn't
  		# provide all packages we need. When such distros are
  		# detected, we have to disable PDF output.
  		#
  		# So, we need to ignore the packages that distros would
  		# need for LaTeX to work
  		if ($is_optional == 2 && !$pdf) {
  			$optional--;
  			next;
  		}
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
  		if ($is_optional) {
  			print "Warning: better to also install \"$prog\".
  ";
  		} else {
  			print "ERROR: please install \"$prog\", otherwise, build won't work.
  ";
  		}
  		if (defined($map{$prog})) {
  			$install .= " " . $map{$prog};
  		} else {
  			$install .= " " . $prog;
  		}
  	}
  
  	$install =~ s/^\s//;
  }
  
  sub add_package($$)
  {
  	my $package = shift;
  	my $is_optional = shift;
  
  	$missing{$package} = $is_optional;
  	if ($is_optional) {
  		$optional++;
  	} else {
  		$need++;
  	}
  }
  
  sub check_missing_file($$$)
  {
ff8fdb36a   Jeremy MAURO   scripts/sphinx-pr...
132
  	my $files = shift;
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
133
134
  	my $package = shift;
  	my $is_optional = shift;
ff8fdb36a   Jeremy MAURO   scripts/sphinx-pr...
135
136
137
  	for (@$files) {
  		return if(-e $_);
  	}
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
138
139
140
141
142
143
144
145
146
147
  
  	add_package($package, $is_optional);
  }
  
  sub findprog($)
  {
  	foreach(split(/:/, $ENV{PATH})) {
  		return "$_/$_[0]" if(-x "$_/$_[0]");
  	}
  }
412b09dda   Mauro Carvalho Chehab   scripts: sphinx-p...
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
  sub find_python_no_venv()
  {
  	my $prog = shift;
  
  	my $cur_dir = qx(pwd);
  	$cur_dir =~ s/\s+$//;
  
  	foreach my $dir (split(/:/, $ENV{PATH})) {
  		next if ($dir =~ m,($cur_dir)/sphinx,);
  		return "$dir/python3" if(-x "$dir/python3");
  	}
  	foreach my $dir (split(/:/, $ENV{PATH})) {
  		next if ($dir =~ m,($cur_dir)/sphinx,);
  		return "$dir/python" if(-x "$dir/python");
  	}
  	return "python";
  }
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
165
166
167
168
  sub check_program($$)
  {
  	my $prog = shift;
  	my $is_optional = shift;
2f9c50255   Mauro Carvalho Chehab   scripts: sphinx-p...
169
  	return $prog if findprog($prog);
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
  
  	add_package($prog, $is_optional);
  }
  
  sub check_perl_module($$)
  {
  	my $prog = shift;
  	my $is_optional = shift;
  
  	my $err = system("perl -M$prog -e 1 2>/dev/null /dev/null");
  	return if ($err == 0);
  
  	add_package($prog, $is_optional);
  }
  
  sub check_python_module($$)
  {
  	my $prog = shift;
  	my $is_optional = shift;
2f9c50255   Mauro Carvalho Chehab   scripts: sphinx-p...
189
190
191
  	return if (!$python_cmd);
  
  	my $err = system("$python_cmd -c 'import $prog' 2>/dev/null /dev/null");
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
  	return if ($err == 0);
  
  	add_package($prog, $is_optional);
  }
  
  sub check_rpm_missing($$)
  {
  	my @pkgs = @{$_[0]};
  	my $is_optional = $_[1];
  
  	foreach my $prog(@pkgs) {
  		my $err = system("rpm -q '$prog' 2>/dev/null >/dev/null");
  		add_package($prog, $is_optional) if ($err);
  	}
  }
  
  sub check_pacman_missing($$)
  {
  	my @pkgs = @{$_[0]};
  	my $is_optional = $_[1];
  
  	foreach my $prog(@pkgs) {
  		my $err = system("pacman -Q '$prog' 2>/dev/null >/dev/null");
  		add_package($prog, $is_optional) if ($err);
  	}
  }
  
  sub check_missing_tex($)
  {
  	my $is_optional = shift;
  	my $kpsewhich = findprog("kpsewhich");
  
  	foreach my $prog(keys %texlive) {
  		my $package = $texlive{$prog};
  		if (!$kpsewhich) {
  			add_package($package, $is_optional);
  			next;
  		}
  		my $file = qx($kpsewhich $prog);
  		add_package($package, $is_optional) if ($file =~ /^\s*$/);
  	}
  }
77d09ad9d   Mauro Carvalho Chehab   scripts/sphinx-pr...
234
  sub get_sphinx_fname()
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
235
  {
77d09ad9d   Mauro Carvalho Chehab   scripts/sphinx-pr...
236
237
  	my $fname = "sphinx-build";
  	return $fname if findprog($fname);
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
238

77d09ad9d   Mauro Carvalho Chehab   scripts/sphinx-pr...
239
240
  	$fname = "sphinx-build-3";
  	if (findprog($fname)) {
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
241
  		$need_symlink = 1;
77d09ad9d   Mauro Carvalho Chehab   scripts/sphinx-pr...
242
  		return $fname;
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
243
  	}
77d09ad9d   Mauro Carvalho Chehab   scripts/sphinx-pr...
244
245
  	return "";
  }
a8b380c37   Mauro Carvalho Chehab   scripts: sphinx-p...
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
  sub get_sphinx_version($)
  {
  	my $cmd = shift;
  	my $ver;
  
  	open IN, "$cmd --version 2>&1 |";
  	while (<IN>) {
  		if (m/^\s*sphinx-build\s+([\d\.]+)(\+\/[\da-f]+)?$/) {
  			$ver=$1;
  			last;
  		}
  		# Sphinx 1.2.x uses a different format
  		if (m/^\s*Sphinx.*\s+([\d\.]+)$/) {
  			$ver=$1;
  			last;
  		}
  	}
  	close IN;
  	return $ver;
  }
77d09ad9d   Mauro Carvalho Chehab   scripts/sphinx-pr...
266
267
  sub check_sphinx()
  {
1ef70ced5   Mauro Carvalho Chehab   scripts: sphinx-p...
268
  	my $default_version;
77d09ad9d   Mauro Carvalho Chehab   scripts/sphinx-pr...
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
  
  	open IN, $conf or die "Can't open $conf";
  	while (<IN>) {
  		if (m/^\s*needs_sphinx\s*=\s*[\'\"]([\d\.]+)[\'\"]/) {
  			$min_version=$1;
  			last;
  		}
  	}
  	close IN;
  
  	die "Can't get needs_sphinx version from $conf" if (!$min_version);
  
  	open IN, $requirement_file or die "Can't open $requirement_file";
  	while (<IN>) {
  		if (m/^\s*Sphinx\s*==\s*([\d\.]+)$/) {
1ef70ced5   Mauro Carvalho Chehab   scripts: sphinx-p...
284
  			$default_version=$1;
77d09ad9d   Mauro Carvalho Chehab   scripts/sphinx-pr...
285
286
287
288
  			last;
  		}
  	}
  	close IN;
1ef70ced5   Mauro Carvalho Chehab   scripts: sphinx-p...
289
  	die "Can't get default sphinx version from $requirement_file" if (!$default_version);
77d09ad9d   Mauro Carvalho Chehab   scripts/sphinx-pr...
290

1ef70ced5   Mauro Carvalho Chehab   scripts: sphinx-p...
291
  	$virtenv_dir = $virtenv_prefix . $default_version;
77d09ad9d   Mauro Carvalho Chehab   scripts/sphinx-pr...
292
293
  
  	my $sphinx = get_sphinx_fname();
2f9c50255   Mauro Carvalho Chehab   scripts: sphinx-p...
294
295
296
297
  	if ($sphinx eq "") {
  		$need_sphinx = 1;
  		return;
  	}
77d09ad9d   Mauro Carvalho Chehab   scripts/sphinx-pr...
298

a8b380c37   Mauro Carvalho Chehab   scripts: sphinx-p...
299
300
  	$cur_version = get_sphinx_version($sphinx);
  	die ("$sphinx returned an error") if (!$cur_version);
77d09ad9d   Mauro Carvalho Chehab   scripts/sphinx-pr...
301
302
  
  	die "$sphinx didn't return its version" if (!$cur_version);
77d09ad9d   Mauro Carvalho Chehab   scripts/sphinx-pr...
303
  	if ($cur_version lt $min_version) {
9b88ad546   Mauro Carvalho Chehab   scripts/sphinx-pr...
304
305
  		printf "ERROR: Sphinx version is %s. It should be >= %s (recommended >= %s)
  ",
1ef70ced5   Mauro Carvalho Chehab   scripts: sphinx-p...
306
  		       $cur_version, $min_version, $default_version;
77d09ad9d   Mauro Carvalho Chehab   scripts/sphinx-pr...
307
308
309
310
311
  		$need_sphinx = 1;
  		return;
  	}
  
  	if ($cur_version lt $rec_version) {
1ef70ced5   Mauro Carvalho Chehab   scripts: sphinx-p...
312
313
314
  		$rec_sphinx_upgrade = 1;
  		return;
  	}
9b88ad546   Mauro Carvalho Chehab   scripts/sphinx-pr...
315
316
317
  
  	# On version check mode, just assume Sphinx has all mandatory deps
  	exit (0) if ($version_check);
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
  }
  
  #
  # Ancillary subroutines
  #
  
  sub catcheck($)
  {
    my $res = "";
    $res = qx(cat $_[0]) if (-r $_[0]);
    return $res;
  }
  
  sub which($)
  {
  	my $file = shift;
  	my @path = split ":", $ENV{PATH};
  
  	foreach my $dir(@path) {
  		my $name = $dir.'/'.$file;
  		return $name if (-x $name );
  	}
  	return undef;
  }
  
  #
  # Subroutines that check distro-specific hints
  #
  
  sub give_debian_hints()
  {
  	my %map = (
  		"python-sphinx"		=> "python3-sphinx",
  		"sphinx_rtd_theme"	=> "python3-sphinx-rtd-theme",
2f9c50255   Mauro Carvalho Chehab   scripts: sphinx-p...
352
  		"ensurepip"		=> "python3-venv",
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
353
  		"virtualenv"		=> "virtualenv",
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
354
355
356
357
  		"dot"			=> "graphviz",
  		"convert"		=> "imagemagick",
  		"Pod::Usage"		=> "perl-modules",
  		"xelatex"		=> "texlive-xetex",
8e7d5d15e   Mauro Carvalho Chehab   sphinx-pre-instal...
358
  		"rsvg-convert"		=> "librsvg2-bin",
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
359
360
361
  	);
  
  	if ($pdf) {
ff8fdb36a   Jeremy MAURO   scripts/sphinx-pr...
362
  		check_missing_file(["/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"],
56e5a6339   Mauro Carvalho Chehab   scripts/sphinx-pr...
363
  				   "fonts-dejavu", 2);
27eed923f   Mauro Carvalho Chehab   scripts/sphinx-pr...
364

9692f2fdb   Jeremy MAURO   scripts/sphinx-pr...
365
  		check_missing_file(["/usr/share/fonts/noto-cjk/NotoSansCJK-Regular.ttc",
bfc7f4281   Mauro Carvalho Chehab   scripts: sphinx-p...
366
367
  				    "/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc",
  				    "/usr/share/fonts/opentype/noto/NotoSerifCJK-Regular.ttc"],
27eed923f   Mauro Carvalho Chehab   scripts/sphinx-pr...
368
  				   "fonts-noto-cjk", 2);
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
369
  	}
56e5a6339   Mauro Carvalho Chehab   scripts/sphinx-pr...
370
  	check_program("dvipng", 2) if ($pdf);
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
  	check_missing(\%map);
  
  	return if (!$need && !$optional);
  	printf("You should run:
  
  \tsudo apt-get install $install
  ");
  }
  
  sub give_redhat_hints()
  {
  	my %map = (
  		"python-sphinx"		=> "python3-sphinx",
  		"sphinx_rtd_theme"	=> "python3-sphinx_rtd_theme",
  		"virtualenv"		=> "python3-virtualenv",
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
386
387
388
389
  		"dot"			=> "graphviz",
  		"convert"		=> "ImageMagick",
  		"Pod::Usage"		=> "perl-Pod-Usage",
  		"xelatex"		=> "texlive-xetex-bin",
8e7d5d15e   Mauro Carvalho Chehab   sphinx-pre-instal...
390
  		"rsvg-convert"		=> "librsvg2-tools",
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
391
  	);
5d88953c3   Mauro Carvalho Chehab   sphinx-pre-instal...
392
393
394
  	my @fedora26_opt_pkgs = (
  		"graphviz-gd",		# Fedora 26: needed for PDF support
  	);
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
395
396
397
  	my @fedora_tex_pkgs = (
  		"texlive-collection-fontsrecommended",
  		"texlive-collection-latex",
27eed923f   Mauro Carvalho Chehab   scripts/sphinx-pr...
398
  		"texlive-xecjk",
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
399
400
401
402
  		"dejavu-sans-fonts",
  		"dejavu-serif-fonts",
  		"dejavu-sans-mono-fonts",
  	);
9b756a9d0   Mauro Carvalho Chehab   scripts/sphinx-pr...
403
404
405
  	#
  	# Checks valid for RHEL/CentOS version 7.x.
  	#
56e5a6339   Mauro Carvalho Chehab   scripts/sphinx-pr...
406
407
408
  	my $old = 0;
  	my $rel;
  	$rel = $1 if ($system_release =~ /release\s+(\d+)/);
b308467c9   Mauro Carvalho Chehab   scripts/sphinx-pr...
409
  	if (!($system_release =~ /Fedora/)) {
9b756a9d0   Mauro Carvalho Chehab   scripts/sphinx-pr...
410
  		$map{"virtualenv"} = "python-virtualenv";
9b756a9d0   Mauro Carvalho Chehab   scripts/sphinx-pr...
411

56e5a6339   Mauro Carvalho Chehab   scripts/sphinx-pr...
412
413
414
  		if ($rel && $rel < 8) {
  			$old = 1;
  			$pdf = 0;
5d88953c3   Mauro Carvalho Chehab   sphinx-pre-instal...
415

56e5a6339   Mauro Carvalho Chehab   scripts/sphinx-pr...
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
  			printf("Note: texlive packages on RHEL/CENTOS <= 7 are incomplete. Can't support PDF output
  ");
  			printf("If you want to build PDF, please read:
  ");
  			printf("\thttps://www.systutorials.com/241660/how-to-install-tex-live-on-centos-7-linux/
  ");
  		}
  	} else {
  		if ($rel && $rel < 26) {
  			$old = 1;
  		}
  	}
  	if (!$rel) {
  		printf("Couldn't identify release number
  ");
  		$old = 1;
  		$pdf = 0;
  	}
5d88953c3   Mauro Carvalho Chehab   sphinx-pre-instal...
434

27eed923f   Mauro Carvalho Chehab   scripts/sphinx-pr...
435
  	if ($pdf) {
ff8fdb36a   Jeremy MAURO   scripts/sphinx-pr...
436
  		check_missing_file(["/usr/share/fonts/google-noto-cjk/NotoSansCJK-Regular.ttc"],
27eed923f   Mauro Carvalho Chehab   scripts/sphinx-pr...
437
438
  				   "google-noto-sans-cjk-ttc-fonts", 2);
  	}
56e5a6339   Mauro Carvalho Chehab   scripts/sphinx-pr...
439
440
441
  	check_rpm_missing(\@fedora26_opt_pkgs, 2) if ($pdf && !$old);
  	check_rpm_missing(\@fedora_tex_pkgs, 2) if ($pdf);
  	check_missing_tex(2) if ($pdf);
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
442
443
444
  	check_missing(\%map);
  
  	return if (!$need && !$optional);
9b756a9d0   Mauro Carvalho Chehab   scripts/sphinx-pr...
445

56e5a6339   Mauro Carvalho Chehab   scripts/sphinx-pr...
446
  	if (!$old) {
9b756a9d0   Mauro Carvalho Chehab   scripts/sphinx-pr...
447
448
449
450
451
452
453
454
455
456
457
458
  		# dnf, for Fedora 18+
  		printf("You should run:
  
  \tsudo dnf install -y $install
  ");
  	} else {
  		# yum, for RHEL (and clones) or Fedora version < 18
  		printf("You should run:
  
  \tsudo yum install -y $install
  ");
  	}
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
459
460
461
462
463
464
465
466
  }
  
  sub give_opensuse_hints()
  {
  	my %map = (
  		"python-sphinx"		=> "python3-sphinx",
  		"sphinx_rtd_theme"	=> "python3-sphinx_rtd_theme",
  		"virtualenv"		=> "python3-virtualenv",
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
467
468
469
470
471
  		"dot"			=> "graphviz",
  		"convert"		=> "ImageMagick",
  		"Pod::Usage"		=> "perl-Pod-Usage",
  		"xelatex"		=> "texlive-xetex-bin",
  	);
b3df6223b   Mauro Carvalho Chehab   scripts: sphinx-p...
472
473
  	# On Tumbleweed, this package is also named rsvg-convert
  	$map{"rsvg-convert"} = "rsvg-view" if (!($system_release =~ /Tumbleweed/));
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
  	my @suse_tex_pkgs = (
  		"texlive-babel-english",
  		"texlive-caption",
  		"texlive-colortbl",
  		"texlive-courier",
  		"texlive-dvips",
  		"texlive-helvetic",
  		"texlive-makeindex",
  		"texlive-metafont",
  		"texlive-metapost",
  		"texlive-palatino",
  		"texlive-preview",
  		"texlive-times",
  		"texlive-zapfchan",
  		"texlive-zapfding",
  	);
353290a9e   Mauro Carvalho Chehab   scripts/sphinx-pr...
490
  	$map{"latexmk"} = "texlive-latexmk-bin";
27eed923f   Mauro Carvalho Chehab   scripts/sphinx-pr...
491
492
493
494
  	# FIXME: add support for installing CJK fonts
  	#
  	# I tried hard, but was unable to find a way to install
  	# "Noto Sans CJK SC" on openSUSE
56e5a6339   Mauro Carvalho Chehab   scripts/sphinx-pr...
495
496
  	check_rpm_missing(\@suse_tex_pkgs, 2) if ($pdf);
  	check_missing_tex(2) if ($pdf);
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
497
498
499
500
501
502
503
504
  	check_missing(\%map);
  
  	return if (!$need && !$optional);
  	printf("You should run:
  
  \tsudo zypper install --no-recommends $install
  ");
  }
800d408a3   Mauro Carvalho Chehab   sphinx-pre-instal...
505
506
507
508
509
510
  sub give_mageia_hints()
  {
  	my %map = (
  		"python-sphinx"		=> "python3-sphinx",
  		"sphinx_rtd_theme"	=> "python3-sphinx_rtd_theme",
  		"virtualenv"		=> "python3-virtualenv",
800d408a3   Mauro Carvalho Chehab   sphinx-pre-instal...
511
512
513
514
  		"dot"			=> "graphviz",
  		"convert"		=> "ImageMagick",
  		"Pod::Usage"		=> "perl-Pod-Usage",
  		"xelatex"		=> "texlive",
d6ebf1890   Mauro Carvalho Chehab   scripts: sphinx-p...
515
  		"rsvg-convert"		=> "librsvg2",
800d408a3   Mauro Carvalho Chehab   sphinx-pre-instal...
516
517
518
519
520
  	);
  
  	my @tex_pkgs = (
  		"texlive-fontsextra",
  	);
353290a9e   Mauro Carvalho Chehab   scripts/sphinx-pr...
521
  	$map{"latexmk"} = "texlive-collection-basic";
d6ebf1890   Mauro Carvalho Chehab   scripts: sphinx-p...
522
523
524
525
526
527
528
529
530
531
  	my $packager_cmd;
  	my $noto_sans;
  	if ($system_release =~ /OpenMandriva/) {
  		$packager_cmd = "dnf install";
  		$noto_sans = "noto-sans-cjk-fonts";
  		@tex_pkgs = ( "texlive-collection-fontsextra" );
  	} else {
  		$packager_cmd = "urpmi";
  		$noto_sans = "google-noto-sans-cjk-ttc-fonts";
  	}
27eed923f   Mauro Carvalho Chehab   scripts/sphinx-pr...
532
  	if ($pdf) {
d6ebf1890   Mauro Carvalho Chehab   scripts: sphinx-p...
533
534
535
  		check_missing_file(["/usr/share/fonts/google-noto-cjk/NotoSansCJK-Regular.ttc",
  				    "/usr/share/fonts/TTF/NotoSans-Regular.ttf"],
  				   $noto_sans, 2);
27eed923f   Mauro Carvalho Chehab   scripts/sphinx-pr...
536
  	}
56e5a6339   Mauro Carvalho Chehab   scripts/sphinx-pr...
537
  	check_rpm_missing(\@tex_pkgs, 2) if ($pdf);
800d408a3   Mauro Carvalho Chehab   sphinx-pre-instal...
538
539
540
  	check_missing(\%map);
  
  	return if (!$need && !$optional);
d6ebf1890   Mauro Carvalho Chehab   scripts: sphinx-p...
541
542
543
544
  	printf("You should run:
  
  \tsudo $packager_cmd $install
  ");
800d408a3   Mauro Carvalho Chehab   sphinx-pre-instal...
545
  }
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
546
547
548
549
550
  sub give_arch_linux_hints()
  {
  	my %map = (
  		"sphinx_rtd_theme"	=> "python-sphinx_rtd_theme",
  		"virtualenv"		=> "python-virtualenv",
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
551
552
553
  		"dot"			=> "graphviz",
  		"convert"		=> "imagemagick",
  		"xelatex"		=> "texlive-bin",
0d0da9aa0   Louis Taylor   scripts/sphinx-pr...
554
  		"latexmk"		=> "texlive-core",
8e7d5d15e   Mauro Carvalho Chehab   sphinx-pre-instal...
555
  		"rsvg-convert"		=> "extra/librsvg",
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
556
557
558
559
560
561
562
  	);
  
  	my @archlinux_tex_pkgs = (
  		"texlive-core",
  		"texlive-latexextra",
  		"ttf-dejavu",
  	);
56e5a6339   Mauro Carvalho Chehab   scripts/sphinx-pr...
563
  	check_pacman_missing(\@archlinux_tex_pkgs, 2) if ($pdf);
27eed923f   Mauro Carvalho Chehab   scripts/sphinx-pr...
564
  	if ($pdf) {
ff8fdb36a   Jeremy MAURO   scripts/sphinx-pr...
565
  		check_missing_file(["/usr/share/fonts/noto-cjk/NotoSansCJK-Regular.ttc"],
27eed923f   Mauro Carvalho Chehab   scripts/sphinx-pr...
566
567
  				   "noto-fonts-cjk", 2);
  	}
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
568
569
570
571
572
573
574
575
576
577
578
579
580
581
  	check_missing(\%map);
  
  	return if (!$need && !$optional);
  	printf("You should run:
  
  \tsudo pacman -S $install
  ");
  }
  
  sub give_gentoo_hints()
  {
  	my %map = (
  		"sphinx_rtd_theme"	=> "dev-python/sphinx_rtd_theme",
  		"virtualenv"		=> "dev-python/virtualenv",
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
582
583
584
  		"dot"			=> "media-gfx/graphviz",
  		"convert"		=> "media-gfx/imagemagick",
  		"xelatex"		=> "dev-texlive/texlive-xetex media-fonts/dejavu",
8e7d5d15e   Mauro Carvalho Chehab   sphinx-pre-instal...
585
  		"rsvg-convert"		=> "gnome-base/librsvg",
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
586
  	);
ff8fdb36a   Jeremy MAURO   scripts/sphinx-pr...
587
  	check_missing_file(["/usr/share/fonts/dejavu/DejaVuSans.ttf"],
56e5a6339   Mauro Carvalho Chehab   scripts/sphinx-pr...
588
  			   "media-fonts/dejavu", 2) if ($pdf);
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
589

27eed923f   Mauro Carvalho Chehab   scripts/sphinx-pr...
590
  	if ($pdf) {
e45a63174   Mauro Carvalho Chehab   scripts: sphinx-p...
591
592
  		check_missing_file(["/usr/share/fonts/noto-cjk/NotoSansCJKsc-Regular.otf",
  				    "/usr/share/fonts/noto-cjk/NotoSerifCJK-Regular.ttc"],
27eed923f   Mauro Carvalho Chehab   scripts/sphinx-pr...
593
594
  				   "media-fonts/noto-cjk", 2);
  	}
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
595
596
597
  	check_missing(\%map);
  
  	return if (!$need && !$optional);
bba1e4cbd   Mauro Carvalho Chehab   sphinx-pre-instal...
598
599
600
601
  
  	printf("You should run:
  
  ");
4ea96d57b   Mauro Carvalho Chehab   scripts/sphinx-pr...
602
603
604
605
606
  
  	my $imagemagick = "media-gfx/imagemagick svg png";
  	my $cairo = "media-gfx/graphviz cairo pdf";
  	my $portage_imagemagick = "/etc/portage/package.use/imagemagick";
  	my $portage_cairo = "/etc/portage/package.use/graphviz";
e45a63174   Mauro Carvalho Chehab   scripts: sphinx-p...
607
  	if (qx(grep imagemagick $portage_imagemagick 2>/dev/null) eq "") {
4ea96d57b   Mauro Carvalho Chehab   scripts/sphinx-pr...
608
609
610
  		printf("\tsudo su -c 'echo \"$imagemagick\" > $portage_imagemagick'
  ")
  	}
e45a63174   Mauro Carvalho Chehab   scripts: sphinx-p...
611
  	if (qx(grep graphviz $portage_cairo 2>/dev/null) eq  "") {
4ea96d57b   Mauro Carvalho Chehab   scripts/sphinx-pr...
612
613
614
  		printf("\tsudo su -c 'echo \"$cairo\" > $portage_cairo'
  ");
  	}
bba1e4cbd   Mauro Carvalho Chehab   sphinx-pre-instal...
615
616
  	printf("\tsudo emerge --ask $install
  ");
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
617
618
619
620
621
622
623
624
625
  }
  
  sub check_distros()
  {
  	# Distro-specific hints
  	if ($system_release =~ /Red Hat Enterprise Linux/) {
  		give_redhat_hints;
  		return;
  	}
9b756a9d0   Mauro Carvalho Chehab   scripts/sphinx-pr...
626
627
628
629
630
631
632
633
634
635
636
637
  	if ($system_release =~ /CentOS/) {
  		give_redhat_hints;
  		return;
  	}
  	if ($system_release =~ /Scientific Linux/) {
  		give_redhat_hints;
  		return;
  	}
  	if ($system_release =~ /Oracle Linux Server/) {
  		give_redhat_hints;
  		return;
  	}
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
  	if ($system_release =~ /Fedora/) {
  		give_redhat_hints;
  		return;
  	}
  	if ($system_release =~ /Ubuntu/) {
  		give_debian_hints;
  		return;
  	}
  	if ($system_release =~ /Debian/) {
  		give_debian_hints;
  		return;
  	}
  	if ($system_release =~ /openSUSE/) {
  		give_opensuse_hints;
  		return;
  	}
800d408a3   Mauro Carvalho Chehab   sphinx-pre-instal...
654
655
656
657
  	if ($system_release =~ /Mageia/) {
  		give_mageia_hints;
  		return;
  	}
d6ebf1890   Mauro Carvalho Chehab   scripts: sphinx-p...
658
659
660
661
  	if ($system_release =~ /OpenMandriva/) {
  		give_mageia_hints;
  		return;
  	}
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
  	if ($system_release =~ /Arch Linux/) {
  		give_arch_linux_hints;
  		return;
  	}
  	if ($system_release =~ /Gentoo/) {
  		give_gentoo_hints;
  		return;
  	}
  
  	#
  	# Fall-back to generic hint code for other distros
  	# That's far from ideal, specially for LaTeX dependencies.
  	#
  	my %map = (
  		"sphinx-build" => "sphinx"
  	);
56e5a6339   Mauro Carvalho Chehab   scripts/sphinx-pr...
678
  	check_missing_tex(2) if ($pdf);
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
679
680
681
682
683
684
685
686
687
688
689
690
  	check_missing(\%map);
  	print "I don't know distro $system_release.
  ";
  	print "So, I can't provide you a hint with the install procedure.
  ";
  	print "There are likely missing dependencies.
  ";
  }
  
  #
  # Common dependencies
  #
2730ce017   Shuah Khan   scripts/sphinx-pr...
691
692
  sub deactivate_help()
  {
2f9c50255   Mauro Carvalho Chehab   scripts: sphinx-p...
693
694
695
  	printf "
  If you want to exit the virtualenv, you can use:
  ";
2730ce017   Shuah Khan   scripts/sphinx-pr...
696
697
698
  	printf "\tdeactivate
  ";
  }
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
699
700
  sub check_needs()
  {
2f9c50255   Mauro Carvalho Chehab   scripts: sphinx-p...
701
  	# Check if Sphinx is already accessible from current environment
9b88ad546   Mauro Carvalho Chehab   scripts/sphinx-pr...
702
  	check_sphinx();
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
703
  	if ($system_release) {
ec43a27ff   Mauro Carvalho Chehab   scripts: sphinx-p...
704
705
  		print "Detected OS: $system_release.
  ";
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
706
  	} else {
ec43a27ff   Mauro Carvalho Chehab   scripts: sphinx-p...
707
708
  		print "Unknown OS
  ";
9b756a9d0   Mauro Carvalho Chehab   scripts/sphinx-pr...
709
  	}
ec43a27ff   Mauro Carvalho Chehab   scripts: sphinx-p...
710
711
712
  	printf "Sphinx version: %s
  
  ", $cur_version if ($cur_version);
9b756a9d0   Mauro Carvalho Chehab   scripts/sphinx-pr...
713

2f9c50255   Mauro Carvalho Chehab   scripts: sphinx-p...
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
  	# Check python command line, trying first python3
  	$python_cmd = findprog("python3");
  	$python_cmd = check_program("python", 0) if (!$python_cmd);
  
  	# Check the type of virtual env, depending on Python version
  	if ($python_cmd) {
  		if ($virtualenv) {
  			my $tmp = qx($python_cmd --version 2>&1);
  			if ($tmp =~ m/(\d+\.)(\d+\.)/) {
  				if ($1 >= 3 && $2 >= 3) {
  					$need_venv = 1;		# python 3.3 or upper
  				} else {
  					$need_virtualenv = 1;
  				}
  				if ($1 < 3) {
  					# Complain if it finds python2 (or worse)
  					printf "Warning: python$1 support is deprecated. Use it with caution!
  ";
  				}
  			} else {
  				die "Warning: couldn't identify $python_cmd version!";
  			}
  		} else {
  			add_package("python-sphinx", 0);
  		}
  	}
  
  	# Set virtualenv command line, if python < 3.3
  	my $virtualenv_cmd;
  	if ($need_virtualenv) {
  		$virtualenv_cmd = findprog("virtualenv-3");
  		$virtualenv_cmd = findprog("virtualenv-3.5") if (!$virtualenv_cmd);
  		if (!$virtualenv_cmd) {
  			check_program("virtualenv", 0);
  			$virtualenv_cmd = "virtualenv";
  		}
  	}
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
751
  	# Check for needed programs/tools
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
752
753
754
755
  	check_perl_module("Pod::Usage", 0);
  	check_program("make", 0);
  	check_program("gcc", 0);
  	check_python_module("sphinx_rtd_theme", 1) if (!$virtualenv);
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
756
757
  	check_program("dot", 1);
  	check_program("convert", 1);
56e5a6339   Mauro Carvalho Chehab   scripts/sphinx-pr...
758
759
760
761
762
  
  	# Extra PDF files - should use 2 for is_optional
  	check_program("xelatex", 2) if ($pdf);
  	check_program("rsvg-convert", 2) if ($pdf);
  	check_program("latexmk", 2) if ($pdf);
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
763

2f9c50255   Mauro Carvalho Chehab   scripts: sphinx-p...
764
765
766
767
768
  	if ($need_sphinx || $rec_sphinx_upgrade) {
  		check_python_module("ensurepip", 0) if ($need_venv);
  	}
  
  	# Do distro-specific checks and output distro-install commands
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
769
  	check_distros();
2f9c50255   Mauro Carvalho Chehab   scripts: sphinx-p...
770
771
772
773
774
775
776
777
778
  	if (!$python_cmd) {
  		if ($need == 1) {
  			die "Can't build as $need mandatory dependency is missing";
  		} elsif ($need) {
  			die "Can't build as $need mandatory dependencies are missing";
  		}
  	}
  
  	# Check if sphinx-build is called sphinx-build-3
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
779
780
781
782
783
784
  	if ($need_symlink) {
  		printf "\tsudo ln -sf %s /usr/bin/sphinx-build
  
  ",
  		       which("sphinx-build-3");
  	}
2f9c50255   Mauro Carvalho Chehab   scripts: sphinx-p...
785
786
787
  
  	# NOTE: if the system has a too old Sphinx version installed,
  	# it will recommend installing a newer version using virtualenv
77d09ad9d   Mauro Carvalho Chehab   scripts/sphinx-pr...
788
  	if ($need_sphinx || $rec_sphinx_upgrade) {
44f421651   Mauro Carvalho Chehab   scripts/sphinx-pr...
789
  		my $min_activate = "$ENV{'PWD'}/${virtenv_prefix}${min_version}/bin/activate";
9b88ad546   Mauro Carvalho Chehab   scripts/sphinx-pr...
790
  		my @activates = glob "$ENV{'PWD'}/${virtenv_prefix}*/bin/activate";
44f421651   Mauro Carvalho Chehab   scripts/sphinx-pr...
791

ec43a27ff   Mauro Carvalho Chehab   scripts: sphinx-p...
792
793
794
795
796
797
798
799
800
801
  		if ($cur_version lt $rec_version) {
  			print "Warning: It is recommended at least Sphinx version $rec_version.
  ";
  			print "         If you want pdf, you need at least $min_pdf_version.
  ";
  		}
  		if ($cur_version lt $min_pdf_version) {
  			print "Note: It is recommended at least Sphinx version $min_pdf_version if you need PDF support.
  ";
  		}
9b88ad546   Mauro Carvalho Chehab   scripts/sphinx-pr...
802
  		@activates = sort {$b cmp $a} @activates;
a8b380c37   Mauro Carvalho Chehab   scripts: sphinx-p...
803
804
  		my ($activate, $ver);
  		foreach my $f (@activates) {
2834a7412   Mauro Carvalho Chehab   scripts: sphinx-p...
805
  			next if ($f lt $min_activate);
a8b380c37   Mauro Carvalho Chehab   scripts: sphinx-p...
806

2834a7412   Mauro Carvalho Chehab   scripts: sphinx-p...
807
  			my $sphinx_cmd = $f;
a8b380c37   Mauro Carvalho Chehab   scripts: sphinx-p...
808
809
  			$sphinx_cmd =~ s/activate/sphinx-build/;
  			next if (! -f $sphinx_cmd);
44f421651   Mauro Carvalho Chehab   scripts/sphinx-pr...
810

a8b380c37   Mauro Carvalho Chehab   scripts: sphinx-p...
811
  			$ver = get_sphinx_version($sphinx_cmd);
2834a7412   Mauro Carvalho Chehab   scripts: sphinx-p...
812
813
814
815
816
817
818
  			if ($need_sphinx && ($ver ge $min_version)) {
  				$activate = $f;
  				last;
  			} elsif ($ver gt $cur_version) {
  				$activate = $f;
  				last;
  			}
a8b380c37   Mauro Carvalho Chehab   scripts: sphinx-p...
819
  		}
2834a7412   Mauro Carvalho Chehab   scripts: sphinx-p...
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
  		if ($activate ne "") {
  			if ($need_sphinx) {
  				printf "
  Need to activate Sphinx (version $ver) on virtualenv with:
  ";
  				printf "\t. $activate
  ";
  				deactivate_help();
  				exit (1);
  			} else {
  				printf "
  You may also use a newer Sphinx (version $ver) with:
  ";
  				printf "\tdeactivate && . $activate
  ";
  			}
5be33182d   Mauro Carvalho Chehab   sphinx-pre-instal...
836
  		} else {
44f421651   Mauro Carvalho Chehab   scripts/sphinx-pr...
837
  			my $rec_activate = "$virtenv_dir/bin/activate";
c428cd522   Tim Bird   scripts/sphinx-pr...
838

2834a7412   Mauro Carvalho Chehab   scripts: sphinx-p...
839
840
841
  			print "To upgrade Sphinx, use:
  
  " if ($rec_sphinx_upgrade);
412b09dda   Mauro Carvalho Chehab   scripts: sphinx-p...
842
  			$python_cmd = find_python_no_venv();
2f9c50255   Mauro Carvalho Chehab   scripts: sphinx-p...
843
844
845
846
847
848
849
  			if ($need_venv) {
  				printf "\t$python_cmd -m venv $virtenv_dir
  ";
  			} else {
  				printf "\t$virtualenv_cmd $virtenv_dir
  ";
  			}
44f421651   Mauro Carvalho Chehab   scripts/sphinx-pr...
850
851
  			printf "\t. $rec_activate
  ";
fb947f3f4   Mauro Carvalho Chehab   sphinx-pre-instal...
852
853
  			printf "\tpip install -r $requirement_file
  ";
2730ce017   Shuah Khan   scripts/sphinx-pr...
854
  			deactivate_help();
77d09ad9d   Mauro Carvalho Chehab   scripts/sphinx-pr...
855
856
  
  			$need++ if (!$rec_sphinx_upgrade);
5be33182d   Mauro Carvalho Chehab   sphinx-pre-instal...
857
  		}
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
858
859
860
  	}
  	printf "
  ";
54002b56b   Bjorn Helgaas   scripts/sphinx-pr...
861
862
  	print "All optional dependencies are met.
  " if (!$optional);
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
  
  	if ($need == 1) {
  		die "Can't build as $need mandatory dependency is missing";
  	} elsif ($need) {
  		die "Can't build as $need mandatory dependencies are missing";
  	}
  
  	print "Needed package dependencies are met.
  ";
  }
  
  #
  # Main
  #
  
  while (@ARGV) {
  	my $arg = shift(@ARGV);
  
  	if ($arg eq "--no-virtualenv") {
  		$virtualenv = 0;
  	} elsif ($arg eq "--no-pdf"){
  		$pdf = 0;
9b88ad546   Mauro Carvalho Chehab   scripts/sphinx-pr...
885
886
  	} elsif ($arg eq "--version-check"){
  		$version_check = 1;
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
887
  	} else {
9b88ad546   Mauro Carvalho Chehab   scripts/sphinx-pr...
888
889
890
891
892
893
894
895
896
897
898
899
900
  		print "Usage:
  \t$0 <--no-virtualenv> <--no-pdf> <--version-check>
  
  ";
  		print "Where:
  ";
  		print "\t--no-virtualenv\t- Recommend installing Sphinx instead of using a virtualenv
  ";
  		print "\t--version-check\t- if version is compatible, don't check for missing dependencies
  ";
  		print "\t--no-pdf\t- don't check for dependencies required to build PDF docs
  
  ";
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
  		exit -1;
  	}
  }
  
  #
  # Determine the system type. There's no standard unique way that would
  # work with all distros with a minimal package install. So, several
  # methods are used here.
  #
  # By default, it will use lsb_release function. If not available, it will
  # fail back to reading the known different places where the distro name
  # is stored
  #
  
  $system_release = qx(lsb_release -d) if which("lsb_release");
  $system_release =~ s/Description:\s*// if ($system_release);
  $system_release = catcheck("/etc/system-release") if !$system_release;
  $system_release = catcheck("/etc/redhat-release") if !$system_release;
  $system_release = catcheck("/etc/lsb-release") if !$system_release;
  $system_release = catcheck("/etc/gentoo-release") if !$system_release;
d14d0c1ae   Mauro Carvalho Chehab   scripts: sphinx-p...
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
  
  # This seems more common than LSB these days
  if (!$system_release) {
  	my %os_var;
  	if (open IN, "cat /etc/os-release|") {
  		while (<IN>) {
  			if (m/^([\w\d\_]+)=\"?([^\"]*)\"?
  /) {
  				$os_var{$1}=$2;
  			}
  		}
  		$system_release = $os_var{"NAME"};
  		if (defined($os_var{"VERSION_ID"})) {
  			$system_release .= " " . $os_var{"VERSION_ID"} if (defined($os_var{"VERSION_ID"}));
  		} else {
  			$system_release .= " " . $os_var{"VERSION"};
  		}
  	}
  }
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
940
941
942
943
  $system_release = catcheck("/etc/issue") if !$system_release;
  $system_release =~ s/\s+$//;
  
  check_needs;