Refactored meson scripts (#9143)

This commit is contained in:
Paul I 2018-01-11 19:20:23 +03:00 committed by xarkes
parent f32cc2777a
commit 2b0c9d1a17
3 changed files with 157 additions and 140 deletions

View File

@ -27,12 +27,10 @@ environment:
- builder: vs2015_64
PYTHON: 'C:\\Python36-x64'
BUILD_DIR: build
NINJA_URL: https://github.com/ninja-build/ninja/releases/download/v1.7.2/ninja-win.zip
# VS2015 32
- builder: vs2015_32
PYTHON: 'C:\\Python36'
BUILD_DIR: build
NINJA_URL: https://github.com/ninja-build/ninja/releases/download/v1.7.2/ninja-win.zip
# VS2015 64 (Dynamic linking)
- builder: vs2015_64_dyn
PYTHON: 'C:\\Python36'
@ -65,7 +63,7 @@ install:
- ps: $env:DIST_FOLDER = "radare2-$env:builder-$env:R2_VERSION"
- ps: $env:ARTIFACT_ZIP = "$env:DIST_FOLDER.zip"
# Download required packages
- cmd: if defined BUILD_DIR ( %PYTHON%\python.exe -m pip install meson && COPY %PYTHON%\Scripts\meson.py meson.py )
- cmd: if defined BUILD_DIR ( %PYTHON%\python.exe -m pip install meson )
- cmd: if defined NINJA_URL ( powershell -Command wget %NINJA_URL% -OutFile ninja.zip && unzip ninja.zip )
# Build scripts
@ -73,11 +71,11 @@ build_script:
- appveyor AddMessage "Compiling radare2 %R2_VERSION% (%builder%)"
- if %builder% == msvc_cccl_64 ( sys\msvc.bat && make windist WINBITS=%builder% )
- cmd: if %builder% == vs2015_64 ( set "PATH=C:\mingw\bin;C:\mingw\msys\1.0\bin;%PYTHON%;%PATH%" && call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x64 && python sys\meson.py --backend vs2015 --release --xp --prefix="%CD%" && sys\meson_install.bat --msbuild %DIST_FOLDER% && zip -r %ARTIFACT_ZIP% %DIST_FOLDER% )
- cmd: if %builder% == vs2015_64 ( set "PATH=C:\mingw\bin;C:\mingw\msys\1.0\bin;%PYTHON%;%PATH%" && call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x64 && python sys\meson.py --backend vs2015 --release --xp --prefix="%CD%" --install="%DIST_FOLDER%" && zip -r %ARTIFACT_ZIP% %DIST_FOLDER% )
- cmd: if %builder% == vs2015_32 ( set "PATH=C:\mingw\bin;C:\mingw\msys\1.0\bin;%PYTHON%;%PATH%" && call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86 && python sys\meson.py --backend vs2015 --release --xp --prefix="%CD%" && sys\meson_install.bat --msbuild %DIST_FOLDER% && zip -r %ARTIFACT_ZIP% %DIST_FOLDER% )
- cmd: if %builder% == vs2015_32 ( set "PATH=C:\mingw\bin;C:\mingw\msys\1.0\bin;%PYTHON%;%PATH%" && call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86 && python sys\meson.py --backend vs2015 --release --xp --prefix="%CD%" --install="%DIST_FOLDER%" && zip -r %ARTIFACT_ZIP% %DIST_FOLDER% )
- cmd: if %builder% == vs2015_64_dyn ( set "PATH=C:\mingw\bin;C:\mingw\msys\1.0\bin;%PYTHON%;%PATH%" && call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x64 && python sys\meson.py --release --shared --prefix="%CD%" && sys\meson_install.bat %DIST_FOLDER% && zip -r %ARTIFACT_ZIP% %DIST_FOLDER% )
- cmd: if %builder% == vs2015_64_dyn ( set "PATH=C:\mingw\bin;C:\mingw\msys\1.0\bin;%PYTHON%;%PATH%" && call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x64 && python sys\meson.py --release --shared --prefix="%CD%" --install="%DIST_FOLDER%" && zip -r %ARTIFACT_ZIP% %DIST_FOLDER% )
- cmd: if %builder% == mingw32 ( set "PATH=%EXP_PATH%;%PATH%" && sh -c "CC=mingw32-gcc-5.3.0 ./configure --with-ostype=mingw32 && make" && sh -c "make windist WINBITS=%builder% ZIPNAME=%ARTIFACT_ZIP%" )

View File

@ -1,42 +1,34 @@
## Meson build for radare2
import argparse
import glob
import inspect
import logging
import os
import re
import shutil
import subprocess
import sys
ROOT = None
from mesonbuild import mesonmain
BUILDDIR = 'build'
SDB_BUILDDIR = 'build_sdb'
SDB = os.path.join(SDB_BUILDDIR, 'sdb')
BACKENDS = ['ninja', 'vs2015', 'vs2017']
BLACKLIST = ['Makefile', 'makefile']
EXTENSIONS = ['sdb.txt']
MESON = None
PYTHON = None
BACKENDS = ['ninja', 'vs2015', 'vs2017']
PATH_FMT = {}
ROOT = None
log = None
def setGlobalVariables():
""" Set global variables """
global log
global ROOT
global MESON
global PYTHON
if os.name == 'posix':
cmd = 'which meson'
else:
cmd = 'where meson.py'
MESON = os.popen(cmd).read().split('\n')[0]
#if os.name == 'nt' and ' ' in MESON:
# MESON = '"{}"'.format(MESON)
PYTHON = sys.executable
#if os.name == 'nt' and ' ' in PYTHON:
# PYTHON = '"{}"'.format(PYTHON)
ROOT = os.path.abspath(inspect.getfile(inspect.currentframe()) +
os.path.join(os.path.pardir, os.path.pardir, os.path.pardir))
@ -46,11 +38,11 @@ def setGlobalVariables():
logging.basicConfig(format='[Meson][%(levelname)s]: %(message)s',
level=logging.DEBUG)
log = logging.getLogger('r2-meson')
log.debug('Root:{} Meson:{} Python:{}'.format(ROOT, MESON, PYTHON))
log.debug('Root:{}'.format(ROOT))
def meson(root, build, prefix=None, backend=None, release=False, shared=False):
""" Start meson build (i.e. python meson.py ./ build) """
command = [PYTHON, MESON, root, build]
command = [root, build]
if prefix:
command += ['--prefix={}'.format(prefix)]
if backend:
@ -63,20 +55,59 @@ def meson(root, build, prefix=None, backend=None, release=False, shared=False):
command += ['--default-library', 'static']
log.debug('Invoking meson: {}'.format(command))
ret = subprocess.call(command)
launcher = os.path.join(ROOT, 'sys', 'meson.py')
meson_run(command, launcher)
def meson_run(args, launcher):
ret = mesonmain.run(args, launcher)
if ret != 0:
log.error('Meson error. Exiting.')
sys.exit(1)
def ninja(folder):
def ninja(folder, install=False):
""" Start ninja build (i.e. ninja -C build) """
command = ['ninja', '-C', os.path.join(ROOT, folder)]
if install: command.append('install')
log.debug('Invoking ninja: {}'.format(command))
ret = subprocess.call(command)
if ret != 0:
log.error('Ninja error. Exiting.')
sys.exit(1)
def msbuild(project):
log.info('Starting msbuild %s' % project)
ret = subprocess.call(['msbuild', project])
if ret != 0:
log.error('MSbuild error. Exiting.')
sys.exit(1)
def copytree(src, dst):
src = src.format(**PATH_FMT)
dst = dst.format(**PATH_FMT)
log.debug('copytree "%s" -> "%s"' % (src, dst))
shutil.copytree(src, dst)
def move(src, dst):
src = src.format(**PATH_FMT)
dst = dst.format(**PATH_FMT)
term = os.path.sep if os.path.isdir(dst) else ''
log.debug('move "%s" -> "%s%s"' % (src, dst, term))
for file in glob.iglob(src):
shutil.move(file, dst)
def copy(src, dst):
src = src.format(**PATH_FMT)
dst = dst.format(**PATH_FMT)
term = os.path.sep if os.path.isdir(dst) else ''
log.debug('copy "%s" -> "%s%s"' % (src, dst, term))
for file in glob.iglob(src):
shutil.copy2(file, dst)
def makedirs(path):
path = path.format(**PATH_FMT)
log.debug('makedirs "%s"' % path)
os.makedirs(path)
def convert_sdb(folder, f):
""" Convert f to sdb format """
base, _ = get_base_extension(f)
@ -107,11 +138,17 @@ def handle_folder(folder):
convert_sdb(folder, f)
def xp_compat(builddir):
log.info('Running XP compat script')
with open(os.path.join(builddir, 'REGEN.vcxproj'), 'r') as f:
version = re.search('<PlatformToolset>(.*)</PlatformToolset>', f.read()).group(1)
if version.endswith('_xp'):
log.debug('Skipping %s\\*.vcxproj' % builddir)
return
log.debug('Translating from %s to %s_xp' % (version, version))
newversion=version+'_xp'
newversion = version+'_xp'
for root, dirs, files in os.walk(builddir):
for f in files:
@ -123,13 +160,79 @@ def xp_compat(builddir):
proj.write(c)
log.debug("%s .. OK" % f)
def win_install(args):
global PATH_FMT
with open(os.path.join(ROOT, 'configure.acr')) as f:
f.readline()
version = f.readline().split(' ')[1].rstrip()
PATH_FMT['ROOT'] = ROOT
PATH_FMT['DIST'] = args.install
PATH_FMT['BIN'] = os.path.join(args.prefix, 'bin')
PATH_FMT['LIB'] = os.path.join(args.prefix, 'lib')
PATH_FMT['BUILDDIR'] = os.path.join(ROOT, args.dir)
PATH_FMT['R2_VERSION'] = version
if args.backend == 'ninja':
ninja(args.dir, install=True)
else:
for d in (r'{BIN}', r'{LIB}'):
d = d.format(**PATH_FMT)
if os.path.exists(d):
shutil.rmtree(d)
os.makedirs(d)
copy(r'{BUILDDIR}\binr\**\*.exe', r'{BIN}')
copy(r'{BUILDDIR}\libr\**\*.dll', r'{BIN}')
copy(r'{BUILDDIR}\libr\**\*.lib', r'{LIB}')
copy(r'{BUILDDIR}\libr\**\*.a', r'{LIB}')
makedirs(r'{DIST}')
move(r'{BIN}\*.exe', r'{DIST}')
move(r'{BIN}\*.dll', r'{DIST}')
if args.copylib:
move(r'{LIB}\*.lib', r'{DIST}')
move(r'{LIB}\*.a', r'{DIST}')
copytree(r'{ROOT}\shlr\www', r'{DIST}\www')
copytree(r'{ROOT}\libr\magic\d\default', r'{DIST}\share\radare2\{R2_VERSION}\magic')
makedirs(r'{DIST}\share\radare2\{R2_VERSION}\syscall')
copy(r'{ROOT}\libr\syscall\d\*.sdb', r'{DIST}\share\radare2\{R2_VERSION}\syscall')
makedirs(r'{DIST}\share\radare2\{R2_VERSION}\fcnsign')
copy(r'{ROOT}\libr\anal\d\*.sdb', r'{DIST}\share\radare2\{R2_VERSION}\fcnsign')
makedirs(r'{DIST}\share\radare2\{R2_VERSION}\opcodes')
copy(r'{ROOT}\libr\anal\d\*.sdb', r'{DIST}\share\radare2\{R2_VERSION}\opcodes')
makedirs(r'{DIST}\include\libr\sdb')
makedirs(r'{DIST}\include\libr\r_util')
copy(r'{ROOT}\libr\include\*.h', r'{DIST}\include\libr')
copy(r'{ROOT}\libr\include\sdb\*.h', r'{DIST}\include\libr\sdb')
copy(r'{ROOT}\libr\include\r_util\*.h', r'{DIST}\include\libr\r_util')
makedirs(r'{DIST}\share\doc\radare2')
copy(r'{ROOT}\doc\fortunes.*', r'{DIST}\share\doc\radare2')
makedirs(r'{DIST}\share\radare2\{R2_VERSION}\format\dll')
copy(r'{ROOT}\libr\bin\d\elf32', r'{DIST}\share\radare2\{R2_VERSION}\format')
copy(r'{ROOT}\libr\bin\d\elf64', r'{DIST}\share\radare2\{R2_VERSION}\format')
copy(r'{ROOT}\libr\bin\d\elf_enums', r'{DIST}\share\radare2\{R2_VERSION}\format')
copy(r'{ROOT}\libr\bin\d\pe32', r'{DIST}\share\radare2\{R2_VERSION}\format')
copy(r'{ROOT}\libr\bin\d\trx', r'{DIST}\share\radare2\{R2_VERSION}\format')
copy(r'{ROOT}\libr\bin\d\dll\*.sdb', r'{DIST}\share\radare2\{R2_VERSION}\format\dll')
makedirs(r'{DIST}\share\radare2\{R2_VERSION}\cons')
copy(r'{ROOT}\libr\cons\d\*', r'{DIST}\share\radare2\{R2_VERSION}\cons')
makedirs(r'{DIST}\share\radare2\{R2_VERSION}\hud')
copy(r'{ROOT}\doc\hud', r'{DIST}\share\radare2\{R2_VERSION}\hud\main')
def build_sdb(args):
""" Build and generate sdb files """
log.info('Building SDB')
cmd = 'ECHO %CD%' if os.name == 'nt' else 'pwd'
cd = os.popen(cmd).read().rstrip()
meson(os.path.join(ROOT, 'shlr', 'sdb'), SDB_BUILDDIR, prefix=cd)
ninja(SDB_BUILDDIR)
if not os.path.exists(SDB_BUILDDIR):
meson(os.path.join(ROOT, 'shlr', 'sdb'), SDB_BUILDDIR,
args.prefix, args.backend, args.release, args.shared)
if args.backend != 'ninja':
if args.xp:
xp_compat(os.path.join(ROOT, SDB_BUILDDIR))
if not args.project:
project = os.path.join(ROOT, SDB_BUILDDIR, 'sdb.sln')
msbuild(project)
else:
ninja(SDB_BUILDDIR)
# Create .sdb files
log.info('Generating sdb files.')
@ -147,24 +250,18 @@ def build_sdb(args):
def build_r2(args):
""" Build radare2 """
log.info('Building radare2')
if not os.path.exists(args.dir):
meson(ROOT, args.dir, args.prefix, args.backend,
args.release, args.shared)
if args.backend != 'ninja':
if not os.path.exists(args.dir):
meson(ROOT, args.dir, args.prefix, args.backend, args.release,
args.shared)
if args.xp:
log.info('Running XP compat script')
xp_compat(BUILDDIR)
xp_compat(os.path.join(ROOT, args.dir))
if not args.project:
log.info('Starting msbuild')
project = os.path.join(ROOT, args.dir, 'radare2.sln')
subprocess.call(['msbuild', project])
msbuild(project)
else:
if not os.path.exists(args.dir):
meson(ROOT, args.dir, args.prefix, args.backend, args.release,
args.shared)
ninja(args.dir)
def build(args):
""" Prepare requirements and build radare2 """
# Prepare capstone
@ -181,8 +278,10 @@ def build(args):
def install(args):
""" Install radare2 """
if os.name == 'nt':
win_install(args)
return
log.warning('Install not implemented yet.')
return
# TODO
#if os.name == 'posix':
# os.system('DESTDIR="{destdir}" ninja -C {build} install'
@ -204,13 +303,18 @@ def main():
help='Link dynamically (shared library) rather than statically')
parser.add_argument('--prefix', action='store', default=None,
help='Set project installation prefix (default: /usr/local)')
parser.add_argument('--install', action='store_true',
help='Install radare2 after building')
parser.add_argument('--dir', action='store', default=BUILDDIR,
help='Destination build directory (default: {})'.format(BUILDDIR),
required=False)
parser.add_argument('--xp', action='store_true',
help='Adds support for Windows XP')
if os.name == 'nt':
parser.add_argument('--install', help='Installation directory')
parser.add_argument('--copylib', action='store_true',
help='Copy static libraries to the installation directory')
else:
parser.add_argument('--install', action='store_true',
help='Install radare2 after building')
args = parser.parse_args()
# Check arguments
@ -220,6 +324,9 @@ def main():
if args.xp and args.backend == 'ninja':
log.error('--xp is not compatible with --backend ninja')
sys.exit(1)
if os.name == 'nt' and args.install and os.path.exists(args.install):
log.error('%s already exists' % args.install)
sys.exit(1)
# Build it!
log.debug('Arguments: {}'.format(args))
@ -228,4 +335,9 @@ def main():
install(args)
if __name__ == '__main__':
# meson internals
if len(sys.argv) > 1 and sys.argv[1] in ('test', '--internal'):
launcher = os.path.realpath(sys.argv[0])
meson_run(sys.argv[1:], launcher)
sys.exit()
main()

