chiark / gitweb /
path: add new "systemd-path" utility for querying paths described in file-hierarchy(7)
[elogind.git] / src / shared / architecture.h
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 #pragma once
4
5 /***
6   This file is part of systemd.
7
8   Copyright 2014 Lennart Poettering
9
10   systemd is free software; you can redistribute it and/or modify it
11   under the terms of the GNU Lesser General Public License as published by
12   the Free Software Foundation; either version 2.1 of the License, or
13   (at your option) any later version.
14
15   systemd is distributed in the hope that it will be useful, but
16   WITHOUT ANY WARRANTY; without even the implied warranty of
17   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18   Lesser General Public License for more details.
19
20   You should have received a copy of the GNU Lesser General Public License
21   along with systemd; If not, see <http://www.gnu.org/licenses/>.
22 ***/
23
24 #include "util.h"
25
26 /* A cleaned up architecture definition */
27
28 typedef enum Architecture {
29         ARCHITECTURE_X86 = 0,
30         ARCHITECTURE_X86_64,
31         ARCHITECTURE_PPC,
32         ARCHITECTURE_PPC_LE,
33         ARCHITECTURE_PPC64,
34         ARCHITECTURE_PPC64_LE,
35         ARCHITECTURE_IA64,
36         ARCHITECTURE_PARISC,
37         ARCHITECTURE_PARISC64,
38         ARCHITECTURE_S390,
39         ARCHITECTURE_S390X,
40         ARCHITECTURE_SPARC,
41         ARCHITECTURE_SPARC64,
42         ARCHITECTURE_MIPS,
43         ARCHITECTURE_MIPS_LE,
44         ARCHITECTURE_MIPS64,
45         ARCHITECTURE_MIPS64_LE,
46         ARCHITECTURE_ALPHA,
47         ARCHITECTURE_ARM,
48         ARCHITECTURE_ARM_BE,
49         ARCHITECTURE_ARM64,
50         ARCHITECTURE_ARM64_BE,
51         ARCHITECTURE_SH,
52         ARCHITECTURE_SH64,
53         ARCHITECTURE_M68K,
54         ARCHITECTURE_TILEGX,
55         ARCHITECTURE_CRIS,
56         _ARCHITECTURE_MAX,
57         _ARCHITECTURE_INVALID = -1
58 } Architecture;
59
60 Architecture uname_architecture(void);
61
62 /*
63  * ARCH_TUPLE should resolve to the local architecture systemd is
64  * built for, according to the Debian tuple list:
65  *
66  * https://wiki.debian.org/Multiarch/Tuples
67  *
68  */
69
70 #if defined(__x86_64__)
71 #  define native_architecture() ARCHITECTURE_X86_64
72 #  define ARCH_TUPLE "x86_64-linux-gnu"
73 #elif defined(__i386__)
74 #  define native_architecture() ARCHITECTURE_X86
75 #  define ARCH_TUPLE "i386-linux-gnu"
76 #elif defined(__powerpc64__)
77 #  if defined(WORDS_BIGENDIAN)
78 #    define native_architecture() ARCHITECTURE_PPC64
79 #    define ARCH_TUPLE "ppc64-linux-gnu"
80 #  else
81 #    define native_architecture() ARCHITECTURE_PPC64_LE
82 #    error "Missing ARCH_TUPLE for PPC64LE"
83 #  endif
84 #elif defined(__powerpc__)
85 #  if defined(WORDS_BIGENDIAN)
86 #    define native_architecture() ARCHITECTURE_PPC
87 #    define ARCH_TUPLE "powerpc-linux-gnu"
88 #  else
89 #    define native_architecture() ARCHITECTURE_PPC_LE
90 #    error "Missing ARCH_TUPLE for PPCLE"
91 #  endif
92 #elif defined(__ia64__)
93 #  define native_architecture() ARCHITECTURE_IA64
94 #  define ARCH_TUPLE "ia64-linux-gnu"
95 #elif defined(__hppa64__)
96 #  define native_architecture() ARCHITECTURE_PARISC64
97 #  error "Missing ARCH_TUPLE for HPPA64"
98 #elif defined(__hppa__)
99 #  define native_architecture() ARCHITECTURE_PARISC
100 #  define ARCH_TUPLE "hppa‑linux‑gnu"
101 #elif defined(__s390x__)
102 #  define native_architecture() ARCHITECTURE_S390X
103 #  define ARCH_TUPLE "s390x-linux-gnu"
104 #elif defined(__s390__)
105 #  define native_architecture() ARCHITECTURE_S390
106 #  define ARCH_TUPLE "s390-linux-gnu"
107 #elif defined(__sparc64__)
108 #  define native_architecture() ARCHITECTURE_SPARC64
109 #  define ARCH_TUPLE "sparc64-linux-gnu"
110 #elif defined(__sparc__)
111 #  define native_architecture() ARCHITECTURE_SPARC
112 #  define ARCH_TUPLE "sparc-linux-gnu"
113 #elif defined(__mips64__)
114 #  if defined(WORDS_BIGENDIAN)
115 #    define native_architecture() ARCHITECTURE_MIPS64
116 #    error "Missing ARCH_TUPLE for MIPS64"
117 #  else
118 #    define native_architecture() ARCHITECTURE_MIPS64_LE
119 #    error "Missing ARCH_TUPLE for MIPS64_LE"
120 #  endif
121 #elif defined(__mips__)
122 #  if defined(WORDS_BIGENDIAN)
123 #    define native_architecture() ARCHITECTURE_MIPS
124 #    define ARCH_TUPLE "mips-linux-gnu"
125 #  else
126 #    define native_architecture() ARCHITECTURE_MIPS_LE
127 #    define ARCH_TUPLE "mipsel-linux-gnu"
128 #endif
129 #elif defined(__alpha__)
130 #  define native_architecture() ARCHITECTURE_ALPHA
131 #  define ARCH_TUPLE "alpha-linux-gnu"
132 #elif defined(__aarch64__)
133 #  if defined(WORDS_BIGENDIAN)
134 #    define native_architecture() ARCHITECTURE_ARM64_BE
135 #    define ARCH_TUPLE "aarch64_be-linux-gnu"
136 #  else
137 #    define native_architecture() ARCHITECTURE_ARM64
138 #    define ARCH_TUPLE "aarch64-linux-gnu"
139 #  endif
140 #elif defined(__arm__)
141 #  if defined(WORDS_BIGENDIAN)
142 #    define native_architecture() ARCHITECTURE_ARM_BE
143 #    error "Missing ARCH_TUPLE for ARM_BE"
144 #  else
145 #    define native_architecture() ARCHITECTURE_ARM
146 #    error "Missing ARCH_TUPLE for ARM"
147 #  endif
148 #elif defined(__sh64__)
149 #  define native_architecture() ARCHITECTURE_SH64
150 #  error "Missing ARCH_TUPLE for SH64"
151 #elif defined(__sh__)
152 #  define native_architecture() ARCHITECTURE_SH
153 #  define ARCH_TUPLE "sh4-linux-gnu"
154 #elif defined(__m68k__)
155 #  define native_architecture() ARCHITECTURE_M68K
156 #  define ARCH_TUPLE "m68k-linux-gnu"
157 #elif defined(__tilegx__)
158 #  define native_architecture() ARCHITECTURE_TILEGX
159 #  error "Missing ARCH_TUPLE for TILEGX"
160 #elif defined(__cris__)
161 #  define native_architecture() ARCHITECTURE_CRIS
162 #  error "Missing ARCH_TUPLE for CRIS"
163 #else
164 #error "Please register your architecture here!"
165 #endif
166
167 const char *architecture_to_string(Architecture a) _const_;
168 Architecture architecture_from_string(const char *s) _pure_;