Skip to content

Commit

Permalink
fix static linkage and make THD statically linked
Browse files Browse the repository at this point in the history
  • Loading branch information
soumith committed Aug 28, 2017
1 parent df44c57 commit 0b92e5c
Show file tree
Hide file tree
Showing 9 changed files with 59 additions and 31 deletions.
33 changes: 20 additions & 13 deletions setup.py
Expand Up @@ -229,16 +229,6 @@ def run(self):
# Python 2.6 requires -fno-strict-aliasing, see
# http://legacy.python.org/dev/peps/pep-3123/
'-fno-strict-aliasing']
if os.getenv('PYTORCH_BINARY_BUILD') and platform.system() == 'Linux':
print('PYTORCH_BINARY_BUILD found. Static linking libstdc++ on Linux')
# get path of libstdc++ and link manually.
# for reasons unknown, -static-libstdc++ doesn't fully link some symbols
CXXNAME = os.getenv('CXX', 'g++')
path = subprocess.check_output([CXXNAME, '-print-file-name=libstdc++.a'])
path = path[:-1]
if type(path) != str: # python 3
path = path.decode(sys.stdout.encoding)
extra_link_args += [path]

cwd = os.path.dirname(os.path.abspath(__file__))
lib_path = os.path.join(cwd, "torch", "lib")
Expand All @@ -265,7 +255,9 @@ def run(self):
THCUNN_LIB = os.path.join(lib_path, 'libTHCUNN.so.1')
THPP_LIB = os.path.join(lib_path, 'libTHPP.so.1')
ATEN_LIB = os.path.join(lib_path, 'libATen.so.1')
THD_LIB = os.path.join(lib_path, 'libTHD.so.1')
GLOO_LIB = os.path.join(lib_path, 'libgloo.a')
GLOO_CUDA_LIB = os.path.join(lib_path, 'libgloo_cuda.a')
THD_LIB = os.path.join(lib_path, 'libTHD.a')
NCCL_LIB = os.path.join(lib_path, 'libnccl.so.1')
if platform.system() == 'Darwin':
TH_LIB = os.path.join(lib_path, 'libTH.1.dylib')
Expand All @@ -276,11 +268,10 @@ def run(self):
THCUNN_LIB = os.path.join(lib_path, 'libTHCUNN.1.dylib')
THPP_LIB = os.path.join(lib_path, 'libTHPP.1.dylib')
ATEN_LIB = os.path.join(lib_path, 'libATen.1.dylib')
THD_LIB = os.path.join(lib_path, 'libTHD.1.dylib')
NCCL_LIB = os.path.join(lib_path, 'libnccl.1.dylib')

if WITH_NCCL and subprocess.call('ldconfig -p | grep libnccl >/dev/null', shell=True) == 0:
SYSTEM_NCCL = True
SYSTEM_NCCL = True

main_compile_args = ['-D_THP_CORE']
main_libraries = ['shm']
Expand Down Expand Up @@ -343,6 +334,8 @@ def run(self):
extra_compile_args += ['-DWITH_DISTRIBUTED_MW']
include_dirs += [tmp_install_path + "/include/THD"]
main_link_args += [THD_LIB]
if platform.system() == 'Linux':
main_link_args += [GLOO_LIB]

