@@ -3,6 +3,11 @@ set(SETUP_PY "${CMAKE_CURRENT_BINARY_DIR}/setup.py")
3
3
get_property (CDEFS DIRECTORY PROPERTY COMPILE_DEFINITIONS )
4
4
get_property (IDIRS DIRECTORY PROPERTY INCLUDE_DIRECTORIES )
5
5
6
+ # On windows setup.py for some reason is unable to work with
7
+ # cmake-style path with forward slashes. It requires native path
8
+ # with back slashes in definition of package_dir variable.
9
+ file (TO_NATIVE_PATH "${CMAKE_CURRENT_SOURCE_DIR} " NATIVE_CMAKE_CURRENT_SOURCE_DIR)
10
+ string (REPLACE "\\ " "\\\\ " NATIVE_CMAKE_CURRENT_SOURCE_DIR ${NATIVE_CMAKE_CURRENT_SOURCE_DIR} )
6
11
configure_file ("${CMAKE_CURRENT_SOURCE_DIR} /setup.py.in" "${SETUP_PY} " )
7
12
configure_file ("${CMAKE_CURRENT_SOURCE_DIR} /pyhdk/version.py.in" "${CMAKE_CURRENT_SOURCE_DIR} /pyhdk/version.py" )
8
13
@@ -22,9 +27,20 @@ set(pydeps
22
27
23
28
# $<SEMICOLON> is used here as a list separator and it is converted to colon ":" on Linux in $<SHELL_PATH>
24
29
# expression.
25
- set (SETUP_LDFLAGS $<TARGET_FILE_DIR:Calcite>$<SEMICOLON>$<TARGET_FILE_DIR:IR>$<SEMICOLON>$<TARGET_FILE_DIR:ArrowStorage>$<SEMICOLON>$<TARGET_FILE_DIR:QueryBuilder>$<SEMICOLON>$<TARGET_FILE_DIR:QueryEngine>$<SEMICOLON>$<TARGET_FILE_DIR:SchemaMgr>$<SEMICOLON>$<TARGET_FILE_DIR:ConfigBuilder>$<SEMICOLON>$<TARGET_FILE_DIR:Logger>$<SEMICOLON>$<TARGET_FILE_DIR:Shared>$<SEMICOLON>$<TARGET_FILE_DIR:DataMgr>$<SEMICOLON>$<TARGET_FILE_DIR:ResultSet>$<SEMICOLON>$<TARGET_FILE_DIR:ResultSetRegistry>$<SEMICOLON>$<TARGET_FILE_DIR:${Boost_LOG_LIBRARY} >)
30
+ set (SETUP_LD_PATH_LIST $<TARGET_FILE_DIR:Calcite>$<SEMICOLON>$<TARGET_FILE_DIR:IR>$<SEMICOLON>$<TARGET_FILE_DIR:ArrowStorage>$<SEMICOLON>$<TARGET_FILE_DIR:QueryBuilder>$<SEMICOLON>$<TARGET_FILE_DIR:QueryEngine>$<SEMICOLON>$<TARGET_FILE_DIR:SchemaMgr>$<SEMICOLON>$<TARGET_FILE_DIR:ConfigBuilder>$<SEMICOLON>$<TARGET_FILE_DIR:Logger>$<SEMICOLON>$<TARGET_FILE_DIR:Shared>$<SEMICOLON>$<TARGET_FILE_DIR:DataMgr>$<SEMICOLON>$<TARGET_FILE_DIR:ResultSet>$<SEMICOLON>$<TARGET_FILE_DIR:ResultSetRegistry>$<SEMICOLON>$<TARGET_FILE_DIR:${Boost_LOG_LIBRARY} >)
26
31
27
- set (SETUP_FLAGS -f -I ${CMAKE_CURRENT_SOURCE_DIR} -L "$<SHELL_PATH:${SETUP_LDFLAGS} >" )
32
+ if (WIN32 )
33
+ # Convert all paths from library list to paths with forward
34
+ # slashes. This is required because on windows paths with back slashes
35
+ # work incorrectly in cmake_install.cmake since cmake thinks that
36
+ # those are quoted characters.
37
+ cmake_path(CONVERT ${SETUP_LD_PATH_LIST} TO_CMAKE_PATH_LIST SETUP_LDFLAGS)
38
+ else ()
39
+ # Convert semicolons from the list above into colons path separator
40
+ # on Linux.
41
+ set (SETUP_LDFLAGS "$<SHELL_PATH:${SETUP_LD_PATH_LIST} >" )
42
+ endif ()
43
+ set (SETUP_FLAGS -f -I ${CMAKE_CURRENT_SOURCE_DIR} -L ${SETUP_LDFLAGS} )
28
44
29
45
if (NOT WIN32 AND (CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo" ))
30
46
# On windows enabling debug in python requires python debug library which is absent in conda
@@ -45,4 +61,11 @@ add_custom_target(pyhdk-install
45
61
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
46
62
)
47
63
48
- install (CODE "execute_process(WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${Python3_EXECUTABLE} ${SETUP_PY} build_ext ${SETUP_FLAGS} install)" )
64
+ # On windows we cannot use variable ${SETUP_FLAGS} in the line below
65
+ # because it has all delimiting spaces converted to semicolons while
66
+ # we need spaces between arguments and semicolons in library
67
+ # list. Therefore repeat all arguments from ${SETUP_FLAGS} here. Also
68
+ # quotes are required around ${SETUP_LDFLAGS} because otherwise cmake
69
+ # converts semicolons to spaces when executing
70
+ # cmake_install.cmake. This stuff is very fragile, touch with care!
71
+ install (CODE "execute_process(WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${Python3_EXECUTABLE} ${SETUP_PY} build_ext -f -I ${CMAKE_CURRENT_SOURCE_DIR} -L \" ${SETUP_LDFLAGS} \" install)" )
0 commit comments