summaryrefslogtreecommitdiff
path: root/sci-chemistry/openbabel/files/openbabel-python.cmake
blob: 425b4656a9d2899da5be0381bd4b8fc8c68c0457 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# The following is a cmake fragment taken from scripts/CMakeLists.txt and
# edited for Gentoo python multibuild compatibility.

if (PYTHON_BINDINGS)
	# Tags should be edited to reflect the active python implementation
	set(EPYTHON @@EPYTHON@@)
	set(PYTHON_INCUDE_DIR @@PYTHON_INCUDE_DIR@@)
	set(PYTHON_LIBS @@PYTHON_LIBS@@)
	set(PYTHON_SITEDIR @@PYTHON_SITEDIR@@)

	include_directories(${PYTHON_INCUDE_DIR})

	add_custom_command(
		OUTPUT ${CMAKE_SOURCE_DIR}/scripts/${EPYTHON}/openbabel-python.cpp ${CMAKE_SOURCE_DIR}/scripts/${EPYTHON}/openbabel.py
		COMMAND ${SWIG_EXECUTABLE} -python -c++ -small -O -templatereduce -naturalvar -I${CMAKE_SOURCE_DIR}/include -I${CMAKE_BINARY_DIR}/include -o ${CMAKE_SOURCE_DIR}/scripts/${EPYTHON}/openbabel-python.cpp ${eigen_define} -outdir ${CMAKE_SOURCE_DIR}/scripts/${EPYTHON} ${CMAKE_SOURCE_DIR}/scripts/openbabel-python.i
		MAIN_DEPENDENCY openbabel-python.i
		VERBATIM
	)

	configure_file(${CMAKE_SOURCE_DIR}/scripts/python/openbabel/__init__.py.in
		${CMAKE_BINARY_DIR}/scripts/${EPYTHON}/openbabel/__init__.py)

	add_library(bindings_python_${EPYTHON} MODULE ${CMAKE_SOURCE_DIR}/scripts/${EPYTHON}/openbabel-python.cpp)
	target_link_libraries(bindings_python_${EPYTHON} ${PYTHON_LIBS} ${BABEL_LIBRARY})

	set_target_properties(bindings_python_${EPYTHON}
		PROPERTIES
		OUTPUT_NAME _openbabel
		LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/scripts/${EPYTHON}/openbabel
		PREFIX ""
		SUFFIX .so )

	add_dependencies(bindings_python_${EPYTHON} openbabel)

	install(TARGETS bindings_python_${EPYTHON}
		LIBRARY DESTINATION ${PYTHON_SITEDIR}/openbabel
		COMPONENT bindings_python)
	install(FILES ${CMAKE_BINARY_DIR}/scripts/${EPYTHON}/openbabel/__init__.py
		DESTINATION ${PYTHON_SITEDIR}/openbabel
		COMPONENT bindings_python)
	install(FILES ${CMAKE_SOURCE_DIR}/scripts/${EPYTHON}/openbabel.py
		DESTINATION ${PYTHON_SITEDIR}/openbabel
		COMPONENT bindings_python)
	install(FILES ${CMAKE_SOURCE_DIR}/scripts/python/openbabel/pybel.py
		DESTINATION ${PYTHON_SITEDIR}/openbabel
		COMPONENT bindings_python)

	if (ENABLE_TESTS)
		# Make sure all module files are together in the same directory for testing
		add_custom_command(TARGET bindings_python_${EPYTHON} POST_BUILD
			COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/scripts/${EPYTHON}/openbabel.py ${CMAKE_BINARY_DIR}/scripts/${EPYTHON}/openbabel/
			COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/scripts/python/openbabel/pybel.py ${CMAKE_BINARY_DIR}/scripts/${EPYTHON}/openbabel/)
		set(TEST_SOURCE_DIR ${CMAKE_SOURCE_DIR}/test)
		# define TESTDATADIR for tests that need input files
		add_definitions(-DTESTDATADIR="${TEST_SOURCE_DIR}/files/")
		# define FORMATDIR for location of format plugin binaries
		set(FORMATDIR "${CMAKE_BINARY_DIR}/lib${LIB_SUFFIX}/")
		add_definitions(-DFORMATDIR="${FORMATDIR}/")
		include_directories(${TEST_SOURCE_DIR})

		# The macro is modified from cmake/modules/UsePythonTest.cmake
		MACRO(ADD_PYTHON_TEST TESTNAME FILENAME)
			GET_SOURCE_FILE_PROPERTY(loc ${FILENAME} LOCATION)
			STRING(REGEX REPLACE ";" " " wo_semicolumn "${ARGN}")
			FILE(WRITE ${CMAKE_BINARY_DIR}/test/${TESTNAME}.cmake
"
	MESSAGE(\"${PYTHONPATH}\")
	EXECUTE_PROCESS(
		COMMAND ${EPYTHON} ${loc} ${wo_semicolumn}
		RESULT_VARIABLE import_res
		OUTPUT_VARIABLE import_output
		ERROR_VARIABLE  import_output
	)

	# Pass the output back to ctest
	IF(import_output)
		MESSAGE(\${import_output})
	ENDIF(import_output)
	IF(import_res)
		MESSAGE(SEND_ERROR \${import_res})
	ENDIF(import_res)
"
			)
			ADD_TEST(${TESTNAME} ${CMAKE_COMMAND} -P ${CMAKE_BINARY_DIR}/test/${TESTNAME}.cmake)
		ENDMACRO(ADD_PYTHON_TEST)

		set(pybindtests
			bindings
			_pybel
			example 
			obconv_writers
			cdjsonformat
			pcjsonformat
			roundtrip
			)
		foreach(pybindtest ${pybindtests})
			ADD_PYTHON_TEST(pybindtest_${pybindtest}_${EPYTHON} ${TEST_SOURCE_DIR}/test${pybindtest}.py)
			set_tests_properties(pybindtest_${pybindtest}_${EPYTHON} PROPERTIES
				ENVIRONMENT "PYTHONPATH=${CMAKE_BINARY_DIR}/scripts/${EPYTHON}:${CMAKE_BINARY_DIR}/lib${LIB_SUFFIX};LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/scripts/${EPYTHON}:${CMAKE_BINARY_DIR}/lib${LIB_SUFFIX}:\$ENV{LD_LIBRARY_PATH};BABEL_LIBDIR=${CMAKE_BINARY_DIR}/lib${LIB_SUFFIX}/;BABEL_DATADIR=${CMAKE_SOURCE_DIR}/data"
				FAIL_REGULAR_EXPRESSION "ERROR;FAIL;Test failed"
			)
		endforeach(pybindtest ${pybindtests})
	endif (ENABLE_TESTS)
endif(PYTHON_BINDINGS)