当前位置: 首页 > news >正文

更换网站模板网上推销产品去什么平台

更换网站模板,网上推销产品去什么平台,帮忙做宴会的网站,网络公司给我做网站我有没有源代码版权吗?PG16 PG中使用的makefile看起来代码比较多,但是实际逻辑比较简单,这里做一些抽象总结。 总结 Makefile.global.in的$(recurse)宏自动生成了target,可以方便的进入内存目录进行编译。 all: all-common-recurse all-common-recurse: submak…

PG16

PG中使用的makefile看起来代码比较多,但是实际逻辑比较简单,这里做一些抽象总结。

总结

  1. Makefile.global.in的$(recurse)宏自动生成了target,可以方便的进入内存目录进行编译。
all: all-common-recurse
all-common-recurse:  submake-generated-headersMAKE -C common allall: all-backend-recurse
all-backend-recurse:  submake-generated-headersMAKE -C backend allinstall: install-common-recurse
install-common-recurse:  submake-generated-headersMAKE -C common installinstall: install-backend-recurse
install-backend-recurse:  submake-generated-headersMAKE -C backend installcheck: check-common-recurse
check-common-recurse:  submake-generated-headers  temp-installMAKE -C common checkcheck: check-backend-recurse
check-backend-recurse:  submake-generated-headers  temp-installMAKE -C backend check
  1. Makefile.global.in同时定义了对.o合.bc文件的生成规则:
%.o : %.c@if test ! -d $(DEPDIR); then mkdir -p $(DEPDIR); fi$(COMPILE.c) -o $@ $< -MMD -MP -MF $(DEPDIR)/$(*F).Po%.o : %.cpp@if test ! -d $(DEPDIR); then mkdir -p $(DEPDIR); fi$(COMPILE.cc) -o $@ $< -MMD -MP -MF $(DEPDIR)/$(*F).Po%.bc : %.c$(COMPILE.c.bc) -o $@ $<%.bc : %.cpp$(COMPILE.cxx.bc) -o $@ $<
  1. 在最内层目录的Makefile定义了OBJS例如:OBJS=aset.o mcxt.o ...,然后调用common.mk文件,对OBJS中的每一个元素进行隐式编译,common.mk:
    在这里插入图片描述
    简化版内层Makefile:
OBJS = aset.o mcxt.o# 没有OBJS生成规则,make隐式生成.o文件,调用上面定义的%.o : %.c规则
objfiles.txt: $(OBJS)# echo or touch objfiles
  1. 如果打开了llvm,简化版内层Makefile:
OBJS = aset.o mcxt.o# 没有aset.bc mcxt.bc生成规则,make隐式生成.bc文件,调用上面定义的%.bc : %.c规则。
objfiles.txt: $(patsubst %.o,%.bc, $(OBJS))     ## objfiles.txt: aset.bc mcxt.bc
# 没有OBJS生成规则,make隐式生成.o文件,调用上面定义的%.o : %.c规则
$(patsubst %.o,%.bc, $(OBJS)): $(OBJS)          ## aset.bc mcxt.bc: aset.o mcxt.o

1 执行make后发生了什么?

简单工程中的makefile中可以看到很多target,依赖关系一般也比较直接,例如下面例子中:

OrcV2CBindingsAddObjectFile 依赖 OrcV2CBindingsAddObjectFile.o 依赖 OrcV2CBindingsAddObjectFile.c

all: __BUILD_DIR \$(BUILD_DIR)/OrcV2CBindingsAddObjectFile \$(BUILD_DIR)/OrcV2CBindingsBasicUsage.PHONY: __BUILD_DIR$(BUILD_DIR)/OrcV2CBindingsAddObjectFile: $(BUILD_DIR)/OrcV2CBindingsAddObjectFile.o${CXX} $< ${CXXFLAGS} ${LLVM_LD_FLAGS} -o $@ 
$(BUILD_DIR)/OrcV2CBindingsAddObjectFile.o: OrcV2CBindingsAddObjectFile.c${CC} -c $< ${CFLAGS} ${LLVM_CC_FLAGS} -o $@

