diff --git a/src/cmd/dist/a.h b/src/cmd/dist/a.h index b108572c0c..ace2ff60ad 100644 --- a/src/cmd/dist/a.h +++ b/src/cmd/dist/a.h @@ -150,3 +150,4 @@ int xstrlen(char*); char* xstrrchr(char*, int); char* xstrstr(char*, char*); char* xworkdir(void); +int xsamefile(char*, char*); diff --git a/src/cmd/dist/build.c b/src/cmd/dist/build.c index 8c813006ec..74100595c0 100644 --- a/src/cmd/dist/build.c +++ b/src/cmd/dist/build.c @@ -1564,7 +1564,7 @@ cmdbanner(int argc, char **argv) "Read and run ./sudo.bash to install the debuggers.\n"); } - if(!streq(goroot_final, goroot)) { + if(!xsamefile(goroot_final, goroot)) { xprintf("\n" "The binaries expect %s to be copied or moved to %s\n", goroot, goroot_final); diff --git a/src/cmd/dist/plan9.c b/src/cmd/dist/plan9.c index 8bbff1d24c..7482d970a4 100644 --- a/src/cmd/dist/plan9.c +++ b/src/cmd/dist/plan9.c @@ -742,4 +742,11 @@ xstrrchr(char *p, int c) return strrchr(p, c); } +// xsamefile returns whether f1 and f2 are the same file (or dir) +int +xsamefile(char *f1, char *f2) +{ + return streq(f1, f2); // suffice for now +} + #endif // PLAN9 diff --git a/src/cmd/dist/unix.c b/src/cmd/dist/unix.c index e38d5bcc0f..ff63556127 100644 --- a/src/cmd/dist/unix.c +++ b/src/cmd/dist/unix.c @@ -727,5 +727,12 @@ xstrrchr(char *p, int c) return strrchr(p, c); } +// xsamefile returns whether f1 and f2 are the same file (or dir) +int +xsamefile(char *f1, char *f2) +{ + return streq(f1, f2); // suffice for now +} + #endif // PLAN9 #endif // __WINDOWS__ diff --git a/src/cmd/dist/windows.c b/src/cmd/dist/windows.c index 90310cd28d..5fa9634919 100644 --- a/src/cmd/dist/windows.c +++ b/src/cmd/dist/windows.c @@ -925,4 +925,41 @@ xstrrchr(char *p, int c) return nil; } +// xsamefile returns whether f1 and f2 are the same file (or dir) +int +xsamefile(char *f1, char *f2) +{ + Rune *ru; + HANDLE fd1, fd2; + BY_HANDLE_FILE_INFORMATION fi1, fi2; + int r; + + // trivial case + if(streq(f1, f2)) + return 1; + + torune(&ru, f1); + // refer to ../../pkg/os/stat_windows.go:/sameFile + fd1 = CreateFileW(ru, 0, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); + xfree(ru); + if(fd1 == INVALID_HANDLE_VALUE) + return 0; + torune(&ru, f2); + fd2 = CreateFileW(ru, 0, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); + xfree(ru); + if(fd2 == INVALID_HANDLE_VALUE) { + CloseHandle(fd1); + return 0; + } + r = GetFileInformationByHandle(fd1, &fi1) != 0 && GetFileInformationByHandle(fd2, &fi2) != 0; + CloseHandle(fd2); + CloseHandle(fd1); + if(r != 0 && + fi1.dwVolumeSerialNumber == fi2.dwVolumeSerialNumber && + fi1.nFileIndexHigh == fi2.nFileIndexHigh && + fi1.nFileIndexLow == fi2.nFileIndexLow) + return 1; + return 0; +} + #endif // __WINDOWS__ diff --git a/src/make.bat b/src/make.bat index ec39392dd9..01c2dc4578 100644 --- a/src/make.bat +++ b/src/make.bat @@ -68,6 +68,9 @@ call env.bat del env.bat echo. +if x%1==x--dist-tool goto copydist +if x%2==x--dist-tool goto copydist + echo # Building compilers and Go bootstrap tool. set buildall=-a if x%1==x--no-clean set buildall= @@ -105,6 +108,11 @@ if x%1==x--no-banner goto nobanner goto end +:copydist +mkdir %GOTOOLDIR% 2>NUL +copy cmd\dist\dist.exe %GOTOOLDIR%\ +goto end + :fail set GOBUILDFAIL=1