加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

基于Python的cmake多目录工程的自动配置实现

发布时间:2020-12-17 17:04:55 所属栏目:Python 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 #!/usr/bin/python"""2015.06.30Modified some functions.Now this configration can be run on both Windows and Linux.***************************

以下代码由PHP站长网 52php.cn收集自互联网

现在PHP站长网小编把它分享给大家,仅供参考

#!/usr/bin/python

"""
2015.06.30
Modified some functions.
Now this configration can be run on both Windows and Linux.
*************************************************************************************
2015.06.29
This is a configration function code which can be only run on Win Sys
Written by Grey 2015.06.29
"""
#coding:utf-8
import os,shutil,re

# Function DeleteCmakefilesDirectory can delete the directory generated by cmake.
def DeleteCmakefilesDirectory():
	try:
		shutil.rmtree("./CMakeFiles")
	except:
		print "cannot find the object!"

# Function RemoveEmptyFolder can remove all the empty folders in pwd
def RemoveEmptyFolder():
	for root,dirs,files in os.walk("./"):
		if dirs == [] and files == []:
			os.rmdir(root)

# Function SubDirectoryCmakelistsGen can generate a CMakeLists.txt for a subdirectory
def SubDirectoryCmakelistsGen():
	pwd = os.getcwd()
	directory_name = os.path.basename(pwd)
	directory_source_name = directory_name + '_DIR_SRCS'
	directory_lib_name    = directory_name + '_lib'
	cmakelists_obj        = open('CMakeLists.txt','w')
	cmakelists_obj.write("aux_source_directory(. %s)n" % directory_source_name)
	cmakelists_obj.write("add_library(%s ${%s})nn" % (directory_lib_name,directory_source_name))
	cmakelists_obj.close()

def MainCmakelistsGen():
	cmakelists_obj = open('CMakeLists.txt','w')
	pwd = os.getcwd()
	directory_name = os.path.basename(pwd)
	directory_source_name = directory_name + '_DIR_SRCS'
	directory_lib_name = directory_name + '_lib'
	cmakelists_obj = open('CMakeLists.txt','w')
	cmakelists_obj.write("cmake_minimum_required(VERSION 3.3)n")
	cmakelists_obj.write("project(%s_prj)n" % directory_name)
	cmakelists_obj.write("aux_source_directory(. %s)n" % directory_source_name)
	cmakelists_obj.write("add_subdirectory_for_replacen")
	cmakelists_obj.write("add_executable(%s_bin ${%s})n" % (directory_name,directory_source_name))
	cmakelists_obj.write("target_link_libraries(%s_bin all_libs_for_replace)n" % directory_name)
	cmakelists_obj.close()

def MainCmakelistsUpdate():
	main_text = open('CMakeLists.txt','r').read()
	include_text = open('include.txt','r').read()
	subdirectory_text = open('subdirectory.txt','r').read()
	lib_text = open('lib_list.txt','r').read()
	subdirectory_text = re.sub(r'add_subdirectory(./)n','',subdirectory_text)
	main_text = re.sub('add_subdirectory_for_replace','%s',main_text) % (include_text + 'n' + subdirectory_text)
	main_text = re.sub('all_libs_for_replace',main_text) % lib_text
	main_text = re.sub(r'','/',main_text)
	main_text = re.sub(r'nn','n',main_text)
	main_write_fid = open('CMakeLists.txt','w')
	main_write_fid.write(main_text)
	main_write_fid.close()

def MainConfig():
	# step1 : delete all the empty code folders
	RemoveEmptyFolder()
	# step2 : delete 'CMakeFiles' in main folder
	DeleteCmakefilesDirectory()
	# step3 : process for subdirectories
	subdirectories = []
	sub_libs = []
	pwd = os.getcwd()
	for root,files in os.walk("./"):
		os.chdir(root)
		DeleteCmakefilesDirectory()
		SubDirectoryCmakelistsGen()
		subdirectories.append(root)
		subdirectory_name = os.path.basename(root)
		sub_libs.append(subdirectory_name + "_lib")
		os.chdir(pwd)
	include_obj = open('include.txt','w')
	subdir_obj = open('subdirectory.txt','w')
	include_obj.write("include_directories(")
	for subdirectory in subdirectories:
		include_obj.write("%s " % subdirectory)
		subdir_obj.write("add_subdirectory(%s)n" % subdirectory)
	include_obj.write(")")
	include_obj.close()
	subdir_obj.close()
	# step4 : try to generate main CMakeLists.txt
	MainCmakelistsGen()
	lib_flag = 0
	lib_list_obj = open('lib_list.txt','w')
	for each_sub_lib in sub_libs:
		if lib_flag != 0:
			lib_list_obj.write("%s " % each_sub_lib)
		lib_flag += 1
	lib_list_obj.close()
	MainCmakelistsUpdate()

MainConfig()

以上内容由PHP站长网【52php.cn】收集整理供大家参考研究

如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读