Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: zsh make(1) completion on FreeBSD



Guilherme Salazar wrote on Tue, Oct 11, 2016 at 20:27:14 -0300:
> Hi Daniel,
> 
> > I'd like to see this fixed but I'm not on FreeBSD right now.  Any chance
> > you could write a patch?  I think there are two approaches, either (a)
> > figure out what incantation of BSD make is equivalent to «gmake -nspf
> > $file», or (b) use the -d switch to ask make what are the targets,
> > variables, and other things that _make-parseMakefile extracts.
> 
> Baptiste (cc'ed) kindly sent me a patch he uses to get targets
> completion [1]. Using it and adding variable completion, I got to the
> following:
> 

Thanks, both of you.

> ````
> --- /usr/ports/shells/zsh/work/zsh-5.2/Completion/Unix/Command/_make
>  2015-08-08 14:51:33.000000000 -0300
> +++ /usr/local/share/zsh/5.2/functions/Completion/Unix/_make
> 2016-10-11 20:14:43.403084000 -0300
> @@ -268,7 +268,14 @@
>        else
>          case "$OSTYPE" in
>            freebsd*)
> -          _make-parseMakefile $PWD < <(_call_program targets
> "$words[1]" -nsp -f "$file" .PHONY 2> /dev/null)
> +          if [[ $words[1] == *'gmake'* ]]
> +          then
> +            args="-nsp"
> +          else
> +            args="-nsdg1Fstdout"
> +            TARGETS+=(${=${(f)"$(_call_program targets \"$words[1]\"
> -s -f "$file" -V.ALLTARGETS 2> /dev/null)"}})

The correct way to quote $words[1] would have been «${(q)words[1]}», but
elements of $words are already command-line quoted so they don't need to
be quoted again.  That is: just using $words[1] directly would be correct.
(modulo noglob, but don't worry about that)

Since the patch was broken by your mailer, I'm reincluding it here so
it's easier to review/apply.  (You can usually send patches as
attachments named *.txt to prevent munging and ensure a sane MIME type.)

workers@: I've added this to my list to review, but my list is quite full
nowadays, feel free to beat me to applying this.

Thanks again for the patch.

Cheers,

Daniel

(patch by Guilherme and bapt)
diff --git a/Completion/Unix/Command/_make b/Completion/Unix/Command/_make
index d10c8ee..de828bb 100644
--- a/Completion/Unix/Command/_make
+++ b/Completion/Unix/Command/_make
@@ -269,7 +269,14 @@ _make() {
       else
         case "$OSTYPE" in
           freebsd*)
-          _make-parseMakefile $PWD < <(_call_program targets "$words[1]" -nsp -f "$file" .PHONY 2> /dev/null)
+          if [[ $words[1] == *'gmake'* ]]
+          then
+            args="-nsp"
+          else
+            args="-nsdg1Fstdout"
+            TARGETS+=(${=${(f)"$(_call_program targets \"$words[1]\" -s -f "$file" -V.ALLTARGETS 2> /dev/null)"}})
+          fi
+          _make-parseMakefile $PWD < <(_call_program targets "$words[1]" $args -f "$file" .PHONY 2> /dev/null)
     ;;
     *)
           _make-parseMakefile $PWD < $file

> +          fi
> +          _make-parseMakefile $PWD < <(_call_program targets
> "$words[1]" $args -f "$file" .PHONY 2> /dev/null)
>      ;;
>      *)
>            _make-parseMakefile $PWD < $file
> ````
> 
> It works well for bmake without breaking gmake.
> 
> [1] https://people.freebsd.org/~bapt/_make.diff



Messages sorted by: Reverse Date, Date, Thread, Author