Мне удалось заставить его установить, но это не красиво, и я не совсем понимаю, почему это не сработает из коробки "autoconf".
Для начала, вместо установки с помощью «установки cabal» (с использованием локальной копии), я использовал последовательность
>runhaskell Setup.hs configure
>runhaskell Setup.hs build
>runhaskell Setup.hs install
Основная причина этого заключается в том, что просто изменить переменную $ CC в скрипте конфигурации, используя аргумент в файле Setup.hs. Я подозревал, что переменная $ CC была причиной проблемы. Я изменил:
[("CC", ccProg)
до
[("CC", "/cygdrive/c/cygwin/bin/gcc.exe")
в Setup.hs, который является gcc, который поставляется с Cygwin. Моим первоначальным подозрением было то, что autoconf не понравился путь к gcc в стиле Windows, который он использовал на основании приведенного выше файла журнала. Я также обнаружил, что из нескольких копий gcc на моем компьютере (одна в Haskell / mingw, другая в отдельной установке mingw и на какую версию $ PATH указывал) ТОЛЬКО cygwin gcc смогла успешно скомпилировать тестовый файл что проверено на. Используя Cygwin GCC, я мог бы запустить
gcc hello.c
для любого включаемого файла (БЕЗ внешней директивы include), тогда как для любой другой копии gcc, даже что-то вроде
gcc -I/cygdrive/c/..../include hello.c
не удалось найти. Понятия не имею, почему.
Простое изменение $ CC на Cygwin gcc исправило почти все ошибки. Следующие ошибки произошли при «проверке библиотеки, содержащей cudaRuntimeGetVersion / cuGetDriverVersion».
Файл конфигурации, который пытался скомпилировать, был
#define PACKAGE_NAME "Haskell CUDA bindings"
#define PACKAGE_TARNAME "cuda"
#define PACKAGE_VERSION "0.4.0.0"
#define PACKAGE_STRING "Haskell CUDA bindings 0.4.0.0"
#define PACKAGE_BUGREPORT "tmcdonell@cse.unsw.edu.au"
#define STDC_HEADERS 1
#define HAVE_SYS_TYPES_H 1
#define HAVE_SYS_STAT_H 1
#define HAVE_STDLIB_H 1
#define HAVE_STRING_H 1
#define HAVE_MEMORY_H 1
#define HAVE_STRINGS_H 1
#define HAVE_INTTYPES_H 1
#define HAVE_STDINT_H 1
#define HAVE_UNISTD_H 1
#define HAVE_CUDA_H 1
#define HAVE_CUDA_RUNTIME_API_H 1
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char cudaRuntimeGetVersion ();
int main ()
{
return cudaRuntimeGetVersion ();
;
return 0;
}
с помощью команды:
/cygdrive/c/cygwin/bin/gcc.exe -o conftest.exe -fno-stack-protector
-I/cygdrive/c/CUDA/v4.0/include -L/cygdrive/c/CUDA/v4.0/lib conftest.c -lcudart
Ошибка (из файла журнала):
/cygdrive/c/Users/crockeea/AppData/Local/Temp/ccKMQJiq.o:conftest.c:(.text+0xc):
undefined reference to `_cudaRuntimeGetVersion'
Я немного заржавел на своем C, но похоже, что они не включают соответствующий заголовочный файл здесь. Это, вероятно, неправильно, потому что тот же файл работает на Unix-системах при запуске configure, но это мое лучшее предположение Кроме того, редактирование configure для включения в этот файл cuda.h приводит к другой ошибке в нескольких определениях cudaRuntimeGetVersion. Так что мой хак был закомментировать строки в файле конфигурации со ссылками на cudaRuntimeGetVersion / cuGetDriverVersion. Я поместил C-комментарии в C-файлы, которые собирался скомпилировать файл конфигурации (достаточно легко найти их исходный код в файле конфигурации на основе номеров строк из файла журнала). Я не знаю последствий изменения файла конфигурации таким образом.
Это позволило мне пройти этап «сборки». Больше комментариев, если я столкнусь с любыми другими проблемами.