Mentions légales du service

Skip to content
Snippets Groups Projects
Commit c3b106db authored by hhakim's avatar hhakim
Browse files

Add pyfaust wrapper compilation support on Windows using MinGW.

Both py2.7 and py3 are supported.
parent 41631fd6
Branches
Tags
No related merge requests found
......@@ -48,13 +48,17 @@ message(STATUS "------------ Looking for Python PATH -----------")
message(STATUS "------------------------------------------------")
if(UNIX)
if(UNIX OR WIN32)
message(STATUS "INFO- If you want to choose an other version of Python,")
message(STATUS "INFO- please add an environment variable PYTHON_PATH. ")
message(STATUS "INFO- please add an environment variable PYTHON_PATH or PYTHON2_PATH and PYTHON3_PATH for using the both major versions. ")
message(STATUS "INFO- Example : PYTHON_PATH=/usr/bin/python")
if ($ENV{PYTHON_PATH}} MATCHES python)
if("$ENV{PYTHON2_PATH}" MATCHES python OR "$ENV{PYTHON3_PATH}" MATCHES python)
#message(STATUS $ENV{PYTHON2_PATH})
set(PYTHON_EXES $ENV{PYTHON2_PATH};$ENV{PYTHON3_PATH})
#message(STATUS "PYTHON_EXES=${PYTHON_EXES} set from environment.")
elseif ("$ENV{PYTHON_PATH}" MATCHES python)
set(PYTHON_EXE $ENV{PYTHON_PATH})
message(STATUS "PYTHON_EXE=$ENV{PYTHON_PATH} defined from environment variable")
set(PYTHON_EXES ${PYTHON_EXE})
......@@ -94,14 +98,14 @@ if(UNIX)
endif()
set(PYTHON_EXES ${PYTHON2_EXE};${PYTHON3_EXE})
endif()
else(UNIX)
message(FATAL_ERROR "Python wrapper Unsupported OS (only compatible with Unix System (Linux or Mac Os X)")
else()
message(FATAL_ERROR "Python wrapper Unsupported OS (only compatible with Unix System (Linux or Mac Os X) or Windows.")
endif()
message(STATUS PYTHON_EXES=${PYTHON_EXES})
#message(STATUS PYTHON_EXES=${PYTHON_EXES})
foreach(PYTHON_EXE IN LISTS PYTHON_EXES)
string(REGEX REPLACE "[a-zA-Z0-9_/:.]+/p(ython.?)" "c\\1" CYTHON_BIN_NAME "${PYTHON_EXE}")
string(REGEX REPLACE "(.*)/.*" "\\1" PYTHON_PARENT_PATH ${PYTHON_EXE})
string(REGEX REPLACE "(.*)(/|\\\\).*" "\\1" PYTHON_PARENT_PATH ${PYTHON_EXE}) # / separator for Unices, \ for Win
if(NOT EXISTS ${PYTHON_PARENT_PATH}/${CYTHON_BIN_NAME})
set(CYTHON_BIN_NAME cython)
endif()
......@@ -117,7 +121,7 @@ foreach(PYTHON_EXE IN LISTS PYTHON_EXES)
message(STATUS "--- Looking for Python module (cython,numpy,scipy) ---")
message(STATUS "------------------------------------------------------")
exec_program("${PYTHON_EXE} ${PROJECT_SOURCE_DIR}/CMake/check_python.py" OUTPUT_VARIABLE LIST_PYTHON_MODULE RETURN_VALUE PYTHON_MODULE_MISSING)
message("${LIST_PYTHON_MODULE}")
#message(STATUS "${LIST_PYTHON_MODULE}")
set(PYTHON_MODULE_SCIPY ON)
if(${PYTHON_MODULE_MISSING} EQUAL -1)
......@@ -137,30 +141,33 @@ foreach(PYTHON_EXE IN LISTS PYTHON_EXES)
message(STATUS "------------------------------------------------")
if(UNIX)
message(STATUS "INFO- If you want to choose an other version of Cython,")
message(STATUS "INFO- please add an environment variable CYTHON_PATH. ")
message(STATUS "INFO- Example : CYTHON_PATH=/usr/bin/cython")
if ($ENV{CYTHON_PATH}} MATCHES ${CYTHON_BIN_NAME})
set(CYTHON_TMP $ENV{CYTHON_PATH})
message(STATUS "CYTHON_PATH=$ENV{CYTHON_PATH} defined from environment variable")
elseif (${CYTHON_PATH} MATCHES ${CYTHON_BIN_NAME})
set(CYTHON_TMP ${CYTHON_PATH})
message(STATUS "CYTHON_PATH=${CYTHON_PATH} defined from local input variable")
else() # PYTHON_EXE_DIR
message(STATUS "INFO- If you want to choose an other version of Cython,")
message(STATUS "INFO- please add an environment variable CYTHON_PATH. ")
message(STATUS "INFO- Example : CYTHON_PATH=/usr/bin/cython")
if ($ENV{CYTHON_PATH}} MATCHES ${CYTHON_BIN_NAME})
set(CYTHON_TMP $ENV{CYTHON_PATH})
message(STATUS "CYTHON_PATH=$ENV{CYTHON_PATH} defined from environment variable")
elseif (${CYTHON_PATH} MATCHES ${CYTHON_BIN_NAME})
set(CYTHON_TMP ${CYTHON_PATH})
message(STATUS "CYTHON_PATH=${CYTHON_PATH} defined from local input variable")
else() # PYTHON_EXE_DIR
set(CYTHON_TMP CYTHON_TMP-NOTFOUND) # forcing find_program to search again (don't rely on older value)
if(UNIX)
find_program(CYTHON_TMP ${CYTHON_BIN_NAME})
if(${CYTHON_TMP} MATCHES ".*-NOTFOUND")
message(FATAL_ERROR "Cython is not present in your PATH ; Please insert in the PATH environment.")
else()
message(STATUS "Cython path: ${CYTHON_TMP}")
endif()
elseif(WIN32)
#message(STATUS "Python parent path ${PYTHON_PARENT_PATH}")
find_program(CYTHON_TMP ${CYTHON_BIN_NAME} PATHS ${PYTHON_PARENT_PATH} PATH_SUFFIXES Scripts NO_DEFAULT_PATH)
#message(STATUS "CYTHON_TMP=${CYTHON_TMP}")
endif()
if(${CYTHON_TMP} MATCHES ".*-NOTFOUND")
message(FATAL_ERROR "Cython is not present in your PATH ; Please insert in the PATH environment.")
else()
message(STATUS "Cython path: ${CYTHON_TMP}")
endif()
string(REGEX REPLACE "([a-zA-Z0-9_/:.]+)/${CYTHON_BIN_NAME}.?" "\\1" CYTHON_BIN_DIR "${CYTHON_TMP}")
else(UNIX)
message(FATAL_ERROR "Cython wrapper Unsupported OS (only compatible with Unix System (Linux or Mac Os X)")
endif()
string(REGEX REPLACE "([a-zA-Z0-9_/:.]+)(\\|/)${CYTHON_BIN_NAME}.?" "\\1" CYTHON_BIN_DIR "${CYTHON_TMP}")
message(STATUS "CYTHON_BIN_DIR has been found : ${CYTHON_BIN_DIR}")
message(STATUS "------------------------------------------------")
list(APPEND CYTHON_EXES ${CYTHON_BIN_DIR})
endforeach()
......@@ -125,6 +125,7 @@ message (STATUS "CMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}")
#set(FAUST_INSTALL_TESTING_DATA "${PROJECT_BINARY_DIR}/output/testing/data" CACHE STRING "default install path for the test faust" FORCE )
# default location of install dir for matlab component
SET(CMAKE_INSTALL_MATLAB_PREFIX "C:/Users/$ENV{USERNAME}/Documents/MATLAB/faust" CACHE STRING "default install path for the matlab wrapper" FORCE )
SET(CMAKE_INSTALL_MATLAB_PREFIX "C:/Users/$ENV{USERNAME}/Documents/PYTHON/faust" CACHE STRING "default install path for the matlab wrapper" FORCE )
# CMAKE_INSTALL_PREFIX path is deleted for next cmake .. configure
SET(CMAKE_INSTALL_PREFIX "" CACHE STRING "default install path" FORCE )
#message (STATUS "default install")
......@@ -141,6 +142,7 @@ message (STATUS "CMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}")
#set(FAUST_INSTALL_TESTING_DATA "${CMAKE_INSTALL_PREFIX}/testing/data")
# default location of install dir for matlab component
SET(CMAKE_INSTALL_MATLAB_PREFIX "${CMAKE_INSTALL_PREFIX}/matlab")
SET(CMAKE_INSTALL_PYTHON_PREFIX "${CMAKE_INSTALL_PREFIX}/python")
else()
message(STATUS "Install FAuST path already defined to : ${CMAKE_INSTALL_MATLAB_PREFIX}")
......@@ -967,4 +969,3 @@ INCLUDE(CPack)
##################################################################
......@@ -51,12 +51,87 @@ configure_file(${FAUST_PYTHON_SRC_DIR}/pyfaust.py ${FAUST_PYTHON_BIN_DIR}/pyfaus
add_custom_target(${FAUST_PYTHON_TARGET} ALL DEPENDS ${FAUST_TARGET})
foreach(PYTHON_EXE IN LISTS PYTHON_EXES)
add_custom_command(TARGET ${FAUST_PYTHON_TARGET}
COMMAND ${PYTHON_EXE}
ARGS "${FAUST_PYTHON_BIN_DIR}/setup.py" "build_ext" "--inplace"
COMMENT "Creating PyFaust")
endforeach()
list(LENGTH PYTHON_EXES PYTHON_EXES_LEN)
list(LENGTH CYTHON_EXES CYTHON_EXES_LEN)
#TODO: check that the two LEN are equal
#message(STATUS "PYTHON_EXES_LEN=${PYTHON_EXES_LEN}, PYTHON_EXES=${PYTHON_EXES}")
#message(STATUS "CYTHON_EXES_LEN=${CYTHON_EXES_LEN}, CYTHON_EXES=${CYTHON_EXES}")
if(UNIX)
foreach(PYTHON_EXE IN LISTS PYTHON_EXES)
exec_program("${PYTHON_EXE}" ARGS "--version" OUTPUT_VARIABLE PY_VER RETURN_VALUE PY_RES)
#message(STATUS "PY_VER=${PY_VER}")
string(REGEX REPLACE "Python ([0-9])\\.([0-9]).*$" "\\1\\2" PY_VER ${PY_VER})
add_custom_command(TARGET ${FAUST_PYTHON_TARGET}
COMMAND ${PYTHON_EXE}
ARGS "${FAUST_PYTHON_BIN_DIR}/setup.py" "build_ext" "--inplace"
COMMENT "Creating pyfaust${PY_VER}")
endforeach()
elseif(WIN32 AND ${CMAKE_GENERATOR} MATCHES "MinGW Makefiles")
# manually compiling cython extension instead of using setup.py in order to avoid visual studio to melt into the compilation (we use mingw gcc here)
if(CYTHON_EXES_LEN)
foreach(INDEX RANGE 0 ${CYTHON_EXES_LEN} 1)
#message(STATUS "INDEX=${INDEX}")
if(${INDEX} LESS ${CYTHON_EXES_LEN})
list(GET CYTHON_EXES ${INDEX} CYTHON_EXE)
#list(GET PYTH0N_EXES ${INDEX} PYTHON_EXE)
# workaround to the previous command which fails to retrieve PYTHON_EXES item
if(${INDEX} EQUAL 0)
string(REGEX REPLACE "(.*);.*$" "\\1" PYTHON_EXE "${PYTHON_EXES}")
else()
string(REGEX REPLACE ".*;(.*)$" "\\1" PYTHON_EXE "${PYTHON_EXES}")
endif()
string(REGEX REPLACE "(.*)(/|\\\\).*" "\\1" PYTHON_PARENT_PATH ${PYTHON_EXE})
#message(STATUS "PYTHON_PARENT_PATH=${PYTHON_PARENT_PATH}")
#message(STATUS "PYTHON_EXE=${PYTHON_EXE}, PYTHON_EXES=${PYTHON_EXES}, INDEX=${INDEX}")
# get abbreviated python version
exec_program("${PYTHON_EXE}" ARGS "--version" OUTPUT_VARIABLE PY_VER RETURN_VALUE PY_RES)
#message(STATUS "PY_VER=${PY_VER}")
string(REGEX REPLACE "Python ([0-9])\\.([0-9]).*$" "\\1\\2" PY_VER ${PY_VER})
#message(STATUS "PY_VER=${PY_VER}")
# set header inclusion flags
string(REGEX REPLACE "," ";-I" FAUST_PY_CFLAGS ${FAUST_PYTHON_INCLUDE_DIR})
string(REGEX REPLACE "'" "" FAUST_PY_CFLAGS ${FAUST_PY_CFLAGS})
set(FAUST_PY_CFLAGS "${FAUST_PY_CFLAGS};-I${PYTHON_PARENT_PATH}\\include")
# get numpy header dir
execute_process(COMMAND "${PYTHON_EXE}" "-c" "import numpy;print(numpy.get_include())" OUTPUT_VARIABLE NUMPY_INCLUDE ERROR_VARIABLE PY_ERR RESULT_VARIABLE PY_RES)
#message(STATUS "NUMPY_INCLUDE=${NUMPY_INCLUDE}")
set(FAUST_PY_CFLAGS "-I${FAUST_PY_CFLAGS};-I${NUMPY_INCLUDE}")
string(REGEX REPLACE "\n" "" FAUST_PY_CFLAGS ${FAUST_PY_CFLAGS})
string(REGEX REPLACE ";?-I" ";-I" FAUST_PY_CFLAGS ${FAUST_PY_CFLAGS})
# find libfaust.a to statically link it into the python wrapper lib
#find_library(FAUST_LIB_PATH libfaust.a PATHS ${PROJECT_BINARY_DIR}/lib PATH_SUFFIXES release debug NO_DEFAULT_PATH)
# use rather generated expression to point to faust target file below ("$<TARGET_FILE:${FAUST_TARGET}>")
#message(STATUS "FAUST_LIB_PATH=${FAUST_LIB_PATH}")
find_library(MATIO_STATIC_LIB_PATH libmatio.a PATHS ${MATIO_LIB_DIR} NO_DEFAULT_PATH)
set(PYTHON_STATIC_LIB_PATH PYTHON_STATIC_LIB_PATH-NOTFOUND) # forcing search of lib (otherwise could be stuck to the previous iteration python)
find_library(PYTHON_STATIC_LIB_PATH libpython${PY_VER}.a PATHS ${PYTHON_PARENT_PATH} PATH_SUFFIXES libs NO_DEFAULT_PATH)
#message(STATUS "PYTHON_STATIC_LIB_PATH=${PYTHON_STATIC_LIB_PATH}")
if(PY_VER MATCHES 3)
set(PY_DYNLIB "FaustCorePy.cp${PY_VER}-win_amd64.pyd")
else() #py 2.7.x
set(PY_DYNLIB "FaustCorePy.pyd")
endif()
set(PY_STATIC_LIBS "$<TARGET_FILE:${FAUST_TARGET}>;${MATIO_STATIC_LIB_PATH};${PYTHON_STATIC_LIB_PATH}")
string(REGEX REPLACE "\n" ";" PY_STATIC_LIBS "${PY_STATIC_LIBS}")
add_custom_command(TARGET ${FAUST_PYTHON_TARGET}
COMMAND ${CYTHON_EXE}
ARGS "--cplus" "-o" "${FAUST_PYTHON_BIN_DIR}/FaustCorePy.cpp" "${FAUST_PYTHON_BIN_DIR}/FaustCorePy.pyx"
# patch the weird bug: missing cmath include in cython generated cpp code
COMMAND echo \#include ^<cmath^> ">" "FAUST_CORE_TMP_FILE"
COMMAND type
ARGS "FAUST_CORE_TMP_FILE" "FaustCorePy.cpp" ">" "FaustCorePy.cpp2" 2>NUL
COMMAND type
ARGS "FaustCorePy.cpp2" ">" "FaustCorePy.cpp" 2>NUL
COMMAND ${CMAKE_CXX_COMPILER}
ARGS "-std=c++11" "-shared" "-DMS_WIN64" "-o" "${PY_DYNLIB}" "${FAUST_PYTHON_BIN_DIR}/FaustCorePy.cpp" ${FAUST_PY_CFLAGS} ${PY_STATIC_LIBS}
COMMENT "Creating pyfaust${PY_VER}")
endif()
endforeach()
endif()
else()
message(FATAL_ERROR "Win32 python Faust version is supported only when compiling with MinGW")
endif()
#install the python wrapper
install(DIRECTORY ${FAUST_PYTHON_BIN_DIR}/ DESTINATION ${CMAKE_INSTALL_PYTHON_PREFIX} FILE_PERMISSIONS ${INSTALL_FILE_PERMISSION} DIRECTORY_PERMISSIONS ${INSTALL_DIR_PERMISSION} FILES_MATCHING PATTERN "*.${MEX_EXT}" PATTERN "*.py" PATTERN "*.so" PATTERN "build" EXCLUDE PATTERN "setup*" EXCLUDE PATTERN "CMakeFiles*" EXCLUDE)
install(DIRECTORY ${FAUST_PYTHON_BIN_DIR}/ DESTINATION ${CMAKE_INSTALL_PYTHON_PREFIX} FILE_PERMISSIONS ${INSTALL_FILE_PERMISSION} DIRECTORY_PERMISSIONS ${INSTALL_DIR_PERMISSION} FILES_MATCHING PATTERN "*.${MEX_EXT}" PATTERN "*.py" PATTERN "*.so" PATTERN "*.pyd" PATTERN "build" EXCLUDE PATTERN "setup*" EXCLUDE PATTERN "CMakeFiles*" EXCLUDE)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment