[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Makefile with out of source build Re: How to adding pathes to dependenci
From: |
ljh |
Subject: |
Makefile with out of source build Re: How to adding pathes to dependencies in rules of `.d` files |
Date: |
Sun, 5 Mar 2023 15:22:27 +0800 |
Updated. Suggestions are most welcome.
Thanks
---
# Makefile for top dir
# $(call makever,1.2.3)
# major.minor.patch
define makever
$(MAKE) -C $@ soname=lib$@.so.$(word 1,$(subst ., ,$(1)))
@ cp $(OBJDIR)/$@/$@ $(OBJDIR)/$@/lib$@.so.$(1)
@ cd $(OBJDIR)/$@; ln -f -s $(OBJDIR)/$@/lib$@.so.$(1) \
$(OBJDIR)/$@/lib$@.so.$(word 1,$(subst ., ,$(1))); cd ..
@ cd $(OBJDIR)/$@; ln -f -s $(OBJDIR)/$@/lib$@.so.$(1) \
$(OBJDIR)/$@/lib$@.so; 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 $@ $< # .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 $@ $< # .cpp
$(SUBDIR): ; mkdir -p $(SUBDIR)
-include $(SUBDIR)/*.d
clean : ; -rm -fr $(OBJDIR)
.PHONY : all clean