mirror of
https://github.com/ceph/ceph
synced 2024-12-25 21:03:31 +00:00
38e7686a37
in python's distutils.ccompiler, linker_exe is composed using CC instead of LDFLAGS. the latter only effects how it builds (shared) library. and put CMAKE_C_FLAGS into the cflags for the compiler for building python C extensions, it's more consistent this way. more importantly, if we build with ASan enabled, the canary program, a.k.a. rados_dummy.c, won't link without proper CFLAGS. without this change, rados.so fails to build with errors like: /usr/bin/ld: /var/ssd/ceph/build/lib/librados.so: undefined reference to `__asan_stack_free_10' /usr/bin/ld: /var/ssd/ceph/build/lib/librados.so: undefined reference to `__asan_report_exp_store8' ... ... clang: error: linker command failed with exit code 1 (use -v to see invocation) Link Error: RADOS library not found make[3]: *** [src/pybind/rados/CMakeFiles/cython_rados.dir/build.make:57: src/pybind/rados/CMakeFiles/cython_rados] Error 1 Signed-off-by: Kefu Chai <kchai@redhat.com>
108 lines
4.8 KiB
CMake
108 lines
4.8 KiB
CMake
include(CMakeParseArguments)
|
|
|
|
function(distutils_install_module name)
|
|
set(py_srcs setup.py README.rst requirements.txt test-requirements.txt bin ${name})
|
|
foreach(src ${py_srcs})
|
|
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${src})
|
|
list(APPEND py_clone ${CMAKE_CURRENT_BINARY_DIR}/${src})
|
|
add_custom_command(
|
|
OUTPUT ${src}
|
|
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${src}
|
|
COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_CURRENT_SOURCE_DIR}/${src} ${src})
|
|
endif()
|
|
endforeach()
|
|
add_custom_target(${name}-clone ALL
|
|
DEPENDS ${py_clone})
|
|
cmake_parse_arguments(DU "" INSTALL_SCRIPT "" ${ARGN})
|
|
install(CODE "
|
|
set(options --prefix=${CMAKE_INSTALL_PREFIX})
|
|
if(DEFINED ENV{DESTDIR})
|
|
if(EXISTS /etc/debian_version)
|
|
list(APPEND options --install-layout=deb)
|
|
endif()
|
|
list(APPEND options --root=\$ENV{DESTDIR})
|
|
if(NOT \"${DU_INSTALL_SCRIPT}\" STREQUAL \"\")
|
|
list(APPEND options --install-script=${DU_INSTALL_SCRIPT})
|
|
endif()
|
|
endif()
|
|
execute_process(
|
|
COMMAND ${PYTHON${PYTHON_VERSION}_EXECUTABLE}
|
|
setup.py install \${options} --single-version-externally-managed
|
|
WORKING_DIRECTORY \"${CMAKE_CURRENT_BINARY_DIR}\")")
|
|
endfunction(distutils_install_module)
|
|
|
|
function(distutils_add_cython_module name src)
|
|
get_property(compiler_launcher GLOBAL PROPERTY RULE_LAUNCH_COMPILE)
|
|
get_property(link_launcher GLOBAL PROPERTY RULE_LAUNCH_LINK)
|
|
# When using ccache, CMAKE_C_COMPILER is ccache executable absolute path
|
|
# and the actual C compiler is CMAKE_C_COMPILER_ARG1.
|
|
# However with a naive
|
|
# set(PY_CC ${compiler_launcher} ${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1})
|
|
# distutils tries to execve something like "/usr/bin/cmake gcc" and fails.
|
|
# Removing the leading whitespace from CMAKE_C_COMPILER_ARG1 helps to avoid
|
|
# the failure.
|
|
string(STRIP "${CMAKE_C_COMPILER_ARG1}" c_compiler_arg1)
|
|
string(STRIP "${CMAKE_CXX_COMPILER_ARG1}" cxx_compiler_arg1)
|
|
# Note: no quotes, otherwise distutils will execute "/usr/bin/ccache gcc"
|
|
# CMake's implicit conversion between strings and lists is wonderful, isn't it?
|
|
string(REPLACE " " ";" cflags ${CMAKE_C_FLAGS})
|
|
list(APPEND cflags -iquote${CMAKE_SOURCE_DIR}/src/include -w)
|
|
set(PY_CC ${compiler_launcher} ${CMAKE_C_COMPILER} ${c_compiler_arg1} ${cflags})
|
|
set(PY_CXX ${compiler_launcher} ${CMAKE_CXX_COMPILER} ${cxx_compiler_arg1})
|
|
set(PY_LDSHARED ${link_launcher} ${CMAKE_C_COMPILER} ${c_compiler_arg1} "-shared")
|
|
add_custom_target(${name} ALL
|
|
COMMAND
|
|
env
|
|
CC="${PY_CC}"
|
|
CXX="${PY_CXX}"
|
|
LDSHARED="${PY_LDSHARED}"
|
|
OPT=\"-DNDEBUG -g -fwrapv -O2 -w\"
|
|
LDFLAGS=-L${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
|
|
CYTHON_BUILD_DIR=${CMAKE_CURRENT_BINARY_DIR}
|
|
CEPH_LIBDIR=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
|
|
${PYTHON${PYTHON_VERSION}_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/setup.py
|
|
build --verbose --build-base ${CYTHON_MODULE_DIR}
|
|
--build-platlib ${CYTHON_MODULE_DIR}/lib.${PYTHON${PYTHON_VERSION}_VERSION_MAJOR}
|
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
|
DEPENDS ${src})
|
|
endfunction(distutils_add_cython_module)
|
|
|
|
function(distutils_install_cython_module name)
|
|
get_property(compiler_launcher GLOBAL PROPERTY RULE_LAUNCH_COMPILE)
|
|
get_property(link_launcher GLOBAL PROPERTY RULE_LAUNCH_LINK)
|
|
set(PY_CC "${compiler_launcher} ${CMAKE_C_COMPILER}")
|
|
set(PY_LDSHARED "${link_launcher} ${CMAKE_C_COMPILER} -shared")
|
|
install(CODE "
|
|
set(ENV{CC} \"${PY_CC}\")
|
|
set(ENV{LDSHARED} \"${PY_LDSHARED}\")
|
|
set(ENV{CPPFLAGS} \"-iquote${CMAKE_SOURCE_DIR}/src/include\")
|
|
set(ENV{LDFLAGS} \"-L${CMAKE_LIBRARY_OUTPUT_DIRECTORY}\")
|
|
set(ENV{CYTHON_BUILD_DIR} \"${CMAKE_CURRENT_BINARY_DIR}\")
|
|
set(ENV{CEPH_LIBDIR} \"${CMAKE_LIBRARY_OUTPUT_DIRECTORY}\")
|
|
|
|
set(options --prefix=${CMAKE_INSTALL_PREFIX})
|
|
if(DEFINED ENV{DESTDIR})
|
|
if(EXISTS /etc/debian_version)
|
|
list(APPEND options --install-layout=deb)
|
|
endif()
|
|
list(APPEND options --root=\$ENV{DESTDIR})
|
|
else()
|
|
list(APPEND options --root=/)
|
|
endif()
|
|
execute_process(
|
|
COMMAND
|
|
${PYTHON${PYTHON_VERSION}_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/setup.py
|
|
build --verbose --build-base ${CYTHON_MODULE_DIR}
|
|
--build-platlib ${CYTHON_MODULE_DIR}/lib.${PYTHON${PYTHON_VERSION}_VERSION_MAJOR}
|
|
build_ext --cython-c-in-temp --build-temp ${CMAKE_CURRENT_BINARY_DIR} --cython-include-dirs ${PROJECT_SOURCE_DIR}/src/pybind/rados
|
|
install \${options} --single-version-externally-managed --record /dev/null
|
|
egg_info --egg-base ${CMAKE_CURRENT_BINARY_DIR}
|
|
--verbose
|
|
WORKING_DIRECTORY \"${CMAKE_CURRENT_SOURCE_DIR}\"
|
|
RESULT_VARIABLE install_res)
|
|
if(NOT \"\${install_res}\" STREQUAL 0)
|
|
message(FATAL_ERROR \"Failed to build and install ${name} python module\")
|
|
endif()
|
|
")
|
|
endfunction(distutils_install_cython_module)
|