但打开PG根目录下的Makefile:

subdir = src
top_builddir = ..
include Makefile.globalSUBDIRS = \common \port \timezone \backend \backend/utils/mb/conversion_procs \backend/snowball \include \interfaces \backend/replication/libpqwalreceiver \backend/replication/pgoutput \fe_utils \bin \pl \makefiles \test/regress \test/isolation \test/perlifeq ($(with_llvm), yes)
SUBDIRS += backend/jit/llvm
endif# There are too many interdependencies between the subdirectories, so
# don't attempt parallel make here.
.NOTPARALLEL:$(recurse)...
...
  • 看不到target信息,代码的可读性比较差,因为所有target都是生成的。优点是target动态生成,代码量少,比较灵活。
  • 所有的细节都封装在$(recurse)中,具体在Makefile.global.in中定义。

2 Makefile.global.in

截取关键代码:


standard_targets = all install installdirs uninstall distprep clean distclean maintainer-clean coverage check checkprep installcheck init-po update-po
# these targets should recurse even into subdirectories not being built:
standard_always_targets = distprep clean distclean maintainer-clean.PHONY: $(standard_targets) install-strip html man installcheck-parallel update-unicode# make `all' the default target
all:##########################################################################
#
# Programs and flags# CompilersCPP = @CPP@
CPPFLAGS = @CPPFLAGS@
PG_SYSROOT = @PG_SYSROOT@override CPPFLAGS := $(ICU_CFLAGS) $(CPPFLAGS)ifdef PGXS
override CPPFLAGS := -I$(includedir_server) -I$(includedir_internal) $(CPPFLAGS)
else # not PGXS
override CPPFLAGS := -I$(top_srcdir)/src/include $(CPPFLAGS)
ifdef VPATH
override CPPFLAGS := -I$(top_builddir)/src/include $(CPPFLAGS)
endif
endif # not PGXSCC = @CC@
GCC = @GCC@
SUN_STUDIO_CC = @SUN_STUDIO_CC@
CXX = @CXX@
CFLAGS = @CFLAGS@
CFLAGS_SL = @CFLAGS_SL@
# *_MODULE are for flags applied to extension libraries
CFLAGS_SL_MODULE = @CFLAGS_SL_MODULE@
CXXFLAGS_SL_MODULE = @CXXFLAGS_SL_MODULE@
CFLAGS_UNROLL_LOOPS = @CFLAGS_UNROLL_LOOPS@
CFLAGS_VECTORIZE = @CFLAGS_VECTORIZE@
CFLAGS_CRC = @CFLAGS_CRC@
PERMIT_DECLARATION_AFTER_STATEMENT = @PERMIT_DECLARATION_AFTER_STATEMENT@
CXXFLAGS = @CXXFLAGS@LLVM_CPPFLAGS = @LLVM_CPPFLAGS@
LLVM_CFLAGS = @LLVM_CFLAGS@
LLVM_CXXFLAGS = @LLVM_CXXFLAGS@# Kind-of compilersBISON = @BISON@
BISONFLAGS = @BISONFLAGS@ $(YFLAGS)
FLEX = @FLEX@
FLEXFLAGS = @FLEXFLAGS@ $(LFLAGS)
DTRACE = @DTRACE@
DTRACEFLAGS = @DTRACEFLAGS@
ZIC = @ZIC@# LinkingAR = @AR@
AROPT = crs
LIBS = @LIBS@
LDAP_LIBS_FE = @LDAP_LIBS_FE@
LDAP_LIBS_BE = @LDAP_LIBS_BE@
UUID_LIBS = @UUID_LIBS@
LLVM_LIBS=@LLVM_LIBS@# Tree-wide build supportall install check installcheck: submake-generated-headers.PHONY: submake-generated-headerssubmake-generated-headers:
ifndef NO_GENERATED_HEADERS
ifeq ($(MAKELEVEL),0)$(MAKE) -C $(top_builddir)/src/backend generated-headers
endif
endif##########################################################################
#
# Recursive make supportdefine _create_recursive_target
.PHONY: $(1)-$(2)-recurse
$(1): $(1)-$(2)-recurse
$(1)-$(2)-recurse: $(if $(filter all install check installcheck, $(3)), submake-generated-headers) $(if $(filter check, $(3)), temp-install)$$(MAKE) -C $(2) $(3)
endefrecurse = $(foreach target,$(if $1,$1,$(standard_targets)),$(foreach subdir,$(if $2,$2,$(SUBDIRS)),$(eval $(call 

在最后面我们看到了recurse的定义:
recurse = $(foreach target,$(if $1,$1,$(standard_targets)),$(foreach subdir,$(if $2,$2,$(SUBDIRS)),$(eval $(call _create_recursive_target,$(target),$(subdir),$(if $3,$3,$(target))))))
这里调用了_create_recursive_target函数来生成所有目录的target。

PG的例子太复杂,这里抽象出来一个最小用例来继续分析。

3 $(recurse)最小DEMO

Makefile


subdir = src
top_builddir = ..
include Makefile.globalSUBDIRS = \common \port \timezone \backend$(recurse)

Makefile.global


standard_targets = all install check
.PHONY: $(standard_targets)all:###############################
all install check installcheck: submake-generated-headers.PHONY: submake-generated-headerssubmake-generated-headers:
ifndef NO_GENERATED_HEADERS
ifeq ($(MAKELEVEL),0)$(info ------------GENERATEHEADERS------------)
endif
endif###############################
define _create_recursive_target
.PHONY: $(1)-$(2)-recurse
$(1): $(1)-$(2)-recurse
$(1)-$(2)-recurse: $(if $(filter all install check installcheck, $(3)), submake-generated-headers) $(if $(filter check, $(3)), temp-install)$(info ------------GENERATE TATGETS------------)$(info $$1: $1, $$2: $2, $$3: $3)$(info $(1): $(1)-$(2)-recurse)$(info $(1)-$(2)-recurse: $(if $(filter all install check installcheck, $(3)), submake-generated-headers) $(if $(filter check, $(3)), temp-install))$(info MAKE -C $(2) $(3))$$(MAKE) -C $(2) $(3)
endefrecurse = $(foreach target,$(if $1,$1,$(standard_targets)),$(foreach subdir,$(if $2,$2,$(SUBDIRS)),$(eval $(call _create_recursive_target,$(target),$(subdir),$(if $3,$3,$(target))))))# recurse = \
#     $(foreach target,$(if $1,$1,$(standard_targets)),\
#         $(foreach subdir,$(if $2,$2,$(SUBDIRS)),\
#             $(eval $(call _create_recursive_target,$(target),$(subdir),$(if $3,$3,$(target))))\
#         )\
#     )

执行结果:
在这里插入图片描述

4 $(recurse)最小DEMO结果分析

recurse = $(foreach target,$(if $1,$1,$(standard_targets)),$(foreach subdir,$(if $2,$2,$(SUBDIRS)),$(eval $(call _create_recursive_target,$(target),$(subdir),$(if $3,$3,$(target))))))

展开后

recurse = \$(foreach target,$(if $1,$1,$(standard_targets)),\$(foreach subdir,$(if $2,$2,$(SUBDIRS)),\$(eval $(call _create_recursive_target,$(target),$(subdir),$(if $3,$3,$(target))))\)\)
  • 外层循环遍历standard_targets = all install check,也就是PG定义的所有make指令,需要为每个指令定义target。
  • 内层循环遍历SUBDIRS = common backend,这个是Makefile中定义的,也就是谁include Makefile.global,谁负责定义好SUBDIRS。表示当前目录下,哪些子目录需要进行编译。

调用_create_recursive_target函数,为makefile动态定义target:

define _create_recursive_target
.PHONY: $(1)-$(2)-recurse
$(1): $(1)-$(2)-recurse
$(1)-$(2)-recurse: $(if $(filter all install check installcheck, $(3)), submake-generated-headers) $(if $(filter check, $(3)), temp-install)$$(MAKE) -C $(2) $(3)
endef

函数执行后,生成一系列target,两个小细节:

  • 如果target是all install check installcheck集中情况,需要增加submake-generated-headers依赖,这个是生成头文件的,PG的一些头文件是编译时生成出来的。
  • 如果target是check,需要增加temp-install依赖,temp-install是负责regress测试的target。
all: all-common-recurse
all-common-recurse:  submake-generated-headersMAKE -C common allall: all-backend-recurse
all-backend-recurse:  submake-generated-headersMAKE -C backend allinstall: install-common-recurse
install-common-recurse:  submake-generated-headersMAKE -C common installinstall: install-backend-recurse
install-backend-recurse:  submake-generated-headersMAKE -C backend installcheck: check-common-recurse
check-common-recurse:  submake-generated-headers  temp-installMAKE -C common checkcheck: check-backend-recurse
check-backend-recurse:  submake-generated-headers  temp-installMAKE -C backend check

5 继续完善demo

  • 前面提到的demo只构造了target,并没有真正编译.c文件。
  • 继续增加了.c文件编译到.o的部分。
$ tree
.
├── common
│   ├── aset.c
│   └── Makefile
├── common.mk
├── Makefile
└── Makefile.global1 directory, 5 files

common/Makefile

subdir = src/backend/utils/mmgr
top_builddir = ../../../..
include ../Makefile.globalOBJS = \aset.oinclude ../common.mk

common.mk

subsysfilename = objfiles.txtifneq ($(subdir), src/backend)
all: $(subsysfilename)
endifobjfiles.txt: $(OBJS)$(if $(filter-out $(OBJS),$?),( $(if $(SUBDIROBJS),cat $(SUBDIROBJS); )echo $(addprefix $(subdir)/,$(OBJS)) ) >$@,touch $@)

Makefile


subdir = src
top_builddir = ..
include Makefile.globalSUBDIRS = \common \backend$(recurse)

Makefile.global


standard_targets = all install check
.PHONY: $(standard_targets)all:###############################
all install check installcheck: submake-generated-headers.PHONY: submake-generated-headerssubmake-generated-headers:
ifndef NO_GENERATED_HEADERS
ifeq ($(MAKELEVEL),0)$(info ------------GENERATEHEADERS------------)
endif
endif###############################
define _create_recursive_target
.PHONY: $(1)-$(2)-recurse
$(1): $(1)-$(2)-recurse
$(1)-$(2)-recurse: $(if $(filter all install check installcheck, $(3)), submake-generated-headers) $(if $(filter check, $(3)), temp-install)$(info ------------GENERATE TATGETS------------)$(info $$1: $1, $$2: $2, $$3: $3)$(info $(1): $(1)-$(2)-recurse)$(info $(1)-$(2)-recurse: $(if $(filter all install check installcheck, $(3)), submake-generated-headers) $(if $(filter check, $(3)), temp-install))$(info MAKE -C $(2) $(3))$$(MAKE) -C $(2) $(3)
endefrecurse = $(foreach target,$(if $1,$1,$(standard_targets)),$(foreach subdir,$(if $2,$2,$(SUBDIRS)),$(eval $(call _create_recursive_target,$(target),$(subdir),$(if $3,$3,$(target))))))# recurse = \
#     $(foreach target,$(if $1,$1,$(standard_targets)),\
#         $(foreach subdir,$(if $2,$2,$(SUBDIRS)),\
#             $(eval $(call _create_recursive_target,$(target),$(subdir),$(if $3,$3,$(target))))\
#         )\
#     )

这里主要需要关注的就是common.mk。每个源码目录中都有一些文件需要编译,所以都需要配一个Makefile,这些Makefile中相同的逻辑抽取到了common.mk中。

objfiles.txt: $(OBJS)......

注意这里OBJS = aset.o,这里makefile构造objfiles.txt依赖aset.o,而aset.o触发了Makefile的隐式规则,会自动从aset.c编译为aset.o。

除了规则外,具体的编译方法也可以在Makefile中定义,例如PG的makefile.global.in中定义了对.o文件的处理方法。

%.o : %.c@if test ! -d $(DEPDIR); then mkdir -p $(DEPDIR); fi$(COMPILE.c) -o $@ $< -MMD -MP -MF $(DEPDIR)/$(*F).Po%.o : %.cpp@if test ! -d $(DEPDIR); then mkdir -p $(DEPDIR); fi$(COMPILE.cc) -o $@ $< -MMD -MP -MF $(DEPDIR)/$(*F).Po

llvm支持:common.mk中还有一段,如果打开了llvm后,objfiles.txt会同时依赖.o和.bc文件。

ifeq ($(with_llvm), yes)
objfiles.txt: $(patsubst %.o,%.bc, $(OBJS))
$(patsubst %.o,%.bc, $(OBJS)): $(OBJS)
endif

在makefile.global.in中也定义了对.bc文件的处理方法:

%.bc : %.c$(COMPILE.c.bc) -o $@ $<%.bc : %.cpp$(COMPILE.cxx.bc) -o $@ $<

文章转载自:
http://dinncoruth.wbqt.cn
http://dinncomouthbreeder.wbqt.cn
http://dinncogametangium.wbqt.cn
http://dinncozippy.wbqt.cn
http://dinncoameloblast.wbqt.cn
http://dinncophillumenist.wbqt.cn
http://dinncoreprovision.wbqt.cn
http://dinncoautodidact.wbqt.cn
http://dinncocardinal.wbqt.cn
http://dinncoteether.wbqt.cn
http://dinncorightie.wbqt.cn
http://dinncodanielle.wbqt.cn
http://dinncocranialgia.wbqt.cn
http://dinncoplacet.wbqt.cn
http://dinncoragger.wbqt.cn
http://dinncotexturology.wbqt.cn
http://dinncoacetanilide.wbqt.cn
http://dinncoheptode.wbqt.cn
http://dinncojambalaya.wbqt.cn
http://dinncognomology.wbqt.cn
http://dinncoconstituent.wbqt.cn
http://dinncolancashire.wbqt.cn
http://dinncoexsuction.wbqt.cn
http://dinncocyperaceous.wbqt.cn
http://dinncomodernisation.wbqt.cn
http://dinncoirreligiously.wbqt.cn
http://dinncoserve.wbqt.cn
http://dinncosubjoin.wbqt.cn
http://dinncoduodecimo.wbqt.cn
http://dinncomarine.wbqt.cn
http://dinncobema.wbqt.cn
http://dinncogertie.wbqt.cn
http://dinncoantefix.wbqt.cn
http://dinncospeedlamp.wbqt.cn
http://dinncobat.wbqt.cn
http://dinncotumbler.wbqt.cn
http://dinncosupraconscious.wbqt.cn
http://dinncoscepsis.wbqt.cn
http://dinncoclavioline.wbqt.cn
http://dinncoirony.wbqt.cn
http://dinncojundy.wbqt.cn
http://dinncofavonian.wbqt.cn
http://dinncocedi.wbqt.cn
http://dinncocaseous.wbqt.cn
http://dinncorheumatology.wbqt.cn
http://dinncosnippersnapper.wbqt.cn
http://dinncosublessee.wbqt.cn
http://dinncorussophil.wbqt.cn
http://dinncouteri.wbqt.cn
http://dinncoarginine.wbqt.cn
http://dinncoplanify.wbqt.cn
http://dinncoskullfish.wbqt.cn
http://dinncotiter.wbqt.cn
http://dinncorubbishy.wbqt.cn
http://dinncointerest.wbqt.cn
http://dinncounnecessary.wbqt.cn
http://dinncofloppy.wbqt.cn
http://dinncoconservatize.wbqt.cn
http://dinncosemipalmate.wbqt.cn
http://dinncoembezzler.wbqt.cn
http://dinnconematocide.wbqt.cn
http://dinncohaemorrhage.wbqt.cn
http://dinncochurchless.wbqt.cn
http://dinncothisbe.wbqt.cn
http://dinncodjawa.wbqt.cn
http://dinncokinswoman.wbqt.cn
http://dinncoawkwardness.wbqt.cn
http://dinncoalec.wbqt.cn
http://dinncovinny.wbqt.cn
http://dinncoaddax.wbqt.cn
http://dinncolakelet.wbqt.cn
http://dinncoextrovert.wbqt.cn
http://dinncogangliform.wbqt.cn
http://dinncoflq.wbqt.cn
http://dinncoloudmouthed.wbqt.cn
http://dinncoemergence.wbqt.cn
http://dinncosemiprivate.wbqt.cn
http://dinncoyetta.wbqt.cn
http://dinncopostproduction.wbqt.cn
http://dinncohypophoria.wbqt.cn
http://dinncospecktioneer.wbqt.cn
http://dinncolitchi.wbqt.cn
http://dinncoumpteen.wbqt.cn
http://dinncobackyard.wbqt.cn
http://dinncoslowish.wbqt.cn
http://dinncofrilling.wbqt.cn
http://dinncoinelegance.wbqt.cn
http://dinncoencephaloma.wbqt.cn
http://dinncoretina.wbqt.cn
http://dinncohypothesis.wbqt.cn
http://dinncotriglyceride.wbqt.cn
http://dinncooverstowage.wbqt.cn
http://dinncohydrometallurgical.wbqt.cn
http://dinncoesoteric.wbqt.cn
http://dinncotheatregoing.wbqt.cn
http://dinncoquadrature.wbqt.cn
http://dinncoexceed.wbqt.cn
http://dinnconeedlebook.wbqt.cn
http://dinncostridence.wbqt.cn
http://dinncohonoria.wbqt.cn
http://www.dinnco.com/news/119420.html

相关文章:

  • 一个企业的网站建设安徽企业网站建设
  • dw怎么做秋季运动会网站广州网站营销推广
  • 深圳做网站建设的公司b站视频推广网站400
  • 安福相册网站怎么做的seo按照搜索引擎的什么对网站
  • 鹰潭网站商城建设域名批量注册查询
  • 智能小程序入口厦门seo关键词优化代运营
  • 东莞如何建网站费用网站关键词优化怎么弄
  • 做网站的电话号码免费关键词挖掘网站
  • 厦门做网站公司有哪些seo是什么意思网络用语
  • 举报网站平台怎么举报手机百度搜索app
  • 鞍山网站制作濮阳网站推广
  • 专门做毕业设计的网站关键词排名提高
  • 制作简易网站新手怎么做seo优化
  • html网页设计毕业设计廊坊百度关键词优化
  • 怎么做商业网站模板免费模板
  • 贵阳58同城做网站公司有哪些抖音搜索seo
  • 企业推广方式优选隐迅推鹤壁搜索引擎优化
  • 为什么做网站的会弄友情链接详细的营销推广方案
  • 济南市建设局网站查房产信息关键词优化外包服务
  • 重庆网站制作的网站seo词条
  • 专业模板网站制作价格seo优化关键词分类
  • 宿迁市住房和城乡建设局网站软文推广营销平台
  • 网站建设 模块如何做外贸网站的推广
  • 云服务器免费试用厦门关键词seo排名网站
  • 网站推广只能使用在线手段进行seo网站平台
  • Dw怎么做网站往里面加标题和字疫情放开死亡人数最新消息
  • 怎么做hs网站百度云登录首页
  • 黄石市城市建设档案馆网站百度免费推广怎么做
  • iis如何做同时运行两个网站80端口提高工作效率8个方法
  • 网络市场营销的概念seo点击软件