Skip to content

Commit

Permalink
build: add Meson support
Browse files Browse the repository at this point in the history
I was trying to package Vixl, but the SCons build system does not
provide an install target, so I would've had to add it. It seemed too
difficult, so I directly created a quite basic Meson build script.

It provides most features of the SCons script, except for tests and
benchmarks, while adding a rich install target, with library soname
versioning and a pkg-config file.

Meson is a simple yet powerful build system, and you're interested in
using it as your main build system I could add tests and benchmarks :)
  • Loading branch information
Tachi107 committed Aug 6, 2024
1 parent b7ab6ec commit 8ca72cd
Show file tree
Hide file tree
Showing 9 changed files with 336 additions and 0 deletions.
1 change: 1 addition & 0 deletions AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,4 @@
ARM Ltd. <*@arm.com>
Google Inc. <*@google.com>
Linaro <*@linaro.org>
Andrea Pappacoda <[email protected]>
12 changes: 12 additions & 0 deletions doc/aarch32/meson.build
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# SPDX-FileCopyrightText: 2021 VIXL authors
# SPDX-License-Identifier: BSD-3-Clause

custom_target(
'doc_aarch32',
command: [markdown, '@INPUT@'],
input: 'getting-started-aarch32.md',
output: '@[email protected]',
capture: true,
install: true,
install_dir: doc_dir/'aarch32'
)
21 changes: 21 additions & 0 deletions doc/aarch64/meson.build
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# SPDX-FileCopyrightText: 2021 VIXL authors
# SPDX-License-Identifier: BSD-3-Clause

doc_aarch64_files = [
'getting-started-aarch64',
'supported-instructions-aarch64'
]

foreach file : doc_aarch64_files
custom_target(
'doc_aarch64_' + file,
command: [markdown, '@INPUT@'],
input: file + '.md',
output: file + '.html',
capture: true,
install: true,
install_dir: doc_dir/'aarch64'
)
endforeach

subdir('topics')
21 changes: 21 additions & 0 deletions doc/aarch64/topics/meson.build
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# SPDX-FileCopyrightText: 2021 VIXL authors
# SPDX-License-Identifier: BSD-3-Clause

doc_aarch64_topics_files = [
'extending-the-disassembler',
'index',
'state-trace',
'ycm'
]

foreach file : doc_aarch64_topics_files
custom_target(
'doc_aarch64_topics_' + file,
command: [markdown, '@INPUT@'],
input: file + '.md',
output: file + '.html',
capture: true,
install: true,
install_dir: doc_dir/'aarch64'/'topics'
)
endforeach
21 changes: 21 additions & 0 deletions doc/meson.build
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# SPDX-FileCopyrightText: 2021 VIXL authors
# SPDX-License-Identifier: BSD-3-Clause

doc_dir = get_option('datadir')/'doc'/meson.project_name()

custom_target(
'doc',
command: [markdown, '@INPUT@'],
input: '..'/'README.md',
output: '@[email protected]',
capture: true,
install: true,
install_dir: doc_dir
)

if build_a32 or build_t32
subdir('aarch32')
endif
if build_a64
subdir('aarch64')
endif
150 changes: 150 additions & 0 deletions meson.build
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
# SPDX-FileCopyrightText: 2021 VIXL authors
# SPDX-License-Identifier: BSD-3-Clause

project(
'vixl',
'cpp',
default_options: [
'cpp_std=c++17',
'buildtype=release',
'warning_level=3',
'werror=true',
'd_ndebug=if-release',
'b_lto=true'
],
license: 'BSD-3-Clause',
meson_version: '>=0.50.0',
version: '7.0.0',
)

extra_args = []

if get_option('debug')
extra_args += '-DVIXL_DEBUG'
endif

hosts_32bit = ['arc', 'arm', 'c2000', 'csky', 'mips', 'ppc', 'riscv32', 'rx', 'sparc', 'wasm32', 'x86']
can_target_aarch64 = not (host_machine.cpu_family() in hosts_32bit)

build_a32 = false
build_t32 = false
build_a64 = false

targets = get_option('target')
if 'auto' in targets or 'all' in targets
if can_target_aarch64 or 'all' in targets
extra_args += [
'-DVIXL_INCLUDE_TARGET_A32',
'-DVIXL_INCLUDE_TARGET_T32',
'-DVIXL_INCLUDE_TARGET_A64'
]
build_a32 = true
build_t32 = true
build_a64 = true
else
extra_args += [
'-DVIXL_INCLUDE_TARGET_A32',
'-DVIXL_INCLUDE_TARGET_T32'
]
build_a32 = true
build_t32 = true
endif
else
if 'a32' in targets or 'aarch32' in targets
extra_args += [
'-DVIXL_INCLUDE_TARGET_A32'
]
build_a32 = true
endif
if 't32' in targets or 'aarch32' in targets
extra_args += [
'-DVIXL_INCLUDE_TARGET_T32'
]
build_t32 = true
endif
if 'a64' in targets or 'aarch64' in targets
extra_args += [
'-DVIXL_INCLUDE_TARGET_A64'
]
build_a64 = true
endif
endif

target_sources = []
if build_a32 or build_t32
subdir('src'/'aarch32')
endif
if build_a64
subdir('src'/'aarch64')
endif

if get_option('simulator') == 'auto'
if not (host_machine.cpu_family() == 'aarch64') and can_target_aarch64
extra_args += '-DVIXL_INCLUDE_SIMULATOR_AARCH64'
endif
elif get_option('simulator') == 'aarch64'
if can_target_aarch64 and build_a64
extra_args += '-DVIXL_INCLUDE_SIMULATOR_AARCH64'
else
error('Building an AArch64 simulator implies that VIXL targets AArch64. Set `target` to include `aarch64` or `a64`.')
endif
endif

