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.




Consider applying for YC's Winter 2026 batch! Applications are open till Nov 10

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

Search: