project(PyOpenMM) # cmake_minimum_required(VERSION 2.6 FATAL_ERROR) # Don't say fatal error until we can upgrade SimTK dashboard server cmake cmake_minimum_required(VERSION 2.6) enable_testing() ####################################################################### ### Carefully select which variables show up in the cmake interface ### ####################################################################### # nightly build dashboard include(Dart) mark_as_advanced(DART_ROOT) # We have custom cmake modules for FindOpenMM and running python tests set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake_modules") find_program(PYTHON_EXECUTABLE NAMES python) mark_as_advanced(CLEAR PYTHON_EXECUTABLE) # ...OpenMM find_package(OpenMM REQUIRED) mark_as_advanced(CLEAR OpenMM_INCLUDE_DIR OpenMM_LIBRARIES) mark_as_advanced(CLEAR CMAKE_INSTALL_PREFIX) ############################################# ### Copy all source files to staging area ### ############################################# # PyOpenMM_STAGING_DIR is a staging area for python, swig, and C files in the python package we are making. set(PyOpenMM_STAGING_DIR "${CMAKE_BINARY_DIR}/staging" CACHE PATH "Temporary staging area for python, swig, and C files") mark_as_advanced(PyOpenMM_STAGING_DIR) ############################################################################## ### Identify files that need to be copied from source area to staging area ### ############################################################################## set(STAGING_OUTPUT_FILES "") # Will contain all required package files file(GLOB STAGING_INPUT_FILES RELATIVE "${CMAKE_SOURCE_DIR}" "${CMAKE_SOURCE_DIR}/MANIFEST.in" "${CMAKE_SOURCE_DIR}/README.txt" "${CMAKE_SOURCE_DIR}/*.py" ) # file(GLOB_RECURSE temp RELATIVE "${CMAKE_SOURCE_DIR}" "${CMAKE_SOURCE_DIR}/src/*.i") # foreach(f ${temp}) # set(temp2 "${temp2}\n${f}") # endforeach() # Avoid descending into build or bin or build_vstudio directory # by setting subdirectories explicitly set(SUBDIRS examples test scripts simtk) foreach(SUBDIR ${SUBDIRS}) file(GLOB_RECURSE STAGING_INPUT_FILES1 RELATIVE "${CMAKE_SOURCE_DIR}" "${CMAKE_SOURCE_DIR}/${SUBDIR}/*README.txt" "${CMAKE_SOURCE_DIR}/${SUBDIR}/*.py" "${CMAKE_SOURCE_DIR}/${SUBDIR}/*.i" "${CMAKE_SOURCE_DIR}/${SUBDIR}/*.sh" ) foreach(file ${STAGING_INPUT_FILES1}) set(STAGING_INPUT_FILES ${STAGING_INPUT_FILES} "${file}") endforeach(file ${STAGING_INPUT_FILES1}) endforeach(SUBDIR ${SUBDIRS}) # message("STAGING_INPUT_FILES = " ${STAGING_INPUT_FILES}) foreach(INIT_FILE ${STAGING_INPUT_FILES}) set(infile "${CMAKE_SOURCE_DIR}/${INIT_FILE}") set(outfile "${PyOpenMM_STAGING_DIR}/${INIT_FILE}") add_custom_command( OUTPUT "${outfile}" COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${infile}" "${outfile}" DEPENDS "${infile}" COMMENT "CMake-copying file ${infile} to ${outfile}") set(STAGING_OUTPUT_FILES ${STAGING_OUTPUT_FILES} "${outfile}") # message("STAGING_OUTPUT_FILE = " ${outfile}) endforeach(INIT_FILE ${STAGING_INPUT_FILES}) # Run python setup.py indirectly, so we can set environment variables set(PYTHON_SETUP_COMMAND build) configure_file( pysetup.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/pysetupbuild.cmake" @ONLY ) add_custom_command( OUTPUT ${PyOpenMM_STAGING_DIR}/build COMMAND ${CMAKE_COMMAND} ARGS -P "${CMAKE_CURRENT_BINARY_DIR}/pysetupbuild.cmake" DEPENDS ${PyOpenMM_STAGING_DIR}/setup.py "${CMAKE_CURRENT_BINARY_DIR}/pysetupbuild.cmake" PyopenmmPackage ${STAGING_OUTPUT_FILES} WORKING_DIRECTORY ${PyOpenMM_STAGING_DIR} COMMENT "Building PyOpenMM binary module..." ) add_custom_target(BuildModule ALL DEPENDS ${STAGING_OUTPUT_FILES}) # CTest testing if(BUILD_TESTING) # Python modules will be installed locally in the build area for testing. # Run python setup.py indirectly, so we can set environment variables set(INST_DIR "../local_install") file(TO_NATIVE_PATH "${INST_DIR}" INST_DIR) # Terrible bug in python distutils fails to handle absolute paths on Windows correctly # Double backslashes so they can get through to command string(REGEX REPLACE "\\\\" "\\\\\\\\" INST_DIR "${INST_DIR}") set(PYTHON_SETUP_COMMAND "install --home=${INST_DIR}") configure_file( pysetup.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/pysetuplocalinstall.cmake" @ONLY) set(PyOpenMM_INSTALL_TEST_DIR "${CMAKE_BINARY_DIR}/local_install" CACHE PATH "Where pyopenmm modules will be temporarily installed locally for testing") file(MAKE_DIRECTORY "${PyOpenMM_INSTALL_TEST_DIR}") add_custom_target(PyopenmmLocalInstall ALL COMMAND ${CMAKE_COMMAND} -P "${CMAKE_CURRENT_BINARY_DIR}/pysetuplocalinstall.cmake" DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/pysetuplocalinstall.cmake" ${STAGING_OUTPUT_FILES} WORKING_DIRECTORY ${PyOpenMM_STAGING_DIR} COMMENT "LOCAL install PyOpenMM binary module..." ) mark_as_advanced(PyOpenMM_INSTALL_TEST_DIR) add_subdirectory(test) add_subdirectory(examples) endif(BUILD_TESTING) # Binary distribution if(WIN32) set(PYTHON_SETUP_COMMAND bdist_wininst) else(WIN32) set(PYTHON_SETUP_COMMAND bdist) endif(WIN32) configure_file(pysetup.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/pysetupbdist.cmake" @ONLY) add_custom_target(PackageBinaryDistribution ALL COMMAND ${CMAKE_COMMAND} -P "${CMAKE_CURRENT_BINARY_DIR}/pysetupbdist.cmake" DEPENDS ${STAGING_OUTPUT_FILES} "${CMAKE_CURRENT_BINARY_DIR}/pysetupbdist.cmake" WORKING_DIRECTORY ${PyOpenMM_STAGING_DIR} COMMENT "Packaging binary distribution package (bdist)..." ) # Source distribution set(PYTHON_SETUP_COMMAND sdist) configure_file(pysetup.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/pysetupsdist.cmake" @ONLY) add_custom_target(PackageSourceDistribution COMMAND ${CMAKE_COMMAND} -P "${CMAKE_CURRENT_BINARY_DIR}/pysetupsdist.cmake" DEPENDS ${STAGING_OUTPUT_FILES} "${CMAKE_CURRENT_BINARY_DIR}/pysetupsdist.cmake" WORKING_DIRECTORY ${PyOpenMM_STAGING_DIR} COMMENT "Packaging source distribution package (sdist)..." ) # Install binary module (to system location) set(PYTHON_SETUP_COMMAND "install") configure_file(pysetup.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/pysetupinstall.cmake" @ONLY) add_custom_target(InstallPyOpenMM COMMAND ${CMAKE_COMMAND} -P "${CMAKE_CURRENT_BINARY_DIR}/pysetupinstall.cmake" DEPENDS ${STAGING_OUTPUT_FILES} "${CMAKE_CURRENT_BINARY_DIR}/pysetupinstall.cmake" WORKING_DIRECTORY ${PyOpenMM_STAGING_DIR} COMMENT "Installing PyOpenMM binary module..." ) install(DIRECTORY "${PyOpenMM_STAGING_DIR}/dist/" DESTINATION ".")