Blame view

scripts/sphinx-pre-install 17.6 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;
44f421651   Mauro Carvalho Chehab   scripts/sphinx-pr...
4
  # Copyright (c) 2017-2019 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;
77d09ad9d   Mauro Carvalho Chehab   scripts/sphinx-pr...
24
  my $rec_sphinx_upgrade = 0;
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
25
  my $install = "";
44f421651   Mauro Carvalho Chehab   scripts/sphinx-pr...
26
27
  my $virtenv_dir = "";
  my $min_version;
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
28
29
30
31
32
33
34
  
  #
  # Command line arguments
  #
  
  my $pdf = 1;
  my $virtualenv = 1;
9b88ad546   Mauro Carvalho Chehab   scripts/sphinx-pr...
35
  my $version_check = 0;
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
36
37
38
39
40
41
  
  #
  # List of required texlive packages on Fedora and OpenSuse
  #
  
  my %texlive = (
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
42
43
44
45
46
47
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
  	'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...
84
85
86
87
88
89
90
91
92
93
  		# 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...
94
95
96
97
98
99
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
  		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($$$)
  {
  	my $file = shift;
  	my $package = shift;
  	my $is_optional = shift;
  
  	return if(-e $file);
  
  	add_package($package, $is_optional);
  }
  
  sub findprog($)
  {
  	foreach(split(/:/, $ENV{PATH})) {
  		return "$_/$_[0]" if(-x "$_/$_[0]");
  	}
  }
  
  sub check_program($$)
  {
  	my $prog = shift;
  	my $is_optional = shift;
  
  	return if findprog($prog);
  
  	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;
  
  	my $err = system("python3 -c 'import $prog' 2>/dev/null /dev/null");
  	return if ($err == 0);
  	my $err = system("python -c 'import $prog' 2>/dev/null /dev/null");
  	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...
213
  sub get_sphinx_fname()
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
214
  {
77d09ad9d   Mauro Carvalho Chehab   scripts/sphinx-pr...
215
216
  	my $fname = "sphinx-build";
  	return $fname if findprog($fname);
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
217

77d09ad9d   Mauro Carvalho Chehab   scripts/sphinx-pr...
218
219
  	$fname = "sphinx-build-3";
  	if (findprog($fname)) {
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
220
  		$need_symlink = 1;
77d09ad9d   Mauro Carvalho Chehab   scripts/sphinx-pr...
221
  		return $fname;
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
222
223
224
  	}
  
  	if ($virtualenv) {
800d408a3   Mauro Carvalho Chehab   sphinx-pre-instal...
225
226
227
228
  		my $prog = findprog("virtualenv-3");
  		$prog = findprog("virtualenv-3.5") if (!$prog);
  
  		check_program("virtualenv", 0) if (!$prog);
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
229
230
231
232
  		$need_sphinx = 1;
  	} else {
  		add_package("python-sphinx", 0);
  	}
77d09ad9d   Mauro Carvalho Chehab   scripts/sphinx-pr...
233
234
235
236
237
238
  
  	return "";
  }
  
  sub check_sphinx()
  {
77d09ad9d   Mauro Carvalho Chehab   scripts/sphinx-pr...
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
  	my $rec_version;
  	my $cur_version;
  
  	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\.]+)$/) {
  			$rec_version=$1;
  			last;
  		}
  	}
  	close IN;
  
  	die "Can't get recommended sphinx version from $requirement_file" if (!$min_version);
44f421651   Mauro Carvalho Chehab   scripts/sphinx-pr...
263
  	$virtenv_dir = $virtenv_prefix . $rec_version;
77d09ad9d   Mauro Carvalho Chehab   scripts/sphinx-pr...
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
  
  	my $sphinx = get_sphinx_fname();
  	return if ($sphinx eq "");
  
  	open IN, "$sphinx --version 2>&1 |" or die "$sphinx returned an error";
  	while (<IN>) {
  		if (m/^\s*sphinx-build\s+([\d\.]+)$/) {
  			$cur_version=$1;
  			last;
  		}
  		# Sphinx 1.2.x uses a different format
  		if (m/^\s*Sphinx.*\s+([\d\.]+)$/) {
  			$cur_version=$1;
  			last;
  		}
  	}
  	close IN;
  
  	die "$sphinx didn't return its version" if (!$cur_version);
