Skip to content

Commit

Permalink
- WIP : add e2k and lcc
Browse files Browse the repository at this point in the history
Signed-off-by: SSE4 <tomskside@gmail.com>
  • Loading branch information
SSE4 committed Nov 9, 2020
1 parent bbfb6b5 commit 72db1b7
Show file tree
Hide file tree
Showing 9 changed files with 171 additions and 10 deletions.
10 changes: 9 additions & 1 deletion conans/client/build/compiler_flags.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,14 @@ def architecture_flag(settings):
return "/Qm32" if str(compiler_base) == "Visual Studio" else "-m32"
elif str(arch) == "x86_64":
return "/Qm64" if str(compiler_base) == "Visual Studio" else "-m64"
elif str(compiler) == "lcc":
return {"e2k-v1": "-march=elbrus-v1",
"e2k-v2": "-march=elbrus-v2",
"e2k-v3": "-march=elbrus-v3",
"e2k-v4": "-march=elbrus-v4",
"e2k-v5": "-march=elbrus-v5",
"e2k-v6": "-march=elbrus-v6",
"e2k-v7": "-march=elbrus-v7"}.get(str(arch), "")
return ""


Expand Down Expand Up @@ -145,7 +153,7 @@ def build_type_flags(settings):
# Modules/Compiler/GNU.cmake
# clang include the gnu (overriding some things, but not build type) and apple clang
# overrides clang but it doesn't touch clang either
if str(compiler) in ["clang", "gcc", "apple-clang", "qcc"]:
if str(compiler) in ["clang", "gcc", "apple-clang", "qcc", "lcc"]:
# FIXME: It is not clear that the "-s" is something related with the build type
# cmake is not adjusting it
# -s: Remove all symbol table and relocation information from the executable.
Expand Down
36 changes: 34 additions & 2 deletions conans/client/build/cppstd_flags.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@ def cppstd_flag(compiler, compiler_version, cppstd, compiler_base=None):
"clang": _cppstd_clang,
"apple-clang": _cppstd_apple_clang,
"Visual Studio": _cppstd_visualstudio,
"intel": cppstd_intel}.get(str(compiler), None)
"intel": cppstd_intel,
"lcc": _cppstd_lcc}.get(str(compiler), None)
flag = None
if func:
flag = func(str(compiler_version), str(cppstd))
Expand Down Expand Up @@ -62,7 +63,8 @@ def cppstd_default(settings):
"clang": _clang_cppstd_default(compiler_version),
"apple-clang": "gnu98", # Confirmed in apple-clang 9.1 with a simple "auto i=1;"
"Visual Studio": _visual_cppstd_default(compiler_version),
"intel": intel_cppstd_default(compiler_version)}.get(str(compiler), None)
"intel": intel_cppstd_default(compiler_version),
"lcc": _lcc_cppstd_default(compiler_version)}.get(str(compiler), None)
return default


Expand All @@ -89,6 +91,10 @@ def _intel_gcc_cppstd_default(_):
return "gnu98"


def _lcc_cppstd_default(compiler_version):
return "gnu14" if Version(compiler_version) >= "1.24" else "gnu98"


def _cppstd_visualstudio(visual_version, cppstd):
# https://docs.microsoft.com/en-us/cpp/build/reference/std-specify-language-standard-version
v14 = None
Expand Down Expand Up @@ -274,3 +280,29 @@ def _cppstd_intel_gcc(intel_version, cppstd):
def _cppstd_intel_visualstudio(intel_version, cppstd):
flag = _cppstd_intel_common(intel_version, cppstd, None, None)
return "/Qstd=%s" % flag if flag else None


def _cppstd_lcc(lcc_version, cppstd):
v11 = vgnu11 = v14 = vgnu14 = v17 = vgnu17 = v20 = vgnu20 = None

if Version(lcc_version) >= "1.21":
v11 = "c++11"
vgnu11 = "gnu++11"
v14 = "c++14"
vgnu14 = "gnu++14"

