Установите CUDA для Haskell с помощью Autoconf на Win7 - PullRequest
0 голосов
/ 17 января 2012

Я пытаюсь установить следующий пакет Haskell в Windows с помощью Cygwin: HaskellCuda

Вы можете установить пакет, используя "cabal install cuda".

Вот вывод, который я получаю (сначала вам может понадобиться "cuda install c2hs"):

$ cabal install
Configuring cuda-0.4.0.2...
checking for gcc... C:\Haskell\2011.4.0.0\mingw\bin\gcc.exe
checking for C compiler default output file name...
configure: error: C compiler cannot create executables
See `config.log' for more details.
Resolving dependencies...
cabal.exe: Error: some packages failed to install:
cuda-0.4.0.2 failed during the configure step. The exception was:
ExitFailure 77

Соответствующая часть из файла журнала:

configure:1758: checking for gcc
configure:1785: result: C:\Haskell\2011.4.0.0\mingw\bin\gcc.exe
configure:2022: checking for C compiler version
configure:2029: C:\Haskell\2011.4.0.0\mingw\bin\gcc.exe --version >&5
configure: line 2030: C:\Haskell\2011.4.0.0\mingw\bin\gcc.exe: command not found
configure:2035: $? = 127
configure:2042: C:\Haskell\2011.4.0.0\mingw\bin\gcc.exe -v >&5
configure: line 2043: C:\Haskell\2011.4.0.0\mingw\bin\gcc.exe: command not found
configure:2045: $? = 127
configure:2052: C:\Haskell\2011.4.0.0\mingw\bin\gcc.exe -V >&5
configure: line 2053: C:\Haskell\2011.4.0.0\mingw\bin\gcc.exe: command not found
configure:2055: $? = 127
configure:2078: checking for C compiler default output file name
configure:2105: C:\Haskell\2011.4.0.0\mingw\bin\gcc.exe -fno-stack-protector   conftest.c  >&5
configure: line 2106: C:\Haskell\2011.4.0.0\mingw\bin\gcc.exe: command not found
configure:2108: $? = 127
configure:2146: result: 
configure: failed program was: [source elided]

Если я пойду в Cygwin и наберу

gcc --version

Я понял что-то разумное. Кажется, проблема скорее в пути, но я не уверен, что / как это исправить. Я также должен отметить, что, используя «cabal install cuda-0.2.2», более старую версию этого пакета, я прошёл этот шаг (но позже получу другую ошибку).

Для репликации убедитесь, что вы установили платформу Haskell в путь без пробелов, иначе вы, вероятно, получите другую ошибку. Это единственное, что я понял до сих пор.

Буду признателен за любую помощь в этом, я провел около недели и нигде не получил.

EDIT:

$PATH = C:\Haskell\2011.4.0.0\mingw\bin;
C:\Haskell\2011.4.0.0\lib\extralibs\bin;
C:\Haskell\2011.4.0.0\bin;
C:\CUDA\v4.0\bin\;
C:\cygwin\bin\;
...

1 Ответ

0 голосов
/ 25 января 2012

Мне удалось заставить его установить, но это не красиво, и я не совсем понимаю, почему это не сработает из коробки "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-файлы, которые собирался скомпилировать файл конфигурации (достаточно легко найти их исходный код в файле конфигурации на основе номеров строк из файла журнала). Я не знаю последствий изменения файла конфигурации таким образом.

Это позволило мне пройти этап «сборки». Больше комментариев, если я столкнусь с любыми другими проблемами.

...