Merge pull request #4386 from bema-aei/emulated_x86_feature_detection

Apple M1 CPU feature detection
This commit is contained in:
CharlieFenton 2021-06-01 05:09:41 -07:00 committed by GitHub
commit f045c08691
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 420 additions and 50 deletions

View File

@ -1,6 +1,6 @@
// This file is part of BOINC.
// http://boinc.berkeley.edu
// Copyright (C) 2020 University of California
// Copyright (C) 2021 University of California
//
// BOINC is free software; you can redistribute it and/or modify it
// under the terms of the GNU Lesser General Public License
@ -53,6 +53,7 @@ extern int compareOSVersionTo(int toMajor, int toMinor);
#include "client_types.h"
#include "client_state.h"
#include "client_msgs.h"
#include "log_flags.h"
#include "project.h"
@ -72,6 +73,90 @@ void CLIENT_STATE::add_platform(const char* platform) {
}
#if defined (__APPLE__) && defined (__arm64__)
// detect a possibly emulated x86_64 CPU and its features on a Apple Silicon M1 Mac
//
int launch_child_process_to_detect_emulated_cpu() {
int prog;
char data_dir[MAXPATHLEN];
char execpath[MAXPATHLEN];
int retval = 0;
retval = boinc_delete_file(EMULATED_CPU_INFO_FILENAME);
if (retval) {
msg_printf(0, MSG_INFO,
"Failed to delete old %s. error code %d",
EMULATED_CPU_INFO_FILENAME, retval
);
} else {
for (;;) {
if (!boinc_file_exists(EMULATED_CPU_INFO_FILENAME)) break;
boinc_sleep(0.01);
}
}
// write the EMULATED_CPU_INFO into the BOINC data dir
boinc_getcwd(data_dir);
// the execuable should be in BOINC data dir
strncpy(execpath, data_dir, sizeof(execpath));
strncat(execpath, "/" EMULATED_CPU_INFO_EXECUTABLE, sizeof(execpath) - strlen(execpath) - 1);
if (log_flags.coproc_debug) {
msg_printf(0, MSG_INFO,
"[x86_64-M1] launching child process at %s",
execpath
);
}
int argc = 1;
char* const argv[2] = {
const_cast<char *>(execpath),
NULL
};
retval = run_program(
data_dir,
execpath,
argc,
argv,
0,
prog
);
if (retval) {
if (log_flags.coproc_debug) {
msg_printf(0, MSG_INFO,
"[x86_64-M1] run_program of child process returned error %d",
retval
);
}
return retval;
}
retval = get_exit_status(prog);
if (retval) {
char buf[200];
if (WIFEXITED(retval)) {
int code = WEXITSTATUS(retval);
snprintf(buf, sizeof(buf), "process exited with status %d: %s", code, strerror(code));
} else if (WIFSIGNALED(retval)) {
int sig = WTERMSIG(retval);
snprintf(buf, sizeof(buf), "process was terminated by signal %d", sig);
} else {
snprintf(buf, sizeof(buf), "unknown status %d", retval);
}
msg_printf(0, MSG_INFO,
"Emulated CPU detection failed: %s",
buf
);
}
return retval;
}
#endif
// determine the list of supported platforms.
//
void CLIENT_STATE::detect_platforms() {
@ -106,8 +191,9 @@ void CLIENT_STATE::detect_platforms() {
}
#elif defined(__arm64__)
add_platform("arm64-apple-darwin");
//TODO: Add test for Mac OS Version when Apple Rosetta emulator is removed
add_platform("x86_64-apple-darwin");
if (!launch_child_process_to_detect_emulated_cpu()) {
add_platform("x86_64-apple-darwin");
}
#else
#error Mac client now requires a 64-bit system
#endif

View File

@ -0,0 +1,44 @@
// This file is part of BOINC.
// http://boinc.berkeley.edu
// Copyright (C) 2021 University of California
//
// BOINC is free software; you can redistribute it and/or modify it
// under the terms of the GNU Lesser General Public License
// as published by the Free Software Foundation,
// either version 3 of the License, or (at your option) any later version.
//
// BOINC is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with BOINC. If not, see <http://www.gnu.org/licenses/>.
// This helper program is used to detect an emulated x86_64 CPU on Apples
// ARM64 CPUs (M1). It should be compiiled _only_ for x86_64 architecture.
// It writes the feature string of the meulated CPU to a file
// EMULATED_CPU_INFO_FILENAME in the current working directory.
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/sysctl.h>
#include "hostinfo.h" // for P_FEATURES_SIZE
#include "filesys.h" // for boinc_fopen()
#include "file_names.h" // for EMULATED_CPU_INFO_FILENAME
int main () {
size_t len;
char features[P_FEATURES_SIZE];
FILE*fp;
len = sizeof(features);
sysctlbyname("machdep.cpu.features", features, &len, NULL, 0);
if ((fp = boinc_fopen(EMULATED_CPU_INFO_FILENAME, "w"))) {
fprintf(fp," %s\n", features);
fclose(fp);
}
return 0;
}

View File

@ -1,6 +1,6 @@
// This file is part of BOINC.
// http://boinc.berkeley.edu
// Copyright (C) 2018 University of California
// Copyright (C) 2021 University of California
//
// BOINC is free software; you can redistribute it and/or modify it
// under the terms of the GNU Lesser General Public License
@ -72,6 +72,8 @@ extern void send_log_after(const char* filename, double t, MIOFILE& mf);
#define CONFIG_FILE "cc_config.xml"
#define NVC_CONFIG_FILE "nvc_config.xml"
#define COPROC_INFO_FILENAME "coproc_info.xml"
#define EMULATED_CPU_INFO_EXECUTABLE "detect_rosetta_cpu"
#define EMULATED_CPU_INFO_FILENAME "emulated_cpu_info.txt"
#define CPU_BENCHMARKS_FILE_NAME "cpu_benchmarks"
#define CREATE_ACCOUNT_FILENAME "create_account.xml"
#define DAILY_XFER_HISTORY_FILENAME "daily_xfer_history.xml"

View File

@ -1,6 +1,6 @@
// This file is part of BOINC.
// http://boinc.berkeley.edu
// Copyright (C) 2020 University of California
// Copyright (C) 2021 University of California
//
// BOINC is free software; you can redistribute it and/or modify it
// under the terms of the GNU Lesser General Public License
@ -805,31 +805,116 @@ void use_cpuid(HOST_INFO& host) {
static void get_cpu_info_mac(HOST_INFO& host) {
int p_model_size = sizeof(host.p_model);
size_t len;
#if defined(__i386__) || defined(__x86_64__)
char brand_string[256];
char features[P_FEATURES_SIZE];
char *p;
char *sep=" ";
int family, stepping, model;
len = sizeof(host.p_vendor);
sysctlbyname("machdep.cpu.vendor", host.p_vendor, &len, NULL, 0);
int family, stepping, model, feature;
string feature_string;
len = sizeof(brand_string);
sysctlbyname("machdep.cpu.brand_string", brand_string, &len, NULL, 0);
len = sizeof(family);
sysctlbyname("machdep.cpu.family", &family, &len, NULL, 0);
#if defined(__i386__) || defined(__x86_64__)
len = sizeof(model);
sysctlbyname("machdep.cpu.model", &model, &len, NULL, 0);
// on an Apple M1 chip the cpu.vendor is broken, family, model and stepping don't exist
if (!strncmp(brand_string, "Apple M", strlen("Apple M"))) {
len = sizeof(stepping);
sysctlbyname("machdep.cpu.stepping", &stepping, &len, NULL, 0);
strcpy(host.p_vendor, "Apple");
strncpy(host.p_model, brand_string, sizeof(host.p_model));
} else {
len = sizeof(host.p_vendor);
sysctlbyname("machdep.cpu.vendor", host.p_vendor, &len, NULL, 0);
len = sizeof(family);
sysctlbyname("machdep.cpu.family", &family, &len, NULL, 0);
len = sizeof(model);
sysctlbyname("machdep.cpu.model", &model, &len, NULL, 0);
len = sizeof(stepping);
sysctlbyname("machdep.cpu.stepping", &stepping, &len, NULL, 0);
snprintf(
host.p_model, sizeof(host.p_model),
"%s [x86 Family %d Model %d Stepping %d]",
brand_string, family, model, stepping
);
}
len = sizeof(features);
sysctlbyname("machdep.cpu.features", features, &len, NULL, 0);
#else // defined(__i386__) || defined(__x86_64__)
strcpy(host.p_vendor, "Apple");
strncpy(host.p_model, brand_string, sizeof(host.p_model));
features[0] = '\0';
len = sizeof(feature);
feature_string="";
sysctlbyname("hw.optional.amx_version", &feature, &len, NULL, 0);
snprintf(features, sizeof(features), "amx_version_%d", feature);
feature_string += features;
sysctlbyname("hw.optional.arm64", &feature, &len, NULL, 0);
if (feature) feature_string += " arm64";
sysctlbyname("hw.optional.armv8_1_atomics", &feature, &len, NULL, 0);
if (feature) feature_string += " armv8_1_atomics";
sysctlbyname("hw.optional.armv8_2_fhm", &feature, &len, NULL, 0);
if (feature) feature_string += " armv8_2_fhm";
sysctlbyname("hw.optional.armv8_2_sha3", &feature, &len, NULL, 0);
if (feature) feature_string += " armv8_2_sha3";
sysctlbyname("hw.optional.armv8_2_sha512", &feature, &len, NULL, 0);
if (feature) feature_string += " armv8_2_sha512";
sysctlbyname("hw.optional.armv8_crc32", &feature, &len, NULL, 0);
if (feature) feature_string += " armv8_crc32";
sysctlbyname("hw.optional.floatingpoint", &feature, &len, NULL, 0);
if (feature) feature_string += " floatingpoint";
sysctlbyname("hw.optional.neon", &feature, &len, NULL, 0);
if (feature) feature_string += " neon";
sysctlbyname("hw.optional.neon_fp16", &feature, &len, NULL, 0);
if (feature) feature_string += " neon_fp16";
sysctlbyname("hw.optional.neon_hpfp", &feature, &len, NULL, 0);
if (feature) feature_string += " neon_hpfp";
sysctlbyname("hw.optional.ucnormal_mem", &feature, &len, NULL, 0);
if (feature) feature_string += " ucnormal_mem";
// read features of the emulated CPU if there is a file containing these
char fpath[MAXPATHLEN];
boinc_getcwd(fpath);
strcat(fpath,"/");
strcat(fpath,EMULATED_CPU_INFO_FILENAME);
if (boinc_file_exists(fpath)) {
FILE* fp = boinc_fopen(fpath, "r");
if (fp) {
fgets(features, sizeof(features), fp);
feature_string += features;
fclose(fp);
} else if (log_flags.coproc_debug) {
msg_printf(0, MSG_INFO, "[x86_64-M1] couldn't open file %s", fpath);
}
} else if (log_flags.coproc_debug) {
msg_printf(0, MSG_INFO, "[x86_64-M1] didn't find file %s", fpath);
}
strncpy(features,feature_string.c_str(),sizeof(features));
#endif // defined(__i386__) || defined(__x86_64__)
// Convert Mac CPU features string to match that returned by Linux
for(p=features; *p; p++) {
*p = tolower(*p);
@ -851,15 +936,6 @@ static void get_cpu_info_mac(HOST_INFO& host) {
}
}
snprintf(
host.p_model, sizeof(host.p_model),
"%s [x86 Family %d Model %d Stepping %d]",
brand_string, family, model, stepping
);
#else
// TODO: Add code for Apple arm64 CPU
#endif
host.p_model[p_model_size-1] = 0;
// This returns an Apple hardware model designation such as "MacPro3,1".

View File

@ -41,6 +41,7 @@
/* End PBXAggregateTarget section */
/* Begin PBXBuildFile section */
B13E2D172655655000D5C977 /* detect_rosetta_cpu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B13E2D162655655000D5C977 /* detect_rosetta_cpu.cpp */; };
DD000D6A24D0208E0083DE77 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DD89165E0F3B1BC200DE5B1C /* OpenGL.framework */; };
DD000D6B24D020940083DE77 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DD89165E0F3B1BC200DE5B1C /* OpenGL.framework */; };
DD000D7424D0244D0083DE77 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DD000D7324D0244C0083DE77 /* SystemConfiguration.framework */; };
@ -583,6 +584,20 @@
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
B1A32E54265D206800896566 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 20286C28FDCF999611CA2CEA /* Project object */;
proxyType = 1;
remoteGlobalIDString = B13E2D0E265564D100D5C977;
remoteInfo = detect_rosetta_cpu;
};
B1A32E57265D20FB00896566 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 20286C28FDCF999611CA2CEA /* Project object */;
proxyType = 1;
remoteGlobalIDString = DD407A4907D2FB1200163EF5;
remoteInfo = libboinc;
};
DD095D1E0F3B22DE000902F5 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 20286C28FDCF999611CA2CEA /* Project object */;
@ -838,6 +853,15 @@
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
B13E2D0D265564D100D5C977 /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = /usr/share/man/man1/;
dstSubfolderSpec = 0;
files = (
);
runOnlyForDeploymentPostprocessing = 1;
};
DD3E15350A774397007E0084 /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
@ -873,6 +897,9 @@
AA8B6B1C046C364400A80164 /* app_ipc.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = app_ipc.h; path = ../lib/app_ipc.h; sourceTree = SOURCE_ROOT; };
AAA31C97042157A800A80164 /* shmem.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = shmem.cpp; sourceTree = "<group>"; };
AAA31C98042157A800A80164 /* shmem.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = shmem.h; path = ../lib/shmem.h; sourceTree = SOURCE_ROOT; };
B13E2D0F265564D100D5C977 /* detect_rosetta_cpu */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = detect_rosetta_cpu; sourceTree = BUILT_PRODUCTS_DIR; };
B13E2D11265564D100D5C977 /* main.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = "<group>"; };
B13E2D162655655000D5C977 /* detect_rosetta_cpu.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = detect_rosetta_cpu.cpp; sourceTree = "<group>"; };
DD000D7324D0244C0083DE77 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = /System/Library/Frameworks/SystemConfiguration.framework; sourceTree = "<absolute>"; };
DD0052F710CA6F1D0067570C /* cs_proxy.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = cs_proxy.cpp; path = ../client/cs_proxy.cpp; sourceTree = SOURCE_ROOT; };
DD0052F810CA6F1D0067570C /* cs_proxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cs_proxy.h; path = ../client/cs_proxy.h; sourceTree = SOURCE_ROOT; };
@ -981,7 +1008,6 @@
DD40825707D3076400163EF5 /* reduce_lib.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = reduce_lib.cpp; sourceTree = "<group>"; };
DD40825807D3076400163EF5 /* reduce_main.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = reduce_main.cpp; sourceTree = "<group>"; };
DD40825907D3076400163EF5 /* reduce.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = reduce.h; path = ../api/reduce.h; sourceTree = SOURCE_ROOT; };
DD40827D07D30AA800163EF5 /* jpeglib.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = jpeglib.h; path = ../samples/jpeglib/jpeglib.h; sourceTree = SOURCE_ROOT; };
DD40E75D0ADB87BC00214518 /* wxPieCtrl.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = wxPieCtrl.cpp; path = ../clientgui/common/wxPieCtrl.cpp; sourceTree = SOURCE_ROOT; };
DD40E75E0ADB87BC00214518 /* wxPieCtrl.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = wxPieCtrl.h; path = ../clientgui/common/wxPieCtrl.h; sourceTree = SOURCE_ROOT; };
DD4688410C165F3C0089F500 /* Uninstall BOINC.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Uninstall BOINC.app"; sourceTree = BUILT_PRODUCTS_DIR; };
@ -1371,6 +1397,13 @@
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
B13E2D0C265564D100D5C977 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
DD1277B1081F3D67007B5DE1 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
@ -1581,6 +1614,7 @@
DDF9EC03144EB14B005D6144 /* libboinc_opencl.a */,
DD3EAAA6216A25AD00BC673C /* boinc_finish_install */,
DD5F654123605B41009ED2A2 /* gfx_cleanup */,
B13E2D0F265564D100D5C977 /* detect_rosetta_cpu */,
);
name = Products;
sourceTree = SOURCE_ROOT;
@ -1588,7 +1622,6 @@
20286C29FDCF999611CA2CEA /* «PROJECTNAME» */ = {
isa = PBXGroup;
children = (
DD40827D07D30AA800163EF5 /* jpeglib.h */,
F54B8FBE02AC0A0C01FB7237 /* client */,
DD81C3F707C5D03B0098A04D /* clientgui */,
DDB873950C85072500E0DE1F /* clientscr */,
@ -1599,6 +1632,7 @@
DD81C79E144D8F97000BE61A /* jpeg */,
20286C2CFDCF999611CA2CEA /* Resources */,
20286C32FDCF999611CA2CEA /* External Frameworks and Libraries */,
B13E2D10265564D100D5C977 /* detect_rosetta_cpu */,
195DF8C9FE9D4F0611CA2CBB /* Products */,
DD96AFFA0811075100A06F22 /* ScreenSaver-Info.plist */,
DD1277B5081F3D67007B5DE1 /* PostInstall-Info.plist */,
@ -1647,6 +1681,14 @@
name = "External Frameworks and Libraries";
sourceTree = SOURCE_ROOT;
};
B13E2D10265564D100D5C977 /* detect_rosetta_cpu */ = {
isa = PBXGroup;
children = (
B13E2D11265564D100D5C977 /* main.cpp */,
);
path = detect_rosetta_cpu;
sourceTree = "<group>";
};
DD1277BC081F3E59007B5DE1 /* mac_installer */ = {
isa = PBXGroup;
children = (
@ -2078,6 +2120,7 @@
F54B8FC902AC0A0C01FB7237 /* cs_scheduler.cpp */,
DD344B9307C5AE2E0043025C /* cs_statefile.cpp */,
DD344B9407C5AE2E0043025C /* cs_trickle.cpp */,
B13E2D162655655000D5C977 /* detect_rosetta_cpu.cpp */,
DD344B9507C5AE2E0043025C /* dhrystone.cpp */,
DD344B9607C5AE2E0043025C /* dhrystone.h */,
DD344B9707C5AE2E0043025C /* dhrystone2.cpp */,
@ -2196,6 +2239,23 @@
/* End PBXHeadersBuildPhase section */
/* Begin PBXNativeTarget section */
B13E2D0E265564D100D5C977 /* detect_rosetta_cpu */ = {
isa = PBXNativeTarget;
buildConfigurationList = B13E2D13265564D100D5C977 /* Build configuration list for PBXNativeTarget "detect_rosetta_cpu" */;
buildPhases = (
B13E2D0B265564D100D5C977 /* Sources */,
B13E2D0C265564D100D5C977 /* Frameworks */,
B13E2D0D265564D100D5C977 /* CopyFiles */,
);
buildRules = (
);
dependencies = (
);
name = detect_rosetta_cpu;
productName = detect_rosetta_cpu;
productReference = B13E2D0F265564D100D5C977 /* detect_rosetta_cpu */;
productType = "com.apple.product-type.tool";
};
DD1277B2081F3D67007B5DE1 /* PostInstall */ = {
isa = PBXNativeTarget;
buildConfigurationList = DD9E2371091CBDAE0048316E /* Build configuration list for PBXNativeTarget "PostInstall" */;
@ -2518,6 +2578,8 @@
buildRules = (
);
dependencies = (
B1A32E58265D20FB00896566 /* PBXTargetDependency */,
B1A32E55265D206800896566 /* PBXTargetDependency */,
DD25E20D220438090040366F /* PBXTargetDependency */,
);
name = BOINC_Client;
@ -2583,6 +2645,9 @@
attributes = {
LastUpgradeCheck = 0620;
TargetAttributes = {
B13E2D0E265564D100D5C977 = {
CreatedOnToolsVersion = 12.5;
};
DD3EAAA5216A25AD00BC673C = {
CreatedOnToolsVersion = 9.4.1;
};
@ -2627,6 +2692,7 @@
DD89161C0F3B17E900DE5B1C /* ss_app */,
DDD336F51062235D00867C7D /* AddRemoveUser */,
DD5F654023605B41009ED2A2 /* gfx_cleanup */,
B13E2D0E265564D100D5C977 /* detect_rosetta_cpu */,
);
};
/* End PBXProject section */
@ -2972,6 +3038,14 @@
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
B13E2D0B265564D100D5C977 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
B13E2D172655655000D5C977 /* detect_rosetta_cpu.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
DD1277B0081F3D67007B5DE1 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
@ -3607,6 +3681,16 @@
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
B1A32E55265D206800896566 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = B13E2D0E265564D100D5C977 /* detect_rosetta_cpu */;
targetProxy = B1A32E54265D206800896566 /* PBXContainerItemProxy */;
};
B1A32E58265D20FB00896566 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = DD407A4907D2FB1200163EF5 /* libboinc */;
targetProxy = B1A32E57265D20FB00896566 /* PBXContainerItemProxy */;
};
DD095D1F0F3B22DE000902F5 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = DD89161C0F3B17E900DE5B1C /* ss_app */;
@ -3801,6 +3885,24 @@
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
B13E2D14265564D100D5C977 /* Development */ = {
isa = XCBuildConfiguration;
buildSettings = {
ARCHS = x86_64;
OTHER_LDFLAGS = "-lboinc";
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Development;
};
B13E2D15265564D100D5C977 /* Deployment */ = {
isa = XCBuildConfiguration;
buildSettings = {
ARCHS = x86_64;
OTHER_LDFLAGS = "-lboinc";
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Deployment;
};
DD1AFEB60A512D8700EE5B82 /* Development */ = {
isa = XCBuildConfiguration;
buildSettings = {
@ -4745,6 +4847,15 @@
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
B13E2D13265564D100D5C977 /* Build configuration list for PBXNativeTarget "detect_rosetta_cpu" */ = {
isa = XCConfigurationList;
buildConfigurations = (
B13E2D14265564D100D5C977 /* Development */,
B13E2D15265564D100D5C977 /* Deployment */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Development;
};
DD1AFEB50A512D8700EE5B82 /* Build configuration list for PBXNativeTarget "Install_BOINC" */ = {
isa = XCConfigurationList;
buildConfigurations = (

View File

@ -2,7 +2,7 @@
# This file is part of BOINC.
# http://boinc.berkeley.edu
# Copyright (C) 2020 University of California
# Copyright (C) 2021 University of California
#
# BOINC is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License
@ -53,6 +53,7 @@
## Updated 7/29/20 by Charlie Fenton to build arm64 and x86_64 Universal2 Binary
## Updated 11/22/20 by Charlie Fenton to build DMG bare-core (apple-darwin) release
## Updated 11/26/20 by Charlie Fenton to let installer show message if MacOS too old
## Updated 5/27/21 to support zsh & detecting X86_64 features emulated by Rosetta 2
##
## NOTE: This script requires Mac OS 10.7 or later, and uses XCode developer
## tools. So you must have installed XCode Developer Tools on the Mac
@ -192,11 +193,11 @@ lipo "BOINCManager.app/Contents/MacOS/BOINCManager" -verify_arch x86_64
if [ $? -eq 0 ]; then Products_Have_x86_64="yes"; fi
lipo "BOINCManager.app/Contents/MacOS/BOINCManager" -verify_arch arm64
if [ $? -eq 0 ]; then Products_Have_arm64="yes"; fi
if [ $Products_Have_x86_64 == "no" ] && [ $Products_Have_arm64 == "no" ]; then
if [ $Products_Have_x86_64 = "no" ] && [ $Products_Have_arm64 = "no" ]; then
echo "ERROR: could not determine architecture of BOINC Manager"
fi
if [ $Products_Have_arm64 == "yes" ]; then
if [ $Products_Have_x86_64 == "yes" ]; then
if [ $Products_Have_arm64 = "yes" ]; then
if [ $Products_Have_x86_64 = "yes" ]; then
arch="universal"
else
arch="arm64"
@ -292,6 +293,7 @@ cp -fp clientscr/res/boinc_logo_black.jpg ../BOINC_Installer/Pkg_Root/Library/Ap
cp -fp api/ttf/liberation-fonts-ttf-2.00.0/LiberationSans-Regular.ttf ../BOINC_Installer/Pkg_Root/Library/Application\ Support/BOINC\ Data/LiberationSans-Regular.ttf
cp -fp clientscr/ss_config.xml ../BOINC_Installer/Pkg_Root/Library/Application\ Support/BOINC\ Data/
cp -fpRL "${BUILDPATH}/boincscr" ../BOINC_Installer/Pkg_Root/Library/Application\ Support/BOINC\ Data/
cp -fpRL "${BUILDPATH}/detect_rosetta_cpu" ../BOINC_Installer/Pkg_Root/Library/Application\ Support/BOINC\ Data/
cp -fpRL "${BUILDPATH}/BOINCManager.app" ../BOINC_Installer/Pkg_Root/Applications/
@ -397,6 +399,9 @@ if [ -e "${HOME}/BOINCCodeSignIdentities.txt" ]; then
# Code Sign the boincscr graphics app if we have a signing identity
sudo codesign -f -o runtime -s "${APPSIGNINGIDENTITY}" "../BOINC_Installer/Pkg_Root/Library/Application Support/BOINC Data/boincscr"
# Code Sign the detect_rosetta_cpu helper app if we have a signing identity
sudo codesign -f -o runtime -s "${APPSIGNINGIDENTITY}" "../BOINC_Installer/Pkg_Root/Library/Application Support/BOINC Data/detect_rosetta_cpu"
# Code Sign the BOINC screensaver code for OS 10.6 and OS 10.7 if we have a signing identity
sudo codesign -f -o runtime -s "${APPSIGNINGIDENTITY}" "../BOINC_Installer/Pkg_Root/Library/Screen Savers/BOINCSaver.saver/Contents/MacOS/BOINCSaver_MacOS10_6_7"
@ -510,6 +515,7 @@ sudo chmod -R 644 ../BOINC_Installer/New_Release_$1_$2_$3/boinc_$1.$2.$3_$arch-a
mkdir -p ../BOINC_Installer/New_Release_$1_$2_$3/boinc_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir
cp -fpRL "${BUILDPATH}/boinc" ../BOINC_Installer/New_Release_$1_$2_$3/boinc_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/
cp -fpRL "${BUILDPATH}/boinccmd" ../BOINC_Installer/New_Release_$1_$2_$3/boinc_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/
cp -fpRL "${BUILDPATH}/detect_rosetta_cpu" ../BOINC_Installer/New_Release_$1_$2_$3/boinc_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/
cp -fpRL curl/ca-bundle.crt ../BOINC_Installer/New_Release_$1_$2_$3/boinc_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/
mkdir -p ../BOINC_Installer/New_Release_$1_$2_$3/boinc_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/switcher
@ -534,34 +540,37 @@ if [ -n "${APPSIGNINGIDENTITY}" ]; then
# Code Sign the stand-alone bare core boinc client if we have a signing identity
sudo codesign -f -o runtime -s "${APPSIGNINGIDENTITY}" "../BOINC_Installer/New_Release_$1_$2_$3/boinc_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinc"
# Code Sign detect_rosetta_cpu for the stand-alone boinc client if we have a signing identity
sudo codesign -f -o runtime -s "${APPSIGNINGIDENTITY}" "../BOINC_Installer/New_Release_$1_$2_$3/boinc_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/detect_rosetta_cpu"
# Code Sign setprojectgrp for the stand-alone boinc client if we have a signing identity
sudo codesign -f -o runtime -s "${APPSIGNINGIDENTITY}" "../BOINC_Installer/New_Release_$1_$2_$3/boinc_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/switcher/setprojectgrp"
# Code Sign switcher for the stand-alone boinc client if we have a signing identity
sudo codesign -f -o runtime -s "${APPSIGNINGIDENTITY}" "../BOINC_Installer/New_Release_$1_$2_$3/boinc_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/switcher/switcher"
if [ $arch == "universal" ]; then
# Workaround for code signing problem under Xcode 12.2:
# Code sign each architecture separately then combine into a uiversal binary
lipo "../BOINC_Installer/New_Release_$1_$2_$3/boinc_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd" -thin x86_64 -output "../BOINC_Installer/New_Release_$1_$2_$3/boinc_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd-x86_64"
if [ $arch = "universal" ]; then
# Workaround for code signing problem under Xcode 12.2:
# Code sign each architecture separately then combine into a uiversal binary
lipo "../BOINC_Installer/New_Release_$1_$2_$3/boinc_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd" -thin x86_64 -output "../BOINC_Installer/New_Release_$1_$2_$3/boinc_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd-x86_64"
lipo "../BOINC_Installer/New_Release_$1_$2_$3/boinc_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd" -thin arm64 -output "../BOINC_Installer/New_Release_$1_$2_$3/boinc_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd-arm64"
lipo "../BOINC_Installer/New_Release_$1_$2_$3/boinc_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd" -thin arm64 -output "../BOINC_Installer/New_Release_$1_$2_$3/boinc_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd-arm64"
sudo codesign -f -o runtime -s "${APPSIGNINGIDENTITY}" "../BOINC_Installer/New_Release_$1_$2_$3/boinc_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd-x86_64"
sudo codesign -f -o runtime -s "${APPSIGNINGIDENTITY}" "../BOINC_Installer/New_Release_$1_$2_$3/boinc_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd-x86_64"
sudo codesign -f -o runtime -s "${APPSIGNINGIDENTITY}" "../BOINC_Installer/New_Release_$1_$2_$3/boinc_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd-arm64"
rm -f "../BOINC_Installer/New_Release_$1_$2_$3/boinc_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd"
lipo "../BOINC_Installer/New_Release_$1_$2_$3/boinc_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd-x86_64" "../BOINC_Installer/New_Release_$1_$2_$3/boinc_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd-arm64" -create -output "../BOINC_Installer/New_Release_$1_$2_$3/boinc_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd"
sudo codesign -f -o runtime -s "${APPSIGNINGIDENTITY}" "../BOINC_Installer/New_Release_$1_$2_$3/boinc_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd-arm64"
rm -f "../BOINC_Installer/New_Release_$1_$2_$3/boinc_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd-x86_64"
rm -f "../BOINC_Installer/New_Release_$1_$2_$3/boinc_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd"
rm -f "../BOINC_Installer/New_Release_$1_$2_$3/boinc_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd-arm64"
lipo "../BOINC_Installer/New_Release_$1_$2_$3/boinc_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd-x86_64" "../BOINC_Installer/New_Release_$1_$2_$3/boinc_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd-arm64" -create -output "../BOINC_Installer/New_Release_$1_$2_$3/boinc_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd"
rm -f "../BOINC_Installer/New_Release_$1_$2_$3/boinc_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd-x86_64"
rm -f "../BOINC_Installer/New_Release_$1_$2_$3/boinc_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd-arm64"
else
# Code Sign boinccmd for the stand-alone boinc client if we have a signing identity
sudo codesign -f -o runtime -s "${APPSIGNINGIDENTITY}" "../BOINC_Installer/New_Release_$1_$2_$3/boinc_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd"
# Code Sign boinccmd for the stand-alone boinc client if we have a signing identity
sudo codesign -f -o runtime -s "${APPSIGNINGIDENTITY}" "../BOINC_Installer/New_Release_$1_$2_$3/boinc_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd"
fi
fi

View File

@ -2,7 +2,7 @@
# This file is part of BOINC.
# http://boinc.berkeley.edu
# Copyright (C) 2019 University of California
# Copyright (C) 2021 University of California
#
# BOINC is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License
@ -157,11 +157,11 @@ lipo "BOINCManager.app/Contents/MacOS/BOINCManager" -verify_arch x86_64
if [ $? -eq 0 ]; then Products_Have_x86_64="yes"; fi
lipo "BOINCManager.app/Contents/MacOS/BOINCManager" -verify_arch arm64
if [ $? -eq 0 ]; then Products_Have_arm64="yes"; fi
if [ $Products_Have_x86_64 == "no" ] && [ $Products_Have_arm64 == "no" ]; then
if [ $Products_Have_x86_64 = "no" ] && [ $Products_Have_arm64 = "no" ]; then
echo "ERROR: could not determine architecture of BOINC Manager"
fi
if [ $Products_Have_arm64 == "yes" ]; then
if [ $Products_Have_x86_64 == "yes" ]; then
if [ $Products_Have_arm64 = "yes" ]; then
if [ $Products_Have_x86_64 = "yes" ]; then
arch="universal"
else
arch="arm64"
@ -254,6 +254,7 @@ cp -fp clientscr/res/boinc_logo_black.jpg ../BOINC_Installer/Pkg_Root/Library/Ap
cp -fp api/ttf/liberation-fonts-ttf-2.00.0/LiberationSans-Regular.ttf ../BOINC_Installer/Pkg_Root/Library/Application\ Support/BOINC\ Data/LiberationSans-Regular.ttf
cp -fp clientscr/ss_config.xml ../BOINC_Installer/Pkg_Root/Library/Application\ Support/BOINC\ Data/
cp -fpRL "${BUILDPATH}/boincscr" ../BOINC_Installer/Pkg_Root/Library/Application\ Support/BOINC\ Data/
cp -fpRL "${BUILDPATH}/detect_rosetta_cpu" ../BOINC_Installer/Pkg_Root/Library/Application\ Support/BOINC\ Data/
cp -fpRL "${BUILDPATH}/BOINCManager.app/." "../BOINC_Installer/Pkg_Root/Applications/${MANAGERAPPNAME}.app/"
sed -i "" s/BOINCManager/"${MANAGERAPPNAME}"/g "../BOINC_Installer/Pkg_Root/Applications/${MANAGERAPPNAME}.app/Contents/Info.plist"
@ -392,6 +393,9 @@ if [ -e "${HOME}/BOINCCodeSignIdentities.txt" ]; then
# Code Sign the boincscr graphics app if we have a signing identity
sudo codesign -f -o runtime -s "${APPSIGNINGIDENTITY}" "../BOINC_Installer/Pkg_Root/Library/Application Support/BOINC Data/boincscr"
# Code Sign the detect_rosetta_cpu helper app if we have a signing identity
sudo codesign -f -o runtime -s "${APPSIGNINGIDENTITY}" "../BOINC_Installer/Pkg_Root/Library/Application Support/BOINC Data/detect_rosetta_cpu"
# Code Sign the BOINC screensaver code for OS 10.6 and OS 10.7 if we have a signing identity
sudo codesign -f -o runtime -s "${APPSIGNINGIDENTITY}" "../BOINC_Installer/Pkg_Root/Library/Screen Savers/${SSAVERAPPNAME}.saver/Contents/MacOS/BOINCSaver_MacOS10_6_7"
@ -449,6 +453,7 @@ sudo chmod -R 644 ../BOINC_Installer/New_Release_${SHORTBRANDNAME}_$1_$2_$3/${SH
mkdir -p ../BOINC_Installer/New_Release_${SHORTBRANDNAME}_$1_$2_$3/${SHORTBRANDNAME}_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir
cp -fpRL "${BUILDPATH}/boinc" ../BOINC_Installer/New_Release_${SHORTBRANDNAME}_$1_$2_$3/${SHORTBRANDNAME}_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/
cp -fpRL "${BUILDPATH}/boinccmd" ../BOINC_Installer/New_Release_${SHORTBRANDNAME}_$1_$2_$3/${SHORTBRANDNAME}_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/
cp -fpRL "${BUILDPATH}/detect_rosetta_cpu" ../BOINC_Installer/New_Release_${SHORTBRANDNAME}_$1_$2_$3/${SHORTBRANDNAME}_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/
cp -fpRL curl/ca-bundle.crt ../BOINC_Installer/New_Release_${SHORTBRANDNAME}_$1_$2_$3/${SHORTBRANDNAME}_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/
mkdir -p ../BOINC_Installer/New_Release_${SHORTBRANDNAME}_$1_$2_$3/${SHORTBRANDNAME}_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/switcher
@ -470,6 +475,41 @@ if [ -n "${APPSIGNINGIDENTITY}" ]; then
# Code Sign the BOINC installer application if we have a signing identity
sudo codesign -f -o runtime -s "${APPSIGNINGIDENTITY}" "../BOINC_Installer/New_Release_${SHORTBRANDNAME}_$1_$2_$3/${SHORTBRANDNAME}_$1.$2.$3_macOSX_$arch/${INSTALLERAPPNAME}.app"
# Code Sign the stand-alone bare core boinc client if we have a signing identity
sudo codesign -f -o runtime -s "${APPSIGNINGIDENTITY}" "../BOINC_Installer/New_Release_${SHORTBRANDNAME}_$1_$2_$3/${SHORTBRANDNAME}_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinc"
# Code Sign detect_rosetta_cpu for the stand-alone boinc client if we have a signing identity
sudo codesign -f -o runtime -s "${APPSIGNINGIDENTITY}" "../BOINC_Installer/New_Release_${SHORTBRANDNAME}_$1_$2_$3/${SHORTBRANDNAME}_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/detect_rosetta_cpu"
# Code Sign setprojectgrp for the stand-alone boinc client if we have a signing identity
sudo codesign -f -o runtime -s "${APPSIGNINGIDENTITY}" "../BOINC_Installer/New_Release_${SHORTBRANDNAME}_$1_$2_$3/${SHORTBRANDNAME}_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/switcher/setprojectgrp"
# Code Sign switcher for the stand-alone boinc client if we have a signing identity
sudo codesign -f -o runtime -s "${APPSIGNINGIDENTITY}" "../BOINC_Installer/New_Release_${SHORTBRANDNAME}_$1_$2_$3/${SHORTBRANDNAME}_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/switcher/switcher"
if [ $arch = "universal" ]; then
# Workaround for code signing problem under Xcode 12.2:
# Code sign each architecture separately then combine into a uiversal binary
lipo "../BOINC_Installer/New_Release_${SHORTBRANDNAME}_$1_$2_$3/${SHORTBRANDNAME}_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd" -thin x86_64 -output "../BOINC_Installer/New_Release_${SHORTBRANDNAME}_$1_$2_$3/${SHORTBRANDNAME}_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd-x86_64"
lipo "../BOINC_Installer/New_Release_${SHORTBRANDNAME}_$1_$2_$3/${SHORTBRANDNAME}_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd" -thin arm64 -output "../BOINC_Installer/New_Release_${SHORTBRANDNAME}_$1_$2_$3/${SHORTBRANDNAME}_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd-arm64"
sudo codesign -f -o runtime -s "${APPSIGNINGIDENTITY}" "../BOINC_Installer/New_Release_${SHORTBRANDNAME}_$1_$2_$3/${SHORTBRANDNAME}_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd-x86_64"
sudo codesign -f -o runtime -s "${APPSIGNINGIDENTITY}" "../BOINC_Installer/New_Release_${SHORTBRANDNAME}_$1_$2_$3/${SHORTBRANDNAME}_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd-arm64"
rm -f "../BOINC_Installer/New_Release_${SHORTBRANDNAME}_$1_$2_$3/${SHORTBRANDNAME}_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd"
lipo "../BOINC_Installer/New_Release_${SHORTBRANDNAME}_$1_$2_$3/${SHORTBRANDNAME}_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd-x86_64" "../BOINC_Installer/New_Release_${SHORTBRANDNAME}_$1_$2_$3/${SHORTBRANDNAME}_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd-arm64" -create -output "../BOINC_Installer/New_Release_${SHORTBRANDNAME}_$1_$2_$3/${SHORTBRANDNAME}_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd"
rm -f "../BOINC_Installer/New_Release_${SHORTBRANDNAME}_$1_$2_$3/${SHORTBRANDNAME}_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd-x86_64"
rm -f "../BOINC_Installer/New_Release_${SHORTBRANDNAME}_$1_$2_$3/${SHORTBRANDNAME}_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd-arm64"
else
# Code Sign boinccmd for the stand-alone boinc client if we have a signing identity
sudo codesign -f -o runtime -s "${APPSIGNINGIDENTITY}" "../BOINC_Installer/New_Release_${SHORTBRANDNAME}_$1_$2_$3/${SHORTBRANDNAME}_$1.$2.$3_$arch-apple-darwin/move_to_boinc_dir/boinccmd"
fi
fi
cd ../BOINC_Installer/New_Release_${SHORTBRANDNAME}_$1_$2_$3
@ -483,6 +523,8 @@ ditto -ck --sequesterRsrc --keepParent ${SHORTBRANDNAME}_$1.$2.$3_macOSX_$arch $
ditto -ck --sequesterRsrc --keepParent ${SHORTBRANDNAME}_$1.$2.$3_$arch-apple-darwin ${SHORTBRANDNAME}_$1.$2.$3_$arch-apple-darwin.zip
ditto -ck --sequesterRsrc --keepParent ${SHORTBRANDNAME}_$1.$2.$3_macOSX_SymbolTables ${SHORTBRANDNAME}_$1.$2.$3_macOSX_SymbolTables.zip
hdiutil create -srcfolder ${SHORTBRANDNAME}_$1.$2.$3_$arch-apple-darwin -ov -format UDZO ${SHORTBRANDNAME}_$1.$2.$3_$arch-apple-darwin.dmg
#popd
cd "${BOINCPath}"