Skip to content

Commit 4cafb6d

Browse files
committed
Polish swig wrapper
1 parent c016758 commit 4cafb6d

File tree

7 files changed

+63
-289
lines changed

7 files changed

+63
-289
lines changed

paddle/api/CMakeLists.txt

Lines changed: 51 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,3 @@
1-
FUNCTION(generate_python_api target_name)
2-
ADD_CUSTOM_COMMAND(OUTPUT ${PROJ_ROOT}/paddle/py_paddle/swig_paddle.py
3-
${PROJ_ROOT}/paddle/Paddle_wrap.cxx
4-
${PROJ_ROOT}/paddle/Paddle_wrap.h
5-
COMMAND ${SWIG_EXECUTABLE} -python -c++ -outcurrentdir -I../ api/Paddle.swig
6-
&& mv ${PROJ_ROOT}/paddle/swig_paddle.py ${PROJ_ROOT}/paddle/py_paddle/swig_paddle.py
7-
DEPENDS ${PROJ_ROOT}/paddle/api/Paddle.swig
8-
${PROJ_ROOT}/paddle/api/PaddleAPI.h
9-
${external_project_dependencies}
10-
WORKING_DIRECTORY ${PROJ_ROOT}/paddle
11-
COMMENT "Generate Python API from swig")
12-
ADD_CUSTOM_TARGET(${target_name} ALL DEPENDS
13-
${PROJ_ROOT}/paddle/Paddle_wrap.cxx
14-
${PROJ_ROOT}/paddle/Paddle_wrap.h
15-
${PROJ_ROOT}/paddle/py_paddle/swig_paddle.py
16-
${external_project_dependencies})
17-
ENDFUNCTION(generate_python_api)
18-
191
set(API_SOURCES
202
Arguments.cpp
213
ConfigParser.cpp
@@ -33,65 +15,73 @@ set(API_HEADER
3315
PaddleAPI.h
3416
Internal.h)
3517

36-
add_library(paddle_api STATIC
37-
${API_SOURCES})
18+
add_library(paddle_api STATIC ${API_SOURCES})
3819
add_dependencies(paddle_api gen_proto_cpp)
3920

40-
list(LENGTH "${GFLAGS_LIBRARIES}" GFLAGS_LIBRARIES_LENGTH)
21+
INCLUDE(${SWIG_USE_FILE})
22+
INCLUDE_DIRECTORIES(${PROJ_ROOT}/paddle)
4123

42-
if(${GFLAGS_LIBRARIES_LENGTH} EQUAL 0 AND TARGET "${GFLAGS_LIBRARIES}")
43-
# Because gflags compiled by cmake, so it is imported by cmake target,
44-
# not a real library path. Get the real library path here.
45-
message(STATUS "GFLAGS Libraries is ${GFLAGS_LIBRARIES}")
46-
get_target_property(GFLAGS_LOCATION ${GFLAGS_LIBRARIES} LOCATION)
47-
message(STATUS "GFLAGS Target location is ${GFLAGS_LOCATION}")
48-
else()
49-
set(GFLAGS_LOCATION ${GFLAGS_LIBRARIES})
50-
endif()
24+
FILE(GLOB PY_PADDLE_PYTHON_FILES ${PROJ_ROOT}/paddle/py_paddle/*.py)
25+
26+
SET_SOURCE_FILES_PROPERTIES(Paddle.i PROPERTIES CPLUSPLUS ON)
5127

52-
configure_file(
53-
paddle_api_config.py.in
54-
${PROJ_ROOT}/paddle/api/paddle_api_config.py
28+
SET(CMAKE_SWIG_OUTDIR ${CMAKE_CURRENT_BINARY_DIR})
29+
SET(CMAKE_CXX_FLAGS "-std=c++11 -fPIC")
30+
SET(SWIG_MODULE_swig_paddle_EXTRA_DEPS
31+
paddle_parameter
32+
paddle_function
33+
paddle_math
34+
paddle_utils
35+
paddle_gserver
36+
paddle_pserver
37+
paddle_api
38+
paddle_cuda
39+
paddle_trainer_lib
40+
paddle_network
41+
paddle_proto
42+
${PY_PADDLE_PYTHON_FILES}
43+
${external_project_dependencies}
5544
)
5645

57-
generate_python_api(python_swig_sources)
46+
IF(APPLE)
47+
SET(CMAKE_LINK_FLAGS "-undefined dynamic_lookup -Wl,-all_load")
48+
ENDIF(APPLE)
5849

59-
file(GLOB PY_PADDLE_PYTHON_FILES ${PROJ_ROOT}/paddle/py_paddle/*.py)
50+
SWIG_ADD_MODULE(swig_paddle python Paddle.i)
51+
SWIG_LINK_LIBRARIES(swig_paddle
52+
${CMAKE_LINK_FLAGS}
53+
${CMAKE_DL_LIBS}
54+
${EXTERNAL_LIBS}
55+
${PYTHON_LIBRARIES}
56+
${CMAKE_THREAD_LIBS_INIT}
57+
${RDMA_LD_FLAGS}
58+
${RDMA_LIBS}
59+
paddle_parameter
60+
paddle_function
61+
paddle_math
62+
paddle_utils
63+
paddle_gserver
64+
paddle_pserver
65+
paddle_api
66+
paddle_cuda
67+
paddle_trainer_lib
68+
paddle_network
69+
paddle_proto
70+
)
6071

61-
# TODO(yuyang18) : make wheel name calculated by cmake
6272
add_custom_command(OUTPUT ${PROJ_ROOT}/paddle/dist/.timestamp
73+
COMMAND mv ${CMAKE_CURRENT_BINARY_DIR}/swig_paddle.py ${PROJ_ROOT}/paddle/py_paddle
74+
&& mv ${CMAKE_CURRENT_BINARY_DIR}/_swig_paddle.so ${PROJ_ROOT}/paddle/py_paddle
6375
COMMAND env ${py_env} ${PYTHON_EXECUTABLE} setup.py bdist_wheel
6476
COMMAND ${CMAKE_COMMAND} -E touch dist/.timestamp
6577
COMMAND rm -rf py_paddle.egg-info build
6678
WORKING_DIRECTORY ${PROJ_ROOT}/paddle
67-
DEPENDS python_swig_sources
68-
paddle_parameter
69-
paddle_function
70-
paddle_math
71-
paddle_utils
72-
paddle_gserver
73-
paddle_pserver
74-
paddle_trainer
75-
paddle_api
76-
paddle_cuda
77-
${PY_PADDLE_PYTHON_FILES}
79+
DEPENDS _swig_paddle
7880
)
7981

80-
install(DIRECTORY ${PROJ_ROOT}/paddle/dist/
81-
DESTINATION opt/paddle/share/wheels
82-
)
82+
add_custom_target(python_api_wheel ALL DEPENDS ${PROJ_ROOT}/paddle/dist/.timestamp)
8383

84-
add_custom_target(python_api_wheel ALL DEPENDS
85-
${PROJ_ROOT}/paddle/dist/.timestamp)
86-
add_dependencies(python_api_wheel python_swig_sources
87-
paddle_parameter
88-
paddle_math
89-
paddle_utils
90-
paddle_gserver
91-
paddle_pserver
92-
paddle_trainer
93-
paddle_api
94-
paddle_cuda)
84+
install(DIRECTORY ${PROJ_ROOT}/paddle/dist/ DESTINATION opt/paddle/share/wheels)
9585

9686
if(WITH_TESTING)
9787
IF(NOT PY_PIP_FOUND)
File renamed without changes.

paddle/api/paddle_api_config.py.in

Lines changed: 0 additions & 17 deletions
This file was deleted.

paddle/api/paddle_ld_flags.py

Lines changed: 0 additions & 157 deletions
This file was deleted.

paddle/py_paddle/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
swig_paddle.py
2+
_swig_paddle.so

paddle/setup.py.in

Lines changed: 3 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -12,64 +12,16 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
# This file is used to build paddle python binding package.
16-
# It will be invoked by Makefile that generated by COMAKE
1715

1816
from setuptools import setup, Extension
1917

20-
import numpy as np
21-
import api.paddle_ld_flags
22-
import platform
23-
import os
24-
25-
system = platform.system().lower()
26-
27-
is_osx = (system == 'darwin')
28-
is_win = (system == 'windows')
29-
is_lin = (system == 'linux')
30-
31-
32-
# The extra links will passed from COMAKE
33-
# because generate paddle LDFLAGS is too complicated to do in setup.py
34-
# it just read COMAKE generated LDFLAGS.
35-
extra_comps = []
36-
extra_links = []
37-
obj = api.paddle_ld_flags.PaddleLDFlag()
38-
extra_comps = obj.c_flag()
39-
ldflags = obj.ldflag_str()
40-
if ldflags is not None:
41-
extra_links.extend(ldflags.split(" "))
42-
43-
try:
44-
with open('.py_paddle_extra_link_flags', 'r') as f:
45-
for line in f:
46-
extra_links += line.split()
47-
except:
48-
pass
49-
50-
if is_lin == True:
51-
extra_links = ["-Xlinker", '-start-group'] + extra_links + ["-Xlinker", "-end-group"]
52-
elif is_osx == True:
53-
os.environ["ARCHFLAGS"] = "-arch x86_64"
54-
extra_links = ["-Wl,-all_load"] + extra_links
55-
56-
include_dirs = [np.get_include(), "../"] # include numpy and paddle.
57-
5818
setup(name="py_paddle",
5919
version="@PADDLE_VERSION@",
60-
ext_modules=[
61-
Extension('py_paddle._swig_paddle', # Build SWIG Extension.
62-
['Paddle_wrap.cxx'],
63-
language = "c++",
64-
include_dirs = include_dirs,
65-
extra_link_args = extra_links,
66-
extra_compile_args = extra_comps
67-
)
68-
],
6920
packages=['py_paddle'],
70-
include_dirs = include_dirs,
21+
include_package_data=True,
22+
package_data={'py_paddle':['*.py','_swig_paddle.so']},
7123
install_requires = [
7224
'numpy>=1.8.0', # The numpy is required.
73-
'protobuf>=2.4.1' # The paddle protobuf version
25+
'protobuf>=2.4.1' # The paddle protobuf version
7426
],
7527
)

0 commit comments

Comments
 (0)