2015-06-20 12:39:39 +02:00
|
|
|
#!/usr/bin/python
|
|
|
|
##
|
|
|
|
## license:BSD-3-Clause
|
|
|
|
## copyright-holders:Miodrag Milanovic
|
|
|
|
|
|
|
|
from __future__ import with_statement
|
|
|
|
|
|
|
|
import sys
|
|
|
|
## to ignore include of emu.h add it always to list
|
2015-06-20 16:35:49 +02:00
|
|
|
|
2015-06-20 12:39:39 +02:00
|
|
|
files_included = ['src/emu/emu.h']
|
|
|
|
|
2015-09-13 09:20:24 +02:00
|
|
|
include_dirs = ['src/emu/', 'src/devices/', 'src/mame/', 'src/mess/']
|
2015-06-20 12:39:39 +02:00
|
|
|
|
2015-06-20 13:41:55 +02:00
|
|
|
mappings = dict()
|
|
|
|
|
2015-06-20 16:35:49 +02:00
|
|
|
deps_files_included = [ ]
|
|
|
|
|
|
|
|
deps_include_dirs = ['src/mame/', 'src/mess/']
|
|
|
|
|
|
|
|
components = [ ]
|
2015-06-20 13:41:55 +02:00
|
|
|
|
2015-06-20 16:35:49 +02:00
|
|
|
drivers = [ ]
|
|
|
|
|
2015-06-20 18:20:10 +02:00
|
|
|
def file_exists(root, srcfile, folder, inc_dir):
|
2015-06-20 12:39:39 +02:00
|
|
|
includes = [ folder ]
|
2015-06-20 16:35:49 +02:00
|
|
|
includes.extend(inc_dir)
|
2015-06-20 12:39:39 +02:00
|
|
|
for line in includes:
|
|
|
|
try:
|
2015-06-20 18:20:10 +02:00
|
|
|
fp = open(root + line + srcfile, 'rb')
|
2015-07-04 02:37:32 +02:00
|
|
|
fp.close()
|
2015-06-20 12:39:39 +02:00
|
|
|
return line + srcfile
|
|
|
|
except IOError:
|
2015-07-03 23:45:36 +02:00
|
|
|
pass
|
2015-06-20 12:39:39 +02:00
|
|
|
return ''
|
|
|
|
|
2015-06-20 18:20:10 +02:00
|
|
|
def add_c_if_exists(root, fullname):
|
2015-06-20 16:35:49 +02:00
|
|
|
try:
|
2015-06-20 18:20:10 +02:00
|
|
|
fp = open(root + fullname, 'rb')
|
2015-07-04 02:37:32 +02:00
|
|
|
fp.close()
|
2015-06-20 16:35:49 +02:00
|
|
|
deps_files_included.append(fullname)
|
|
|
|
except IOError:
|
2015-07-03 23:45:36 +02:00
|
|
|
pass
|
2015-06-20 16:35:49 +02:00
|
|
|
|
2015-06-21 08:59:21 +02:00
|
|
|
def add_rest_if_exists(root, srcfile,folder):
|
2015-06-20 16:35:49 +02:00
|
|
|
t = srcfile.rsplit('/', 2)
|
|
|
|
if t[1]=='includes':
|
|
|
|
t[2] = t[2].replace('.h','.c')
|
|
|
|
t[1] = 'drivers'
|
2015-06-20 18:20:10 +02:00
|
|
|
add_c_if_exists(root,"/".join(t))
|
2015-06-21 08:59:21 +02:00
|
|
|
parse_file_for_deps(root, "/".join(t), folder)
|
2015-06-20 16:35:49 +02:00
|
|
|
t[1] = 'machine'
|
2015-06-20 18:20:10 +02:00
|
|
|
add_c_if_exists(root,"/".join(t))
|
2015-06-21 08:59:21 +02:00
|
|
|
parse_file_for_deps(root, "/".join(t), folder)
|
2015-06-20 16:35:49 +02:00
|
|
|
t[1] = 'video'
|
2015-06-20 18:20:10 +02:00
|
|
|
add_c_if_exists(root,"/".join(t))
|
2015-06-21 08:59:21 +02:00
|
|
|
parse_file_for_deps(root, "/".join(t), folder)
|
2015-06-20 16:35:49 +02:00
|
|
|
t[1] = 'audio'
|
2015-06-20 18:20:10 +02:00
|
|
|
add_c_if_exists(root,"/".join(t))
|
2015-06-21 08:59:21 +02:00
|
|
|
parse_file_for_deps(root, "/".join(t), folder)
|
2015-06-20 16:35:49 +02:00
|
|
|
|
2015-06-20 18:20:10 +02:00
|
|
|
def parse_file_for_deps(root, srcfile, folder):
|
2015-06-20 16:35:49 +02:00
|
|
|
try:
|
2015-06-20 18:20:10 +02:00
|
|
|
fp = open(root + srcfile, 'rb')
|
2015-06-20 16:35:49 +02:00
|
|
|
except IOError:
|
|
|
|
return 1
|
|
|
|
in_comment = 0
|
|
|
|
linenum = 0
|
|
|
|
for line in fp.readlines():
|
|
|
|
content = ''
|
|
|
|
linenum+=1
|
|
|
|
srcptr = 0
|
|
|
|
while srcptr < len(line):
|
|
|
|
c = line[srcptr]
|
|
|
|
srcptr+=1
|
|
|
|
if c==13 or c==10:
|
|
|
|
if c==13 and line[srcptr]==10:
|
|
|
|
srcptr+=1
|
|
|
|
continue
|
|
|
|
if c==' ' or c==9:
|
|
|
|
continue
|
|
|
|
if in_comment==1 and c=='*' and line[srcptr]=='/' :
|
|
|
|
srcptr+=1
|
|
|
|
in_comment = 0
|
|
|
|
continue
|
|
|
|
if in_comment:
|
|
|
|
continue
|
|
|
|
if c=='/' and line[srcptr]=='*' :
|
|
|
|
srcptr+=1
|
|
|
|
in_comment = 1
|
|
|
|
continue
|
|
|
|
if c=='/' and line[srcptr]=='/' :
|
|
|
|
break
|
|
|
|
content += c
|
|
|
|
content = content.strip()
|
|
|
|
if len(content)>0:
|
|
|
|
if content.startswith('#include'):
|
|
|
|
name = content[8:]
|
|
|
|
name = name.replace('"','')
|
2015-06-20 18:20:10 +02:00
|
|
|
fullname = file_exists(root, name, folder,deps_include_dirs)
|
2015-06-20 16:35:49 +02:00
|
|
|
if fullname in deps_files_included:
|
|
|
|
continue
|
|
|
|
if fullname!='':
|
|
|
|
deps_files_included.append(fullname)
|
2015-06-20 18:20:10 +02:00
|
|
|
add_c_if_exists(root, fullname.replace('.h','.c'))
|
2015-06-21 08:59:21 +02:00
|
|
|
add_rest_if_exists(root, fullname,folder)
|
2015-06-20 16:35:49 +02:00
|
|
|
newfolder = fullname.rsplit('/', 1)[0] + '/'
|
2015-06-20 18:20:10 +02:00
|
|
|
parse_file_for_deps(root, fullname, newfolder)
|
2015-06-20 16:35:49 +02:00
|
|
|
continue
|
2015-07-04 02:37:32 +02:00
|
|
|
fp.close()
|
2015-06-20 16:35:49 +02:00
|
|
|
return 0
|
|
|
|
|
2015-06-20 18:20:10 +02:00
|
|
|
def parse_file(root, srcfile, folder):
|
2015-06-20 12:39:39 +02:00
|
|
|
try:
|
2015-06-20 18:20:10 +02:00
|
|
|
fp = open(root + srcfile, 'rb')
|
2015-06-20 12:39:39 +02:00
|
|
|
except IOError:
|
|
|
|
return 1
|
|
|
|
in_comment = 0
|
|
|
|
linenum = 0
|
|
|
|
for line in fp.readlines():
|
|
|
|
content = ''
|
|
|
|
linenum+=1
|
|
|
|
srcptr = 0
|
|
|
|
while srcptr < len(line):
|
|
|
|
c = line[srcptr]
|
|
|
|
srcptr+=1
|
|
|
|
if c==13 or c==10:
|
|
|
|
if c==13 and line[srcptr]==10:
|
|
|
|
srcptr+=1
|
|
|
|
continue
|
|
|
|
if c==' ' or c==9:
|
|
|
|
continue
|
|
|
|
if in_comment==1 and c=='*' and line[srcptr]=='/' :
|
|
|
|
srcptr+=1
|
|
|
|
in_comment = 0
|
|
|
|
continue
|
|
|
|
if in_comment:
|
|
|
|
continue
|
|
|
|
if c=='/' and line[srcptr]=='*' :
|
|
|
|
srcptr+=1
|
|
|
|
in_comment = 1
|
|
|
|
continue
|
|
|
|
if c=='/' and line[srcptr]=='/' :
|
|
|
|
break
|
|
|
|
content += c
|
|
|
|
content = content.strip()
|
|
|
|
if len(content)>0:
|
|
|
|
if content.startswith('#include'):
|
|
|
|
name = content[8:]
|
|
|
|
name = name.replace('"','')
|
2015-06-20 18:20:10 +02:00
|
|
|
fullname = file_exists(root, name, folder,include_dirs)
|
2015-06-20 12:39:39 +02:00
|
|
|
if fullname in files_included:
|
|
|
|
continue
|
2015-09-12 10:12:14 +02:00
|
|
|
if "src/lib/netlist/" in fullname:
|
2015-06-21 08:44:45 +02:00
|
|
|
continue
|
2015-06-20 12:39:39 +02:00
|
|
|
if fullname!='':
|
2015-06-20 13:41:55 +02:00
|
|
|
if fullname in mappings.keys():
|
|
|
|
if not(mappings[fullname] in components):
|
|
|
|
components.append(mappings[fullname])
|
2015-06-20 12:39:39 +02:00
|
|
|
files_included.append(fullname)
|
|
|
|
newfolder = fullname.rsplit('/', 1)[0] + '/'
|
2015-06-20 18:20:10 +02:00
|
|
|
parse_file(root, fullname, newfolder)
|
2015-06-21 08:44:45 +02:00
|
|
|
if (fullname.endswith('.h')):
|
2015-06-21 08:59:21 +02:00
|
|
|
parse_file(root, fullname.replace('.h','.c'), newfolder)
|
2015-06-20 12:39:39 +02:00
|
|
|
continue
|
2015-07-04 02:37:32 +02:00
|
|
|
fp.close()
|
2015-06-20 12:39:39 +02:00
|
|
|
return 0
|
|
|
|
|
2015-06-20 18:20:10 +02:00
|
|
|
def parse_file_for_drivers(root, srcfile):
|
2015-06-20 16:35:49 +02:00
|
|
|
try:
|
2015-06-20 18:20:10 +02:00
|
|
|
fp = open(root + srcfile, 'rb')
|
2015-06-20 16:35:49 +02:00
|
|
|
except IOError:
|
|
|
|
sys.stderr.write("Unable to open source file '%s'\n" % srcfile)
|
|
|
|
return 1
|
|
|
|
in_comment = 0
|
|
|
|
linenum = 0
|
|
|
|
for line in fp.readlines():
|
|
|
|
content = ''
|
|
|
|
linenum+=1
|
|
|
|
srcptr = 0
|
|
|
|
while srcptr < len(line):
|
|
|
|
c = line[srcptr]
|
|
|
|
srcptr+=1
|
|
|
|
if c==13 or c==10:
|
|
|
|
if c==13 and line[srcptr]==10:
|
|
|
|
srcptr+=1
|
|
|
|
continue
|
|
|
|
if c==' ' or c==9:
|
|
|
|
continue
|
|
|
|
if in_comment==1 and c=='*' and line[srcptr]=='/' :
|
|
|
|
srcptr+=1
|
|
|
|
in_comment = 0
|
|
|
|
continue
|
|
|
|
if in_comment:
|
|
|
|
continue
|
|
|
|
if c=='/' and line[srcptr]=='*' :
|
|
|
|
srcptr+=1
|
|
|
|
in_comment = 1
|
|
|
|
continue
|
|
|
|
if c=='/' and line[srcptr]=='/' :
|
|
|
|
break
|
|
|
|
content += c
|
|
|
|
content = content.strip()
|
|
|
|
if len(content)>0:
|
|
|
|
if content.startswith('COMP') or content.startswith('CONS') or content.startswith('GAME') or content.startswith('SYST') or content.startswith('GAMEL'):
|
|
|
|
name = content[4:]
|
|
|
|
drivers.append(name.rsplit(',', 14)[1])
|
|
|
|
return 0
|
|
|
|
|
2015-06-20 13:41:55 +02:00
|
|
|
def parse_lua_file(srcfile):
|
|
|
|
try:
|
|
|
|
fp = open(srcfile, 'rb')
|
|
|
|
except IOError:
|
|
|
|
sys.stderr.write("Unable to open source file '%s'\n" % srcfile)
|
|
|
|
return 1
|
|
|
|
for line in fp.readlines():
|
|
|
|
content = line.strip()
|
|
|
|
if len(content)>0:
|
|
|
|
if content.startswith('--@'):
|
|
|
|
name = content[3:]
|
|
|
|
mappings[name.rsplit(',', 1)[0]] = name.rsplit(',', 1)[1]
|
|
|
|
return 0
|
|
|
|
|
2015-06-20 18:20:10 +02:00
|
|
|
if len(sys.argv) < 5:
|
2015-06-20 12:39:39 +02:00
|
|
|
print('Usage:')
|
2015-06-20 18:20:10 +02:00
|
|
|
print(' makedep <root> <source.c> <type> <target>')
|
2015-06-20 12:39:39 +02:00
|
|
|
sys.exit(0)
|
|
|
|
|
2015-06-20 18:20:10 +02:00
|
|
|
root = sys.argv[1] + '/'
|
2015-06-20 13:41:55 +02:00
|
|
|
|
2015-06-20 18:20:10 +02:00
|
|
|
parse_lua_file(root +'scripts/src/bus.lua')
|
|
|
|
parse_lua_file(root +'scripts/src/cpu.lua')
|
|
|
|
parse_lua_file(root +'scripts/src/machine.lua')
|
|
|
|
parse_lua_file(root +'scripts/src/sound.lua')
|
|
|
|
parse_lua_file(root +'scripts/src/video.lua')
|
|
|
|
|
|
|
|
for filename in sys.argv[2].rsplit(',') :
|
2015-06-20 16:35:49 +02:00
|
|
|
deps_files_included.append(filename.replace('\\','/'))
|
2015-06-20 18:20:10 +02:00
|
|
|
parse_file_for_deps(root,filename,'')
|
2015-06-20 16:35:49 +02:00
|
|
|
|
2015-06-20 16:40:08 +02:00
|
|
|
for filename in deps_files_included:
|
2015-06-20 18:20:10 +02:00
|
|
|
parse_file(root,filename,'')
|
2015-06-20 13:41:55 +02:00
|
|
|
|
2015-06-20 18:20:10 +02:00
|
|
|
for filename in sys.argv[2].rsplit(',') :
|
|
|
|
parse_file_for_drivers(root,filename)
|
2015-06-20 16:35:49 +02:00
|
|
|
|
|
|
|
|
|
|
|
# display output
|
2015-06-20 18:20:10 +02:00
|
|
|
if sys.argv[3]=='drivers':
|
|
|
|
# add a reference to the ___empty driver
|
|
|
|
drivers.append("___empty")
|
|
|
|
|
|
|
|
# start with a header
|
|
|
|
print('#include "emu.h"\n')
|
|
|
|
print('#include "drivenum.h"\n')
|
|
|
|
|
|
|
|
#output the list of externs first
|
|
|
|
for drv in sorted(drivers):
|
|
|
|
print("GAME_EXTERN(%s);" % drv)
|
|
|
|
print("")
|
|
|
|
|
|
|
|
# then output the array
|
|
|
|
print("const game_driver * const driver_list::s_drivers_sorted[%d] =" % len(drivers))
|
|
|
|
print("{")
|
|
|
|
for drv in sorted(drivers):
|
|
|
|
print("\t&GAME_NAME(%s)," % drv)
|
|
|
|
print("};")
|
|
|
|
print("")
|
|
|
|
|
|
|
|
# also output a global count
|
|
|
|
print("int driver_list::s_driver_count = %d;\n" % len(drivers))
|
|
|
|
|
|
|
|
if sys.argv[3]=='target':
|
2015-06-20 16:35:49 +02:00
|
|
|
for line in components:
|
|
|
|
sys.stdout.write("%s\n" % line)
|
2015-07-03 23:13:01 +02:00
|
|
|
sys.stdout.write('\n')
|
|
|
|
sys.stdout.write('function createProjects_mame_%s(_target, _subtarget)\n' % sys.argv[4])
|
|
|
|
sys.stdout.write(' project ("mame_%s")\n' % sys.argv[4])
|
|
|
|
sys.stdout.write(' targetsubdir(_target .."_" .. _subtarget)\n')
|
|
|
|
sys.stdout.write(' kind (LIBTYPE)\n')
|
|
|
|
sys.stdout.write(' uuid (os.uuid("drv-mame-%s"))\n' % sys.argv[4])
|
|
|
|
sys.stdout.write(' \n')
|
|
|
|
sys.stdout.write(' options {\n')
|
|
|
|
sys.stdout.write(' "ForceCPP",\n')
|
|
|
|
sys.stdout.write(' }\n')
|
|
|
|
sys.stdout.write(' \n')
|
|
|
|
sys.stdout.write(' includedirs {\n')
|
|
|
|
sys.stdout.write(' MAME_DIR .. "src/osd",\n')
|
|
|
|
sys.stdout.write(' MAME_DIR .. "src/emu",\n')
|
2015-09-13 09:20:24 +02:00
|
|
|
sys.stdout.write(' MAME_DIR .. "src/devices",\n')
|
2015-07-03 23:13:01 +02:00
|
|
|
sys.stdout.write(' MAME_DIR .. "src/mame",\n')
|
|
|
|
sys.stdout.write(' MAME_DIR .. "src/mess",\n')
|
|
|
|
sys.stdout.write(' MAME_DIR .. "src/lib",\n')
|
|
|
|
sys.stdout.write(' MAME_DIR .. "src/lib/util",\n')
|
|
|
|
sys.stdout.write(' MAME_DIR .. "3rdparty",\n')
|
|
|
|
sys.stdout.write(' GEN_DIR .. "mame/layout",\n')
|
|
|
|
sys.stdout.write(' GEN_DIR .. "mess/layout",\n')
|
|
|
|
sys.stdout.write(' }\n')
|
|
|
|
sys.stdout.write(' if _OPTIONS["with-bundled-zlib"] then\n')
|
|
|
|
sys.stdout.write(' includedirs {\n')
|
|
|
|
sys.stdout.write(' MAME_DIR .. "3rdparty/zlib",\n')
|
|
|
|
sys.stdout.write(' }\n')
|
|
|
|
sys.stdout.write(' end\n')
|
|
|
|
sys.stdout.write('\n')
|
|
|
|
sys.stdout.write(' files{\n')
|
2015-06-20 16:35:49 +02:00
|
|
|
for line in deps_files_included:
|
2015-07-03 23:13:01 +02:00
|
|
|
sys.stdout.write(' MAME_DIR .. "%s",\n' % line)
|
|
|
|
sys.stdout.write(' }\n')
|
|
|
|
sys.stdout.write('end\n')
|
|
|
|
sys.stdout.write('\n')
|
|
|
|
sys.stdout.write('function linkProjects_mame_%s(_target, _subtarget)\n' % sys.argv[4])
|
|
|
|
sys.stdout.write(' links {\n')
|
|
|
|
sys.stdout.write(' "mame_%s",\n' % sys.argv[4])
|
|
|
|
sys.stdout.write(' }\n')
|
|
|
|
sys.stdout.write('end\n')
|