########################################################
#
#
#######################################################
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 != 4:
		print " Usage: python copy-include.py src_inc_dir dst_inc_dir input_file\n\n"
		sys.exit(-1)

	src_inc_dir = sys.argv[1].rstrip("/")
	dst_inc_dir = sys.argv[2].rstrip("/")
	input_file = sys.argv[3]
	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()
	fd = open(input_file, "r")
	line = fd.readline();
	while line != "":
		line = line.strip(".")
		line = line.strip("\n")
		line = line.strip("/")

		(path, file) = line.rsplit('/', 1)
		print "%s  %s" % (path, file)
		src_path_dir = src_inc_dir + "/" + path
		src_path     = src_inc_dir + "/" + path + "/" + file
		dst_path_dir = dst_inc_dir + "/" +  path
		file = "bsd_" + file
		dst_path = dst_inc_dir + "/" +  path + "/" + file

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

	fd.close()

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