You can simply get current arch usign following code, where on windows can be used GetNativeSystemInfo() and on macos and linux uname() function:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
std::string GetOSArch()
{
#ifdef CPK_OS_WIN
SYSTEM_INFO info;
GetNativeSystemInfo(&info);
switch (info.wProcessorArchitecture) {
case PROCESSOR_ARCHITECTURE_AMD64:
return "x86_64";
case PROCESSOR_ARCHITECTURE_INTEL:
return "x86";
case PROCESSOR_ARCHITECTURE_IA64:
return "ia64";
};
#endif
#if defined(CPK_OS_LINUX) || defined(CPK_OS_MACOS)
long ret = -1;
struct utsname u;
if (ret == -1)
ret = uname(&u);
if (ret != -1) {
if (strlen(u.machine) == 4 && u.machine[0] == 'i'
&& u.machine[2] == '8' && u.machine[3] == '6')
return std::string("x86");
if (strcmp(u.machine, "amd64") == 0) // Solaris
return std::string("x86_64");
return std::string(u.machine);
}
#endif
return "";
}
OS detection can be done for example on cmake side or with other definition like __WIN32
:
1
2
3
4
5
6
7
8
9
if(WIN32)
add_definitions(-DCPK_OS_WIN)
else()
if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
add_definitions(-DCPK_OS_MACOS)
else()
add_definitions(-DCPK_OS_LINUX)
endif()
endif()