php做投票网站,wordpress seo模块,企业备案号查询系统,网站开发流程表源码分析
核心MakeFile
这个 Makefile 是一个复杂的构建脚本#xff0c;用于管理和构建一个大型项目。它包括多个目标、条件判断和递归调用 make 命令来处理多个子项目和子目录。让我们逐部分进行详细解析。
伪目标和变量定义
.PHONY: all clean install build test init.…源码分析
核心MakeFile
这个 Makefile 是一个复杂的构建脚本用于管理和构建一个大型项目。它包括多个目标、条件判断和递归调用 make 命令来处理多个子项目和子目录。让我们逐部分进行详细解析。
伪目标和变量定义
.PHONY: all clean install build test init.PHONY 目标声明了 all、clean、install、build、test 和 init 是伪目标不对应实际文件。
PLATDIRS newbuild so fantom share party www update var SIP-INSTALLROOT linux
CLEANDIRS $(PLATDIRS) appsPLATDIRS 和 CLEANDIRS 是目录列表变量用于后续的构建和清理操作。
模式规则
%.all :cd $* $(MAKE)
%.clean :cd $* $(MAKE) clean
%.build :cd $* $(MAKE) build这三条规则定义了通用目标规则对于目录列表中的每个目录会进入该目录并执行相应的 make 目标all、clean、build。
clean 目标
clean:rm -rf $(BUILD)/fantommake $(patsubst %, %.clean, $(CLEANDIRS))clean 目标删除 $(BUILD)/fantom 目录并调用 make 命令清理 CLEANDIRS 列表中的每个目录。
平台预构建目标
build_plat_pre:chmod x $(ROOT)/update/setbaseversion if [ ! -d $(BUILDROOT) ]; then mkdir -p $(BUILDROOT) ; fiif [ ! -d $(BUILDROOT)/newbuild ]; then mkdir -p $(BUILDROOT)/newbuild ; fiif [ ! -d $(BUILDROOT)/apps ]; then mkdir -p $(BUILDROOT)/apps ; fiif [ ! -d $(BUILDROOT)/bin ]; then mkdir -p $(BUILDROOT)/bin ; fiif [ ! -d $(BUILDROOT)/party ]; then mkdir -p $(BUILDROOT)/party ; fiif [ ! -d $(BUILDROOT)/share/lib ]; then mkdir -p $(BUILDROOT)/share/lib ; fiif [ ! -d $(BUILDROOT)/share/Python-2.7/lib ]; then mkdir -p $(BUILDROOT)/share/Python-2.7/lib ; fibuild_plat_pre 目标进行了一些预构建任务包括设置文件权限和创建所需目录。
应用列表和目标
sis_apps_list accessskeleton coengine dnsdetect ngfw saas secvisual server_anomaly super \wskiller update secdetect dgadetect httpdetector scandetect beforehanddetect \cloud_report webshelldetect wxscandetect brutedetect dosdetect netflow_forensic smbdetect \mailector secevent sec_dnsdetect sec_httpdetect sec_maildetect sec_netdetect sec_secdetect \sec_smbdetect sec_tidnsdetect sec_tihttpdetect sec_tiipdetect sec_thirdparty infoshare monitor \sec_filedetect sec_threatdetect documents agent
ifndef NO_SECLIB
sis_apps_list seclib
endif
SISAPPS $(patsubst %, apps/%, $(sis_apps_list))sis_apps_list 定义了一个应用列表包含多个应用名。如果未定义 NO_SECLIB则将 seclib 添加到应用列表中。SISAPPS 将 sis_apps_list 转换为带有 apps/ 前缀的格式。
平台打包前置任务
plat_sis_pre:python $(ROOT)/apps/super/plat/plat.py $(ROOT)/apps/super/plat/sis/plugins.confplat_sis_pre 目标运行一个 Python 脚本用于配置或预处理。
平台打包
plat_sis: plat_sis_pre plat_fantom $(SISAPPS:.build)plat_sis 目标依赖于 plat_sis_pre、plat_fantom 和所有 SISAPPS 的 .build 目标。
云平台应用列表和目标
cloud_apps_list super cloud_report
CLOUDAPPS $(patsubst %, apps/%, $(cloud_apps_list))cloud_apps_list 定义了云平台的应用列表。CLOUDAPPS 将 cloud_apps_list 转换为带有 apps/ 前缀的格式。
plat_cloud_pre:python $(ROOT)/apps/super/plat/plat.py $(ROOT)/apps/super/plat/cloud/plugins.confplat_cloud_pre 目标运行一个 Python 脚本用于云平台的预处理。
plat_cloud: plat_cloud_pre plat_fantom $(CLOUDAPPS:.build)plat_cloud 目标依赖于 plat_cloud_pre、plat_fantom 和所有 CLOUDAPPS 的 .build 目标。
平台基础内容打包
plat_fantom: build_plat_pre $(PLATDIRS:.build)cd $(BUILD) tar -czf fantom.tar.gz fantomplat_fantom 目标依赖于 build_plat_pre 和所有 PLATDIRS 的 .build 目标。它会进入 $(BUILD) 目录并将 fantom 目录打包成 fantom.tar.gz。
应用打包预处理
build_apps_pre:if [ ! -d $(BUILDROOT)/apps ]; then mkdir -p $(BUILDROOT)/apps ; fibuild_apps_pre 目标确保 $(BUILDROOT)/apps 目录存在。
应用打包
plat_apps: build_apps_pre
ifdef NAMEif [ -d $(ROOT)/apps/$(NAME) ]; then \cd $(ROOT)/apps/$(NAME) make build; \cd $(ROOT)/update make build; \cd $(BUILD)/fantom/apps/ tar -czf $(NAME).tar.gz $(NAME); \mv $(NAME).tar.gz $(BUILD);\else \echo App $(NAME) not exists; \fi
else
endifplat_apps 目标依赖于 build_apps_pre。 如果定义了 NAME 变量并且 $(ROOT)/apps/$(NAME) 目录存在则 进入 $(ROOT)/apps/$(NAME) 并执行 make build。进入 $(ROOT)/update 并执行 make build。将 $(BUILD)/fantom/apps/$(NAME) 目录打包成 $(NAME).tar.gz并移动到 $(BUILD) 目录。 如果 $(ROOT)/apps/$(NAME) 目录不存在则输出错误信息。
总结
这个 Makefile 用于构建和打包一个复杂的项目包含多个应用和平台组件。它通过定义变量和模式规则来管理不同的构建任务并使用条件判断和递归调用 make 命令来处理各个子目录和应用的构建过程。
php
TYPE dirifdef NO_SECLIB
dirs : $(shell find . -maxdepth 1 -path ./seclib -prune -o -type d -print)
else
dirs : $(shell find . -maxdepth 1 -type d)
endifdirs : $(basename $(patsubst ./%,%,$(dirs)))SUBDIRS $(dirs)include $(MAKEFILEDIR)/Makefile.$(TYPE)这个 Makefile 代码片段通过使用条件和 shell 命令来动态生成子目录列表并根据一个特定的类型包含相应的 Makefile。让我们逐行解析这个 Makefile 片段
代码解析
TYPE dir这行定义了一个变量 TYPE其值为 dir。这个变量在后续的 include 语句中被使用。
ifdef NO_SECLIB
dirs : $(shell find . -maxdepth 1 -path ./seclib -prune -o -type d -print)
else
dirs : $(shell find . -maxdepth 1 -type d)
endif这里使用了条件判断 ifdef 来检测是否定义了 NO_SECLIB 变量。 如果定义了 NO_SECLIB则执行第一条命令 dirs : $(shell find . -maxdepth 1 -path ./seclib -prune -o -type d -print)这条命令使用 find 命令查找当前目录不包括子目录的所有目录但排除了 ./seclib 目录。-maxdepth 1 限制查找深度为当前目录。-path ./seclib -prune 用于排除 ./seclib 目录。-o -type d -print 查找类型为目录并打印路径。 否则如果未定义 NO_SECLIB则执行第二条命令 dirs : $(shell find . -maxdepth 1 -type d)这条命令使用 find 命令查找当前目录不包括子目录的所有目录。
dirs : $(basename $(patsubst ./%,%,$(dirs)))这行代码使用了 patsubst 和 basename 函数对 dirs 变量进行处理 $(patsubst ./%,%,$(dirs)) 移除每个目录路径前面的 ./ 前缀。$(basename $(patsubst ./%,%,$(dirs))) 进一步处理每个目录路径只保留目录名称。
SUBDIRS $(dirs)将处理后的目录列表赋值给变量 SUBDIRS。
include $(MAKEFILEDIR)/Makefile.$(TYPE)包含另一个 Makefile 文件。文件的路径和名称由 $(MAKEFILEDIR)/Makefile.$(TYPE) 决定。 $(MAKEFILEDIR) 是另一个变量通常在其他地方定义用于指定 Makefile 文件所在的目录。$(TYPE) 变量的值为 dir所以这行等价于 include $(MAKEFILEDIR)/Makefile.dir。
总结
这个 Makefile 片段的目的是
动态生成当前目录下的子目录列表并处理排除某些特定目录如 seclib。处理目录路径将它们标准化为不带 ./ 前缀的格式。将处理后的目录列表赋值给 SUBDIRS 变量。根据 TYPE 变量的值包含另一个 Makefile 文件便于分层和模块化管理构建过程。
通过这种方式可以根据不同的条件动态调整构建过程灵活应对各种需求和依赖关系。
python
TYPE appSUBDIRS .PHONY: build cleanappversiondate %Y%m%d/%H:%M:%Sbuild:find ./appserver -name .svn | xargs rm -rffind ./bin -name .svn | xargs rm -rffind ./default -name .svn | xargs rm -rffind ./lib -name .svn | xargs rm -rffind ./local -name .svn | xargs rm -rffind ./var -name .svn | xargs rm -rffind ./meta-info -name .svn | xargs rm -rfrwini -w -s info -k version -f libinfo -v $(appversion)mkdir -p ./patch0/$(notdir $(CURDIR))mv -f ./appserver ./patch0/$(notdir $(CURDIR))/appservermv -f ./bin ./patch0/$(notdir $(CURDIR))/binmv -f ./default ./patch0/$(notdir $(CURDIR))/defaultmv -f ./lib ./patch0/$(notdir $(CURDIR))/libmv -f ./local ./patch0/$(notdir $(CURDIR))/localmv -f ./var ./patch0/$(notdir $(CURDIR))/varcp -rf ./libinfo ./patch0/$(notdir $(CURDIR))/libinfocp -rf ./meta-info/update ./patch0cp -rf ./meta-info ./patch0/$(notdir $(CURDIR))/meta-infozip -r -q $(notdir $(CURDIR)).zip patch0 libinfo meta-inform -rf ./libinform -rf ./meta-inform -rf ./patch0if [ ! -d $(BUILDROOT)/apps/$(notdir $(CURDIR)) ]; then mkdir -p $(BUILDROOT)/apps/$(notdir $(CURDIR)) ; firsync -r . $(BUILDROOT)/apps/$(notdir $(CURDIR)) --excludeMakefile --exclude.svn/
clean:rm -f $(notdir $(CURDIR)).zip这个 Makefile 定义了两个主要目标 build 和 clean。它主要用于清理项目目录中的 .svn 文件夹、更新版本信息、组织项目文件并将其打包成压缩文件。下面是对每一部分的详细解析
变量和伪目标
TYPE app
SUBDIRS
.PHONY: build cleanTYPE app 定义了一个变量 TYPE其值为 app。虽然在这个 Makefile 中没有进一步使用但它可以用来在包含的其他 Makefile 中使用。SUBDIRS 定义了一个空的 SUBDIRS 变量。在这个 Makefile 中没有实际使用。.PHONY: build clean 声明了两个伪目标 build 和 clean这表示这些目标不是实际的文件名而是任务名称。
版本信息
appversiondate %Y%m%d/%H:%M:%Sappversion 变量用来保存当前的日期和时间格式为 YYYYMMDD/HH:MM:SS。这个变量会用于更新版本信息。
build 目标
build:find ./appserver -name .svn | xargs rm -rffind ./bin -name .svn | xargs rm -rffind ./default -name .svn | xargs rm -rffind ./lib -name .svn | xargs rm -rffind ./local -name .svn | xargs rm -rffind ./var -name .svn | xargs rm -rffind ./meta-info -name .svn | xargs rm -rfrwini -w -s info -k version -f libinfo -v $(appversion)mkdir -p ./patch0/$(notdir $(CURDIR))mv -f ./appserver ./patch0/$(notdir $(CURDIR))/appservermv -f ./bin ./patch0/$(notdir $(CURDIR))/binmv -f ./default ./patch0/$(notdir $(CURDIR))/defaultmv -f ./lib ./patch0/$(notdir $(CURDIR))/libmv -f ./local ./patch0/$(notdir $(CURDIR))/localmv -f ./var ./patch0/$(notdir $(CURDIR))/varcp -rf ./libinfo ./patch0/$(notdir $(CURDIR))/libinfocp -rf ./meta-info/update ./patch0cp -rf ./meta-info ./patch0/$(notdir $(CURDIR))/meta-infozip -r -q $(notdir $(CURDIR)).zip patch0 libinfo meta-inform -rf ./libinform -rf ./meta-inform -rf ./patch0if [ ! -d $(BUILDROOT)/apps/$(notdir $(CURDIR)) ]; then mkdir -p $(BUILDROOT)/apps/$(notdir $(CURDIR)) ; firsync -r . $(BUILDROOT)/apps/$(notdir $(CURDIR)) --excludeMakefile --exclude.svn/清理 .svn 文件夹
使用 find 命令查找并删除各个目录下的 .svn 文件夹这些文件夹是 Subversion (SVN) 版本控制系统的目录不需要打包到最终的发布版本中。
更新版本信息
使用 rwini 命令更新 libinfo 文件中的版本信息rwini 是一个假设的工具用于写入 INI 文件格式中的值。具体操作是设置 [info] 节点中的 version 键为当前时间。
组织项目文件
创建一个名为 patch0 的目录并将各个子目录如 appserver、bin、default、lib、local、var移动到 patch0/$(notdir $(CURDIR)) 中。 $(notdir $(CURDIR)) 获取当前目录的名称不包括路径例如如果当前目录是 /home/user/project则 $(notdir $(CURDIR)) 会得到 project。
复制和压缩文件
将 libinfo 和 meta-info 目录复制到 patch0 下的相应位置。使用 zip 命令将 patch0、libinfo 和 meta-info 压缩成一个 zip 文件名称为当前目录名称加 .zip例如 project.zip。删除 libinfo、meta-info 和 patch0 目录。
同步文件
如果 $(BUILDROOT)/apps/$(notdir $(CURDIR)) 目录不存在则创建它。使用 rsync 命令将当前目录的内容除了 Makefile 和 .svn 文件夹同步到 $(BUILDROOT)/apps/$(notdir $(CURDIR)) 目录。
clean 目标
clean:rm -f $(notdir $(CURDIR)).zip删除以当前目录名称命名的 zip 文件例如 project.zip。
总结
这个 Makefile 主要用于清理项目目录中的 .svn 文件夹更新版本信息组织和打包项目文件并将其同步到一个特定的构建目录。build 目标执行了所有这些步骤而 clean 目标仅删除生成的 zip 文件。使用了 shell 命令和 rwini 工具来处理文件和目录动态生成版本信息并打包和同步项目文件。