########################################################
#
#
#######################################################
import time
import os, fnmatch
import sys
import shutil 
import datetime

inc_file_list = []
revert_inc_file_list = {} 

#######################################################
# Execute makefile and extract the include files
#
def execute_makefile():
	res = os.system("make >& tmpfile.1")
	fp = open("tmpfile.1", "r")
	line = fp.readline().strip()
	while line != '':
        # Example: "if_ether.c:52:24: error: sys/socket.h: No such file or directory"
		str_list = line.split(':')
		if str_list[-1] == " No such file or directory":

			src_file = str_list[0].strip()
			inc_file = str_list[4].strip()
			if inc_file in inc_file_list:
				rev_inc_files[inc_file].append(src_file)
			else:
				inc_file_list.append(inc_file)
				src_file_list = []
				src_file_list.append(src_file)
				revert_inc_file_list[inc_file] = src_file_list

		line = fp.readline().strip()
	


#########################################################                
#
#  1. system("make")
#  1. While find new include files:
#        1.1 mkdir
#        1.2 copy the file to new dir
#        1.3 system("make")
# 
if __name__ == '__main__':
    
	argc = len(sys.argv)
	if argc != 3:
		print " Usage: python copy-include.py src_inc_dir dst_inc_dir\n\n"
		sys.exit(-1)

	src_inc_dir = sys.argv[1].rstrip("/")
	dst_inc_dir = sys.argv[2].rstrip("/")
	print "Top source include directory is [%s]" % (src_inc_dir)
	print "Top target include directory is [%s]\n" % (dst_inc_dir)

	logfp = open("copy-include.log", "a")
	logfp.write("\n=============================================\n")
	today = time.localtime()
	today_str = "%d-%d-%d %d:%d:%d" %(today[0:6])
	logfp.write(today_str)
	logfp.write("\n=============================================\n")

	execute_makefile()
	while len(inc_file_list) != 0:
		for path in inc_file_list:
			dir_file = path.rsplit('/', 1)
			dst_dir = ""
			print path
			if len(dir_file) == 1:
				src_path = src_inc_dir + "/MYKERNEL/" + dir_file[0]
				dst_path = dst_inc_dir + "/opt/" + dir_file[0]
				dst_dir = "opt"
			else:
				src_path = src_inc_dir + "/" + path
				dst_path = dst_inc_dir + "/" +  path
				dst_dir = dir_file[0]

			# check if dir in include_dir
			logfp.write("cp " + src_path + " \t" + dst_path + "\n")
			if not dst_dir in os.listdir(dst_inc_dir):
				os.makedirs(dst_inc_dir + "/" + dst_dir)
			shutil.copyfile(src_path, dst_path)

		inc_file_list = []
		execute_makefile()

	logfp.close()
	os.remove("tmpfile.1")
