mirror of
https://gitee.com/zlgopen/awtk.git
synced 2024-11-30 02:58:26 +08:00
327 lines
10 KiB
Python
327 lines
10 KiB
Python
import os
|
|
import os.path
|
|
import platform
|
|
import shutil
|
|
from shutil import copyfile
|
|
|
|
import sys
|
|
if sys.version_info.major == 2:
|
|
import cPickle as pickle
|
|
else:
|
|
import pickle
|
|
|
|
import subprocess
|
|
|
|
def is_raspberrypi():
|
|
result = str(subprocess.check_output(["uname", "-a"]))
|
|
return result.find('Linux raspberrypi') >= 0
|
|
|
|
#######################################################
|
|
# XXX: This file can be edited only in tkc project
|
|
#######################################################
|
|
|
|
TOOLS_PREFIX = ''
|
|
OS_NAME = platform.system()
|
|
MACH = platform.machine()
|
|
ARCH = platform.architecture()
|
|
is32bit = (ARCH[0] == '32bit')
|
|
|
|
if is32bit:
|
|
if MACH == 'i686' or MACH == 'i386' or MACH == 'x86':
|
|
TARGET_ARCH = 'x86'
|
|
else:
|
|
TARGET_ARCH = ''
|
|
else:
|
|
TARGET_ARCH = ''
|
|
|
|
print('MACH=' + MACH + ' ARCH=' + str(ARCH) + ' TARGET_ARCH=' + TARGET_ARCH)
|
|
|
|
|
|
def addLibPrefix(iter):
|
|
print(iter)
|
|
return '-l'+iter
|
|
|
|
|
|
def toWholeArchive(libs):
|
|
wa = ' '.join(list(map(addLibPrefix, libs)))
|
|
return ' -Wl,--whole-archive ' + wa + ' -Wl,--no-whole-archive'
|
|
|
|
|
|
def getTkcOnly():
|
|
env = os.environ
|
|
if 'TKC_ONLY' in env:
|
|
return env['TKC_ONLY'] == 'True'
|
|
else:
|
|
return False
|
|
|
|
|
|
def joinPath(root, subdir):
|
|
return os.path.normpath(os.path.join(root, subdir))
|
|
|
|
|
|
TK_ROOT = os.path.dirname(os.path.normpath(os.path.abspath(__file__)))
|
|
|
|
print('TK_ROOT: ' + TK_ROOT)
|
|
|
|
TK_SRC = joinPath(TK_ROOT, 'src')
|
|
TK_BIN_DIR = joinPath(TK_ROOT, 'bin')
|
|
TK_LIB_DIR = joinPath(TK_ROOT, 'lib')
|
|
TK_3RD_ROOT = joinPath(TK_ROOT, '3rd')
|
|
TK_TOOLS_ROOT = joinPath(TK_ROOT, 'tools')
|
|
TK_DEMO_ROOT = joinPath(TK_ROOT, 'demos')
|
|
GTEST_ROOT = joinPath(TK_ROOT, '3rd/gtest/googletest')
|
|
TKC_STATIC_LIBS = ['debugger', 'fscript_ext', 'streams', 'conf_io', 'hal', 'xml', 'charset',
|
|
'csv', 'ubjson', 'compressors', 'miniz', 'tkc_core', 'mbedtls']
|
|
|
|
TOOLS_NAME = ''
|
|
NANOVG_BACKEND = ''
|
|
NATIVE_WINDOW = ''
|
|
#TOOLS_NAME = 'mingw'
|
|
|
|
if OS_NAME == 'Windows':
|
|
TK_ROOT = TK_ROOT.replace('\\', '\\\\')
|
|
|
|
OS_FLAGS = ''
|
|
OS_LIBS = []
|
|
OS_LIBPATH = []
|
|
OS_CPPPATH = []
|
|
OS_LINKFLAGS = ''
|
|
OS_SUBSYSTEM_CONSOLE = ''
|
|
OS_SUBSYSTEM_WINDOWS = ''
|
|
OS_PROJECTS = []
|
|
# only for c compiler flags
|
|
COMMON_CFLAGS = ''
|
|
|
|
if OS_NAME == 'Darwin':
|
|
TOOLS_NAME = ''
|
|
OS_FLAGS = '-g -Wall -Wno-unused-function -fPIC -DWITHOUT_GLAD=1 '
|
|
OS_LIBS = ['stdc++', 'iconv', 'pthread', 'm', 'dl']
|
|
OS_LINKFLAGS = '-framework IOKit -framework Cocoa -framework QuartzCore -framework OpenGL -weak_framework Metal -weak_framework MetalKit'
|
|
OS_FLAGS = OS_FLAGS + ' -DHAS_SEM_OPEN '
|
|
OS_FLAGS = OS_FLAGS + ' -D__APPLE__ -DHAS_PTHREAD -DMACOS -Dmacintosh '
|
|
OS_FLAGS = OS_FLAGS + ' -D__STDC_LIMIT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_CONSTANT_MACROS -DBGFX_CONFIG_RENDERER_METAL=1 '
|
|
OS_LIBPATH = ['/usr/local/lib/', '/opt/homebrew/Cellar/sdl2/2.28.0/lib']
|
|
|
|
elif OS_NAME == 'Linux':
|
|
TOOLS_NAME = ''
|
|
OS_FLAGS = '-g -Wall -Wno-unused-function -fPIC '
|
|
OS_LIBS = ['GL', 'gtk-3', 'gdk-3', 'glib-2.0', 'gobject-2.0', 'Xext', 'X11',
|
|
'sndio', 'stdc++', 'asound', 'pthread', 'm', 'dl']
|
|
COMMON_CFLAGS = COMMON_CFLAGS+' -std=gnu99 '
|
|
OS_FLAGS = OS_FLAGS + ' -DLINUX -DHAS_PTHREAD'
|
|
OS_FLAGS = OS_FLAGS + ' -DSDL_REAL_API -DSDL_TIMER_UNIX -DSDL_VIDEO_DRIVER_X11 -DSDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS '
|
|
OS_FLAGS = OS_FLAGS + \
|
|
' -DSDL_AUDIO_DRIVER_SNDIO -DSDL_VIDEO_OPENGL_GLX -DSDL_VIDEO_RENDER_OGL '
|
|
OS_FLAGS = OS_FLAGS + ' -DSDL_LOADSO_DLOPEN -DSDL_VIDEO_OPENGL_EGL -DSDL_VIDEO_OPENGL_ES2 '
|
|
OS_FLAGS = OS_FLAGS + \
|
|
' -DSDL_REAL_API -DSDL_HAPTIC_DISABLED -DSDL_SENSOR_DISABLED -DSDL_JOYSTICK_DISABLED '
|
|
OS_PROJECTS = ['3rd/SDL/SConscript']
|
|
if TARGET_ARCH == 'x86':
|
|
OS_FLAGS = OS_FLAGS + ' -U__FLT_EVAL_METHOD__ -D__FLT_EVAL_METHOD__=0 '
|
|
else:
|
|
OS_FLAGS = OS_FLAGS + ' -DWITH_64BIT_CPU '
|
|
|
|
OS_LINKFLAGS = ' -Wl,-rpath=./bin -Wl,-rpath=./ '
|
|
if is_raspberrypi():
|
|
OS_FLAGS = OS_FLAGS + ' -DRASPBERRYPI '
|
|
os.environ['RASPBERRYPI'] = 'true'
|
|
|
|
|
|
elif OS_NAME == 'Windows':
|
|
if not os.path.exists(os.path.abspath(TK_BIN_DIR)):
|
|
os.makedirs(os.path.abspath(TK_BIN_DIR))
|
|
if not os.path.exists(os.path.abspath(TK_LIB_DIR)):
|
|
os.makedirs(os.path.abspath(TK_LIB_DIR))
|
|
if TOOLS_NAME == '':
|
|
OS_LIBS = ['gdi32', 'user32', 'winmm.lib', 'imm32.lib', 'version.lib', 'shell32.lib',
|
|
'ole32.lib', 'Oleaut32.lib', 'Advapi32.lib', 'DelayImp.lib', 'psapi.lib', "ws2_32"]
|
|
OS_FLAGS = '-DWIN32 -D_WIN32 -DWINDOWS /EHsc -D_CONSOLE /DEBUG /Od /FS /Z7 /utf-8 /MD '
|
|
if TARGET_ARCH == 'x86':
|
|
OS_LINKFLAGS = '/MACHINE:X86 /DEBUG '
|
|
OS_SUBSYSTEM_CONSOLE = '/SUBSYSTEM:CONSOLE,5.01 '
|
|
OS_SUBSYSTEM_WINDOWS = '/SUBSYSTEM:WINDOWS,5.01 '
|
|
OS_FLAGS = OS_FLAGS + ' -D_WIN32 '
|
|
else:
|
|
OS_FLAGS = OS_FLAGS + ' -DWITH_64BIT_CPU '
|
|
OS_LINKFLAGS = '/MACHINE:X64 /DEBUG '
|
|
OS_SUBSYSTEM_CONSOLE = '/SUBSYSTEM:CONSOLE '
|
|
OS_SUBSYSTEM_WINDOWS = '/SUBSYSTEM:WINDOWS '
|
|
OS_FLAGS = OS_FLAGS + ' -D_WIN64 '
|
|
OS_FLAGS = OS_FLAGS + ' -DHAVE_LIBC '
|
|
|
|
elif TOOLS_NAME == 'mingw':
|
|
OS_LIBS = ['kernel32', 'gdi32', 'user32', 'winmm', 'imm32', 'version', 'shell32',
|
|
'ole32', 'Oleaut32', 'Advapi32', 'oleaut32', 'uuid', 'stdc++', "ws2_32"]
|
|
OS_FLAGS = '-DMINGW -DWINDOWS -D_CONSOLE -g -Wall'
|
|
OS_LINKFLAGS = ' -Wl,-rpath=./bin -Wl,-rpath=./ '
|
|
COMMON_CFLAGS = COMMON_CFLAGS+' -std=gnu99 '
|
|
OS_FLAGS = OS_FLAGS+' -U__FLT_EVAL_METHOD__ -D__FLT_EVAL_METHOD__=0 -DDECLSPEC= '
|
|
|
|
#OS_FLAGS='-DWIN32 -D_WIN32 -DWINDOWS /EHsc -D_CONSOLE /DEBUG /Od /FS /Z7 -D_DEBUG /MDd '
|
|
OS_FLAGS = OS_FLAGS + \
|
|
' -DSDL_REAL_API -DSDL_HAPTIC_DISABLED -DSDL_SENSOR_DISABLED -DSDL_JOYSTICK_DISABLED '
|
|
OS_FLAGS = OS_FLAGS + '-D__STDC_LIMIT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_CONSTANT_MACROS -D_HAS_EXCEPTIONS=0 -D_HAS_ITERATOR_DEBUGGING=0 -D_ITERATOR_DEBUG_LEVEL=0 -D_SCL_SECURE=0'
|
|
OS_FLAGS = OS_FLAGS + \
|
|
'-D_SECURE_SCL=0 -D_SCL_SECURE_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS -D_CRT_SECURE_NO_DEPRECATE '
|
|
OS_PROJECTS = ['3rd/SDL/SConscript']
|
|
|
|
|
|
def has_custom_cc():
|
|
return False
|
|
|
|
|
|
def cleanSharedLib(dst, name):
|
|
if OS_NAME == 'Darwin':
|
|
dst = os.path.join(dst, 'lib'+name+'.dylib')
|
|
elif OS_NAME == 'Linux':
|
|
dst = os.path.join(dst, 'lib'+name+'.so')
|
|
elif OS_NAME == 'Windows':
|
|
dst = os.path.join(dst, name+'.dll')
|
|
else:
|
|
print('not support ' + OS_NAME)
|
|
return
|
|
|
|
dst = os.path.normpath(dst)
|
|
|
|
if os.path.exists(dst):
|
|
os.remove(dst)
|
|
print('Removed ' + dst)
|
|
|
|
if OS_NAME == 'Windows':
|
|
dst=dst.replace('.dll', '.lib')
|
|
if os.path.exists(dst):
|
|
os.remove(dst)
|
|
print('Removed ' + dst)
|
|
|
|
|
|
def copySharedLib(src, dst, name):
|
|
mingw_src = src
|
|
if OS_NAME == 'Darwin':
|
|
src = os.path.join(src, 'bin/lib'+name+'.dylib')
|
|
elif OS_NAME == 'Linux':
|
|
src = os.path.join(src, 'bin/lib'+name+'.so')
|
|
elif OS_NAME == 'Windows':
|
|
src = os.path.join(src, 'bin/'+name+'.dll')
|
|
else:
|
|
print('not support ' + OS_NAME)
|
|
return
|
|
|
|
src = os.path.normpath(src)
|
|
dst = os.path.normpath(dst)
|
|
|
|
if os.path.dirname(src) == dst:
|
|
return
|
|
|
|
if not os.path.exists(src):
|
|
print('Can\'t find ' + src + '. Please build '+name+' before!')
|
|
else:
|
|
if not os.path.exists(dst):
|
|
os.makedirs(dst)
|
|
shutil.copy(src, dst)
|
|
print(src + '==>' + dst)
|
|
if OS_NAME == 'Windows':
|
|
if TOOLS_NAME == 'mingw':
|
|
src = os.path.join(mingw_src, 'bin/lib'+name+'.a')
|
|
else:
|
|
src = src.replace('dll', 'lib')
|
|
if os.path.exists(src):
|
|
shutil.copy(src, dst)
|
|
print(src + '==>' + dst)
|
|
|
|
|
|
def isBuildShared():
|
|
return 'WITH_AWTK_SO' in os.environ and os.environ['WITH_AWTK_SO'] == 'true'
|
|
|
|
|
|
def genIdlAndDefEx(withAWTK):
|
|
cmds = [
|
|
'node tools/idl_gen/tkc.js tools/idl_gen/tkc.json',
|
|
'node tools/dll_def_gen/index.js tools/idl_gen/tkc.json dllexports/tkc.def false'
|
|
]
|
|
if withAWTK:
|
|
cmds += [
|
|
'node tools/idl_gen/index.js tools/idl_gen/idl.json',
|
|
'node tools/dll_def_gen/index.js tools/idl_gen/idl.json dllexports/awtk.def false',
|
|
]
|
|
|
|
for cmd in cmds:
|
|
print(cmd)
|
|
if os.system(cmd) != 0:
|
|
print('exe cmd: ' + cmd + ' failed.')
|
|
|
|
|
|
os.environ['TK_ROOT'] = TK_ROOT
|
|
os.environ['TOOLS_NAME'] = TOOLS_NAME
|
|
os.environ['GTEST_ROOT'] = GTEST_ROOT
|
|
os.environ['TK_3RD_ROOT'] = TK_3RD_ROOT
|
|
|
|
|
|
def setEnvSpawn(env):
|
|
if env['PLATFORM'] == 'win32' and os.environ['TOOLS_NAME'] != '':
|
|
import subprocess
|
|
|
|
class ourSpawn:
|
|
def ourspawn(self, sh, escape, cmd, args, env):
|
|
newargs = ' '.join(args[1:])
|
|
cmdline = cmd + " " + newargs
|
|
startupinfo = subprocess.STARTUPINFO()
|
|
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
|
|
proc = subprocess.Popen(cmdline, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
|
|
stderr=subprocess.PIPE, startupinfo=startupinfo, shell=False, env=env)
|
|
data, err = proc.communicate()
|
|
rv = proc.wait()
|
|
if rv:
|
|
print("=====")
|
|
print(err)
|
|
print("=====")
|
|
return rv
|
|
|
|
buf = ourSpawn()
|
|
buf.ourenv = env
|
|
env['SPAWN'] = buf.ourspawn
|
|
|
|
|
|
def genDllLinkFlags(libs, defFile):
|
|
linkFlags = ''
|
|
wholeArch = toWholeArchive(libs)
|
|
|
|
if OS_NAME == 'Windows':
|
|
if TOOLS_NAME == '':
|
|
linkFlags += ' /DEF:"dllexports/'+defFile+'.def" '
|
|
elif TOOLS_NAME == 'mingw':
|
|
linkFlags += wholeArch
|
|
elif OS_NAME == 'Darwin':
|
|
linkFlags += ' -all_load '
|
|
elif OS_NAME == 'Linux':
|
|
linkFlags += wholeArch
|
|
|
|
return linkFlags
|
|
|
|
|
|
def get_scons_db_files(root):
|
|
scons_db_files = []
|
|
scons_db_filename = ".sconsign.dblite"
|
|
|
|
for f in os.listdir(root):
|
|
full_path = joinPath(root, f)
|
|
if os.path.isfile(full_path) and f == scons_db_filename:
|
|
scons_db_files.append(full_path)
|
|
elif os.path.isdir(full_path) and f != "." and f != "..":
|
|
get_scons_db_files(full_path)
|
|
|
|
return scons_db_files
|
|
|
|
|
|
def scons_db_check_and_remove():
|
|
scons_db_files = []
|
|
scons_db_files = get_scons_db_files(TK_ROOT)
|
|
|
|
for f in scons_db_files:
|
|
try:
|
|
with open(f, "rb") as fs:
|
|
pickle.load(fs)
|
|
fs.close()
|
|
except ValueError as e:
|
|
fs.close()
|
|
os.remove(f)
|