allocator = get_option('code_buffer_allocator')
if (allocator == 'auto' and host_machine.system() == 'linux') or allocator == 'mmap'
extra_args += '-DVIXL_CODE_BUFFER_MMAP'
else
extra_args += '-DVIXL_CODE_BUFFER_MALLOC'
endif

markdown = find_program('markdown', required: get_option('doc'))
if markdown.found()
subdir('doc')
endif

libvixl = library(
'vixl',
'src'/'code-buffer-vixl.cc',
'src'/'compiler-intrinsics-vixl.cc',
'src'/'cpu-features.cc',
'src'/'utils-vixl.cc',
cpp_args: extra_args,
include_directories: 'src',
install: true,
sources: target_sources,
version: meson.project_version()
)

vixl_dep = declare_dependency(
compile_args: extra_args,
include_directories: 'src',
link_with: libvixl
)

if meson.version().version_compare('>=0.54.0')
meson.override_dependency('vixl', vixl_dep)
endif

install_headers(
'src'/'assembler-base-vixl.h',
'src'/'code-buffer-vixl.h',
'src'/'code-generation-scopes-vixl.h',
'src'/'compiler-intrinsics-vixl.h',
'src'/'cpu-features.h',
'src'/'globals-vixl.h',
'src'/'invalset-vixl.h',
'src'/'macro-assembler-interface.h',
'src'/'platform-vixl.h',
'src'/'pool-manager-impl.h',
'src'/'pool-manager.h',
'src'/'utils-vixl.h',
subdir: 'vixl'
)

import('pkgconfig').generate(
libvixl,
description: 'ARMv8 Runtime Code Generation Library',
extra_cflags: extra_args,
subdirs: 'vixl',
url: 'https://github.com/Linaro/vixl'
)
33 changes: 33 additions & 0 deletions meson_options.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# SPDX-FileCopyrightText: 2021 VIXL authors
# SPDX-License-Identifier: BSD-3-Clause

option(
'target',
type: 'array',
choices: ['auto', 'all', 'aarch32', 'a32', 't32', 'aarch64', 'a64'],
value: ['auto'],
description: 'Target ISA/Architecture'
)

option(
'simulator',
type: 'combo',
choices: ['auto', 'aarch64', 'none'],
value: 'auto',
description: 'Simulators to include'
)

option(
'code_buffer_allocator',
type: 'combo',
choices: ['auto', 'malloc', 'mmap'],
value: 'auto',
description: 'Configure the allocation mechanism in the CodeBuffer'
)

option(
'doc',
type: 'feature',
value: 'auto',
description: 'Convert documentation to HTML (requires the `markdown` program)'
)
30 changes: 30 additions & 0 deletions src/aarch32/meson.build
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# SPDX-FileCopyrightText: 2021 VIXL authors
# SPDX-License-Identifier: BSD-3-Clause

# Need to wrap the filenames in files() otherwise this array would be treated
# as a simple array of strings, and when used in the master meson.build they
# would refer to nonexistent paths. Wrapping in files() ensures that the
# filenames will be always relative to this directory, even if referenced in
# a different one. As a general rule, when I need to refer to a file from a
# different build directory I should wrap it in files().

target_sources += files(
'assembler-aarch32.cc',
'constants-aarch32.cc',
'disasm-aarch32.cc',
'instructions-aarch32.cc',
'location-aarch32.cc',
'macro-assembler-aarch32.cc',
'operands-aarch32.cc'
)

install_headers(
'assembler-aarch32.h',
'constants-aarch32.h',
'disasm-aarch32.h',
'instructions-aarch32.h',
'location-aarch32.h',
'macro-assembler-aarch32.h',
'operands-aarch32.h',
subdir: 'vixl'/'aarch32'
)
47 changes: 47 additions & 0 deletions src/aarch64/meson.build
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# SPDX-FileCopyrightText: 2021 VIXL authors
# SPDX-License-Identifier: BSD-3-Clause

# Need to wrap the filenames in files() otherwise this array would be treated
# as a simple array of strings, and when used in the master meson.build they
# would refer to nonexistent paths. Wrapping in files() ensures that the
# filenames will be always relative to this directory, even if referenced in
# a different one. As a general rule, when I need to refer to a file from a
# different build directory I should wrap it in files().

target_sources += files(
'assembler-aarch64.cc',
'assembler-sve-aarch64.cc',
'cpu-aarch64.cc',
'cpu-features-auditor-aarch64.cc',
'debugger-aarch64.cc',
'decoder-aarch64.cc',
'disasm-aarch64.cc',
'instructions-aarch64.cc',
'logic-aarch64.cc',
'macro-assembler-aarch64.cc',
'macro-assembler-sve-aarch64.cc',
'operands-aarch64.cc',
'pointer-auth-aarch64.cc',
'registers-aarch64.cc',
'simulator-aarch64.cc'
)

install_headers(
'abi-aarch64.h',
'assembler-aarch64.h',
'constants-aarch64.h',
'cpu-aarch64.h',
'cpu-features-auditor-aarch64.h',
'debugger-aarch64.h',
'decoder-aarch64.h',
'decoder-constants-aarch64.h',
'decoder-visitor-map-aarch64.h',
'disasm-aarch64.h',
'instructions-aarch64.h',
'macro-assembler-aarch64.h',
'operands-aarch64.h',
'registers-aarch64.h',
'simulator-aarch64.h',
'simulator-constants-aarch64.h',
subdir: 'vixl'/'aarch64'
)

0 comments on commit 8ca72cd

Please sign in to comment.