@@ -233,12 +233,15 @@ func compileInDir(runcmd runCmd, dir string, flags []string, localImports bool,
233
233
return runcmd (cmd ... )
234
234
}
235
235
236
- func linkFile (runcmd runCmd , goname string ) (err error ) {
236
+ func linkFile (runcmd runCmd , goname string , ldflags [] string ) (err error ) {
237
237
pfile := strings .Replace (goname , ".go" , ".o" , - 1 )
238
238
cmd := []string {goTool (), "tool" , "link" , "-w" , "-o" , "a.exe" , "-L" , "." }
239
239
if * linkshared {
240
240
cmd = append (cmd , "-linkshared" , "-installsuffix=dynlink" )
241
241
}
242
+ if ldflags != nil {
243
+ cmd = append (cmd , ldflags ... )
244
+ }
242
245
cmd = append (cmd , pfile )
243
246
_ , err = runcmd (cmd ... )
244
247
return
@@ -324,6 +327,18 @@ func goDirFiles(longdir string) (filter []os.FileInfo, err error) {
324
327
325
328
var packageRE = regexp .MustCompile (`(?m)^package ([\p{Lu}\p{Ll}\w]+)` )
326
329
330
+ func getPackageNameFromSource (fn string ) (string , error ) {
331
+ data , err := ioutil .ReadFile (fn )
332
+ if err != nil {
333
+ return "" , err
334
+ }
335
+ pkgname := packageRE .FindStringSubmatch (string (data ))
336
+ if pkgname == nil {
337
+ return "" , fmt .Errorf ("cannot find package name in %s" , fn )
338
+ }
339
+ return pkgname [1 ], nil
340
+ }
341
+
327
342
// If singlefilepkgs is set, each file is considered a separate package
328
343
// even if the package names are the same.
329
344
func goDirPackages (longdir string , singlefilepkgs bool ) ([][]string , error ) {
@@ -335,19 +350,13 @@ func goDirPackages(longdir string, singlefilepkgs bool) ([][]string, error) {
335
350
m := make (map [string ]int )
336
351
for _ , file := range files {
337
352
name := file .Name ()
338
- data , err := ioutil .ReadFile (filepath .Join (longdir , name ))
339
- if err != nil {
340
- return nil , err
341
- }
342
- pkgname := packageRE .FindStringSubmatch (string (data ))
343
- if pkgname == nil {
344
- return nil , fmt .Errorf ("cannot find package name in %s" , name )
345
- }
346
- i , ok := m [pkgname [1 ]]
353
+ pkgname , err := getPackageNameFromSource (filepath .Join (longdir , name ))
354
+ check (err )
355
+ i , ok := m [pkgname ]
347
356
if singlefilepkgs || ! ok {
348
357
i = len (pkgs )
349
358
pkgs = append (pkgs , nil )
350
- m [pkgname [ 1 ] ] = i
359
+ m [pkgname ] = i
351
360
}
352
361
pkgs [i ] = append (pkgs [i ], name )
353
362
}
@@ -502,6 +511,7 @@ func (t *test) run() {
502
511
wantError := false
503
512
wantAuto := false
504
513
singlefilepkgs := false
514
+ setpkgpaths := false
505
515
localImports := true
506
516
f := strings .Fields (action )
507
517
if len (f ) > 0 {
@@ -540,6 +550,8 @@ func (t *test) run() {
540
550
wantError = false
541
551
case "-s" :
542
552
singlefilepkgs = true
553
+ case "-P" :
554
+ setpkgpaths = true
543
555
case "-n" :
544
556
// Do not set relative path for local imports to current dir,
545
557
// e.g. do not pass -D . -I . to the compiler.
@@ -765,16 +777,34 @@ func (t *test) run() {
765
777
t .err = err
766
778
return
767
779
}
780
+ // Split flags into gcflags and ldflags
781
+ ldflags := []string {}
782
+ for i , fl := range flags {
783
+ if fl == "-ldflags" {
784
+ ldflags = flags [i + 1 :]
785
+ flags = flags [0 :i ]
786
+ break
787
+ }
788
+ }
789
+
768
790
for i , gofiles := range pkgs {
769
- _ , err := compileInDir (runcmd , longdir , flags , localImports , gofiles ... )
791
+ pflags := []string {}
792
+ pflags = append (pflags , flags ... )
793
+ if setpkgpaths {
794
+ fp := filepath .Join (longdir , gofiles [0 ])
795
+ pkgname , serr := getPackageNameFromSource (fp )
796
+ check (serr )
797
+ pflags = append (pflags , "-p" , pkgname )
798
+ }
799
+ _ , err := compileInDir (runcmd , longdir , pflags , localImports , gofiles ... )
770
800
// Allow this package compilation fail based on conditions below;
771
801
// its errors were checked in previous case.
772
802
if err != nil && ! (wantError && action == "errorcheckandrundir" && i == len (pkgs )- 2 ) {
773
803
t .err = err
774
804
return
775
805
}
776
806
if i == len (pkgs )- 1 {
777
- err = linkFile (runcmd , gofiles [0 ])
807
+ err = linkFile (runcmd , gofiles [0 ], ldflags )
778
808
if err != nil {
779
809
t .err = err
780
810
return
0 commit comments