diff options
author | Xiretza | 2022-06-04 19:41:28 +0200 |
---|---|---|
committer | Xiretza | 2022-06-04 19:42:17 +0200 |
commit | c38320f53cb1fec23056ac1b97a02efb41fab058 (patch) | |
tree | 719fafe07ecf6c50baf587a3c82ca6be64a27004 | |
parent | 77aecaae850110a33c362ee25741a773658b1657 (diff) | |
download | aur-c38320f53cb1fec23056ac1b97a02efb41fab058.tar.gz |
Make antlr4 parser work
-rw-r--r-- | .SRCINFO | 26 | ||||
-rw-r--r-- | 0001-ANTLR4-4.10-compatibility.patch | 56 | ||||
-rw-r--r-- | 0002-cmake-use-native-gtest.patch | 25 | ||||
-rw-r--r-- | 0003-cmake-use-native-antlr.patch | 27 | ||||
-rw-r--r-- | 0004-cmake-install-parse_fasm.so.patch | 24 | ||||
-rw-r--r-- | 0005-fix-cmake-fix-missing-gtest-linker-argument.patch | 24 | ||||
-rw-r--r-- | 0006-Use-cmake-directly-instead-of-letting-setup.py-try-t.patch | 266 | ||||
-rw-r--r-- | 0007-cmake-install-tags.py-properly.patch | 40 | ||||
-rw-r--r-- | FindANTLR.cmake | 124 | ||||
-rw-r--r-- | PKGBUILD | 48 |
10 files changed, 641 insertions, 19 deletions
@@ -1,10 +1,11 @@ pkgbase = python-fasm-git pkgdesc = FPGA Assembly (FASM) Parser and Generation library - pkgver = 0.0.2.r67.gaf39a4f + pkgver = 0.0.2.r98.g9a73d70 pkgrel = 2 url = https://github.com/SymbiFlow/fasm arch = x86_64 license = ISC + checkdepends = gtest checkdepends = python-pytest makedepends = git makedepends = python-setuptools @@ -14,15 +15,26 @@ pkgbase = python-fasm-git depends = python depends = python-textx depends = antlr4-runtime - provides = python-fasm=0.0.2.r67.gaf39a4f + provides = python-fasm=0.0.2.r98.g9a73d70 conflicts = fasm conflicts = python-fasm source = git+https://github.com/SymbiFlow/fasm.git - source = git+https://github.com/antlr/antlr4 - source = git+https://github.com/google/googletest - sha256sums = SKIP - sha256sums = SKIP + source = FindANTLR.cmake + source = 0001-ANTLR4-4.10-compatibility.patch + source = 0002-cmake-use-native-gtest.patch + source = 0003-cmake-use-native-antlr.patch + source = 0004-cmake-install-parse_fasm.so.patch + source = 0005-fix-cmake-fix-missing-gtest-linker-argument.patch + source = 0006-Use-cmake-directly-instead-of-letting-setup.py-try-t.patch + source = 0007-cmake-install-tags.py-properly.patch sha256sums = SKIP + sha256sums = ff8bb6b28f8e4724aeac01526ea7fa193f4bfa979de24ac99dbae92ee7116488 + sha256sums = d70b631453501e731e63cfa21d24c12386a2e3343631b5e4e7edbba2f4dc7ace + sha256sums = 66404ae75ab1e761bcf22de598e76882cc52cad57a95368e751b8a078ecca9ce + sha256sums = 8c973830b1309fa636e101ce520d7d617adf09364ca86b5c8a5111b1597fb57f + sha256sums = aff2f899aa8bc8b9b93d48430c63d97012c1d53b41106b2f4294e8dbcacb0110 + sha256sums = 6be3cebb42c8f40359c7b0d5bbbaba0434920ba21276ee78dc362e7084739d03 + sha256sums = 24b86a0575317b2349ec4ae488592f949995d5e9cabbf0bc41b2d133a91c6591 + sha256sums = 8f4b57b2bbbfa601b53003489a786ee889db00b92f67a34356e7efcaa7b83683 pkgname = python-fasm-git - diff --git a/0001-ANTLR4-4.10-compatibility.patch b/0001-ANTLR4-4.10-compatibility.patch new file mode 100644 index 000000000000..de89c5d9e39f --- /dev/null +++ b/0001-ANTLR4-4.10-compatibility.patch @@ -0,0 +1,56 @@ +From 752ae3a73c5c5c17feacf896d269752956700c11 Mon Sep 17 00:00:00 2001 +From: Xiretza <xiretza@xiretza.xyz> +Date: Sat, 4 Jun 2022 10:47:32 +0200 +Subject: [PATCH 1/7] ANTLR4 4.10 compatibility + +Commit 70b2edcf98[0] removed antlrcpp::Any in favor of std::any. + +[0]: https://github.com/antlr/antlr4/commit/70b2edcf98eb612a92d3dbaedb2ce0b69533b0cb +--- + src/ParseFasm.cpp | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +diff --git a/src/ParseFasm.cpp b/src/ParseFasm.cpp +index 6a1e720..8f3ca67 100644 +--- a/src/ParseFasm.cpp ++++ b/src/ParseFasm.cpp +@@ -199,7 +199,7 @@ struct ParseException { + + /// Helper macro to convert a rule context into a string + /// For use inside FasmParserBaseVisitor +-#define GET(x) (context->x() ? visit(context->x()).as<std::string>() : "") ++#define GET(x) (context->x() ? std::any_cast<std::string>(visit(context->x())) : "") + + /// FasmParserBaseVisitor is a visitor for the parse tree + /// generated by the ANTLR parser. +@@ -218,7 +218,7 @@ class FasmParserBaseVisitor : public FasmParserVisitor { + virtual Any visitFasmFile( + FasmParser::FasmFileContext* context) override { + for (auto& line : context->fasmLine()) { +- std::string str = visit(line).as<std::string>(); ++ std::string str = std::any_cast<std::string>(visit(line)); + if (!str.empty()) { + out << str; + if (hex_mode) +@@ -285,8 +285,7 @@ class FasmParserBaseVisitor : public FasmParserVisitor { + TAG('\'', width), + std::stoi(context->INT()->getText())); + } +- data << visit(context->verilogDigits()) +- .as<std::string>(); ++ data << std::any_cast<std::string>(visit(context->verilogDigits())); + } + return data.str(); + } +@@ -439,7 +438,7 @@ class FasmParserBaseVisitor : public FasmParserVisitor { + FasmParser::AnnotationsContext* context) override { + std::ostringstream data; + for (auto& a : context->annotation()) { +- data << visit(a).as<std::string>(); ++ data << std::any_cast<std::string>(visit(a)); + } + return withHeader(TAG('{', annotations), data.str()); + } +-- +2.36.1 + diff --git a/0002-cmake-use-native-gtest.patch b/0002-cmake-use-native-gtest.patch new file mode 100644 index 000000000000..a4e5901e4fa6 --- /dev/null +++ b/0002-cmake-use-native-gtest.patch @@ -0,0 +1,25 @@ +From e9d7442de4f0f52ce19629ccfe7ef036030f9669 Mon Sep 17 00:00:00 2001 +From: Xiretza <xiretza@xiretza.xyz> +Date: Sat, 4 Jun 2022 11:22:15 +0200 +Subject: [PATCH 2/7] cmake: use native gtest + +--- + src/CMakeLists.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt +index 94783a6..caf428a 100644 +--- a/src/CMakeLists.txt ++++ b/src/CMakeLists.txt +@@ -63,7 +63,7 @@ set(ANTLR_EXECUTABLE ${CMAKE_CURRENT_SOURCE_DIR}/../third_party/antlr4_lib/antlr + find_package(ANTLR REQUIRED) + + # Unit testing library +-add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../third_party/googletest EXCLUDE_FROM_ALL googletest) ++find_package(GTest REQUIRED) + + # Lexer and parser targets + antlr_target(FasmLexer antlr/FasmLexer.g4 LEXER +-- +2.36.1 + diff --git a/0003-cmake-use-native-antlr.patch b/0003-cmake-use-native-antlr.patch new file mode 100644 index 000000000000..5c9c1ecd3967 --- /dev/null +++ b/0003-cmake-use-native-antlr.patch @@ -0,0 +1,27 @@ +From 501df447d4d3c7f4e22f4fec43b4915b8de2013c Mon Sep 17 00:00:00 2001 +From: Xiretza <xiretza@xiretza.xyz> +Date: Sat, 4 Jun 2022 11:32:32 +0200 +Subject: [PATCH 3/7] cmake: use native antlr + +--- + src/CMakeLists.txt | 4 ---- + 1 file changed, 4 deletions(-) + +diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt +index caf428a..f4b5b1f 100644 +--- a/src/CMakeLists.txt ++++ b/src/CMakeLists.txt +@@ -55,10 +55,6 @@ endif() + # add antrl4cpp artifacts to project environment + include_directories(${ANTLR4_INCLUDE_DIRS}) + +-# set variable pointing to the antlr tool that supports C++ +-# this is not required if the jar file can be found under PATH environment +-set(ANTLR_EXECUTABLE ${CMAKE_CURRENT_SOURCE_DIR}/../third_party/antlr4_lib/antlr-4.9.3-complete.jar) +- + # add macros to generate ANTLR Cpp code from grammar + find_package(ANTLR REQUIRED) + +-- +2.36.1 + diff --git a/0004-cmake-install-parse_fasm.so.patch b/0004-cmake-install-parse_fasm.so.patch new file mode 100644 index 000000000000..bf1181458736 --- /dev/null +++ b/0004-cmake-install-parse_fasm.so.patch @@ -0,0 +1,24 @@ +From 36b8c46b10a4f823754e4adfb388fcd2907098e7 Mon Sep 17 00:00:00 2001 +From: Xiretza <xiretza@xiretza.xyz> +Date: Sat, 4 Jun 2022 11:32:59 +0200 +Subject: [PATCH 4/7] cmake: install parse_fasm.so + +--- + src/CMakeLists.txt | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt +index f4b5b1f..b95872e 100644 +--- a/src/CMakeLists.txt ++++ b/src/CMakeLists.txt +@@ -93,6 +93,7 @@ add_library(parse_fasm SHARED ParseFasm.cpp + ${ANTLR_FasmLexer_CXX_OUTPUTS} + ${ANTLR_FasmParser_CXX_OUTPUTS}) + target_link_libraries(parse_fasm ${ANTLR4_RUNTIME}) ++install(TARGETS parse_fasm) + #target_compile_options(parse_fasm PRIVATE -Wno-attributes) # Disable warning from antlr4-runtime + + add_executable(parse_fasm_tests +-- +2.36.1 + diff --git a/0005-fix-cmake-fix-missing-gtest-linker-argument.patch b/0005-fix-cmake-fix-missing-gtest-linker-argument.patch new file mode 100644 index 000000000000..9bd22e6b4017 --- /dev/null +++ b/0005-fix-cmake-fix-missing-gtest-linker-argument.patch @@ -0,0 +1,24 @@ +From 8f0cf99eba23b575616e45c43266145eaac77dd7 Mon Sep 17 00:00:00 2001 +From: Xiretza <xiretza@xiretza.xyz> +Date: Sat, 4 Jun 2022 11:33:13 +0200 +Subject: [PATCH 5/7] fix(cmake): fix missing gtest linker argument + +--- + src/CMakeLists.txt | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt +index b95872e..63502e5 100644 +--- a/src/CMakeLists.txt ++++ b/src/CMakeLists.txt +@@ -102,6 +102,7 @@ add_executable(parse_fasm_tests + ${ANTLR_FasmParser_CXX_OUTPUTS}) + target_link_libraries(parse_fasm_tests ${ANTLR4_RUNTIME}) + target_link_libraries(parse_fasm_tests gtest_main) ++target_link_libraries(parse_fasm_tests gtest) + #target_compile_options(parse_fasm_tests PRIVATE -Wno-attributes) # Disable warning from antlr4-runtime + + # Standalone executable +-- +2.36.1 + diff --git a/0006-Use-cmake-directly-instead-of-letting-setup.py-try-t.patch b/0006-Use-cmake-directly-instead-of-letting-setup.py-try-t.patch new file mode 100644 index 000000000000..c8e2b3432838 --- /dev/null +++ b/0006-Use-cmake-directly-instead-of-letting-setup.py-try-t.patch @@ -0,0 +1,266 @@ +From 52b71d6edc8ea90d29a5844191d7b386fed67c46 Mon Sep 17 00:00:00 2001 +From: Xiretza <xiretza@xiretza.xyz> +Date: Sat, 4 Jun 2022 11:33:46 +0200 +Subject: [PATCH 6/7] Use cmake directly instead of letting setup.py try to + handle it + +--- + setup.py | 226 +------------------------------------------------------ + 1 file changed, 1 insertion(+), 225 deletions(-) + +diff --git a/setup.py b/setup.py +index cfbaa55..8c0b3ee 100644 +--- a/setup.py ++++ b/setup.py +@@ -18,20 +18,10 @@ + # SPDX-License-Identifier: Apache-2.0 + + import os +-import re + import setuptools +-import shutil + import subprocess +-import sys +-import traceback + + from Cython.Build import cythonize +-from distutils.command.build import build +-from distutils.version import LooseVersion +-from setuptools import Extension +-from setuptools.command.build_ext import build_ext +-from setuptools.command.develop import develop +-from setuptools.command.install import install + + __dir__ = os.path.dirname(os.path.abspath(__file__)) + +@@ -56,212 +46,6 @@ assert version_value[0] == '"', version_value + assert version_value[-1] == '"', version_value + version = version_value[1:-1] + +- +-# Based on: https://www.benjack.io/2018/02/02/python-cpp-revisited.html +-# GitHub: https://github.com/benjaminjack/python_cpp_example +-class CMakeExtension(Extension): +- def __init__(self, name, sourcedir='', prefix=''): +- Extension.__init__(self, name, sources=[]) +- self.sourcedir = os.path.abspath(sourcedir) +- self.prefix = prefix +- +- +-# Used to share options between two classes. +-class SharedOptions(): +- ANTLR_RUNTIMES = ['static', 'shared'] +- options = [ +- ( +- 'antlr-runtime=', None, +- "Whether to use a 'static' or 'shared' ANTLR runtime.") +- ] +- +- def __init__(self): +- self.antlr_runtime = 'static' +- +- def initialize(self, other): +- other.antlr_runtime = None +- +- def load(self, other): +- if other.antlr_runtime is not None: +- self.antlr_runtime = other.antlr_runtime +- assert self.antlr_runtime in SharedOptions.ANTLR_RUNTIMES, \ +- 'Invalid antlr_runtime {}, expected one of {}'.format( +- self.antlr_runtime, SharedOptions.ANTLR_RUNTIMES) +- +- +-# Global to allow sharing options. +-shared_options = SharedOptions() +- +- +-class AntlrCMakeBuild(build_ext): +- user_options = SharedOptions.options +- +- def copy_extensions_to_source(self): +- original_extensions = list(self.extensions) +- self.extensions = [ +- ext for ext in self.extensions +- if not isinstance(ext, CMakeExtension) +- ] +- super().copy_extensions_to_source() +- self.extensions = original_extensions +- +- def run(self): +- shared_options.load(self) +- try: +- super().run() +- +- try: +- out = subprocess.check_output(['cmake', '--version']) +- except OSError: +- raise RuntimeError( +- "CMake must be installed to build " +- "the following extensions: " + ", ".join( +- e.name for e in self.extensions)) +- +- cmake_version = LooseVersion( +- re.search(r'version\s*([\d.]+)', out.decode()).group(1)) +- if cmake_version < '3.7.0': +- raise RuntimeError("CMake >= 3.7.0 is required.") +- +- for ext in self.extensions: +- self.build_extension(ext) +- +- except BaseException as e: +- print( +- "Failed to build ANTLR parser, " +- "falling back on slower textX parser. Error:\n", e) +- traceback.print_exc() +- +- # FIXME: Remove this function +- # see: https://github.com/chipsalliance/fasm/issues/50 +- def add_flags(self): +- if sys.platform.startswith('win'): +- return +- +- for flag in ["CFLAGS", "CXXFLAGS"]: +- flags = [os.environ.get(flag, "")] +- if not flags[0]: +- flags.pop(0) +- +- if shared_options.antlr_runtime == 'static': +- # When linking the ANTLR runtime statically, -fPIC is +- # still necessary because libparse_fasm will be a +- # shared library. +- flags.append("-fPIC") +- +- # FIXME: These should be in the cmake config file? +- # Disable excessive warnings currently in ANTLR runtime. +- # warning: type attributes ignored after type is already defined +- # `class ANTLR4CPP_PUBLIC ATN;` +- flags.append('-Wno-attributes') +- +- # Lots of implicit fallthroughs. +- # flags.append('-Wimplicit-fallthrough=0') +- +- if flags: +- os.environ[flag] = " ".join(flags) +- +- def build_extension(self, ext): +- if isinstance(ext, CMakeExtension): +- extdir = os.path.join( +- os.path.abspath( +- os.path.dirname(self.get_ext_fullpath(ext.name))), +- ext.prefix) +- cmake_args = [ +- '-DCMAKE_INSTALL_PREFIX=' + extdir, +- '-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=' + extdir, +- '-DPYTHON_EXECUTABLE=' + sys.executable, +- '-DANTLR_RUNTIME_TYPE=' + shared_options.antlr_runtime +- ] +- +- cfg = 'Debug' if self.debug else 'Release' +- build_args = ['--config', cfg] +- cmake_args += ['-DCMAKE_BUILD_TYPE=' + cfg] +- if not sys.platform.startswith('win') and ( +- os.environ.get("CMAKE_BUILD_PARALLEL_LEVEL") is None): +- build_args += ['--', '-j'] +- +- env = os.environ.copy() +- env['CXXFLAGS'] = '{} -DVERSION_INFO=\\"{}\\"'.format( +- env.get('CXXFLAGS', ''), self.distribution.get_version()) +- +- # Remove the existing build_temp directory if it already exists. +- if os.path.exists(self.build_temp): +- shutil.rmtree(self.build_temp, ignore_errors=True) +- os.makedirs(self.build_temp, exist_ok=True) +- +- self.add_flags() +- +- subprocess.check_call( +- ['cmake', ext.sourcedir] + cmake_args, +- cwd=self.build_temp, +- env=env) +- subprocess.check_call( +- ['cmake', '--build', '.'] + build_args, cwd=self.build_temp) +- subprocess.check_call( +- ['cmake', '--install', '.'], cwd=self.build_temp) +- subprocess.check_call(['ctest'], cwd=self.build_temp) +- print() # Add an empty line for cleaner output +- else: +- super().build_extension(ext) +- +- def initialize_options(self): +- super().initialize_options() +- shared_options.initialize(self) +- +- def finalize_options(self): +- super().finalize_options() +- shared_options.load(self) +- +- +-class BuildCommand(build): +- user_options = build.user_options + SharedOptions.options +- +- def initialize_options(self): +- super().initialize_options() +- shared_options.initialize(self) +- +- def finalize_options(self): +- super().finalize_options() +- shared_options.load(self) +- +- def run(self): +- shared_options.load(self) +- super().run() +- +- +-class InstallCommand(install): +- user_options = install.user_options + SharedOptions.options +- +- def initialize_options(self): +- super().initialize_options() +- shared_options.initialize(self) +- +- def finalize_options(self): +- super().finalize_options() +- shared_options.load(self) +- +- def run(self): +- shared_options.load(self) +- super().run() +- +- +-class DevelopCommand(develop): +- user_options = develop.user_options + SharedOptions.options +- +- def initialize_options(self): +- super().initialize_options() +- shared_options.initialize(self) +- +- def finalize_options(self): +- super().finalize_options() +- shared_options.load(self) +- +- def run(self): +- shared_options.load(self) +- super().run() +- +- + setuptools.setup( + name="fasm", + version=version, +@@ -282,13 +66,5 @@ setuptools.setup( + entry_points={ + 'console_scripts': ['fasm=fasm.tool:main'], + }, +- ext_modules=[ +- CMakeExtension('parse_fasm', sourcedir='src', prefix='fasm/parser') +- ] + cythonize("fasm/parser/antlr_to_tuple.pyx"), +- cmdclass={ +- 'build_ext': AntlrCMakeBuild, +- 'build': BuildCommand, +- 'develop': DevelopCommand, +- 'install': InstallCommand, +- }, ++ ext_modules=cythonize("fasm/parser/antlr_to_tuple.pyx"), + ) +-- +2.36.1 + diff --git a/0007-cmake-install-tags.py-properly.patch b/0007-cmake-install-tags.py-properly.patch new file mode 100644 index 000000000000..9c7ea1f35861 --- /dev/null +++ b/0007-cmake-install-tags.py-properly.patch @@ -0,0 +1,40 @@ +From 30c905970e06caf9bb4b8211d759d6107f863ca0 Mon Sep 17 00:00:00 2001 +From: Xiretza <xiretza@xiretza.xyz> +Date: Sat, 4 Jun 2022 19:35:34 +0200 +Subject: [PATCH 7/7] cmake: install tags.py properly + +--- + src/CMakeLists.txt | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt +index 63502e5..8d3564f 100644 +--- a/src/CMakeLists.txt ++++ b/src/CMakeLists.txt +@@ -76,13 +76,15 @@ antlr_target(FasmParser antlr/FasmParser.g4 PARSER VISITOR + # line 1: Skip lines starting in #define + # 2: Extract TAGS(...) from dependencies + # 3: Convert from TAGS('c', long_name) -> long_name = b'c, write to file +-add_custom_target(tags.py ALL ++add_custom_command(OUTPUT tags.py + COMMAND grep -ve ^\#define ${CMAKE_CURRENT_SOURCE_DIR}/ParseFasm.cpp | + grep -hoe TAG\([^\)]*\) | +- sed -e s/TAG\(\\\(.*\\\),\ \\\(.*\\\)\)/\\2\ =\ b\\1/ > tags.py ++ sed -e s/TAG\(\\\(.*\\\),\ \\\(.*\\\)\)/\\2\ =\ b\\1/ > ${CMAKE_CURRENT_BINARY_DIR}/tags.py + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/ParseFasm.cpp + VERBATIM + ) ++add_custom_target(tags_py ALL DEPENDS tags.py) ++install(FILES ${CMAKE_CURRENT_BINARY_DIR}/tags.py DESTINATION ${CMAKE_INSTALL_LIBDIR}) + + # Include generated files in project environment + include_directories(${ANTLR_FasmLexer_OUTPUT_DIR}) +@@ -120,5 +122,3 @@ include(CTest) + add_test(NAME parse_fasm_tests + COMMAND parse_fasm_tests) + enable_testing() +- +-install(FILES ${CMAKE_CURRENT_BINARY_DIR}/tags.py DESTINATION .) +-- +2.36.1 + diff --git a/FindANTLR.cmake b/FindANTLR.cmake new file mode 100644 index 000000000000..4a34d730d156 --- /dev/null +++ b/FindANTLR.cmake @@ -0,0 +1,124 @@ +find_package(Java QUIET COMPONENTS Runtime) + +if(NOT ANTLR_EXECUTABLE) + find_program(ANTLR_EXECUTABLE + NAMES antlr.jar antlr4.jar antlr-4.jar antlr-4.10-complete.jar) +endif() + +if(ANTLR_EXECUTABLE AND Java_JAVA_EXECUTABLE) + execute_process( + COMMAND ${Java_JAVA_EXECUTABLE} -jar ${ANTLR_EXECUTABLE} + OUTPUT_VARIABLE ANTLR_COMMAND_OUTPUT + ERROR_VARIABLE ANTLR_COMMAND_ERROR + RESULT_VARIABLE ANTLR_COMMAND_RESULT + OUTPUT_STRIP_TRAILING_WHITESPACE) + + if(ANTLR_COMMAND_RESULT EQUAL 0) + string(REGEX MATCH "Version [0-9]+(\\.[0-9])*" ANTLR_VERSION ${ANTLR_COMMAND_OUTPUT}) + string(REPLACE "Version " "" ANTLR_VERSION ${ANTLR_VERSION}) + else() + message( + SEND_ERROR + "Command '${Java_JAVA_EXECUTABLE} -jar ${ANTLR_EXECUTABLE}' " + "failed with the output '${ANTLR_COMMAND_ERROR}'") + endif() + + macro(ANTLR_TARGET Name InputFile) + set(ANTLR_OPTIONS LEXER PARSER LISTENER VISITOR) + set(ANTLR_ONE_VALUE_ARGS PACKAGE OUTPUT_DIRECTORY DEPENDS_ANTLR) + set(ANTLR_MULTI_VALUE_ARGS COMPILE_FLAGS DEPENDS) + cmake_parse_arguments(ANTLR_TARGET + "${ANTLR_OPTIONS}" + "${ANTLR_ONE_VALUE_ARGS}" + "${ANTLR_MULTI_VALUE_ARGS}" + ${ARGN}) + + set(ANTLR_${Name}_INPUT ${InputFile}) + + get_filename_component(ANTLR_INPUT ${InputFile} NAME_WE) + + if(ANTLR_TARGET_OUTPUT_DIRECTORY) + set(ANTLR_${Name}_OUTPUT_DIR ${ANTLR_TARGET_OUTPUT_DIRECTORY}) + else() + set(ANTLR_${Name}_OUTPUT_DIR + ${CMAKE_CURRENT_BINARY_DIR}/antlr4cpp_generated_src/${ANTLR_INPUT}) + endif() + + unset(ANTLR_${Name}_CXX_OUTPUTS) + + if((ANTLR_TARGET_LEXER AND NOT ANTLR_TARGET_PARSER) OR + (ANTLR_TARGET_PARSER AND NOT ANTLR_TARGET_LEXER)) + list(APPEND ANTLR_${Name}_CXX_OUTPUTS + ${ANTLR_${Name}_OUTPUT_DIR}/${ANTLR_INPUT}.h + ${ANTLR_${Name}_OUTPUT_DIR}/${ANTLR_INPUT}.cpp) + set(ANTLR_${Name}_OUTPUTS + ${ANTLR_${Name}_OUTPUT_DIR}/${ANTLR_INPUT}.interp + ${ANTLR_${Name}_OUTPUT_DIR}/${ANTLR_INPUT}.tokens) + else() + list(APPEND ANTLR_${Name}_CXX_OUTPUTS + ${ANTLR_${Name}_OUTPUT_DIR}/${ANTLR_INPUT}Lexer.h + ${ANTLR_${Name}_OUTPUT_DIR}/${ANTLR_INPUT}Lexer.cpp + ${ANTLR_${Name}_OUTPUT_DIR}/${ANTLR_INPUT}Parser.h + ${ANTLR_${Name}_OUTPUT_DIR}/${ANTLR_INPUT}Parser.cpp) + list(APPEND ANTLR_${Name}_OUTPUTS + ${ANTLR_${Name}_OUTPUT_DIR}/${ANTLR_INPUT}Lexer.interp + ${ANTLR_${Name}_OUTPUT_DIR}/${ANTLR_INPUT}Lexer.tokens) + endif() + + if(ANTLR_TARGET_LISTENER) + list(APPEND ANTLR_${Name}_CXX_OUTPUTS + ${ANTLR_${Name}_OUTPUT_DIR}/${ANTLR_INPUT}BaseListener.h + ${ANTLR_${Name}_OUTPUT_DIR}/${ANTLR_INPUT}BaseListener.cpp + ${ANTLR_${Name}_OUTPUT_DIR}/${ANTLR_INPUT}Listener.h + ${ANTLR_${Name}_OUTPUT_DIR}/${ANTLR_INPUT}Listener.cpp) + list(APPEND ANTLR_TARGET_COMPILE_FLAGS -listener) + endif() + + if(ANTLR_TARGET_VISITOR) + list(APPEND ANTLR_${Name}_CXX_OUTPUTS + ${ANTLR_${Name}_OUTPUT_DIR}/${ANTLR_INPUT}BaseVisitor.h + ${ANTLR_${Name}_OUTPUT_DIR}/${ANTLR_INPUT}BaseVisitor.cpp + ${ANTLR_${Name}_OUTPUT_DIR}/${ANTLR_INPUT}Visitor.h + ${ANTLR_${Name}_OUTPUT_DIR}/${ANTLR_INPUT}Visitor.cpp) + list(APPEND ANTLR_TARGET_COMPILE_FLAGS -visitor) + endif() + + if(ANTLR_TARGET_PACKAGE) + list(APPEND ANTLR_TARGET_COMPILE_FLAGS -package ${ANTLR_TARGET_PACKAGE}) + endif() + + list(APPEND ANTLR_${Name}_OUTPUTS ${ANTLR_${Name}_CXX_OUTPUTS}) + + if(ANTLR_TARGET_DEPENDS_ANTLR) + if(ANTLR_${ANTLR_TARGET_DEPENDS_ANTLR}_INPUT) + list(APPEND ANTLR_TARGET_DEPENDS + ${ANTLR_${ANTLR_TARGET_DEPENDS_ANTLR}_INPUT}) + list(APPEND ANTLR_TARGET_DEPENDS + ${ANTLR_${ANTLR_TARGET_DEPENDS_ANTLR}_OUTPUTS}) + else() + message(SEND_ERROR + "ANTLR target '${ANTLR_TARGET_DEPENDS_ANTLR}' not found") + endif() + endif() + + add_custom_command( + OUTPUT ${ANTLR_${Name}_OUTPUTS} + COMMAND ${Java_JAVA_EXECUTABLE} -jar ${ANTLR_EXECUTABLE} + ${InputFile} + -o ${ANTLR_${Name}_OUTPUT_DIR} + -no-listener + -Dlanguage=Cpp + ${ANTLR_TARGET_COMPILE_FLAGS} + DEPENDS ${InputFile} + ${ANTLR_TARGET_DEPENDS} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT "Building ${Name} with ANTLR ${ANTLR_VERSION}") + endmacro(ANTLR_TARGET) + +endif(ANTLR_EXECUTABLE AND Java_JAVA_EXECUTABLE) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args( + ANTLR + REQUIRED_VARS ANTLR_EXECUTABLE Java_JAVA_EXECUTABLE + VERSION_VAR ANTLR_VERSION) @@ -2,7 +2,7 @@ _pkgname=fasm pkgname="python-$_pkgname-git" -pkgver=0.0.2.r67.gaf39a4f +pkgver=0.0.2.r98.g9a73d70 pkgrel=2 pkgdesc="FPGA Assembly (FASM) Parser and Generation library" arch=(x86_64) @@ -10,15 +10,29 @@ url="https://github.com/SymbiFlow/fasm" license=('ISC') depends=('python' 'python-textx' 'antlr4-runtime') makedepends=('git' 'python-setuptools' 'cython' 'cmake' 'antlr4') -checkdepends=('python-pytest') +checkdepends=('gtest' 'python-pytest') provides=("${pkgname%%-git}=$pkgver") conflicts=(fasm "${pkgname%%-git}") -source=("git+$url.git" - "git+https://github.com/antlr/antlr4" - "git+https://github.com/google/googletest") +source=( + "git+$url.git" + "FindANTLR.cmake" + "0001-ANTLR4-4.10-compatibility.patch" + "0002-cmake-use-native-gtest.patch" + "0003-cmake-use-native-antlr.patch" + "0004-cmake-install-parse_fasm.so.patch" + "0005-fix-cmake-fix-missing-gtest-linker-argument.patch" + "0006-Use-cmake-directly-instead-of-letting-setup.py-try-t.patch" + "0007-cmake-install-tags.py-properly.patch" +) sha256sums=('SKIP' - 'SKIP' - 'SKIP') + 'ff8bb6b28f8e4724aeac01526ea7fa193f4bfa979de24ac99dbae92ee7116488' + 'd70b631453501e731e63cfa21d24c12386a2e3343631b5e4e7edbba2f4dc7ace' + '66404ae75ab1e761bcf22de598e76882cc52cad57a95368e751b8a078ecca9ce' + '8c973830b1309fa636e101ce520d7d617adf09364ca86b5c8a5111b1597fb57f' + 'aff2f899aa8bc8b9b93d48430c63d97012c1d53b41106b2f4294e8dbcacb0110' + '6be3cebb42c8f40359c7b0d5bbbaba0434920ba21276ee78dc362e7084739d03' + '24b86a0575317b2349ec4ae488592f949995d5e9cabbf0bc41b2d133a91c6591' + '8f4b57b2bbbfa601b53003489a786ee889db00b92f67a34356e7efcaa7b83683') pkgver() { cd "$_pkgname" @@ -29,16 +43,26 @@ pkgver() { prepare() { cd "$_pkgname" - git submodule init - git config submodule.third_party/antlr4.url "$srcdir/antlr4" - git config submodule.third_party/googletest.url "$srcdir/googletest" - git submodule update + for patch in "$srcdir"/*.patch; do + patch -p1 < "$patch" + done } build() { + local python_version=$(python -c 'import sys; print(".".join(map(str, sys.version_info[:2])))') + + cmake -S "$_pkgname/src" -B cmake_builddir \ + -DCMAKE_MODULE_PATH="$srcdir" \ + -DANTLR_EXECUTABLE=/usr/share/java/antlr-complete.jar \ + -DCMAKE_INSTALL_PREFIX="$srcdir/$_pkgname/build" \ + -DCMAKE_INSTALL_LIBDIR="lib.linux-$CARCH-$python_version/fasm/parser" \ + -DCMAKE_BUILD_TYPE=None + make -C cmake_builddir + make -C cmake_builddir install + cd "$_pkgname" - python setup.py build --antlr-runtime=shared + python setup.py build } check() { |