Search code examples
linuxbashmakefiletab-completion

Broken tab completion on make under linux


I have no idea how tab completion works, but all of a sudden mine is broken. I don't even know what info to provide other than the use case. there is a target clean in the makefile.

$ make c<tab> results in

$ make c23:set: command not found lean

EDIT: I believe somehow I ruined the set bash built-in since man set says No manual entry for set and which set doesn't report anything. Invoking set on the terminal, however, produces result.

I'm using: GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu) and GNU Make 3.81


Solution

  • thanks to Etan's comment and Aaron's indication of where makefiles are, I managed to debug this.

    I ran set -x so I could track what was happening when doing the tab completion. The output of make c<tab> consists mostly of commands from the bash completion file for make, located at /usr/share/bash-completion/completions/make (1). However, I noticed the an inconsistency between the output and the file. Towards the end, the output said:

    + local mode=--
    + ((  COMP_TYPE != 9  ))
    ++ set +o
    ++ grep --colour=auto -n -F posix
    + local 'reset=23:set +o posix'
    + set +o posix
    

    Which I identified as corresponding to these lines from the file:

    if (( COMP_TYPE != 9 )); then
        mode=-d # display-only mode
    fi
    
    local reset=$( set +o | grep -F posix ); set +o posix # for <(...)
    

    So the output did a grep --colour=auto -n instead of just grep. Indeed, I had setup this alias for grep

    Make worked as soon as I removed the alias.

    I hope this helps others debug their problems.

    EDIT: I have submitted a bug report here: https://alioth.debian.org/tracker/index.php?func=detail&aid=315108&group_id=100114&atid=413095