diff --git a/HySoP/CMake/MyTools.cmake b/HySoP/CMake/MyTools.cmake index 227bbf301bfe8021a7ef2ea2ee0a65bed263c8a1..acb891887b833fc21bbb451319ed2979ed865fbb 100644 --- a/HySoP/CMake/MyTools.cmake +++ b/HySoP/CMake/MyTools.cmake @@ -127,3 +127,32 @@ macro(list_subdirectories retval curdir return_relative) set(${retval} ${list_of_dirs}) endmacro() +# Get the list of all directories in a directory +macro(get_subdirectories result curdir) + file(GLOB subdir RELATIVE ${curdir} ${curdir}/*) + set(dirlist "") + foreach(dir ${subdir}) + if(IS_DIRECTORY ${curdir}/${dir}) + set(dirlist ${dirlist} ${dir}) + endif() + endforeach() + set(${result} ${dirlist}) +endmacro() + +# Find the name (platform dependant) of the python build +# (result of python setup.py build) +# Note : this macro obviously works only if build exists i.e. +# after a call to python build +macro(get_python_builddir where result) + get_subdirectories(listofdirs ${where}) + foreach(dir ${listofdirs}) + find_file(parmepyfile + NAMES __init__.py + PATHS ${where}/${dir}/parmepy + PATH_SUFFIXES parmepy + NO_DEFAULT_PATH) + endforeach() + get_filename_component(builddir ${parmepyfile} PATH) + get_filename_component(builddir ${builddir} PATH) + set(${result} ${builddir}) +endmacro() \ No newline at end of file diff --git a/HySoP/CMake/ParmesTests.cmake b/HySoP/CMake/ParmesTests.cmake index 870ccb76e89b9db3ca780aad779c6cf4e81fd1d9..28ebbc4f39c0aabae4f7a737cf01bf6e4d1c13d5 100644 --- a/HySoP/CMake/ParmesTests.cmake +++ b/HySoP/CMake/ParmesTests.cmake @@ -1,5 +1,3 @@ -#configure_file(CTestCustom.ctest.in CTestCustom.ctest) -#add_test(NAME parmepy_test COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/BUILD_MAIN_PYTEST) enable_testing() find_python_module(pytest REQUIRED) @@ -23,16 +21,22 @@ if(WITH_GPU) ${py_src_dirs} gpu) endif() -### JM : Bub, GLOB_RECURSE utilse les chemins relatifs avec ../ -# foreach(testdir ${py_src_dirs}) -# file(GLOB_RECURSE py_test_files "${test_dir}" RELATIVE_PATH parmepy/*/test_*.py) -# endforeach() +# Set test dir to python build dir. +set(testDir ${CMAKE_BINARY_DIR}/build/${${PROJECT_NAME}_PYTHON_BUILD_DIR}) ## Build a list of test_*.py files for each directory of parmepy/${py_src_dirs} set(py_test_files) foreach(testdir ${py_src_dirs}) - file(GLOB testfiles parmepy/${testdir}/tests/test_*.py) + file(GLOB testfiles RELATIVE ${CMAKE_SOURCE_DIR} parmepy/${testdir}/tests/test_*.py) set(py_test_files ${py_test_files} ${testfiles}) + # copy data files + file(GLOB datfiles parmepy/${testdir}/tests/*.dat) + file(GLOB mapfiles parmepy/${testdir}/tests/*.map) + set(datafiles ${mapfiles} ${datfiles}) + foreach(_F ${datafiles}) + get_filename_component(fname ${_F} NAME) + configure_file(${_F} ${CMAKE_CURRENT_BINARY_DIR}/dataForTests/${fname} COPYONLY) + endforeach() endforeach() ## Handling doctest in *.py files recursively for each directory of parmepy/${py_src_dirs} @@ -53,25 +57,19 @@ message(STATUS "=== TESTS === ") ## Add test_*.py files foreach(testfile ${py_test_files}) get_filename_component(testName ${testfile} NAME_WE) + set(testExe ${testDir}/${testfile}) message(STATUS "Add test ${testfile} ...") if(FULL_TEST) - add_test(NAME ${testName} COMMAND py.test -v --pep8 ${testfile}) + add_test(NAME ${testName} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/dataForTests COMMAND py.test -v --pep8 ${testExe}) else() - add_test(${testName} py.test -v ${testfile}) + add_test(NAME ${testName} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/dataForTests COMMAND py.test -v ${testExe}) endif() endforeach() -## Add files containing doctests +# Add files containing doctests + foreach(testfile ${py_doctest_files}) get_filename_component(testName ${testfile} NAME_WE) message(STATUS "Add test from doc doctest_${testName} ...") add_test("doctest_${testName}" py.test -v ${testfile}) endforeach() message(STATUS "===") - - -#add_test(NAME topology COMMAND ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} 4 py.test -v ${CMAKE_SOURCE_DIR}/parmepy/mpi/tests/test_topology.py) -# add_test(NAME topology COMMAND ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} 1 py.test -v ${CMAKE_SOURCE_DIR}/parmepy/mpi/tests/test_topology.py) -# add_test(topology py.test -v ${CMAKE_SOURCE_DIR}/parmepy/mpi/tests/test_topology.py) - - - diff --git a/HySoP/CMakeLists.txt b/HySoP/CMakeLists.txt index 94648f14f6502dc6a9f24710fa9a3b188ca2e4df..cc669d2a9a5f1d6da3f91f9d13303463d4087041 100644 --- a/HySoP/CMakeLists.txt +++ b/HySoP/CMakeLists.txt @@ -14,7 +14,6 @@ # LJK-CNRS, F. Pérignon, june 2012 # #=============================================================================== - # ============= Global cmake Settings ============= # Set minimum version for cmake cmake_minimum_required(VERSION 2.8.7) @@ -41,7 +40,7 @@ option(WITH_MAIN_FORTRAN "Create an executable (test purpose) from fortran sourc option(DEBUG "Enable debug mode for Parmes (0:disabled, 1:verbose, 2:trace, 3:verbose+trace). Default = 0" 0) option(FULL_TEST "Enable all test options (pep8 ...) - Default = OFF" OFF) option(PROFILE "Enable profiling mode for Parmes. 0:disabled, 1: enabled. Default = 0" 0) - +option(USER_INSTALL "Set install location to python default (equivalent to --user option in python setup). Default = ON" ON) if(NOT WITH_LIB_FORTRAN) message(WARNING "You deactivate libparmes (fortran) generation. This will disable fftw and scales fonctionnalities.") set(WITH_FFTW "OFF") @@ -49,6 +48,18 @@ if(NOT WITH_LIB_FORTRAN) set(WITH_MAIN_FORTRAN "OFF") endif() + +## About install : +# if : +# 1 - cmake ... ==> install in site.USER_SITE of python (equivalent to python setup.py install --user) +# 2 - cmake -DUSER_INSTALL=OFF ... ==> install in cmake default location (/usr/local on linux system) +# 3 cmake -DCMAKE_INSTALL_PREFIX = some_path ==> install in some_path +# Note that case 2 and 3 require a proper set of PYTHONPATH environment var for parmepy to work. +if(USER_INSTALL) + # Unset CMAKE_INSTALL_PREFIX to allow user to reset it and to use python default (--user) rather than cmake default. + set(CMAKE_INSTALL_PREFIX "" CACHE PATH "install path") +endif() + # We can not run scales or fftw without mpi ... if(WITH_FFTW OR WITH_SCALES) set(USE_MPI "ON") @@ -96,12 +107,26 @@ find_python_module(numpy REQUIRED) find_python_module(scitools REQUIRED) find_python_module(evtk) -#Install dir for python (default = --user) +if(USER_INSTALL) + ## INSTALL PREFIX not provided by user (-DCMAKE_INSTALL_PREFIX=...) + if(NOT CMAKE_INSTALL_PREFIX) + set(PYTHON_USER_INSTALL ON) + ## Setup for install dir (default = equivalent to python setup.py install--user) + # get --user output location + execute_process( + COMMAND ${PYTHON_EXECUTABLE} -c "import site ; print site.USER_SITE" + OUTPUT_VARIABLE ${PROJECT_NAME}_INSTALL_DIR) + string(STRIP ${${PROJECT_NAME}_INSTALL_DIR} ${PROJECT_NAME}_INSTALL_DIR) + # If CMAKE_INSTALL_PREFIX not set by user ... + set(CMAKE_INSTALL_PREFIX ${${PROJECT_NAME}_INSTALL_DIR}/${PROJECT_NAME}) + endif() +endif() +# +#Get build dir for python execute_process( - COMMAND ${PYTHON_EXECUTABLE} -c "import site ; print site.USER_SITE" - OUTPUT_VARIABLE ${PROJECT_NAME}_INSTALL_DIR) -string(STRIP ${${PROJECT_NAME}_INSTALL_DIR} ${PROJECT_NAME}_INSTALL_DIR) -set(CMAKE_INSTALL_PREFIX ${${PROJECT_NAME}_INSTALL_DIR}/${PROJECT_NAME}) + COMMAND ${PYTHON_EXECUTABLE} -c "import distutils.util as ut ; import distutils.sysconfig as sy; print 'lib.'+ut.get_platform()+'-'+sy.get_python_version()" + OUTPUT_VARIABLE ${PROJECT_NAME}_PYTHON_BUILD_DIR) +string(STRIP ${${PROJECT_NAME}_PYTHON_BUILD_DIR} ${PROJECT_NAME}_PYTHON_BUILD_DIR) # --- OpenCL --- if(WITH_GPU) @@ -139,12 +164,18 @@ add_custom_target(python-build ALL COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMENT "build parmepy package") # To install python package AND parmes library and modules +if(PYTHON_USER_INSTALL) + set(install-opt "--user") +else() + set(install-opt "--prefix=${CMAKE_INSTALL_PREFIX}") +endif() if(WITH_LIB_FORTRAN) - add_custom_target(python-install COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/setup.py install --user config_fc --f90exec=${CMAKE_Fortran_COMPILER} + add_custom_target(python-install COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/setup.py install ${install-opt} config_fc --f90exec=${CMAKE_Fortran_COMPILER} COMMAND make install WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMENT "build/install parmepy package") else() - add_custom_target(python-install COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/setup.py install --user config_fc --f90exec=${CMAKE_Fortran_COMPILER} + add_custom_target(python-install COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/setup.py install ${install-opt} config_fc --f90exec=${CMAKE_Fortran_COMPILER} + COMMAND make install WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMENT "build/install parmepy package") endif() @@ -162,7 +193,6 @@ add_custom_target(pyclean COMMAND rm -f ${PYCFILES} # Target to generate doxygen documentation # Documentation generation - find_package(Doxygen) if(DOXYGEN_FOUND) configure_file(${CMAKE_SOURCE_DIR}/DoxyConf/parmes.doxyfile.in ${CMAKE_BINARY_DIR}/DoxyConf/parmes.doxyfile) @@ -210,13 +240,14 @@ if(VERBOSE_MODE) message(STATUS " Python version :${PYTHON_VERSION_STRING}") message(STATUS " Python executable : ${PYTHON_EXECUTABLE}") message(STATUS " Python libraries : ${PYTHON_LIBRARIES}") - message(STATUS " Compiler : ${CMAKE_Fortran_COMPILER}") + message(STATUS " Fortran compiler : ${CMAKE_Fortran_COMPILER}") message(STATUS " Sources are in : ${CMAKE_SOURCE_DIR}") message(STATUS " Project uses MPI : ${USE_MPI}") message(STATUS " Project uses Scales : ${WITH_SCALES}") message(STATUS " Project uses FFTW : ${WITH_FFTW}") message(STATUS " Project uses GPU : ${WITH_GPU}") - message(STATUS " Python packages will be installed in ${${PROJECT_NAME}_INSTALL_DIR}") + message(STATUS " Project will be built in ${${PROJECT_NAME}_PYTHON_BUILD_DIR}.") + message(STATUS " Python packages will be installed in ${CMAKE_INSTALL_PREFIX}") message(STATUS " ${PROJECT_NAME} debug mode : ${DEBUG}") message(STATUS "====================== ======= ======================") endif() diff --git a/HySoP/hysop/__init__.py.in b/HySoP/hysop/__init__.py.in index f7b7f0808d8f1161fadf834514eb35c315f66120..46a9e821b76e1758573773387d4989094b416901 100755 --- a/HySoP/hysop/__init__.py.in +++ b/HySoP/hysop/__init__.py.in @@ -51,3 +51,9 @@ Field = fields.continuous.Field ## from tools.explore_hardware import explore + +if("@WITH_TEST@" is "ON"): + import pytest + @pytest.fixture(autouse=True) + def parmetest(): + monkeypatch.setenv("PYTHONPATH", "@testDir@") diff --git a/HySoP/setup.py.in b/HySoP/setup.py.in index da4ce475efc9cbf9d4370ab57bd971ccaf3cfa5e..8d822a6c1db46b44fffaadbebb77791d8f45a007 100644 --- a/HySoP/setup.py.in +++ b/HySoP/setup.py.in @@ -26,11 +26,23 @@ packages = ['parmepy', 'parmepy.numerics.remeshing', ] +packages_for_tests = ['parmepy.domain.tests', + 'parmepy.fields.tests', + 'parmepy.operator.tests', + 'parmepy.tools.tests', + 'parmepy.problem.tests', + ] + if("@USE_MPI@" is "ON"): packages.append('parmepy.mpi') + packages_for_tests.append('parmepy.mpi') if("@WITH_GPU@" is "ON"): packages.append('parmepy.gpu') + packages_for_tests.append('parmepy.gpu') + +if("@WITH_TESTS@" is "ON"): + packages = packages + packages_for_tests # Enable this to get debug info DISTUTILS_DEBUG=1 @@ -109,4 +121,5 @@ config = Configuration(name=name, data_files=data_files, ) + setup(**config.todict())