77d09ad9d   Mauro Carvalho Chehab   scripts/sphinx-pr...
283
  	if ($cur_version lt $min_version) {
9b88ad546   Mauro Carvalho Chehab   scripts/sphinx-pr...
284
285
286
  		printf "ERROR: Sphinx version is %s. It should be >= %s (recommended >= %s)
  ",
  		       $cur_version, $min_version, $rec_version;;
77d09ad9d   Mauro Carvalho Chehab   scripts/sphinx-pr...
287
288
289
290
291
  		$need_sphinx = 1;
  		return;
  	}
  
  	if ($cur_version lt $rec_version) {
9b88ad546   Mauro Carvalho Chehab   scripts/sphinx-pr...
292
293
  		printf "Sphinx version %s
  ", $cur_version;
77d09ad9d   Mauro Carvalho Chehab   scripts/sphinx-pr...
294
295
  		print "Warning: It is recommended at least Sphinx version $rec_version.
  ";
77d09ad9d   Mauro Carvalho Chehab   scripts/sphinx-pr...
296
  		$rec_sphinx_upgrade = 1;
9b88ad546   Mauro Carvalho Chehab   scripts/sphinx-pr...
297
  		return;
77d09ad9d   Mauro Carvalho Chehab   scripts/sphinx-pr...
298
  	}
9b88ad546   Mauro Carvalho Chehab   scripts/sphinx-pr...
299
300
301
  
  	# On version check mode, just assume Sphinx has all mandatory deps
  	exit (0) if ($version_check);
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
  }
  
  #
  # 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",
  		"virtualenv"		=> "virtualenv",
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
337
338
339
340
  		"dot"			=> "graphviz",
  		"convert"		=> "imagemagick",
  		"Pod::Usage"		=> "perl-modules",
  		"xelatex"		=> "texlive-xetex",
8e7d5d15e   Mauro Carvalho Chehab   sphinx-pre-instal...
341
  		"rsvg-convert"		=> "librsvg2-bin",
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
342
343
344
345
  	);
  
  	if ($pdf) {
  		check_missing_file("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf",
56e5a6339   Mauro Carvalho Chehab   scripts/sphinx-pr...
346
  				   "fonts-dejavu", 2);
27eed923f   Mauro Carvalho Chehab   scripts/sphinx-pr...
347
348
349
  
  		check_missing_file("/usr/share/fonts/noto-cjk/NotoSansCJK-Regular.ttc",
  				   "fonts-noto-cjk", 2);
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
350
  	}
56e5a6339   Mauro Carvalho Chehab   scripts/sphinx-pr...
351
  	check_program("dvipng", 2) if ($pdf);
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
  	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...
367
368
369
370
  		"dot"			=> "graphviz",
  		"convert"		=> "ImageMagick",
  		"Pod::Usage"		=> "perl-Pod-Usage",
  		"xelatex"		=> "texlive-xetex-bin",
8e7d5d15e   Mauro Carvalho Chehab   sphinx-pre-instal...
371
  		"rsvg-convert"		=> "librsvg2-tools",
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
372
  	);
5d88953c3   Mauro Carvalho Chehab   sphinx-pre-instal...
373
374
375
  	my @fedora26_opt_pkgs = (
  		"graphviz-gd",		# Fedora 26: needed for PDF support
  	);
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
376
377
378
  	my @fedora_tex_pkgs = (
  		"texlive-collection-fontsrecommended",
  		"texlive-collection-latex",
27eed923f   Mauro Carvalho Chehab   scripts/sphinx-pr...
379
  		"texlive-xecjk",
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
380
381
382
383
  		"dejavu-sans-fonts",
  		"dejavu-serif-fonts",
  		"dejavu-sans-mono-fonts",
  	);
9b756a9d0   Mauro Carvalho Chehab   scripts/sphinx-pr...
384
385
386
  	#
  	# Checks valid for RHEL/CentOS version 7.x.
  	#
56e5a6339   Mauro Carvalho Chehab   scripts/sphinx-pr...
387
388
389
  	my $old = 0;
  	my $rel;
  	$rel = $1 if ($system_release =~ /release\s+(\d+)/);
