forked from bartvdbraak/blender
d2a822fe07
It is now updated against CUDA Toolkit 7.5. Currently should be no functional changes, just begin some ground work for the future.
126 lines
2.8 KiB
Python
126 lines
2.8 KiB
Python
extra_code = """
|
|
static void path_join(const char *path1,
|
|
const char *path2,
|
|
int maxlen,
|
|
char *result) {
|
|
#if defined(WIN32) || defined(_WIN32)
|
|
const char separator = '\\\\';
|
|
#else
|
|
const char separator = '/';
|
|
#endif
|
|
int n = snprintf(result, maxlen, "%s%c%s", path1, separator, path2);
|
|
if (n != -1 && n < maxlen) {
|
|
result[n] = '\\0';
|
|
}
|
|
else {
|
|
result[maxlen - 1] = '\\0';
|
|
}
|
|
}
|
|
|
|
static int path_exists(const char *path) {
|
|
struct stat st;
|
|
if (stat(path, &st)) {
|
|
return 0;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
const char *cuewCompilerPath(void) {
|
|
#ifdef _WIN32
|
|
const char *defaultpaths[] = {"C:/CUDA/bin", NULL};
|
|
const char *executable = "nvcc.exe";
|
|
#else
|
|
const char *defaultpaths[] = {
|
|
"/Developer/NVIDIA/CUDA-5.0/bin",
|
|
"/usr/local/cuda-5.0/bin",
|
|
"/usr/local/cuda/bin",
|
|
"/Developer/NVIDIA/CUDA-6.0/bin",
|
|
"/usr/local/cuda-6.0/bin",
|
|
"/Developer/NVIDIA/CUDA-5.5/bin",
|
|
"/usr/local/cuda-5.5/bin",
|
|
NULL};
|
|
const char *executable = "nvcc";
|
|
#endif
|
|
int i;
|
|
|
|
const char *binpath = getenv("CUDA_BIN_PATH");
|
|
|
|
static char nvcc[65536];
|
|
|
|
if (binpath) {
|
|
path_join(binpath, executable, sizeof(nvcc), nvcc);
|
|
if (path_exists(nvcc))
|
|
return nvcc;
|
|
}
|
|
|
|
for (i = 0; defaultpaths[i]; ++i) {
|
|
path_join(defaultpaths[i], executable, sizeof(nvcc), nvcc);
|
|
if (path_exists(nvcc))
|
|
return nvcc;
|
|
}
|
|
|
|
#ifndef _WIN32
|
|
{
|
|
FILE *handle = popen("which nvcc", "r");
|
|
if (handle) {
|
|
char buffer[4096] = {0};
|
|
int len = fread(buffer, 1, sizeof(buffer) - 1, handle);
|
|
buffer[len] = '\\0';
|
|
pclose(handle);
|
|
|
|
if (buffer[0])
|
|
return "nvcc";
|
|
}
|
|
}
|
|
#endif
|
|
|
|
return NULL;
|
|
}
|
|
|
|
int cuewCompilerVersion(void) {
|
|
const char *path = cuewCompilerPath();
|
|
const char *marker = "Cuda compilation tools, release ";
|
|
FILE *pipe;
|
|
int major, minor;
|
|
char *versionstr;
|
|
char buf[128];
|
|
char output[65536] = "\\0";
|
|
char command[65536] = "\\0";
|
|
|
|
if (path == NULL)
|
|
return 0;
|
|
|
|
/* get --version output */
|
|
strncpy(command, path, sizeof(command));
|
|
strncat(command, " --version", sizeof(command) - strlen(path));
|
|
pipe = popen(command, "r");
|
|
if (!pipe) {
|
|
fprintf(stderr, "CUDA: failed to run compiler to retrieve version");
|
|
return 0;
|
|
}
|
|
|
|
while (!feof(pipe)) {
|
|
if (fgets(buf, sizeof(buf), pipe) != NULL) {
|
|
strncat(output, buf, sizeof(output) - strlen(output) - 1);
|
|
}
|
|
}
|
|
|
|
pclose(pipe);
|
|
|
|
/* parse version number */
|
|
versionstr = strstr(output, marker);
|
|
if (versionstr == NULL) {
|
|
fprintf(stderr, "CUDA: failed to find version number in:\\n\\n%s\\n", output);
|
|
return 0;
|
|
}
|
|
versionstr += strlen(marker);
|
|
|
|
if (sscanf(versionstr, "%d.%d", &major, &minor) < 2) {
|
|
fprintf(stderr, "CUDA: failed to parse version number from:\\n\\n%s\\n", output);
|
|
return 0;
|
|
}
|
|
|
|
return 10 * major + minor;
|
|
}
|
|
"""
|