18 Star 39 Fork 1

mathmhb / Makefile

Create your Gitee Account
Explore and code with more than 12 million developers,Free private repositories !:)
Sign up
Clone or Download
Makefile.inc 9.98 KB
Copy Edit Raw Blame History
mathmhb authored 2024-04-05 18:17 . update Makefile.inc.
CFLAGS += $(C)
LDFLAGS += $(L)
ifeq ($(OS),Windows_NT)
lib.win=-lcomctl32 -lcomdlg32 -luser32 -lmsimg32 -lgdi32 -limm32 -lole32 -loleaut32 -lshell32 -lwinmm -lgdiplus -lversion -luuid
opt.win=-mwindows
use.win=1
ext.dll=.dll
ext.dlla=.dll.a
CCFLAGS += -D WIN32
ifeq ($(PROCESSOR_ARCHITEW6432),AMD64)
CCFLAGS += -D AMD64
else
ifeq ($(PROCESSOR_ARCHITECTURE),AMD64)
CCFLAGS += -D AMD64
endif
ifeq ($(PROCESSOR_ARCHITECTURE),x86)
CCFLAGS += -D IA32
endif
endif
else
UNAME_S := $(shell uname -s)
ext.dll=.so
ext.dlla=
ifeq ($(UNAME_S),Linux)
CCFLAGS += -D LINUX
endif
ifeq ($(UNAME_S),Darwin)
CCFLAGS += -D OSX
ext.dll=.dylib
USE_CLANG=1
endif
UNAME_P := $(shell uname -p)
ifeq ($(UNAME_P),x86_64)
CCFLAGS += -D AMD64
endif
ifneq ($(filter %86,$(UNAME_P)),)
CCFLAGS += -D IA32
endif
ifneq ($(filter arm%,$(UNAME_P)),)
CCFLAGS += -D ARM
endif
endif
ifeq (1,$(DEBUG))
CFLAGS+=-g
ifeq (1,$(USING_TCC))
CFLAGS+=-Og
endif
LDFLAGS+=-g
endif
CXXFLAGS += -std=c++14 -fpermissive
ifeq (1,$(USING_TCC))
LDFLAGS += -lm
else
CFLAGS += -O2
CFLAGS += -march=native
CFLAGS += -Wno-deprecated-declarations -Wno-narrowing
CFLAGS += -fPIC
##CFLAGS += -fomit-frame-pointer
CFLAGS += -ffunction-sections -fdata-sections
CFLAGS+=-D_POSIX -D_GLIBCXX_USE_CXX11_ABI=1
## CCFLAGS+=-DVTK_LEGACY_SILENT
LDFLAGS += $(if $(PROFILING),-pg)
LDFLAGS += $(if $(USE_CLANG),,-latomic)
LDFLAGS += $(if $(USE_CLANG),,-Wl,--gc-sections)
LDFLAGS+=-Wl,-rpath $(LIBDIR)
endif
##auto listing libs
BINDIR=$(USR)/bin
LIB64DIR=$(wildcard /usr/lib/x86_64-linux-gnu)
LIBDIR=$(if $(LIB64DIR),$(LIB64DIR),$(USR)/lib)
LOCDIR=$(USR)/local/lib
define LISTLIB0
$(subst .a,,$(subst $(3),,$(subst $(1)/lib, -l, $(wildcard $(1)/lib$(2)*$(3)))))
endef
define LISTLIB1
$(sort $(foreach e,.a $(ext.dll).a $(ext.dll),$(call LISTLIB0,$(1),$(2),$(e))))
endef
define LISTLIB
$(if $($(1).lib),-L$($(1).lib)) $(foreach w,$(foreach d,$($(1).lib) $(LIBDIR) $(LOCDIR) /opt/lib /opt/local/lib, $(call LISTLIB1,$(d),$(1))),$(basename $(w)))
endef
define LIBX
$(sort $(basename $(basename $(basename $(1)))))
endef
##$(call LISTLIB1,$(BINDIR),$(1))
##auto detectors
define CHECK
$(filter-out 0, $(words $(filter-out 0, $(strip $(shell $(GREP) $(1) $(2) )))))
endef
src:=$(wildcard *.c *.cpp *.cxx)
hdr:=$(wildcard *.h *.hpp)
lst:=$(notdir $(src))
CHECK_SCRIPT:=$(wildcard $(mkfile_dir)/check.sed)
ifneq (,$(CHECK_SCRIPT))
ifneq (,$(lst)$(hdr))
libs_used:=$(sort $(shell $(SED) -n -f $(CHECK_SCRIPT) $(lst)$(hdr)))
ifeq (1,$(USE_CLANG))
libs_used:=$(libs_used:openmp=omp)
endif
endif
else
use.ncnn:=$(call CHECK, ncnn,*.c* *.h*)
use.pdcurses:=$(call CHECK, curses,*.c* *.h*)
use.ncursesw:=$(call CHECK, ncurses,*.c* *.h*)
use.lua:=$(call CHECK, lua,*.c* *.h*)
use.opencv:=$(call CHECK, opencv,*.c* *.h*)
use.omp:=$(use.ncnn)$(call CHECK, omp.h,*.c* *.h*)
use.openmp:=$(use.omp)
use.mpi:=$(call CHECK, mpi.h,*.c* *.h*)
use.ppl:=$(call CHECK, ppl.h,*.c* *.h*)
use.tbb:=$(use.ppl)$(call CHECK, tbb,*.c* *.h*)
use.uuid:=$(call CHECK, uuid,*.c* *.h*)
use.pthread:=$(call CHECK, pthread,*.c* *.h*)
use.dl:=$(call CHECK, dlopen,*.c* *.h*)
use.lzo:=$(call CHECK, lzo,*.c* *.h*)
use.pcl:=$(call CHECK, pcl/,*.c* *.h*)
use.flann:=$(use.pcl)$(call CHECK, flann/,*.c* *.h*)
use.lept:=$(call CHECK, leptonica,*.c* *.h*)
use.tesseract:=$(call CHECK, tesseract,*.c* *.h*)
use.pcl:=$(call CHECK, pcl/,*.c* *.h*)
use.eigen:=$(use.pcl)$(call CHECK, Eigen,*.c* *.h*)
use.vtk:=$(use.pcl)$(call CHECK, vtk,*.c* *.h*)
use.qhull:=$(use.pcl)$(call CHECK, qhull,*.c* *.h*)
use.boost:=$(use.pcl)$(call CHECK, boost,*.c* *.h*)
use.python3:=$(use.boost)$(call CHECK, Python.h,*.c* *.h*)
use.fltk:=$(call CHECK, FL/,*.c* *.h*)
use.tk:=$(call CHECK, Tk_,*.c* *.h*)
use.Qt:=$(call CHECK, QApplication,*.c* *.h*)
use.util:=$(call CHECK, libutil.h,*.c* *.h*)
use.Xft:=$(call CHECK, Xft.h,*.c* *.h*)
use.X11:=$(call CHECK, X11/,*.c* *.h*)
use.win:=$(call CHECK, windows.h,*.c* *.h*)
libnames:=$(if $(USE_CLANG),omp,openmp) dl uuid tbb lzo eigen pcl flann vtk opencv fltk lept tesseract pthread boost qhull python3 Qt tk lua ncursesw ncnn mpi X11 win
libs_used:=$(foreach x,$(libnames),$(if $(use.$x),$x) )
endif
lib.omp=-L/opt/local/lib/libomp -lomp
lib.openmp=-fopenmp -lgomp
opt.omp=-I/opt/local/include/libomp/ -Xpreprocessor -fopenmp
opt.openmp=-fopenmp
#~ -fopt-info-vec-optimized -ftree-vectorizer-verbose=2
opt.qt=-I$(QT_TMP)
ifeq (,$(CHECK_SCRIPT))
lib.ncnn:=-lncnn
lib.pdcurses:=$(call LISTLIB,pdcurses) -lpdcurses
lib.ncursesw:=$(call LISTLIB,ncursesw) -lncursesw
lib.lua:=$(call LISTLIB,lua)
lib.qhull:=$(call LISTLIB,qhull)
lib.flann:=$(call LIBX,$(call LISTLIB,flann))
lib.pcl:= $(call LIBX,$(call LISTLIB,pcl))
lib.vtk:=$(call LISTLIB,vtk_)
lib.vtk:=$(foreach x,$(lib.vtk),$(if $(findstring Python3,$x),,$x))
lib.vtk:=$(foreach x,$(lib.vtk),$(if $(findstring Java,$x),,$x))
lib.vtk:=$(foreach x,$(lib.vtk),$(if $(findstring SQL,$x),,$x))
lib.opencv:=$(call LISTLIB,opencv)
lib.fltk:=$(call LISTLIB,fltk)
lib.tk:=$(call LISTLIB,tk)
lib.Qt:=$(call LISTLIB,Qt5)
lib.boost:=$(filter-out -lboost_python39-mt,$(call LISTLIB,boost))
lib.python3:=
#$(call LISTLIB,python3)
lib.lept=-llept
lib.tesseract=-ltesseract
lib.dl=-ldl
lib.tbb=-ltbb
lib.uuid=-luuid
lib.pthread=-lpthread
lib.lzo=-lminilzo
lib.mpi=-lmpi
lib.Xft=-lXft
lib.X11=-lX11
lib.util=-lutil
endif
## auto detect fltk fl files
fl_src:=$(wildcard *.fl)
fl_cxx:=$(patsubst %.fl,%.cxx,$(fl_src) )
fl_h:=$(patsubst %.fl,%.h,$(fl_src) )
fl_obj:=$(patsubst %.fl,%.o,$(fl_src) )
FLTK_GEN:=$(fl_cxx) $(fl_h) $(fl_obj)
## auto detect Qt ui files and qrc files
QT_TMP=qt_tmp/
ui_src:=$(wildcard *.ui)
qrc_src:=$(wildcard *.qrc)
moc_src:=$(shell $(GREP_FN) Q_OBJECT *.h*)
ui_gen:=$(patsubst %.ui,$(QT_TMP)ui_%.h,$(ui_src) )
qrc_gen:=$(patsubst %.qrc,$(QT_TMP)qrc_%.cpp,$(qrc_src) )
moc_gen:=$(patsubst %.h,$(QT_TMP)moc_%.cpp,$(patsubst %.hpp,$(QT_TMP)moc_%.cpp,$(moc_src) ))
qrc_obj:=$(patsubst %.cpp,%.o,$(qrc_gen) )
moc_obj:=$(patsubst %.cpp,%.o,$(moc_gen) )
QT_GEN:=$(ui_gen) $(qrc_gen) $(qrc_obj) $(moc_gen) $(moc_obj)
#CFLAGS+=-I$(USR)/include
INCS+=$(foreach d,. .. $(USR) /usr/local /opt/local,$(addprefix -I,$(wildcard $d/include)))
#LDFLAGS+=-L$(USR)/lib -L$(USR)/bin -L$(USR)/local/lib
LIBS+=$(foreach d,. .. $(USR) /usr/local /opt/local,$(addprefix -L,$(wildcard $d/lib)))
## compiler and linker settings
# INCS:=$(foreach x,$(libnames),$(if $(use.$x),$(inc.$x)) )
# INCS:=$(foreach x,$(libnames),$(if $(use.$x),$(addprefix -I,$($x.inc))) )
INCS+=$(foreach x,$(libs_used),$(opt.$x) $(addprefix -I,$(sort $($x.inc) $(foreach d,$(USR) /usr/local /opt/local, $(wildcard $d/include/$x)))) )
LIBS+=-Wl,--start-group
LIBS+=$(foreach x,$(libs_used),$(if $(lib.$x),$(lib.$x),) $(subst -llib,-l,$(addprefix -l,$(sort $($x.lib) $(foreach d,$(USR) $(USR)/i686-w64-mingw32 $(USR)/x86_64-w64-mingw32 /usr/local /opt/local, $(foreach z,$(wildcard $d/lib/lib$x.a $d/lib/lib$x$(ext.dll) $d/lib/lib$x$(ext.dlla)),$(basename $(basename $(notdir $z))) ) ) ))))
#~ LIBS:=$(foreach z,$(LIBS),$(foreach x,Python Java SQL,$(if $(findstring $x,$z),,$z)))
LIBS+=-Wl,--end-group
INCS:=$(strip $(INCS))
LIBS:=$(strip $(LIBS))
CFLAGS+=-I. -I.. -I$(QT_TMP) $(INCS)
LDFLAGS+=-L. -L.. $(LIBS)
## support multiple dirs
ifeq ($(SRCDIRS),)
SRCDIRS = .
endif
SRCEXTS = .c .C .cc .cpp .CPP .c++ .cxx .cp
HDREXTS = .h .H .hh .hpp .HPP .h++ .hxx .hp
SOURCES = $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(SRCEXTS))))
HEADERS = $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(HDREXTS))))
SRC_CXX = $(filter-out %.c,$(SOURCES))
OBJS = $(addsuffix .o, $(basename $(SOURCES)))
DEPS = $(OBJS:.o=.dep)
DEP_OPT=-MM -MP
DEPEND = $(CC) $(DEP_OPT) $(MY_CFLAGS) $(CFLAGS) $(CPPFLAGS)
DEPEND.dep = $(subst -g ,,$(DEPEND))
## auto detect source files and object files
jav:=$(wildcard *.java)
jav:=$(if $(FILE),$(filter $(FILE),$(jav)),$(jav))
md:=$(wildcard *.md *.mkd *.markdown)
md:=$(if $(FILE),$(filter $(FILE),$(md)),$(md))
tex:=$(wildcard *.tex)
tex:=$(if $(FILE),$(filter $(FILE),$(tex)),$(tex))
ifneq (,$(src))
obj:=$(patsubst %.cpp,%.o,$(lst) )
obj:=$(patsubst %.cxx,%.o,$(obj) )
obj:=$(patsubst %.c,%.o,$(obj) )
endif
## auto detect main program and libraries for output
ifneq (,$(jav))
main_class:=$(patsubst %.java,%.class,$(jav) )
endif
ifneq (,$(md))
main_html:=$(patsubst %.md,%.html,$(md) )
endif
ifneq (,$(tex))
#main_tex:=$(foreach file, $(tex), $(word 1,$(subst :, ,$(shell grep -H "documentclass" $(file)))))
main_tex:=$(shell $(GREP_FN) "documentclass" $(tex))
main_pdf:=$(patsubst %.tex,%.pdf,$(main_tex) )
endif
#main_src:=$(FILE)
ifneq (,$(lst))
ifeq (,$(main_src))
#main_src:=$(foreach file, $(src), $(word 1,$(subst :, ,$(shell grep -H "^.*[[:space:]]*main[[:space:]]*[^.[:alnum:]]" $(file)))))
main_src:=$(shell $(GREP_FN) "^[iv].*[[:space:]]*main[[:space:]]*[^.[:alnum:]]" $(src))
endif
ifeq (,$(main_src))
main_src:=$(shell $(GREP_FN) "^[[:space:]]*main[[:space:]]*[^.[:alnum:]]" $(src))
endif
ifeq (,$(main_src))
main_src:=$(shell $(GREP_FN) "^[iv].*^[[:space:]]*WinMain[[:space:]]*[^.[:alnum:]]" $(src))
endif
ifeq (,$(main_src))
main_src:=$(shell $(GREP_FN) "^[[:space:]]*WinMain[[:space:]]*[^.[:alnum:]]" $(src))
endif
main_obj:=$(patsubst %.cpp,%.o,$(main_src) )
main_obj:=$(patsubst %.cxx,%.o,$(main_obj) )
main_obj:=$(patsubst %.c,%.o,$(main_obj) )
EXE:=$(patsubst %.o,%,$(main_obj) )
EXES:=$(patsubst %.o,%$(EXE_EXT),$(main_obj) )
APP:=$(firstword $(EXE))
func_obj:=$(filter-out $(main_obj),$(obj))
DLL:=$(firstword $(patsubst %.o,%,$(func_obj) ))
DLLS:=$(foreach dll, $(DLL), lib$(DLL).a)
endif
other
1
https://gitee.com/imbit_mathmhb/Makefile.git
git@gitee.com:imbit_mathmhb/Makefile.git
imbit_mathmhb
Makefile
Makefile
master

Search