if Version(lcc_version) >= "1.24":
v17 = "c++17"
vgnu17 = "gnu++17"

if Version(lcc_version) >= "1.25":
v20 = "c++2a"
vgnu20 = "gnu++2a"

flag = {"98": "c++98", "gnu98": "gnu++98",
"03": "c++03", "gnu03": "gnu++03",
"11": v11, "gnu11": vgnu11,
"14": v14, "gnu14": vgnu14,
"17": v17, "gnu17": vgnu17,
"20": v20, "gnu20": vgnu20}.get(cppstd)
return "-std=%s" % flag if flag else None
13 changes: 10 additions & 3 deletions conans/client/conf/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,12 @@
_t_default_settings_yml = Template(textwrap.dedent("""
# Only for cross building, 'os_build/arch_build' is the system that runs Conan
os_build: [Windows, WindowsStore, Linux, Macos, FreeBSD, SunOS, AIX]
arch_build: [x86, x86_64, ppc32be, ppc32, ppc64le, ppc64, armv5el, armv5hf, armv6, armv7, armv7hf, armv7s, armv7k, armv8, armv8_32, armv8.3, sparc, sparcv9, mips, mips64, avr, s390, s390x, sh4le]
arch_build: [x86, x86_64, ppc32be, ppc32, ppc64le, ppc64, armv5el, armv5hf, armv6, armv7, armv7hf, armv7s, armv7k, armv8, armv8_32, armv8.3, sparc, sparcv9, mips, mips64, avr, s390, s390x, sh4le, e2k-v1, e2k-v2, e2k-v3, e2k-v4, e2k-v5, e2k-v6, e2k-v7]
# Only for building cross compilation tools, 'os_target/arch_target' is the system for
# which the tools generate code
os_target: [Windows, Linux, Macos, Android, iOS, watchOS, tvOS, FreeBSD, SunOS, AIX, Arduino, Neutrino]
arch_target: [x86, x86_64, ppc32be, ppc32, ppc64le, ppc64, armv5el, armv5hf, armv6, armv7, armv7hf, armv7s, armv7k, armv8, armv8_32, armv8.3, sparc, sparcv9, mips, mips64, avr, s390, s390x, asm.js, wasm, sh4le]
arch_target: [x86, x86_64, ppc32be, ppc32, ppc64le, ppc64, armv5el, armv5hf, armv6, armv7, armv7hf, armv7s, armv7k, armv8, armv8_32, armv8.3, sparc, sparcv9, mips, mips64, avr, s390, s390x, asm.js, wasm, sh4le, e2k-v1, e2k-v2, e2k-v3, e2k-v4, e2k-v5, e2k-v6, e2k-v7]
# Rest of the settings are "host" settings:
# - For native building/cross building: Where the library/program will run.
Expand Down Expand Up @@ -53,7 +53,7 @@
Emscripten:
Neutrino:
version: ["6.4", "6.5", "6.6", "7.0", "7.1"]
arch: [x86, x86_64, ppc32be, ppc32, ppc64le, ppc64, armv4, armv4i, armv5el, armv5hf, armv6, armv7, armv7hf, armv7s, armv7k, armv8, armv8_32, armv8.3, sparc, sparcv9, mips, mips64, avr, s390, s390x, asm.js, wasm, sh4le]
arch: [x86, x86_64, ppc32be, ppc32, ppc64le, ppc64, armv4, armv4i, armv5el, armv5hf, armv6, armv7, armv7hf, armv7s, armv7k, armv8, armv8_32, armv8.3, sparc, sparcv9, mips, mips64, avr, s390, s390x, asm.js, wasm, sh4le, e2k-v1, e2k-v2, e2k-v3, e2k-v4, e2k-v5, e2k-v6, e2k-v7]
compiler:
sun-cc:
version: ["5.10", "5.11", "5.12", "5.13", "5.14", "5.15"]
Expand Down Expand Up @@ -106,6 +106,13 @@
version: ["4.4", "5.4", "8.3"]
libcxx: [cxx, gpp, cpp, cpp-ne, accp, acpp-ne, ecpp, ecpp-ne]
cppstd: [None, 98, gnu98, 11, gnu11, 14, gnu14, 17, gnu17]
lcc:
version: ["1.19", "1.20", "1.21", "1.22", "1.23", "1.24", "1.25"]
base:
gcc:
<<: *gcc
threads: [None]
exceptions: [None]
build_type: [None, Debug, Release, RelWithDebInfo, MinSizeRel]
Expand Down
9 changes: 8 additions & 1 deletion conans/client/conf/compiler_id.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
MSVC = "Visual Studio"
INTEL = "intel"
QCC = "qcc"
LCC = "lcc"


class CompilerId(object):
Expand Down Expand Up @@ -102,7 +103,13 @@ def __ne__(self, other):

def _parse_compiler_version(defines):
try:
if '__INTEL_COMPILER' in defines:
if '__LCC__' in defines and '__e2k__' in defines:
compiler = LCC
version = int(defines['__LCC__'])
major = int(version / 100)
minor = int(version % 100)
patch = int(defines['__LCC_MINOR__'])
elif '__INTEL_COMPILER' in defines:
compiler = INTEL
version = int(defines['__INTEL_COMPILER'])
major = int(version / 100)
Expand Down
14 changes: 14 additions & 0 deletions conans/client/tools/oss.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,20 @@ def detected_architecture():
return "s390x"
elif "s390" in machine:
return "s390"
elif "e2k" in machine:
return {"E": "e2k-v1",
"ES": "e2k-v2",
"E1C+": "e2k-v4",
"E1CK": "e2k-v4",
"E2C+": "e2k-v2",
"E2C3": "e2k-v6",
"E4C": "e2k-v3",
"E8C": "e2k-v4",
"E8C1": "e2k-v4",
"E8CB": "e2k-v5",
"E12C": "e2k-v6",
"E16C": "e2k-v6",
"E32C": "e2k-v7"}.get(platform.processor())

return None

Expand Down
14 changes: 14 additions & 0 deletions conans/test/unittests/client/build/compiler_flags_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,20 @@ def test_arch_flag_intel(self, base, arch, flag):
"arch": arch})
self.assertEqual(architecture_flag(settings), flag)

@parameterized.expand([("e2k-v1", "-march=elbrus-v1"),
("e2k-v2", "-march=elbrus-v2"),
("e2k-v3", "-march=elbrus-v3"),
("e2k-v4", "-march=elbrus-v4"),
("e2k-v5", "-march=elbrus-v5"),
("e2k-v6", "-march=elbrus-v6"),
("e2k-v7", "-march=elbrus-v7"),
])
def test_arch_flag_lcc(self, arch, flag):
settings = MockSettings({"compiler": "lcc",
"compiler.base": "gcc",
"arch": arch})
self.assertEqual(architecture_flag(settings), flag)

@parameterized.expand([("gcc", "libstdc++", "_GLIBCXX_USE_CXX11_ABI=0"),
("gcc", "libstdc++11", "_GLIBCXX_USE_CXX11_ABI=1"),
("clang", "libstdc++", "_GLIBCXX_USE_CXX11_ABI=0"),
Expand Down
10 changes: 9 additions & 1 deletion conans/test/unittests/client/build/compiler_id_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from parameterized import parameterized

from conans.client.conf.compiler_id import detect_compiler_id, CompilerId, UNKNOWN_COMPILER, \
GCC, LLVM_GCC, CLANG, APPLE_CLANG, SUNCC, MSVC, INTEL, QCC
GCC, LLVM_GCC, CLANG, APPLE_CLANG, SUNCC, MSVC, INTEL, QCC, LCC
from conans.test.unittests.util.tools_test import RunnerMock


Expand Down Expand Up @@ -127,3 +127,11 @@ def test_qcc(self):
"#define __GNUC_PATCHLEVEL__ 4\n"
compiler_id = detect_compiler_id("qcc", runner=runner)
self.assertEqual(CompilerId(QCC, 4, 2, 4), compiler_id)

def test_lcc(self):
runner = RunnerMock()
runner.output = "#define __LCC__ 125\n" \
"#define __LCC_MINOR__ 6\n" \
"#define __e2k__ 1\n"
compiler_id = detect_compiler_id("lcc", runner=runner)
self.assertEqual(CompilerId(LCC, 1, 25, 6), compiler_id)
52 changes: 52 additions & 0 deletions conans/test/unittests/client/build/cpp_std_flags_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -294,3 +294,55 @@ def test_intel_gcc_cppstd_flag(self):
self.assertEqual(_make_cppstd_flag("intel", "11", "14", "gcc"), None)
self.assertEqual(_make_cppstd_flag("intel", "11", "17", "gcc"), None)
self.assertEqual(_make_cppstd_flag("intel", "11", "20", "gcc"), None)

def test_lcc_cppstd_defaults(self):
self.assertEqual(_make_cppstd_default("lcc", "1.19", "gcc"), "gnu98")
self.assertEqual(_make_cppstd_default("lcc", "1.20", "gcc"), "gnu98")
self.assertEqual(_make_cppstd_default("lcc", "1.21", "gcc"), "gnu98")
self.assertEqual(_make_cppstd_default("lcc", "1.22", "gcc"), "gnu98")
self.assertEqual(_make_cppstd_default("lcc", "1.23", "gcc"), "gnu98")
self.assertEqual(_make_cppstd_default("lcc", "1.24", "gcc"), "gnu14")
self.assertEqual(_make_cppstd_default("lcc", "1.25", "gcc"), "gnu14")

def test_lcc_cppstd_flag(self):
self.assertEqual(_make_cppstd_flag("lcc", "1.19", "98", "gcc"), "-std=c++98")
self.assertEqual(_make_cppstd_flag("lcc", "1.19", "11", "gcc"), None)
self.assertEqual(_make_cppstd_flag("lcc", "1.19", "14", "gcc"), None)
self.assertEqual(_make_cppstd_flag("lcc", "1.19", "17", "gcc"), None)
self.assertEqual(_make_cppstd_flag("lcc", "1.19", "20", "gcc"), None)

self.assertEqual(_make_cppstd_flag("lcc", "1.20", "98", "gcc"), "-std=c++98")
self.assertEqual(_make_cppstd_flag("lcc", "1.20", "11", "gcc"), None)
self.assertEqual(_make_cppstd_flag("lcc", "1.20", "14", "gcc"), None)
self.assertEqual(_make_cppstd_flag("lcc", "1.20", "17", "gcc"), None)
self.assertEqual(_make_cppstd_flag("lcc", "1.20", "20", "gcc"), None)

self.assertEqual(_make_cppstd_flag("lcc", "1.21", "98", "gcc"), "-std=c++98")
self.assertEqual(_make_cppstd_flag("lcc", "1.21", "11", "gcc"), "-std=c++11")
self.assertEqual(_make_cppstd_flag("lcc", "1.21", "14", "gcc"), "-std=c++14")
self.assertEqual(_make_cppstd_flag("lcc", "1.21", "17", "gcc"), None)
self.assertEqual(_make_cppstd_flag("lcc", "1.21", "20", "gcc"), None)

self.assertEqual(_make_cppstd_flag("lcc", "1.22", "98", "gcc"), "-std=c++98")
self.assertEqual(_make_cppstd_flag("lcc", "1.22", "11", "gcc"), "-std=c++11")
self.assertEqual(_make_cppstd_flag("lcc", "1.22", "14", "gcc"), "-std=c++14")
self.assertEqual(_make_cppstd_flag("lcc", "1.22", "17", "gcc"), None)
self.assertEqual(_make_cppstd_flag("lcc", "1.22", "20", "gcc"), None)

self.assertEqual(_make_cppstd_flag("lcc", "1.23", "98", "gcc"), "-std=c++98")
self.assertEqual(_make_cppstd_flag("lcc", "1.23", "11", "gcc"), "-std=c++11")
self.assertEqual(_make_cppstd_flag("lcc", "1.23", "14", "gcc"), "-std=c++14")
self.assertEqual(_make_cppstd_flag("lcc", "1.23", "17", "gcc"), None)
self.assertEqual(_make_cppstd_flag("lcc", "1.23", "20", "gcc"), None)

self.assertEqual(_make_cppstd_flag("lcc", "1.24", "98", "gcc"), "-std=c++98")
self.assertEqual(_make_cppstd_flag("lcc", "1.24", "11", "gcc"), "-std=c++11")
self.assertEqual(_make_cppstd_flag("lcc", "1.24", "14", "gcc"), "-std=c++14")
self.assertEqual(_make_cppstd_flag("lcc", "1.24", "17", "gcc"), "-std=c++17")
self.assertEqual(_make_cppstd_flag("lcc", "1.24", "20", "gcc"), None)

self.assertEqual(_make_cppstd_flag("lcc", "1.25", "98", "gcc"), "-std=c++98")
self.assertEqual(_make_cppstd_flag("lcc", "1.25", "11", "gcc"), "-std=c++11")
self.assertEqual(_make_cppstd_flag("lcc", "1.25", "14", "gcc"), "-std=c++14")
self.assertEqual(_make_cppstd_flag("lcc", "1.25", "17", "gcc"), "-std=c++17")
self.assertEqual(_make_cppstd_flag("lcc", "1.25", "20", "gcc"), "-std=c++2a")
23 changes: 21 additions & 2 deletions conans/test/unittests/util/detected_architecture_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

from conans.client.tools.oss import detected_architecture


class DetectedArchitectureTest(unittest.TestCase):

@parameterized.expand([
Expand All @@ -36,7 +37,6 @@ def test_various(self, mocked_machine, expected_arch):
with mock.patch("platform.machine", mock.MagicMock(return_value=mocked_machine)):
self.assertEqual(expected_arch, detected_architecture(), "given '%s' expected '%s'" % (mocked_machine, expected_arch))


def test_aix(self):
with mock.patch("platform.machine", mock.MagicMock(return_value='00FB91F44C00')),\
mock.patch("platform.processor", mock.MagicMock(return_value='powerpc')),\
Expand All @@ -52,7 +52,6 @@ def test_aix(self):
mock.patch('subprocess.check_output', mock.MagicMock(return_value='7.1.0.0')):
self.assertEqual('ppc64', detected_architecture())


def test_solaris(self):
with mock.patch("platform.machine", mock.MagicMock(return_value='sun4v')),\
mock.patch("platform.processor", mock.MagicMock(return_value='sparc')),\
Expand All @@ -67,3 +66,23 @@ def test_solaris(self):
mock.patch("platform.architecture", mock.MagicMock(return_value=('64bit', 'ELF'))),\
mock.patch("platform.release", mock.MagicMock(return_value='5.11')):
self.assertEqual('x86_64', detected_architecture())

@parameterized.expand([
["E", "e2k-v1"],
["ES", "e2k-v2"],
["E1C+", "e2k-v4"],
["E1CK", "e2k-v4"],
["E2C+", "e2k-v2"],
["E2C3", "e2k-v6"],
["E4C", "e2k-v3"],
["E8C", "e2k-v4"],
["E8C1", "e2k-v4"],
["E8CB", "e2k-v5"],
["E12C", "e2k-v6"],
["E16C", "e2k-v6"],
["E32C", "e2k-v7"]
])
def test_e2k(self, processor, expected_arch):
with mock.patch("platform.machine", mock.MagicMock(return_value='e2k')), \
mock.patch("platform.processor", mock.MagicMock(return_value=processor)):
self.assertEqual(expected_arch, detected_architecture())

0 comments on commit 72db1b7

Please sign in to comment.