Для моего расширения Python у меня есть файлы C (из встроенной библиотеки) и C ++, и они скомпилированы и связаны друг с другом. Только часть C ++ взаимодействует с Python (через SWIG). Это работает как в Windows с VS2015 и GCC под Linux. Однако с gcc файлы C ++ нуждаются в другом наборе флагов компилятора (например, -std = c ++ 11, -Wno-reorder), чем файлы C, чтобы избежать предупреждений о неправильных флагах в C.
Есть ли способ в setuptools / distutils изменить флаги компилятора для каждого файла отдельно, например. на основании расширения файла?
Я использую уже пользовательский шаг сборки из https://stackoverflow.com/a/36293331/3032680.
Основная проблема в том, что distutils.ccompiler
не проверяет расширение файла для C или C ++ и выполняет все с $ CC. Даже определение CXXFLAGS не помогает. Я буду терпеть предупреждения, ни с export
ни определение с использованием os.eniviron
в файле setup.py.
В macOS с CLang 8.0.0 ситуация ухудшается: попытка скомпилировать файл .c с -std = c ++ 11 — не предупреждение, а ошибка.
Поскольку distutils имеет большое значение для обеспечения того, чтобы все файлы компилировались с одинаковыми флагами компилятора, независимо от их расширения .c или .cpp. Следовательно, даже использование CFLAGS и CXXFLAGS не учитывается, но gcc и CLang по-прежнему обрабатывают их по-разному. Visual Studio просто компилирует все как C ++.
Я решил свою проблему, приняв, что C в большинстве случаев все еще является подмножеством C ++, и переименовал файлы C-Source в .cpp, даже если файлы содержат C. Это уродливое решение, но я избавился от предупреждений в gcc и ошибки с CLang — тем более что это решение снова стирает языковой барьер между C и C ++.
Второе решение, которое я принял позже, — это создать статическую библиотеку из кода C вне distutlis и связать Расширение Python для этой статической библиотеки.
Других решений пока нет …