b308467c9   Mauro Carvalho Chehab   scripts/sphinx-pr...
390
  	if (!($system_release =~ /Fedora/)) {
9b756a9d0   Mauro Carvalho Chehab   scripts/sphinx-pr...
391
  		$map{"virtualenv"} = "python-virtualenv";
9b756a9d0   Mauro Carvalho Chehab   scripts/sphinx-pr...
392

56e5a6339   Mauro Carvalho Chehab   scripts/sphinx-pr...
393
394
395
  		if ($rel && $rel < 8) {
  			$old = 1;
  			$pdf = 0;
5d88953c3   Mauro Carvalho Chehab   sphinx-pre-instal...
396

56e5a6339   Mauro Carvalho Chehab   scripts/sphinx-pr...
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
  			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...
415

27eed923f   Mauro Carvalho Chehab   scripts/sphinx-pr...
416
417
418
419
  	if ($pdf) {
  		check_missing_file("/usr/share/fonts/google-noto-cjk/NotoSansCJK-Regular.ttc",
  				   "google-noto-sans-cjk-ttc-fonts", 2);
  	}
56e5a6339   Mauro Carvalho Chehab   scripts/sphinx-pr...
420
421
422
  	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...
423
424
425
  	check_missing(\%map);
  
  	return if (!$need && !$optional);
9b756a9d0   Mauro Carvalho Chehab   scripts/sphinx-pr...
426

56e5a6339   Mauro Carvalho Chehab   scripts/sphinx-pr...
427
  	if (!$old) {
9b756a9d0   Mauro Carvalho Chehab   scripts/sphinx-pr...
428
429
430
431
432
433
434
435
436
437
438
439
  		# 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...
440
441
442
443
444
445
446
447
  }
  
  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...
448
449
450
451
  		"dot"			=> "graphviz",
  		"convert"		=> "ImageMagick",
  		"Pod::Usage"		=> "perl-Pod-Usage",
  		"xelatex"		=> "texlive-xetex-bin",
8e7d5d15e   Mauro Carvalho Chehab   sphinx-pre-instal...
452
  		"rsvg-convert"		=> "rsvg-view",
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
  	);
  
  	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...
471
  	$map{"latexmk"} = "texlive-latexmk-bin";
27eed923f   Mauro Carvalho Chehab   scripts/sphinx-pr...
472
473
474
475
  	# 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...
476
477
  	check_rpm_missing(\@suse_tex_pkgs, 2) if ($pdf);
  	check_missing_tex(2) if ($pdf);
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
478
479
480
481
482
483
484
485
  	check_missing(\%map);
  
  	return if (!$need && !$optional);
  	printf("You should run:
  
  \tsudo zypper install --no-recommends $install
  ");
  }
800d408a3   Mauro Carvalho Chehab   sphinx-pre-instal...
486
487
488
489
490
491
  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...
492
493
494
495
496
497
498
499
500
501
  		"dot"			=> "graphviz",
  		"convert"		=> "ImageMagick",
  		"Pod::Usage"		=> "perl-Pod-Usage",
  		"xelatex"		=> "texlive",
  		"rsvg-convert"		=> "librsvg2-tools",
  	);
  
  	my @tex_pkgs = (
  		"texlive-fontsextra",
  	);
353290a9e   Mauro Carvalho Chehab   scripts/sphinx-pr...
502
  	$map{"latexmk"} = "texlive-collection-basic";
27eed923f   Mauro Carvalho Chehab   scripts/sphinx-pr...
503
504
505
506
  	if ($pdf) {
  		check_missing_file("/usr/share/fonts/google-noto-cjk/NotoSansCJK-Regular.ttc",
  				   "google-noto-sans-cjk-ttc-fonts", 2);
  	}
56e5a6339   Mauro Carvalho Chehab   scripts/sphinx-pr...
507
  	check_rpm_missing(\@tex_pkgs, 2) if ($pdf);
