Makefile with out of source build Re: How to adding pathes to dependencies in rules of `.d` files

"ljh" <[email protected]>
Newsgroups gmane.comp.gnu.make.general
Message-ID <[email protected]>
Updated. Suggestions are most welcome.

Thanks

---


# Makefile for top dir

# $(call makever,1.2.3)
# major.minor.patch
define makever
  $(MAKE) -C $@ [email protected].$(word 1,$(subst ., ,$(1)))

  @ cp $(OBJDIR)/$@/$@ $(OBJDIR)/$@/[email protected].$(1)

  @ cd $(OBJDIR)/$@; ln -f -s $(OBJDIR)/$@/[email protected].$(1) \
    $(OBJDIR)/$@/[email protected].$(word 1,$(subst ., ,$(1))); cd ..

  @ cd $(OBJDIR)/$@; ln -f -s $(OBJDIR)/$@/[email protected].$(1) \
    $(OBJDIR)/$@/[email protected]; cd ..
endef

# make # BUILD_DIR=build
ifndef BUILD_DIR
export OBJDIR = $(abspath build)
else
export OBJDIR = $(abspath $(BUILD_DIR))
endif

SUBDIRS = main foo

all : $(SUBDIRS)
install : $(SUBDIRS)

main : foo
main : ; $(MAKE) -C $@
foo : ; $(call makever,1.2.3)

# make DESTDIR=~/foo install
install :
  install -d "$(DESTDIR)/usr/local/bin"
  install -d "$(DESTDIR)/usr/local/lib"
  install -m 0755 $(OBJDIR)/main/main "$(DESTDIR)/usr/local/bin"
  install -m 0755 $(OBJDIR)/foo/*.so* "$(DESTDIR)/usr/local/lib"

clean : ; -rm -fr $(OBJDIR)

.PHONY : $(SUBDIRS) all install clean


---


# Makefile for subdir

# build shared library with -fPIC, -shared
CFLAGS    = # -g -O3 -fPIC # CXXFLAGS for .cpp
CPPFLAGS  = -MMD -MP -I../foo
LDFLAGS   = -L$(OBJDIR)/foo # -shared
LDLIBS    = -lfoo
#CC       = $(CXX) # link with CXX for .cpp

LDFLAGS  += -Wl,-rpath,$(OBJDIR)/foo
LDFLAGS  += -Wl,-rpath,'$$ORIGIN/../lib'
#LDFLAGS += -Wl,-soname,$(soname)

# make # NDEBUG=1
ifdef NDEBUG
CPPFLAGS += -DNDEBUG
CFLAGS   += -O3 # .cpp
else
CFLAGS   += -g # .cpp
LDFLAGS  += -fsanitize=address
endif

SUBDIR    = $(OBJDIR)/main

all : $(SUBDIR)/main # $(SUBDIR)/foo

$(SUBDIR)/main : $(SUBDIR)/$(patsubst %.c,%.o,$(wildcard *.c))
  $(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@  # CXX for .cpp

$(SUBDIR)/%.o : %.c | $(SUBDIR)
  $(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $&lt;  # .cpp

$(SUBDIR): ; mkdir -p $(SUBDIR)

-include $(SUBDIR)/*.d

clean : ; -rm -fr $(OBJDIR)

.PHONY : all clean


---


# Makefile for subdir

# build shared library with -fPIC, -shared
CFLAGS    = -fPIC # -g -O3 # CXXFLAGS for .cpp
CPPFLAGS  = -MMD -MP # -I../bar
LDFLAGS   = -shared # -L$(OBJDIR)/bar
LDLIBS    = # -lbar
#CC       = $(CXX) # link with CXX for .cpp

LDFLAGS  += -Wl,-rpath,$(OBJDIR)/bar
LDFLAGS  += -Wl,-rpath,'$$ORIGIN/../lib'
LDFLAGS  += -Wl,-soname,$(soname)

# make # NDEBUG=1
ifdef NDEBUG
CPPFLAGS += -DNDEBUG
CFLAGS   += -O3 # .cpp
else
CFLAGS   += -g # .cpp
LDFLAGS  += -fsanitize=address
endif

SUBDIR    = $(OBJDIR)/foo

all : $(SUBDIR)/foo # $(SUBDIR)/bar

$(SUBDIR)/foo : $(SUBDIR)/$(patsubst %.c,%.o,$(wildcard *.c))
  $(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@  # CXX for .cpp

$(SUBDIR)/%.o : %.c | $(SUBDIR)
  $(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $&lt;  # .cpp

$(SUBDIR): ; mkdir -p $(SUBDIR)

-include $(SUBDIR)/*.d

clean : ; -rm -fr $(OBJDIR)

.PHONY : all clean
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.