View File

@ -1,93 +0,0 @@
@echo off
SET BUILDER=ninja
SET DIST=
SET COPYLIB=
:PARSEARGS
IF NOT "%1"=="" (
IF "%1"=="--msbuild" (
SET BUILDER=msbuild
) ELSE IF "%1"=="--with-static" (
SET COPYLIB=1
) ELSE (
SET DIST=%1
)
SHIFT
GOTO PARSEARGS
)
:START
IF "%DIST%"=="" ( ECHO Please call this script with the dist folder name. && GOTO EXIT )
IF "%R2_VERSION%"=="" (
SETLOCAL EnableDelayedExpansion
ECHO %%R2_VERSION%% not set, trying to set automatically...
FOR /F "tokens=* USEBACKQ" %%F IN (`python sys\\version.py`) DO (
SET VER=%%F
)
IF "!VER!"=="" (
ECHO Failed.
GOTO EXIT
)
SET R2_VER=!VER!
) ELSE (
GOTO CHECK
)
ENDLOCAL & ( SET "R2_VERSION=%R2_VER%" )
:CHECK
ECHO Using version %R2_VERSION%
IF "%BUILDER%"=="ninja" (
ECHO [ R2 MESON NINJA INSTALL ]
ninja.exe -C build install
)
IF "%BUILDER%"=="msbuild" (
ECHO [ R2 MSBUILD INSTALL ]
IF EXIST bin ( RD /s /q bin )
MKDIR bin
FOR /F "tokens=*" %%F IN (' dir /s /b build\binr\*.exe ') DO COPY %%F bin\
IF EXIST lib ( RD /s /q lib )
MKDIR lib
FOR /F "tokens=*" %%F IN (' dir /s /b build\libr\*.dll ') DO COPY %%F lib\
)
ECHO [ R2 WINDIST FOLDER CREATION ]
MKDIR %DIST%
MOVE bin\*.exe %DIST%\
MOVE bin\*.dll %DIST%\
IF "%COPYLIB%"=="1" (
MOVE lib\*.lib %DIST%\
MOVE lib\*.a %DIST%\
)
XCOPY /S /I shlr\www %DIST%\www
MKDIR %DIST%\share\radare2\%R2_VERSION%\magic
XCOPY /S libr\magic\d\default\* %DIST%\share\radare2\%R2_VERSION%\magic\
MKDIR %DIST%\share\radare2\%R2_VERSION%\syscall
XCOPY /S libr\syscall\d\*.sdb %DIST%\share\radare2\%R2_VERSION%\syscall\
MKDIR %DIST%\share\radare2\%R2_VERSION%\fcnsign
XCOPY /S libr\anal\d\*.sdb %DIST%\share\radare2\%R2_VERSION%\fcnsign\
MKDIR %DIST%\share\radare2\%R2_VERSION%\opcodes
XCOPY /S libr\anal\d\*.sdb %DIST%\share\radare2\%R2_VERSION%\opcodes\
MKDIR %DIST%\share\doc\radare2
MKDIR %DIST%\include\libr\sdb
MKDIR %DIST%\include\libr\r_util
COPY libr\include\sdb\*.h %DIST%\include\libr\sdb\
COPY libr\include\r_util\*.h %DIST%\include\libr\r_util\
COPY libr\include\*.h %DIST%\include\libr\
COPY doc\fortunes.* %DIST%\share\doc\radare2\
MKDIR %DIST%\share\radare2\%R2_VERSION%\format\dll
COPY libr\bin\d\elf32 %DIST%\share\radare2\%R2_VERSION%\format\
COPY libr\bin\d\elf64 %DIST%\share\radare2\%R2_VERSION%\format\
COPY libr\bin\d\elf_enums %DIST%\share\radare2\%R2_VERSION%\format\
COPY libr\bin\d\pe32 %DIST%\share\radare2\%R2_VERSION%\format\
COPY libr\bin\d\trx %DIST%\share\radare2\%R2_VERSION%\format\
COPY libr\bin\d\dll\*.sdb %DIST%\share\radare2\%R2_VERSION%\format\dll\
MKDIR %DIST%\share\radare2\%R2_VERSION%\cons
COPY libr\cons\d\* %DIST%\share\radare2\%R2_VERSION%\cons\
MKDIR %DIST%\share\radare2\%R2_VERSION%\hud
COPY doc\hud %DIST%\share\radare2\%R2_VERSION%\hud\main
:EXIT