]>
Commit | Line | Data |
---|---|---|
1a4d82fc JJ |
1 | # Copyright 2013-2014 The Rust Project Developers. See the COPYRIGHT |
2 | # file at the top-level directory of this distribution and at | |
3 | # http://rust-lang.org/COPYRIGHT. | |
4 | # | |
5 | # Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or | |
6 | # http://www.apache.org/licenses/LICENSE-2.0> or the MIT license | |
7 | # <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your | |
8 | # option. This file may not be copied, modified, or distributed | |
9 | # except according to those terms. | |
10 | ||
11 | # Script parameters: | |
12 | # argv[1] = rust component root, | |
13 | # argv[2] = gcc component root, | |
14 | # argv[3] = target triple | |
15 | # The first two correspond to the two installable components defined in the setup script. | |
16 | ||
85aaf69f SL |
17 | import sys |
18 | import os | |
19 | import shutil | |
20 | import subprocess | |
21 | ||
1a4d82fc JJ |
22 | |
23 | def find_files(files, path): | |
24 | found = [] | |
25 | for fname in files: | |
26 | for dir in path: | |
27 | filepath = os.path.normpath(os.path.join(dir, fname)) | |
28 | if os.path.isfile(filepath): | |
29 | found.append(filepath) | |
30 | break | |
31 | else: | |
32 | raise Exception("Could not find '%s' in %s" % (fname, path)) | |
33 | return found | |
34 | ||
85aaf69f | 35 | |
1a4d82fc JJ |
36 | def make_win_dist(rust_root, gcc_root, target_triple): |
37 | # Ask gcc where it keeps its stuff | |
38 | gcc_out = subprocess.check_output(["gcc.exe", "-print-search-dirs"]) | |
39 | bin_path = os.environ["PATH"].split(os.pathsep) | |
40 | lib_path = [] | |
41 | for line in gcc_out.splitlines(): | |
42 | key, val = line.split(':', 1) | |
43 | if key == "programs": | |
44 | bin_path.extend(val.lstrip(' =').split(';')) | |
45 | elif key == "libraries": | |
46 | lib_path.extend(val.lstrip(' =').split(';')) | |
47 | ||
48 | target_tools = ["gcc.exe", "ld.exe", "ar.exe", "dlltool.exe", "windres.exe"] | |
49 | ||
50 | rustc_dlls = ["libstdc++-6.dll"] | |
51 | if target_triple.startswith("i686-"): | |
52 | rustc_dlls.append("libgcc_s_dw2-1.dll") | |
53 | else: | |
54 | rustc_dlls.append("libgcc_s_seh-1.dll") | |
55 | ||
56 | target_libs = [ # MinGW libs | |
57 | "crtbegin.o", | |
58 | "crtend.o", | |
59 | "crt2.o", | |
60 | "dllcrt2.o", | |
61 | "libgcc.a", | |
62 | "libgcc_eh.a", | |
63 | "libgcc_s.a", | |
64 | "libm.a", | |
65 | "libmingw32.a", | |
66 | "libmingwex.a", | |
67 | "libstdc++.a", | |
68 | "libiconv.a", | |
69 | "libmoldname.a", | |
70 | # Windows import libs | |
71 | "libadvapi32.a", | |
72 | "libbcrypt.a", | |
73 | "libcomctl32.a", | |
74 | "libcomdlg32.a", | |
75 | "libcrypt32.a", | |
76 | "libgdi32.a", | |
77 | "libimagehlp.a", | |
78 | "libiphlpapi.a", | |
79 | "libkernel32.a", | |
80 | "libmsvcrt.a", | |
81 | "libodbc32.a", | |
82 | "libole32.a", | |
83 | "liboleaut32.a", | |
84 | "libopengl32.a", | |
85 | "libpsapi.a", | |
86 | "librpcrt4.a", | |
87 | "libsetupapi.a", | |
88 | "libshell32.a", | |
89 | "libuser32.a", | |
85aaf69f | 90 | "libuserenv.a", |
1a4d82fc JJ |
91 | "libuuid.a", |
92 | "libwinhttp.a", | |
93 | "libwinmm.a", | |
94 | "libwinspool.a", | |
95 | "libws2_32.a", | |
96 | "libwsock32.a", | |
97 | ] | |
98 | ||
99 | # Find mingw artifacts we want to bundle | |
100 | target_tools = find_files(target_tools, bin_path) | |
101 | rustc_dlls = find_files(rustc_dlls, bin_path) | |
102 | target_libs = find_files(target_libs, lib_path) | |
103 | ||
104 | # Copy runtime dlls next to rustc.exe | |
105 | dist_bin_dir = os.path.join(rust_root, "bin") | |
106 | for src in rustc_dlls: | |
107 | shutil.copy(src, dist_bin_dir) | |
108 | ||
109 | # Copy platform tools to platform-specific bin directory | |
110 | target_bin_dir = os.path.join(gcc_root, "bin", "rustlib", target_triple, "bin") | |
111 | if not os.path.exists(target_bin_dir): | |
112 | os.makedirs(target_bin_dir) | |
113 | for src in target_tools: | |
114 | shutil.copy(src, target_bin_dir) | |
115 | ||
116 | # Copy platform libs to platform-specific lib directory | |
117 | target_lib_dir = os.path.join(gcc_root, "bin", "rustlib", target_triple, "lib") | |
118 | if not os.path.exists(target_lib_dir): | |
119 | os.makedirs(target_lib_dir) | |
120 | for src in target_libs: | |
121 | shutil.copy(src, target_lib_dir) | |
122 | ||
85aaf69f | 123 | if __name__ == "__main__": |
1a4d82fc | 124 | make_win_dist(sys.argv[1], sys.argv[2], sys.argv[3]) |