On Tue, Jul 26, 2022 at 11:57:04PM +0600, NRK wrote:
> On Mon, Jul 04, 2022 at 03:01:35PM +0600, NRK wrote:
> > currently, doing something like the following would fail to build:
> > 
> >     $ make CFLAGS="-O3 -march=native"
> > 
> > this is because CPPFLAGS get mangled with CFLAGS and so changing CFLAGS
> > kills the build.
> > 
> > similarly it's conventional to have library flags in LDLIBS, so that
> > user can change LDFLAGS to add "-flto" or other flags they might want
> > without the build unnecessarily failing.

This is not the reason the two variables exist; they have a different
meaning. LDLIBS is for libraries (eg. -lfoo /path/to/bar.a), which are
input files to be linked like objects, while LDFLAGS are for
flags/options (eg. -Lpath -Wl,--as-needed). Options goes before input
files; order matters for input files but not for (most) flags. So the
traditional link command is $(LD) $(LDFLAGS) $(OBJECTS) $(LDLIBS)

Users may want to override LDFLAGS, or LDLIBS, or both in some
situations. So its unrelated to user overrides. And I think it's the
same for CPPFLAGS vs CFLAGS: the distinction is there for makefiles that
run the preprocessor separately.

(What I like to do in my makefiles, is to first define default options
that are just preferences with "?=" (eg. CFLAGS ?= -O2 -march=native)
and then add the important options with "+=" (eg. CFLAGS += -I. -std=c89),
so a user can override only the defaults with "CFLAGS=... make" or
override the whole thing with "make CFLAGS=...". Here, it does not
matter much I think, since the user is supposed to edit config.mk to his
liking.)

> > ---
> > 
> > P.S: Could also drop `-std=c99` from CFLAGS and set CC to c99. But
> > didn't do that since it wasn't needed for my goal of being able to do
> > something like the following:
> > 
> >     $ make CFLAGS="-O3 -flto" LDFLAGS="-O3 -flto"
> > 
> >  Makefile  | 8 +++++---
> >  config.mk | 6 +++---
> >  2 files changed, 8 insertions(+), 6 deletions(-)
> > 
> > diff --git a/Makefile b/Makefile
> > index a03a95c..8d25ad0 100644
> > --- a/Makefile
> > +++ b/Makefile
> > @@ -11,11 +11,13 @@ all: options dmenu stest
> >  options:
> >     @echo dmenu build options:
> >     @echo "CFLAGS   = $(CFLAGS)"
> > +   @echo "CPPFLAGS = $(CPPFLAGS)"
> >     @echo "LDFLAGS  = $(LDFLAGS)"
> > +   @echo "LDLIBS   = $(LDLIBS)"
> >     @echo "CC       = $(CC)"
> >  
> >  .c.o:
> > -   $(CC) -c $(CFLAGS) $<
> > +   $(CC) -c $(CPPFLAGS) $(CFLAGS) $<
> >  
> >  config.h:
> >     cp config.def.h $@
> > @@ -23,10 +25,10 @@ config.h:
> >  $(OBJ): arg.h config.h config.mk drw.h
> >  
> >  dmenu: dmenu.o drw.o util.o
> > -   $(CC) -o $@ dmenu.o drw.o util.o $(LDFLAGS)
> > +   $(CC) -o $@ dmenu.o drw.o util.o $(LDFLAGS) $(LDLIBS)
> >  

I would put LDFLAGS before the object files.

> >  stest: stest.o
> > -   $(CC) -o $@ stest.o $(LDFLAGS)
> > +   $(CC) -o $@ stest.o $(LDFLAGS) $(LDLIBS)
> >  

(same here)

> >  clean:
> >     rm -f dmenu stest $(OBJ) dmenu-$(VERSION).tar.gz
> > diff --git a/config.mk b/config.mk
> > index b0bd246..a513b74 100644
> > --- a/config.mk
> > +++ b/config.mk
> > @@ -24,9 +24,9 @@ INCS = -I$(X11INC) -I$(FREETYPEINC)
> >  LIBS = -L$(X11LIB) -lX11 $(XINERAMALIBS) $(FREETYPELIBS)
> >  
> >  # flags
> > -CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700 
> > -D_POSIX_C_SOURCE=200809L -DVERSION=\"$(VERSION)\" $(XINERAMAFLAGS)
> > -CFLAGS   = -std=c99 -pedantic -Wall -Os $(INCS) $(CPPFLAGS)
> > -LDFLAGS  = $(LIBS)
> > +CPPFLAGS = $(INCS) -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700 
> > -D_POSIX_C_SOURCE=200809L -DVERSION=\"$(VERSION)\" $(XINERAMAFLAGS)
> > +CFLAGS   = -std=c99 -pedantic -Wall -Os
> > +LDLIBS   = $(LIBS)
> >  

Technically, only the -l flags should go there, the -L ones should go to
LDFLAGS.

> >  # compiler and linker
> >  CC = cc
> > -- 
> > 2.35.1
> > 
> > 
> 
> Any comment on this? Or any specific reason for deviating from the
> conventional approach and mangling `CFLAGS` and `CPPFLAGS`?
> 
> - NRK
> 

Other than my comments on link flags, the patch looks good.

Reply via email to