Build assembly files with AMBuild. (#481)

* Remove prebuilt nasm-generated object files from the tree, and use AMBuild to compile them.

* Add commands in VS project to build the object files

* Rename elf to elf32 for consistency
This commit is contained in:
David Anderson 2018-08-26 11:28:25 -07:00 committed by Vincent Herbet
parent 9bcabfeb1f
commit 46d1ef68bd
21 changed files with 127 additions and 32 deletions

2
.gitignore vendored
View File

@ -84,3 +84,5 @@ Thumbs.db
# AMXX plugin build related files # AMXX plugin build related files
plugins/compile.dat plugins/compile.dat
plugins/compiled/ plugins/compiled/
build_deps/

View File

@ -8,6 +8,7 @@ addons:
- linux-libc-dev - linux-libc-dev
- gcc-multilib - gcc-multilib
- g++-multilib - g++-multilib
- nasm
sources: sources:
- llvm-toolchain-precise-3.7 - llvm-toolchain-precise-3.7
- ubuntu-toolchain-r-test - ubuntu-toolchain-r-test
@ -23,4 +24,4 @@ script:
- mkdir build && cd build - mkdir build && cd build
- PATH="~/.local/bin:$PATH" - PATH="~/.local/bin:$PATH"
- CC=clang-3.7 CXX=clang-3.7 python ../configure.py --enable-optimize - CC=clang-3.7 CXX=clang-3.7 python ../configure.py --enable-optimize
- ambuild - ambuild

View File

@ -20,6 +20,7 @@ class AMXXConfig(object):
self.utf8rewind = None self.utf8rewind = None
self.csx_app = None self.csx_app = None
self.stdcxx_path = None self.stdcxx_path = None
self.nasm_path = None
def use_auto_versioning(self): def use_auto_versioning(self):
if builder.backend != 'amb2': if builder.backend != 'amb2':
@ -105,6 +106,31 @@ class AMXXConfig(object):
if not self.mysql_path: if not self.mysql_path:
raise Exception('Could not find MySQL! Try passing --mysql to configure.py.') raise Exception('Could not find MySQL! Try passing --mysql to configure.py.')
def detectNASM(self):
import subprocess
nasm_paths = [
getattr(builder.options, 'nasm_path', 'nasm'),
]
if builder.target_platform == 'windows':
nasm_paths += [os.path.join(
builder.sourcePath,
'build_deps',
'nasm',
'nasm.exe')
]
for nasm_path in nasm_paths:
try:
subprocess.check_output([nasm_path, '-v'])
self.nasm_path = nasm_path
break
except:
pass
if self.nasm_path is None:
raise Exception('Could not find a suitable path for nasm')
# Returns list of lines of output from the compiler # Returns list of lines of output from the compiler
@staticmethod @staticmethod
def invokeCompiler(args): def invokeCompiler(args):
@ -369,11 +395,42 @@ class AMXXConfig(object):
binary = context.compiler.Program(name) binary = context.compiler.Program(name)
return self.AddVersioning(binary) return self.AddVersioning(binary)
def AddAssembly(self, context, binary, input_file, output_file, includes=[], extra_argv=[]):
if builder.target_platform == 'windows':
obj_type = 'win32'
elif builder.target_platform == 'linux':
obj_type = 'elf32'
elif builder.target_platform == 'mac':
obj_type = 'macho32'
input_path = os.path.join(context.currentSourcePath, input_file)
output_path = output_file
argv = [
self.nasm_path,
'-I{0}{1}'.format(context.currentSourcePath, os.sep),
input_path,
'-f', obj_type,
'-o', output_path,
] + extra_argv
extra_includes = []
for include_file in includes:
extra_includes.append(os.path.join(context.currentSourcePath, include_file))
cmd_node, output_nodes = context.AddCommand(
inputs = [input_path] + extra_includes,
argv = argv,
outputs = [output_path])
binary.compiler.linkflags += [output_nodes[0]]
AMXX = AMXXConfig() AMXX = AMXXConfig()
AMXX.detectProductVersion() AMXX.detectProductVersion()
AMXX.detectMetamod() AMXX.detectMetamod()
AMXX.detectHlsdk() AMXX.detectHlsdk()
AMXX.detectMysql() AMXX.detectMysql()
AMXX.detectNASM()
AMXX.configure() AMXX.configure()
if AMXX.use_auto_versioning(): if AMXX.use_auto_versioning():

View File

@ -9,36 +9,25 @@ binary.compiler.defines += [
'HAVE_STDINT_H', 'HAVE_STDINT_H',
] ]
AMXX.AddAssembly(builder, binary, 'helpers-x86.asm', 'helpers-asm.obj')
AMXX.AddAssembly(builder, binary, 'natives-x86.asm', 'natives-asm.obj')
AMXX.AddAssembly(builder, binary, 'amxexecn.asm', 'amxexecn-asm.obj',
includes=['amxdefn.asm'])
AMXX.AddAssembly(builder, binary, 'amxjitsn.asm', 'amxjitsn-asm.obj',
includes=['amxdefn.asm'],
# Opcode sizes must be maximum width for patching to work.
extra_argv=['-O0'])
if builder.target_platform == 'mac': if builder.target_platform == 'mac':
jit_objects = [
binary.Dep('JIT/amxexecn-darwin.o'),
binary.Dep('JIT/amxjitsn-darwin.o'),
binary.Dep('JIT/natives-darwin-x86.o'),
binary.Dep('JIT/helpers-darwin-x86.o'),
]
binary.compiler.postlink += [ binary.compiler.postlink += [
'-Wl,-read_only_relocs,suppress' '-Wl,-read_only_relocs,suppress'
] ]
elif builder.target_platform == 'linux':
jit_objects = [
binary.Dep('JIT/amxexecn.o'),
binary.Dep('JIT/amxjitsn.o'),
binary.Dep('JIT/natives-x86.o'),
binary.Dep('JIT/helpers-x86.o'),
]
elif builder.target_platform == 'windows': elif builder.target_platform == 'windows':
jit_objects = [
binary.Dep('JIT/amxexecn.obj'),
binary.Dep('JIT/amxjitsn.obj'),
binary.Dep('JIT/helpers-x86.obj'),
binary.Dep('JIT/natives-x86.obj'),
]
binary.compiler.linkflags += [ binary.compiler.linkflags += [
'/EXPORT:GiveFnptrsToDll=_GiveFnptrsToDll@8,@1', '/EXPORT:GiveFnptrsToDll=_GiveFnptrsToDll@8,@1',
'/SECTION:.data,RW', '/SECTION:.data,RW',
] ]
binary.compiler.linkflags += jit_objects
binary.compiler.linkflags += [AMXX.zlib.binary, AMXX.hashing.binary, AMXX.utf8rewind.binary] binary.compiler.linkflags += [AMXX.zlib.binary, AMXX.hashing.binary, AMXX.utf8rewind.binary]
binary.sources = [ binary.sources = [

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -96,6 +96,14 @@
<ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
<SpecifySectionAttributes>.data,RW</SpecifySectionAttributes> <SpecifySectionAttributes>.data,RW</SpecifySectionAttributes>
</Link> </Link>
<PreBuildEvent>
<Command>cd ..
md -p JIT 2&gt;NUL
%NASM_PATH%nasm.exe -f win32 helpers-x86.asm -o JIT/helpers-x86.obj
%NASM_PATH%nasm.exe -f win32 natives-x86.asm -o JIT/natives-x86.obj
%NASM_PATH%nasm.exe -f win32 amxexecn.asm -o JIT/amxexecn.obj
%NASM_PATH%nasm.exe -O0 -f win32 amxjitsn.asm -o JIT/amxjitsn.obj</Command>
</PreBuildEvent>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='JITRelease|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='JITRelease|Win32'">
<Midl> <Midl>
@ -148,6 +156,14 @@
<ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
<SpecifySectionAttributes>.data,RW</SpecifySectionAttributes> <SpecifySectionAttributes>.data,RW</SpecifySectionAttributes>
</Link> </Link>
<PreBuildEvent>
<Command>cd ..
md -p JIT 2&gt;NUL
%NASM_PATH%nasm.exe -f win32 helpers-x86.asm -o JIT/helpers-x86.obj
%NASM_PATH%nasm.exe -f win32 natives-x86.asm -o JIT/natives-x86.obj
%NASM_PATH%nasm.exe -f win32 amxexecn.asm -o JIT/amxexecn.obj
%NASM_PATH%nasm.exe -O0 -f win32 amxjitsn.asm -o JIT/amxjitsn.obj</Command>
</PreBuildEvent>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="..\..\public\memtools\CDetour\asm\asm.c" /> <ClCompile Include="..\..\public\memtools\CDetour\asm\asm.c" />
@ -474,4 +490,4 @@
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets"> <ImportGroup Label="ExtensionTargets">
</ImportGroup> </ImportGroup>
</Project> </Project>

View File

@ -3,6 +3,11 @@ clone_folder: c:\projects\amxmodx
install: install:
- git submodule update --init --recursive - git submodule update --init --recursive
- 'c:' - 'c:'
- mkdir c:\nasm
- set PATH=c:\nasm\nasm-2.13.03;%PATH%
- curl -o "c:\nasm\nasm.zip" http://www.nasm.us/pub/nasm/releasebuilds/2.13.03/win32/nasm-2.13.03-win32.zip
- chdir c:\nasm
- 7z x nasm.zip
- chdir c:\projects - chdir c:\projects
- git clone https://github.com/alliedmodders/ambuild - git clone https://github.com/alliedmodders/ambuild
- git clone https://github.com/alliedmodders/metamod-hl1 - git clone https://github.com/alliedmodders/metamod-hl1
@ -22,5 +27,5 @@ build_script:
- '"%VS120COMNTOOLS%\vsvars32.bat"' - '"%VS120COMNTOOLS%\vsvars32.bat"'
- mkdir build - mkdir build
- cd build - cd build
- c:\python27\python ../configure.py --enable-optimize - c:\python27\python ../configure.py --enable-optimize --nasm="C:\nasm\nasm-2.13.03\nasm.exe"
- c:\python27\scripts\ambuild - c:\python27\scripts\ambuild

View File

@ -30,4 +30,6 @@ run.options.add_option('--mysql', type='string', dest='mysql_path', default='',
help='Path to MySQL') help='Path to MySQL')
run.options.add_option('--disable-auto-versioning', action='store_true', dest='disable_auto_versioning', run.options.add_option('--disable-auto-versioning', action='store_true', dest='disable_auto_versioning',
default=False, help='Disable the auto versioning script') default=False, help='Disable the auto versioning script')
run.options.add_option('--nasm', type='string', dest='nasm_path',
default='nasm', help='Path to NASM')
run.Configure() run.Configure()

View File

@ -5,6 +5,22 @@ if [ ! -d "amxmodx" ]; then
git clone --recursive https://github.com/alliedmodders/amxmodx.git git clone --recursive https://github.com/alliedmodders/amxmodx.git
fi fi
if [ ! -d "amxmodx/build_deps" ]; then
mkdir amxmodx/build_deps
fi
download_archive ()
{
if [ `command -v wget` ]; then
wget "$url" -O "$dest"
elif [ `command -v curl` ]; then
curl -o $dest $url
else
echo "Failed to locate wget or curl. Please install one of these programs."
exit 1
fi
}
if [ "$1" != "--no-mysql" ]; then if [ "$1" != "--no-mysql" ]; then
ismac=0 ismac=0
iswin=0 iswin=0
@ -34,14 +50,9 @@ if [ "$1" != "--no-mysql" ]; then
fi fi
if [ ! -d "mysql-5.5" ]; then if [ ! -d "mysql-5.5" ]; then
if [ `command -v wget` ]; then url=$mysqlurl
wget $mysqlurl -O mysql.$archive_ext dest=mysql.$archive_ext
elif [ `command -v curl` ]; then download_archive
curl -o mysql.$archive_ext $mysqlurl
else
echo "Failed to locate wget or curl. Install one of these programs to download MySQL."
exit 1
fi
$decomp mysql.$archive_ext $decomp mysql.$archive_ext
mv $mysqlver mysql-5.5 mv $mysqlver mysql-5.5
rm mysql.$archive_ext rm mysql.$archive_ext
@ -95,3 +106,15 @@ if [ $? -eq 1 ]; then
python setup.py install --user python setup.py install --user
fi fi
fi fi
if [ $iswin -eq 1 ]; then
if [ ! -d "amxmodx/build_deps/nasm-2.13.03" ]; then
url=http://www.nasm.us/pub/nasm/releasebuilds/2.13.03/win32/nasm-2.13.03-win32.zip
dest=amxmodx/build_deps/nasm-2.13.03-win32.zip
download_archive
cd amxmodx/build_deps
unzip nasm-2.13.03-win32.zip
rm nasm-2.13.03-win32.zip
mv nasm-2.13.03 nasm
fi
fi