if WITH_CUDA:
cuda_lib_dirs = ['lib64', 'lib']
Expand All @@ -359,6 +352,8 @@ def run(self):
extra_compile_args += ['-DCUDA_LIB_PATH=' + cuda_lib_path]
main_libraries += ['cudart', 'nvToolsExt']
main_link_args += [THC_LIB, THCS_LIB, THCUNN_LIB]
if platform.system() == 'Linux':
main_link_args += [GLOO_CUDA_LIB]
main_sources += [
"torch/csrc/cuda/Module.cpp",
"torch/csrc/cuda/Storage.cpp",
Expand Down Expand Up @@ -396,6 +391,18 @@ def run(self):
extra_compile_args += ['-O0', '-g']
extra_link_args += ['-O0', '-g']

if os.getenv('PYTORCH_BINARY_BUILD') and platform.system() == 'Linux':
print('PYTORCH_BINARY_BUILD found. Static linking libstdc++ on Linux')
# get path of libstdc++ and link manually.
# for reasons unknown, -static-libstdc++ doesn't fully link some symbols
CXXNAME = os.getenv('CXX', 'g++')
STDCPP_LIB = subprocess.check_output([CXXNAME, '-print-file-name=libstdc++.a'])
STDCPP_LIB = STDCPP_LIB[:-1]
if type(STDCPP_LIB) != str: # python 3
STDCPP_LIB = STDCPP_LIB.decode(sys.stdout.encoding)
main_link_args += [STDCPP_LIB]
version_script = os.path.abspath("tools/pytorch.version")
extra_link_args += ['-Wl,--version-script=' + version_script]

def make_relative_rpath(path):
if platform.system() == 'Darwin':
Expand Down
12 changes: 12 additions & 0 deletions tools/pytorch.version
@@ -0,0 +1,12 @@
{
global:
_TH*;
TH*;
*THP*;
*THCP*;
PyInit*;
init*;
state;
local:
*;
};
4 changes: 4 additions & 0 deletions torch/lib/ATen/CMakeLists.txt
Expand Up @@ -61,6 +61,10 @@ MESSAGE(STATUS "THNN_LIBRARIES: ${THNN_LIBRARIES}")
IF ($ENV{TH_BINARY_BUILD})
MESSAGE(STATUS "TH_BINARY_BUILD detected. Statically linking libstdc++")
SET(CMAKE_CXX_FLAGS "-static-libstdc++ ${CMAKE_CXX_FLAGS}")
IF (UNIX AND NOT APPLE)
# hiding statically linked library symbols, this flag is not available for the linker under MACOSX
SET(CMAKE_CXX_FLAGS "-Wl,--exclude-libs,libstdc++.a ${CMAKE_CXX_FLAGS}")
ENDIF(UNIX AND NOT APPLE)
ENDIF()

IF(NO_CUDA)
Expand Down
4 changes: 4 additions & 0 deletions torch/lib/THC/CMakeLists.txt
Expand Up @@ -90,6 +90,10 @@ ENDIF(MAGMA_FOUND)
IF ($ENV{TH_BINARY_BUILD})
MESSAGE(STATUS "TH_BINARY_BUILD detected. Statically linking libstdc++")
SET(CMAKE_CXX_FLAGS "-static-libstdc++ ${CMAKE_CXX_FLAGS}")
IF (UNIX AND NOT APPLE)
# hiding statically linked library symbols, this flag is not available for the linker under MACOSX
SET(CMAKE_CXX_FLAGS "-Wl,--exclude-libs,libstdc++.a ${CMAKE_CXX_FLAGS}")
ENDIF(UNIX AND NOT APPLE)
ENDIF()

IF(APPLE)
Expand Down
10 changes: 5 additions & 5 deletions torch/lib/THCS/CMakeLists.txt
Expand Up @@ -42,16 +42,16 @@ endif()
IF ($ENV{TH_BINARY_BUILD})
MESSAGE(STATUS "TH_BINARY_BUILD detected. Statically linking libstdc++")
SET(CMAKE_CXX_FLAGS "-static-libstdc++ ${CMAKE_CXX_FLAGS}")
IF (UNIX AND NOT APPLE)
# hiding statically linked library symbols, this flag is not available for the linker under MACOSX
SET(CMAKE_CXX_FLAGS "-Wl,--exclude-libs,libstdc++.a ${CMAKE_CXX_FLAGS}")
ENDIF(UNIX AND NOT APPLE)

ENDIF()

INCLUDE_DIRECTORIES(${CUDA_INCLUDE_DIRS})
INCLUDE_DIRECTORIES("${CUDA_SDK_ROOT_DIR}/common/inc")

IF ($ENV{TH_BINARY_BUILD})
MESSAGE(STATUS "TH_BINARY_BUILD detected. Statically linking libstdc++")
SET(CMAKE_CXX_FLAGS "-static-libstdc++ ${CMAKE_CXX_FLAGS}")
ENDIF()

IF(APPLE)
IF(${CUDA_VERSION} LESS 6.0)
# work around for mac os x bug:
Expand Down
4 changes: 4 additions & 0 deletions torch/lib/THCUNN/CMakeLists.txt
Expand Up @@ -32,6 +32,10 @@ ENDIF()
IF ($ENV{TH_BINARY_BUILD})
MESSAGE(STATUS "TH_BINARY_BUILD detected. Statically linking libstdc++")
SET(CMAKE_CXX_FLAGS "-static-libstdc++ ${CMAKE_CXX_FLAGS}")
IF (UNIX AND NOT APPLE)
# hiding statically linked library symbols, this flag is not available for the linker under MACOSX
SET(CMAKE_CXX_FLAGS "-Wl,--exclude-libs,libstdc++.a ${CMAKE_CXX_FLAGS}")
ENDIF(UNIX AND NOT APPLE)
ENDIF()

# Detect CUDA architecture and get best NVCC flags
Expand Down
15 changes: 2 additions & 13 deletions torch/lib/THD/CMakeLists.txt
Expand Up @@ -83,11 +83,6 @@ ENDIF()

ADD_DEFINITIONS(-D_THD_CORE=1)

IF ($ENV{TH_BINARY_BUILD})
MESSAGE(STATUS "TH_BINARY_BUILD detected. Statically linking libstdc++")
SET(CMAKE_CXX_FLAGS "-static-libstdc++ ${CMAKE_CXX_FLAGS}")
ENDIF()

# Can be compiled standalone
IF(NOT THD_INSTALL_BIN_DIR OR NOT THD_INSTALL_LIB_DIR OR NOT THD_INSTALL_INCLUDE_DIR)
SET(THD_INSTALL_BIN_DIR "bin" CACHE PATH "THD install binary subdirectory")
Expand Down Expand Up @@ -124,14 +119,8 @@ EXCLUDE_DIR(all_cpp ".*/generic/.*\\.cpp$")

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})

