Элегантная компиляция кроссплатформенного модуля Cython - PullRequest
0 голосов
/ 25 октября 2018

Я пишу библиотеку, которая имеет несколько модулей, написанных на Cython, и интенсивно использует параллелизм с использованием модуля openmp.Библиотеку можно использовать на любой платформе - Unix / Mac / Windows.

Из-за этого мне нужно добавить флаги компилятора в определение модуля, чтобы она компилировалась с openmp.Только для Linux и Mac, я сделал что-то вроде этого:

Extension('my.module', ['my/module.c'],
          extra_compile_args=['-fopenmp', '-O3'],
          extra_link_args=['-fopenmp', '-O3'],
          ),

Однако это не работает в Windows, так как msvcc имеет другой формат для директив, то есть -fopenmp заменяется на /openmpи -O3 заменяется на /O3.Мое текущее решение заключается в следующем:

IS_WINDOWS = 'win' in sys.platform
openmp_opt = '/openmp' if IS_WINDOWS else '-fopenmp'
optim_opt = '/O3' if IS_WINDOWS else '-O3'

Extension('my.module', ['my/module.c'],
          extra_compile_args=[openmp_opt, optim_opt],
          extra_link_args=[openmp_opt, optim_opt],
          ),

Это работает, насколько я могу проверить.У него есть одна проблема: msvcc не требует extra_link_args, но gcc делает.Поэтому при компиляции в Windows я получаю предупреждения компоновщика о том, что /O3 и /openmp распознаются.

Мой вопрос такой: есть ли лучший способ сделать это, встроенный в Cython, которого я не нашела также, есть ли случай, который я пропустил, т.е. есть ли другие компиляторы, о которых мне нужно беспокоиться, или проверка Windows достаточно хороша?

...