Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

Write a target that greps the Makefile itself and extracts the targets.


Then write a parser to regenerate all the targets! It's a good thing make is turing complete. :-)


As shown in the post, targets are not always grep-able. The post's makefile contained the target "par-30" even though that string appears nowhere on the page or in the makefile.

You need to write a full parser to discover all the targets.


    $ make -pqrf <(curl https://gist.githubusercontent.com/jgrahamc/2cc6df7fd5cd61c4d93f/raw/parallel) | grep '^[^ ]*:' | cut -d : -f 1
    par-%
    par-22
    par-30
    par-5
    par-27
    par-31
    all
    FORCE
    /proc/self/fd/13
    par-13
    par-9
    par-23
    par-19
    .SUFFIXES
    par-15
    par-7
    parallel
    par-29
    par-28
    .parallel
    par-4
    par-25
    par-6
    par-14
    .DEFAULT
    par-24
    par-0
    par
    par-1
    par-10
    par-16
    par-2
    par-11
    par-17
    par-20
    par-8
    par-21
    par-12
    par-26
    par-18
    par-3


Right, you used 'make' as the parser. He said "grep the makefile". You're not grepping the makefile. Nice solution though!


> You need to write a full parser to discover all the targets.

I don't think grep '^[^ ]*:' really counts as writing a parser.


Running "make -p" is running a full parser which someone else wrote. Grep is not extracting the targets from a makefile there, it's extracting the targets from an intermediate representation of a makefile.


> The real insanity with make is that it has no interface to check whether a Makefile contains a given target.

>

> Best you can do is to run make -n target to probe, but it's possible to write Makefiles that run code even though -n is used, which will defeat such probes at distribution scale. It quickly becomes an exercise in heuristics and output parsing.


We're arguing different things.

The comment I replied to, chaosfactors, specifically specified grepping the makefile. You're arguing that you can find all the targets and I never said you can't. I simply said you can't find them all by only grepping the makefile.


I usually add two targets for my my projects: 'help' and 'showconfig'. 'make help' explains which targets to use and/or how to combine them. 'make showconfig' shows all the important what the important internal vars and common vars (CFLAGS, LDFLAGS, etc) are and their values.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: