1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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
84
85
86
87
88
89
90
91
92
93
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
|
#!/usr/bin/env python3
# External command, intended to be called with run_command(), custom_target(),
# meson.add_install_script() and meson.add_dist_script().
# argv[1] argv[2:]
# handle-built-files.py <subcommand> <xxx>...
import os
import sys
import shutil
import subprocess
from pathlib import Path
subcommand = sys.argv[1]
# Invoked from custom_target() in meson.build.
def build_from_m4():
# argv[2] argv[3] argv[4]
# <include_dir> <input_file> <output_file>
include_dir = sys.argv[2]
input_file = sys.argv[3]
output_file = sys.argv[4]
# Create the destination directory, if it does not exist.
output_dir = os.path.dirname(output_file)
os.makedirs(output_dir, exist_ok=True)
cmd = [
'm4',
'-I', include_dir,
input_file,
]
with open(output_file, mode='w') as output_file_obj:
return subprocess.run(cmd, stdout=output_file_obj).returncode
# Invoked from meson.add_install_script().
def install_built_h_files():
# argv[2] argv[3] argv[4:]
# <built_h_dir> <install_subdir> <built_h_files>...
# <built_h_dir> is an absolute path in the build directory or source directory.
# <install_subdir> is an installation directory, relative to {prefix}.
built_h_dir = sys.argv[2]
install_dir_root = os.path.join(os.getenv('MESON_INSTALL_DESTDIR_PREFIX'), sys.argv[3])
for file in sys.argv[4:]:
path_h = os.path.join(built_h_dir, file)
rel_dir = os.path.dirname(file)
if rel_dir:
install_dir = os.path.join(install_dir_root, rel_dir)
else:
install_dir = install_dir_root
print('Installing ', path_h, ' to ', install_dir)
# Create the installation directory, if it does not exist.
os.makedirs(install_dir, exist_ok=True)
# shutil.copy2() copies timestamps and some other file metadata.
shutil.copy2(path_h, install_dir)
return 0
# Invoked from meson.add_dist_script().
def dist_built_files(is_msvc_files=False):
# argv[2] argv[3] argv[4:]
# <built_h_cc_dir> <dist_dir> <built_files>...
# <built_h_cc_dir> is an absolute path in the build directory or source directory.
# <dist_dir> is a distribution directory, relative to MESON_DIST_ROOT.
built_h_cc_dir = sys.argv[2]
dist_dir_root = os.path.join(os.getenv('MESON_DIST_ROOT'), sys.argv[3])
dist_dir = dist_dir_root
# Distribute .h and .cc files built from .m4 files, or generated MSVC files.
for file in sys.argv[4:]:
if not is_msvc_files:
dist_dir = os.path.join(dist_dir_root, os.path.dirname(file))
# Create the distribution directory, if it does not exist.
os.makedirs(dist_dir, exist_ok=True)
shutil.copy(os.path.join(built_h_cc_dir, file), dist_dir)
return 0
# Invoked from run_command() in meson.build.
def copy_built_files():
# argv[2] argv[3] argv[4:]
# <from_dir> <to_dir> <file_names>...
# <from_dir> is an absolute or relative path of the directory to copy from.
# <to_dir> is an absolute or relative path of the directory to copy to.
from_dir_root = sys.argv[2]
to_dir_root = sys.argv[3]
# Copy some built files if they exist in from_dir, but not in the destination
# directory, or if they are not up to date in the destination directory.
# (The term "source directory" is avoided here, because from_dir might not
# be what Meson calls a source directory as opposed to a build directory.)
# Copy .h and .cc files built from .m4 files.
for file in sys.argv[4:]:
from_file = os.path.join(from_dir_root, file)
to_file = os.path.join(to_dir_root, file)
if os.path.isfile(from_file) and ((not os.path.isfile(to_file))
or (os.stat(from_file).st_mtime > os.stat(to_file).st_mtime)):
# Create the destination directory, if it does not exist.
os.makedirs(os.path.dirname(to_file), exist_ok=True)
shutil.copy(from_file, to_file)
return 0
# ----- Main -----
if subcommand == 'build_from_m4':
sys.exit(build_from_m4())
if subcommand == 'install_built_h_files':
sys.exit(install_built_h_files())
if subcommand == 'dist_built_files':
sys.exit(dist_built_files())
if subcommand == 'copy_built_files':
sys.exit(copy_built_files())
if subcommand == 'dist_gen_msvc_files':
sys.exit(dist_built_files(True))
print(sys.argv[0], ': illegal subcommand,', subcommand)
sys.exit(1)
|