800d408a3   Mauro Carvalho Chehab   sphinx-pre-instal...
508
509
510
511
512
513
514
515
  	check_missing(\%map);
  
  	return if (!$need && !$optional);
  	printf("You should run:
  
  \tsudo urpmi $install
  ");
  }
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
516
517
518
519
520
  sub give_arch_linux_hints()
  {
  	my %map = (
  		"sphinx_rtd_theme"	=> "python-sphinx_rtd_theme",
  		"virtualenv"		=> "python-virtualenv",
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
521
522
523
  		"dot"			=> "graphviz",
  		"convert"		=> "imagemagick",
  		"xelatex"		=> "texlive-bin",
8e7d5d15e   Mauro Carvalho Chehab   sphinx-pre-instal...
524
  		"rsvg-convert"		=> "extra/librsvg",
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
525
526
527
528
529
530
531
  	);
  
  	my @archlinux_tex_pkgs = (
  		"texlive-core",
  		"texlive-latexextra",
  		"ttf-dejavu",
  	);
56e5a6339   Mauro Carvalho Chehab   scripts/sphinx-pr...
532
  	check_pacman_missing(\@archlinux_tex_pkgs, 2) if ($pdf);
27eed923f   Mauro Carvalho Chehab   scripts/sphinx-pr...
533
534
535
536
  	if ($pdf) {
  		check_missing_file("/usr/share/fonts/noto-cjk/NotoSansCJK-Regular.ttc",
  				   "noto-fonts-cjk", 2);
  	}
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
537
538
539
540
541
542
543
544
545
546
547
548
549
550
  	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...
551
552
553
  		"dot"			=> "media-gfx/graphviz",
  		"convert"		=> "media-gfx/imagemagick",
  		"xelatex"		=> "dev-texlive/texlive-xetex media-fonts/dejavu",
8e7d5d15e   Mauro Carvalho Chehab   sphinx-pre-instal...
554
  		"rsvg-convert"		=> "gnome-base/librsvg",
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
555
556
557
  	);
  
  	check_missing_file("/usr/share/fonts/dejavu/DejaVuSans.ttf",
56e5a6339   Mauro Carvalho Chehab   scripts/sphinx-pr...
558
  			   "media-fonts/dejavu", 2) if ($pdf);
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
559

27eed923f   Mauro Carvalho Chehab   scripts/sphinx-pr...
560
561
562
563
  	if ($pdf) {
  		check_missing_file("/usr/share/fonts/noto-cjk/NotoSansCJKsc-Regular.otf",
  				   "media-fonts/noto-cjk", 2);
  	}
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
564
565
566
  	check_missing(\%map);
  
  	return if (!$need && !$optional);
