diff --git a/mk/dist.mk b/mk/dist.mk index 4d86af37171..26169f3a13b 100644 --- a/mk/dist.mk +++ b/mk/dist.mk @@ -123,7 +123,7 @@ PKG_EXE = dist/$(PKG_NAME)-$(CFG_BUILD).exe $(PKG_EXE): rust.iss modpath.iss upgrade.iss LICENSE.txt rust-logo.ico \ $(CSREQ3_T_$(CFG_BUILD)_H_$(CFG_BUILD)) \ dist-prepare-win - $(CFG_PYTHON) $(S)src/etc/copy-runtime-deps.py tmp/dist/win/bin $(CFG_BUILD) + $(CFG_PYTHON) $(S)src/etc/make-win-dist.py tmp/dist/win $(CFG_BUILD) @$(call E, ISCC: $@) $(Q)"$(CFG_ISCC)" $< diff --git a/src/etc/copy-runtime-deps.py b/src/etc/copy-runtime-deps.py deleted file mode 100644 index fd829cd0ab7..00000000000 --- a/src/etc/copy-runtime-deps.py +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright 2013-2014 The Rust Project Developers. See the COPYRIGHT -# file at the top-level directory of this distribution and at -# http://rust-lang.org/COPYRIGHT. -# -# Licensed under the Apache License, Version 2.0 or the MIT license -# , at your -# option. This file may not be copied, modified, or distributed -# except according to those terms. - -# Copies Rust runtime dependencies to the specified directory. - -import snapshot, sys, os, shutil - -def copy_runtime_deps(dest_dir, triple): - for path in snapshot.get_winnt_runtime_deps(snapshot.get_platform(triple)): - shutil.copy(path, dest_dir) - - lic_dest = os.path.join(dest_dir, "third-party") - if os.path.exists(lic_dest): - shutil.rmtree(lic_dest) # copytree() won't overwrite existing files - shutil.copytree(os.path.join(os.path.dirname(__file__), "third-party"), lic_dest) - -copy_runtime_deps(sys.argv[1], sys.argv[2]) diff --git a/src/etc/make-win-dist.py b/src/etc/make-win-dist.py new file mode 100644 index 00000000000..bb9a112b7b2 --- /dev/null +++ b/src/etc/make-win-dist.py @@ -0,0 +1,82 @@ +# Copyright 2013-2014 The Rust Project Developers. See the COPYRIGHT +# file at the top-level directory of this distribution and at +# http://rust-lang.org/COPYRIGHT. +# +# Licensed under the Apache License, Version 2.0 or the MIT license +# , at your +# option. This file may not be copied, modified, or distributed +# except according to those terms. + +import sys, os, shutil, subprocess + +def find_files(files, path): + found = [] + for fname in files: + for dir in path: + filepath = os.path.normpath(os.path.join(dir, fname)) + if os.path.isfile(filepath): + found.append(filepath) + break + else: + raise Exception("Could not find '%s' in %s" % (fname, path)) + return found + +def make_win_dist(dist_root, target_triple): + # Ask gcc where it keeps its' stuff + gcc_out = subprocess.check_output(["gcc.exe", "-print-search-dirs"]) + bin_path = os.environ["PATH"].split(os.pathsep) + lib_path = [] + for line in gcc_out.splitlines(): + key, val = line.split(':', 1) + if key == "programs": + bin_path.extend(val.lstrip(' =').split(';')) + elif key == "libraries": + lib_path.extend(val.lstrip(' =').split(';')) + + target_tools = ["gcc.exe", "ld.exe", "ar.exe", "dlltool.exe", "windres.exe"] + + rustc_dlls = ["libstdc++-6.dll"] + if target_triple.startswith("i686-"): + rustc_dlls.append("libgcc_s_dw2-1.dll") + else: + rustc_dlls.append("libgcc_s_seh-1.dll") + + target_libs = ["crtbegin.o", "crtend.o", "crt2.o", "dllcrt2.o", + "libadvapi32.a", "libcrypt32.a", "libgcc.a", "libgcc_eh.a", "libgcc_s.a", + "libimagehlp.a", "libiphlpapi.a", "libkernel32.a", "libm.a", "libmingw32.a", + "libmingwex.a", "libmsvcrt.a", "libpsapi.a", "libshell32.a", "libstdc++.a", + "libuser32.a", "libws2_32.a", "libiconv.a", "libmoldname.a"] + + # Find mingw artifacts we want to bundle + target_tools = find_files(target_tools, bin_path) + rustc_dlls = find_files(rustc_dlls, bin_path) + target_libs = find_files(target_libs, lib_path) + + # Copy runtime dlls next to rustc.exe + dist_bin_dir = os.path.join(dist_root, "bin") + for src in rustc_dlls: + shutil.copy(src, dist_bin_dir) + + # Copy platform tools (and another copy of runtime dlls) to platform-spcific bin directory + target_bin_dir = os.path.join(dist_root, "bin", "rustlib", target_triple, "bin") + if not os.path.exists(target_bin_dir): + os.makedirs(target_bin_dir) + for src in target_tools: + shutil.copy(src, target_bin_dir) + + # Copy platform libs to platform-spcific lib directory + target_lib_dir = os.path.join(dist_root, "bin", "rustlib", target_triple, "lib") + if not os.path.exists(target_lib_dir): + os.makedirs(target_lib_dir) + for src in target_libs: + shutil.copy(src, target_lib_dir) + + # Copy license files + lic_dir = os.path.join(dist_root, "bin", "third-party") + if os.path.exists(lic_dir): + shutil.rmtree(lic_dir) # copytree() won't overwrite existing files + shutil.copytree(os.path.join(os.path.dirname(__file__), "third-party"), lic_dir) + +if __name__=="__main__": + make_win_dist(sys.argv[1], sys.argv[2]) diff --git a/src/etc/snapshot.py b/src/etc/snapshot.py index 24255c0cc5d..268b82bdca3 100644 --- a/src/etc/snapshot.py +++ b/src/etc/snapshot.py @@ -157,9 +157,9 @@ def get_winnt_runtime_deps(platform): path_dirs = os.environ["PATH"].split(os.pathsep) for name in deps: for dir in path_dirs: - matches = glob.glob(os.path.join(dir, name)) - if matches: - runtime_deps.append(matches[0]) + filepath = os.path.join(dir, name) + if os.path.isfile(filepath): + runtime_deps.append(filepath) break else: raise Exception("Could not find runtime dependency: %s" % name)