ADD_LIBRARY(THD SHARED ${all_cpp})

IF(THD_SO_VERSION)
MESSAGE(STATUS "THD_SO_VERSION: ${THD_SO_VERSION}")
SET_TARGET_PROPERTIES(THD PROPERTIES
VERSION ${THD_SO_VERSION}
SOVERSION ${THD_SO_VERSION})
ENDIF(THD_SO_VERSION)
ADD_LIBRARY(THD STATIC ${all_cpp})
set_property(TARGET THD PROPERTY POSITION_INDEPENDENT_CODE ON)

TARGET_LINK_LIBRARIES(THD LINK_PRIVATE ${TH_LIBRARIES} ${THPP_LIBRARIES})
IF(CUDA_FOUND)
Expand Down
4 changes: 4 additions & 0 deletions torch/lib/THPP/CMakeLists.txt
Expand Up @@ -63,6 +63,10 @@ ENDIF()
IF ($ENV{TH_BINARY_BUILD})
MESSAGE(STATUS "TH_BINARY_BUILD detected. Statically linking libstdc++")
SET(CMAKE_CXX_FLAGS "-static-libstdc++ ${CMAKE_CXX_FLAGS}")
IF (UNIX AND NOT APPLE)
# hiding statically linked library symbols, this flag is not available for the linker under MACOSX
SET(CMAKE_CXX_FLAGS "-Wl,--exclude-libs,libstdc++.a ${CMAKE_CXX_FLAGS}")
ENDIF(UNIX AND NOT APPLE)
ENDIF()

# Can be compiled standalone
Expand Down
4 changes: 4 additions & 0 deletions torch/lib/libshm/CMakeLists.txt
Expand Up @@ -22,6 +22,10 @@ ENDIF ()
IF ($ENV{PYTORCH_BINARY_BUILD})
MESSAGE(STATUS "PYTORCH_BINARY_BUILD detected. Statically linking libstdc++")
SET(CMAKE_CXX_FLAGS "-static-libstdc++ ${CMAKE_CXX_FLAGS}")
IF (UNIX AND NOT APPLE)
# hiding statically linked library symbols, this flag is not available for the linker under MACOSX
SET(CMAKE_CXX_FLAGS "-Wl,--exclude-libs,libstdc++.a ${CMAKE_CXX_FLAGS}")
ENDIF(UNIX AND NOT APPLE)
ENDIF()

ADD_LIBRARY(shm SHARED core.cpp)
Expand Down

0 comments on commit 0b92e5c

Please sign in to comment.