bba1e4cbd   Mauro Carvalho Chehab   sphinx-pre-instal...
567
568
569
570
  
  	printf("You should run:
  
  ");
4ea96d57b   Mauro Carvalho Chehab   scripts/sphinx-pr...
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
  
  	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";
  
  	if (qx(cat $portage_imagemagick) ne "$imagemagick
  ") {
  		printf("\tsudo su -c 'echo \"$imagemagick\" > $portage_imagemagick'
  ")
  	}
  	if (qx(cat $portage_cairo) ne  "$cairo
  ") {
  		printf("\tsudo su -c 'echo \"$cairo\" > $portage_cairo'
  ");
  	}
bba1e4cbd   Mauro Carvalho Chehab   sphinx-pre-instal...
587
588
  	printf("\tsudo emerge --ask $install
  ");
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
589
590
591
592
593
594
595
596
597
  }
  
  sub check_distros()
  {
  	# Distro-specific hints
  	if ($system_release =~ /Red Hat Enterprise Linux/) {
  		give_redhat_hints;
  		return;
  	}
9b756a9d0   Mauro Carvalho Chehab   scripts/sphinx-pr...
598
599
600
601
602
603
604
605
606
607
608
609
  	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...
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
  	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...
626
627
628
629
  	if ($system_release =~ /Mageia/) {
  		give_mageia_hints;
  		return;
  	}
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
  	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...
646
  	check_missing_tex(2) if ($pdf);
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
  	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
  #
  
  sub check_needs()
  {
9b88ad546   Mauro Carvalho Chehab   scripts/sphinx-pr...
662
663
  	# Check for needed programs/tools
  	check_sphinx();
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
664
  	if ($system_release) {
9b88ad546   Mauro Carvalho Chehab   scripts/sphinx-pr...
665
666
667
  		print "Detected OS: $system_release.
  
  ";
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
668
  	} else {
9b88ad546   Mauro Carvalho Chehab   scripts/sphinx-pr...
669
670
671
  		print "Unknown OS
  
  ";
9b756a9d0   Mauro Carvalho Chehab   scripts/sphinx-pr...
672
  	}
9b88ad546   Mauro Carvalho Chehab   scripts/sphinx-pr...
673
674
675
  	print "To upgrade Sphinx, use:
  
  " if ($rec_sphinx_upgrade);
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
676
  	# Check for needed programs/tools
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
677
678
679
680
  	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...
681
682
  	check_program("dot", 1);
  	check_program("convert", 1);
56e5a6339   Mauro Carvalho Chehab   scripts/sphinx-pr...
683
684
685
686
687
  
  	# 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...
688
689
690
691
692
693
694
695
696
  
  	check_distros();
  
  	if ($need_symlink) {
  		printf "\tsudo ln -sf %s /usr/bin/sphinx-build
  
  ",
  		       which("sphinx-build-3");
  	}
77d09ad9d   Mauro Carvalho Chehab   scripts/sphinx-pr...
697
  	if ($need_sphinx || $rec_sphinx_upgrade) {
44f421651   Mauro Carvalho Chehab   scripts/sphinx-pr...
698
  		my $min_activate = "$ENV{'PWD'}/${virtenv_prefix}${min_version}/bin/activate";
9b88ad546   Mauro Carvalho Chehab   scripts/sphinx-pr...
699
  		my @activates = glob "$ENV{'PWD'}/${virtenv_prefix}*/bin/activate";
44f421651   Mauro Carvalho Chehab   scripts/sphinx-pr...
700

9b88ad546   Mauro Carvalho Chehab   scripts/sphinx-pr...
701
  		@activates = sort {$b cmp $a} @activates;
44f421651   Mauro Carvalho Chehab   scripts/sphinx-pr...
702

9b88ad546   Mauro Carvalho Chehab   scripts/sphinx-pr...
703
704
705
706
  		if ($need_sphinx && scalar @activates > 0 && $activates[0] ge $min_activate) {
  			printf "
  Need to activate a compatible Sphinx version on virtualenv with:
  ";
44f421651   Mauro Carvalho Chehab   scripts/sphinx-pr...
707
708
  			printf "\t. $activates[0]
  ";
9b88ad546   Mauro Carvalho Chehab   scripts/sphinx-pr...
709
  			exit (1);
5be33182d   Mauro Carvalho Chehab   sphinx-pre-instal...
710
  		} else {
44f421651   Mauro Carvalho Chehab   scripts/sphinx-pr...
711
  			my $rec_activate = "$virtenv_dir/bin/activate";
5be33182d   Mauro Carvalho Chehab   sphinx-pre-instal...
712
  			my $virtualenv = findprog("virtualenv-3");
800d408a3   Mauro Carvalho Chehab   sphinx-pre-instal...
713
  			$virtualenv = findprog("virtualenv-3.5") if (!$virtualenv);
5be33182d   Mauro Carvalho Chehab   sphinx-pre-instal...
714
715
716
717
718
  			$virtualenv = findprog("virtualenv") if (!$virtualenv);
  			$virtualenv = "virtualenv" if (!$virtualenv);
  
  			printf "\t$virtualenv $virtenv_dir
  ";
44f421651   Mauro Carvalho Chehab   scripts/sphinx-pr...
719
720
  			printf "\t. $rec_activate
  ";
fb947f3f4   Mauro Carvalho Chehab   sphinx-pre-instal...
721
722
  			printf "\tpip install -r $requirement_file
  ";
77d09ad9d   Mauro Carvalho Chehab   scripts/sphinx-pr...
723
724
  
  			$need++ if (!$rec_sphinx_upgrade);
5be33182d   Mauro Carvalho Chehab   sphinx-pre-instal...
725
  		}
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
726
727
728
  	}
  	printf "
  ";
54002b56b   Bjorn Helgaas   scripts/sphinx-pr...
729
730
  	print "All optional dependencies are met.
  " if (!$optional);
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
  
  	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...
753
754
  	} elsif ($arg eq "--version-check"){
  		$version_check = 1;
24071ac1a   Mauro Carvalho Chehab   scripts/sphinx-pr...
755
  	} else {
9b88ad546   Mauro Carvalho Chehab   scripts/sphinx-pr...
756
757
758
759
760
761
762
763
764
765
766
767
768
  		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...
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
  		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;
  $system_release = catcheck("/etc/issue") if !$system_release;
  $system_release =~ s/\s+$//;
  
  check_needs;