#                                               -*- cmake -*-

add_definitions ( ${OPENTURNS_SWIG_DEFINITIONS} )

# generate SWIG runtime header
set ( SWIG_PYTHON_OPTIONS "-python" )
add_custom_command ( OUTPUT  ${CMAKE_CURRENT_BINARY_DIR}/swig_runtime.hxx
                     COMMAND ${SWIG_EXECUTABLE}
                     ARGS ${SWIG_PYTHON_OPTIONS} ${CMAKE_SWIG_FLAGS} ${OPENTURNS_SWIG_DEFINITIONS} -external-runtime ${CMAKE_CURRENT_BINARY_DIR}/swig_runtime.hxx
                     COMMENT "Swig header" )
add_custom_target ( generate_swig_runtime DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/swig_runtime.hxx )
add_custom_target ( generate_docstrings )

include_directories ( ${CMAKE_CURRENT_BINARY_DIR} )

include_directories ( ${INTERNAL_INCLUDE_DIRS} )
include_directories ( ${CMAKE_CURRENT_SOURCE_DIR} )

set ( OPENTURNS_PYTHON_MODULES )
macro ( ot_add_python_module MODULENAME SOURCEFILE )
  set_source_files_properties ( ${SOURCEFILE} PROPERTIES CPLUSPLUS ON )
  set_source_files_properties ( ${SOURCEFILE} PROPERTIES SWIG_MODULE_NAME ${MODULENAME} )
  ot_install_swig_file ( ${SOURCEFILE} )
  if ( ${ARGC} GREATER 2 )
    set ( SWIG_MODULE_${MODULENAME}_EXTRA_DEPS ${ARGN} )
    list ( APPEND SWIG_MODULE_${MODULENAME}_EXTRA_DEPS PythonWrappingFunctions.hxx )
  endif ()

  set ( swig_other_sources )
  foreach ( it ${ARGN} )
    if ( ${it} MATCHES ".*\\.i$" )
      ot_install_swig_file ( ${it} )
    elseif(${it} MATCHES ".*_doc\\.i\\.in$")
     # handle docstring generation
      set (DOCSTRING_IN_FILE ${CMAKE_CURRENT_SOURCE_DIR}/${it})
      get_filename_component ( DOCSTRING_FILE_BASENAME ${DOCSTRING_IN_FILE} NAME_WE )
      add_custom_target ( generate_${DOCSTRING_FILE_BASENAME}
                          COMMAND ${CMAKE_COMMAND} -DDOCSTRING_IN_FILE=${DOCSTRING_IN_FILE} -DDOCSTRING_FILE=${CMAKE_CURRENT_BINARY_DIR}/${DOCSTRING_FILE_BASENAME}.i -P ${CMAKE_SOURCE_DIR}/cmake/escape_backslash_x4.cmake
                          DEPENDS ${DOCSTRING_IN_FILE} )
      add_dependencies ( generate_docstrings generate_${DOCSTRING_FILE_BASENAME} )
      list ( APPEND SWIGFILES ${CMAKE_CURRENT_BINARY_DIR}/${DOCSTRING_FILE_BASENAME}.i )
    else ()
      list ( APPEND swig_other_sources "${it}" )
    endif ()
  endforeach ()

  # workaround for a bug in UseSWIG script not supporting multiple modules and parallel compilation
  # http://www.cmake.org/pipermail/cmake/2011-January/042345.html
  if ( CMAKE_VERSION VERSION_LESS 2.8.5 )
    set( swig_extra_generated_files )
  endif ()

  swig_add_module ( ${MODULENAME} python ${SOURCEFILE} ${swig_other_sources} )

  add_dependencies ( ${SWIG_MODULE_${MODULENAME}_REAL_NAME} generate_swig_runtime generate_docstrings )
  swig_link_libraries ( ${MODULENAME} OT )

  if ( LINK_PYTHON_LIBRARY )
    swig_link_libraries ( ${MODULENAME} ${PYTHON_LIBRARIES} )
  endif ()

  set_target_properties ( ${SWIG_MODULE_${MODULENAME}_REAL_NAME} PROPERTIES NO_SONAME ON )

  list ( APPEND OPENTURNS_PYTHON_MODULES ${MODULENAME} )
endmacro ( ot_add_python_module )

install ( FILES PythonNumericalMathEvaluationImplementation.hxx
                PythonNumericalMathGradientImplementation.hxx
                PythonNumericalMathHessianImplementation.hxx
                PythonDynamicalFunctionImplementation.hxx
                PythonRandomVectorImplementation.hxx
                PythonDistributionImplementation.hxx
                PythonWrappingFunctions.hxx
          DESTINATION ${OPENTURNS_INCLUDE_PATH}
        )

if ( LIBXML2_FOUND )
  list ( APPEND SWIG_MODULE_common_EXTRA_FLAGS -DOPENTURNS_HAVE_LIBXML2=1 )
endif ()
if ( MUPARSER_FOUND )
  list ( APPEND SWIG_MODULE_func_EXTRA_FLAGS -DOPENTURNS_HAVE_MUPARSER=1 )
endif ()
ot_add_python_module( common common_module.i
                      OTtypes.i
                      OTexceptions.i
                      Memory.i
                      Object.i Object_doc.i.in
                      PersistentObject.i PersistentObject_doc.i.in
                      Study.i
                      StorageManager.i
                      XMLStorageManager.i
                      Log.i
                      TTY.i
                      Path.i
                      Catalog.i
                      ResourceMap.i ResourceMap_doc.i.in
                      ComparisonOperatorImplementation.i
                      ComparisonOperator.i
                      Equal.i
                      Greater.i
                      GreaterOrEqual.i
                      Less.i
                      LessOrEqual.i
                      Cache.i
                      PlatformInfo.i
                      SharedPointer.i
                      Pointer.i
                      InterfaceObject.i InterfaceObject_doc.i.in
                      TypedInterfaceObject.i
                      TypedCollectionInterfaceObject.i
                      BaseCommonTemplateDefs.i
                    )

ot_add_python_module( wrapper wrapper_module.i
                      Collection.i
                      WrapperData.i
                      WrapperFile.i
                      BaseWrapperTemplateDefs.i
                    )

ot_add_python_module( typ typ_module.i
                      PersistentCollection.i
                      Description.i
                      NumericalPoint.i NumericalPoint_doc.i.in
                      NumericalPointWithDescription.i
                      DomainImplementation.i DomainImplementation_doc.i.in
                      Interval.i Interval_doc.i.in
                      Indices.i
                      MatrixImplementation.i
                      Matrix.i Matrix_doc.i.in
                      SquareMatrix.i SquareMatrix_doc.i.in
                      SymmetricMatrix.i SymmetricMatrix_doc.i.in
                      TensorImplementation.i
                      Tensor.i
                      SymmetricTensor.i
                      ComplexTensorImplementation.i
                      ComplexTensor.i ComplexTensor_doc.i.in
                      ComplexMatrixImplementation.i
                      ComplexMatrix.i
                      HermitianMatrix.i
                      SquareComplexMatrix.i SquareComplexMatrix_doc.i.in
                      TriangularMatrix.i
                      TriangularComplexMatrix.i
                      CovarianceMatrix.i CovarianceMatrix_doc.i.in
                      CorrelationMatrix.i
                      IdentityMatrix.i
                      NumericalSample.i NumericalSample_doc.i.in
                      HistoryStrategyImplementation.i
                      HistoryStrategy.i
                      BaseTypTemplateDefs.i
                    )

ot_add_python_module( statistics statistics_module.i
                      LevelSet.i LevelSet_doc.i.in
                      Compact.i
                      Full.i
                      Last.i
                      Null.i
                      ConfidenceInterval.i
                      LinearModel.i
                      LinearModelFactory.i
                      TestResult.i TestResult_doc.i.in
                      RandomGenerator.i
                      RandomGeneratorState.i
                      CorrelationAnalysis.i
                      SensitivityAnalysis.i
                      LowDiscrepancySequenceImplementation.i LowDiscrepancySequenceImplementation_doc.i.in
                      LowDiscrepancySequence.i LowDiscrepancySequence_doc.i.in
                      SobolSequence.i
                      FaureSequence.i
                      HaltonSequence.i
                      HaselgroveSequence.i
                      ReverseHaltonSequence.i
                      SecondOrderModelImplementation.i
                      SecondOrderModel.i
                      ExponentialCauchy.i
                      SphericalModel.i
                      FilteringWindowsImplementation.i
                      FilteringWindows.i
                      Hamming.i
                      Hanning.i
                      FFTImplementation.i FFTImplementation_doc.i.in
                      FFT.i FFT_doc.i.in
                      SpectralModelImplementation.i
                      SpectralModel.i
                      CovarianceModelImplementation.i CovarianceModelImplementation_doc.i.in
                      CovarianceModel.i CovarianceModel_doc.i.in
                      StationaryCovarianceModel.i
                      SpectralModelFactoryImplementation.i
                      SpectralModelFactory.i
                      UserDefinedSpectralModel.i
                      WelchFactory.i
                      ExponentialModel.i
                      ExponentiallyDampedCosineModel.i
                      CauchyModel.i
                      CovarianceModelFactoryImplementation.i
                      CovarianceModelFactory.i
                      UserDefinedCovarianceModel.i
                      UserDefinedStationaryCovarianceModel.i
                      StationaryCovarianceModelFactory.i
                      NonStationaryCovarianceModelFactory.i
                      SquaredExponential.i SquaredExponential_doc.i.in
                      GeneralizedExponential.i
                      AbsoluteExponential.i
                      MaternModel.i
                      ProductCovarianceModel.i
                      BaseStatisticsTemplateDefs.i
                    )

ot_add_python_module( geom geom_module.i
                      Domain.i Domain_doc.i.in
                      Mesh.i Mesh_doc.i.in
                      RegularGrid.i
                      MeshFactoryImplementation.i
                      MeshFactory.i
                      IntervalMesher.i
                      BaseGeomTemplateDefs.i
                     )

ot_add_python_module( graph graph_module.i
                      DrawableImplementation.i DrawableImplementation_doc.i.in
                      Drawable.i Drawable_doc.i.in
                      GraphImplementation.i
                      Graph.i Graph_doc.i.in
                      BarPlot.i
                      Cloud.i
                      Contour.i
                      Curve.i
                      Pairs.i
                      Pie.i
                      Polygon.i
                      PolygonArray.i
                      Staircase.i
                      BaseGraphTemplateDefs.i
                    )

ot_add_python_module( func func_module.i
                      EnumerateFunction.i EnumerateFunction_doc.i.in
                      EnumerateFunctionImplementation.i EnumerateFunctionImplementation_doc.i.in
                      LinearEnumerateFunction.i LinearEnumerateFunction_doc.i.in
                      HyperbolicAnisotropicEnumerateFunction.i
                      FieldImplementation.i
                      Field.i
                      ProcessSample.i
                      TimeSeries.i
                      SpecFunc.i
                      NumericalMathEvaluationImplementation.i
                      NumericalMathGradientImplementation.i
                      NumericalMathHessianImplementation.i
                      NoNumericalMathEvaluationImplementation.i
                      NoNumericalMathGradientImplementation.i
                      NoNumericalMathHessianImplementation.i
                      LinearNumericalMathEvaluationImplementation.i
                      LinearNumericalMathGradientImplementation.i
                      QuadraticNumericalMathEvaluationImplementation.i
                      ConstantNumericalMathGradientImplementation.i
                      ConstantNumericalMathHessianImplementation.i
                      ComputedNumericalMathEvaluationImplementation.i
                      ComputedNumericalMathGradientImplementation.i
                      ComputedNumericalMathHessianImplementation.i
                      ComposedNumericalMathEvaluationImplementation.i
                      ComposedNumericalMathGradientImplementation.i
                      ComposedNumericalMathHessianImplementation.i
                      DualLinearCombinationEvaluationImplementation.i
                      DualLinearCombinationGradientImplementation.i
                      DualLinearCombinationHessianImplementation.i
                      LinearCombinationEvaluationImplementation.i
                      LinearCombinationGradientImplementation.i
                      LinearCombinationHessianImplementation.i
                      ProductNumericalMathEvaluationImplementation.i
                      ProductNumericalMathGradientImplementation.i
                      ProductNumericalMathHessianImplementation.i
                      NumericalMathFunctionImplementation.i
                      ComposedNumericalMathFunction.i
                      ProductNumericalMathFunction.i
                      NumericalMathFunction.i NumericalMathFunction_doc.i.in
                      BaseFuncCollection.i
                      DynamicalFunctionImplementation.i DynamicalFunctionImplementation_doc.i.in
                      DynamicalFunction.i DynamicalFunction_doc.i.in
                      SpatialFunction.i SpatialFunction_doc.i.in
                      TemporalFunction.i TemporalFunction_doc.i.in
                      LinearNumericalMathFunction.i
                      QuadraticNumericalMathFunction.i
                      UniVariatePolynomialImplementation.i UniVariatePolynomialImplementation_doc.i.in
                      UniVariatePolynomial.i UniVariatePolynomial_doc.i.in
                      AggregatedNumericalMathEvaluationImplementation.i
                      AnalyticalNumericalMathEvaluationImplementation.i
                      AnalyticalNumericalMathGradientImplementation.i
                      AnalyticalNumericalMathHessianImplementation.i
                      DatabaseNumericalMathEvaluationImplementation.i
                      IndicatorNumericalMathEvaluationImplementation.i
                      PiecewiseLinearEvaluationImplementation.i
                      PiecewiseHermiteEvaluationImplementation.i
                      ProductPolynomialEvaluationImplementation.i
                      ParametricEvaluationImplementation.i
                      ParametricGradientImplementation.i
                      ParametricHessianImplementation.i
                      BasisImplementation.i BasisImplementation_doc.i.in
                      Basis.i Basis_doc.i.in
                      BasisSequenceImplementation.i
                      BasisSequence.i
                      BasisSequenceFactoryImplementation.i
                      BasisSequenceFactory.i
                      LAR.i
                      BoxCoxEvaluationImplementation.i
                      BoxCoxTransform.i
                      InverseBoxCoxEvaluationImplementation.i
                      PythonNumericalMathEvaluationImplementation.cxx
                      PythonNumericalMathGradientImplementation.cxx
                      PythonNumericalMathHessianImplementation.cxx
                      PythonDynamicalFunctionImplementation.cxx
                      InverseBoxCoxTransform.i
                      TrendEvaluationImplementation.i
                      TrendTransform.i
                      InverseTrendEvaluationImplementation.i
                      InverseTrendTransform.i
                      FunctionalBasis.i
                      FunctionalBasisImplementation.i
                      BasisFactory.i
                      ConstantBasisFactory.i
                      LinearBasisFactory.i
                      QuadraticBasisFactory.i
                      BaseFuncTemplateDefs.i
                    )

ot_add_python_module( diff diff_module.i
                      FiniteDifferenceStepImplementation.i
                      FiniteDifferenceStep.i
                      ConstantStep.i
                      BlendedStep.i
                      FiniteDifferenceGradient.i
                      FiniteDifferenceHessian.i
                      CenteredFiniteDifferenceGradient.i
                      CenteredFiniteDifferenceHessian.i
                      NonCenteredFiniteDifferenceGradient.i
                      BaseDiffTemplateDefs.i
                     )

ot_add_python_module( optim optim_module.i
                      BoundConstrainedAlgorithmImplementationResult.i
                      BoundConstrainedAlgorithmImplementation.i
                      BoundConstrainedAlgorithm.i
                      NearestPointAlgorithmImplementationResult.i
                      NearestPointAlgorithmImplementation.i
                      NearestPointAlgorithm.i
                      NearestPointCheckerResult.i
                      NearestPointChecker.i
                      AbdoRackwitzSpecificParameters.i
                      AbdoRackwitz.i
                      CobylaSpecificParameters.i
                      Cobyla.i
                      TNCSpecificParameters.i
                      TNC.i
                      SQPSpecificParameters.i
                      SQP.i
                      BaseOptimTemplateDefs.i
                    )

ot_add_python_module( solver solver_module.i
                      SolverImplementation.i
                      Solver.i
                      Bisection.i
                      Secant.i
                      Brent.i
                      ODESolverImplementation.i
                      ODESolver.i
                      RungeKutta.i
                      BaseSolverTemplateDefs.i
                    )

ot_add_python_module( algo algo_module.i
                      ApproximationAlgorithmImplementation.i
                      ApproximationAlgorithmImplementationFactory.i
                      ApproximationAlgorithm.i
                      ClassifierImplementation.i
                      Classifier.i
                      FittingAlgorithmImplementation.i
                      FittingAlgorithm.i
                      CorrectedLeaveOneOut.i
                      KDTree.i
                      KFold.i
                      LeastSquaresMetaModelSelection.i
                      LeastSquaresMetaModelSelectionFactory.i
                      PenalizedLeastSquaresAlgorithm.i
                      PenalizedLeastSquaresAlgorithmFactory.i
                      PythonNumericalMathEvaluationImplementation.cxx
                      PythonNumericalMathGradientImplementation.cxx
                      PythonNumericalMathHessianImplementation.cxx
                      KissFFT.i
                      IntegrationAlgorithmImplementation.i
                      IntegrationAlgorithm.i
                      GaussKronrodRule.i
                      GaussKronrod.i
                      ExpertMixture.i
                      BaseAlgoTemplateDefs.i
                    )

ot_add_python_module( experiment experiment_module.i
                      ExperimentImplementation.i ExperimentImplementation_doc.i.in
                      StratifiedExperiment.i
                      Experiment.i Experiment_doc.i.in
                      Axial.i
                      Composite.i
                      Factorial.i
                      Box.i
                      CombinatorialGeneratorImplementation.i
                      CombinatorialGenerator.i
                      Combinations.i
                      KPermutations.i
                      Tuples.i
                      BaseExperimentTemplateDefs.i
                    )

ot_add_python_module( base base_module.i
                      BaseTemplateDefs.i
                    )

ot_add_python_module( model_copula model_copula_module.i
                      DistributionImplementation.i DistributionImplementation_doc.i.in
                      DistributionImplementationFactory.i
                      Distribution.i Distribution_doc.i.in
                      DistributionFactory.i
                      ContinuousDistribution.i
                      EllipticalDistribution.i
                      DiscreteDistribution.i
                      CopulaImplementation.i
                      Copula.i
                      ArchimedeanCopula.i
                      SklarCopula.i
                      IndependentCopula.i
                      MinCopula.i
                      NormalCopula.i
                      NormalCopulaFactory.i
		      OrdinalSumCopula.i OrdinalSumCopula_doc.i.in
                      FarlieGumbelMorgensternCopula.i
                      FarlieGumbelMorgensternCopulaFactory.i
                      AliMikhailHaqCopula.i
                      AliMikhailHaqCopulaFactory.i
                      FrankCopula.i
                      FrankCopulaFactory.i
                      ClaytonCopula.i
                      ClaytonCopulaFactory.i
                      GumbelCopula.i
                      GumbelCopulaFactory.i
                      ComposedDistribution.i
                      ComposedCopula.i
                      PythonDistributionImplementation.cxx
                      UncertaintyModelCopulaCollection.i
                      UncertaintyModelCopulaTemplateDefs.i
                    )

ot_add_python_module( randomvector randomvector_module.i
                      RandomVectorImplementation.i RandomVectorImplementation_doc.i.in
                      ConstantRandomVector.i
                      UsualRandomVector.i
                      UncertaintyRandomVectorTemplateDefs.i
                    )

ot_add_python_module( model_process model_process_module.i
                      ProcessImplementation.i ProcessImplementation_doc.i.in
                      Process.i Process_doc.i.in
                      WhiteNoise.i
                      RandomWalk.i
                      ARMACoefficients.i
                      ARMAState.i
                      ARMA.i
                      SpectralNormalProcess.i
                      TemporalNormalProcess.i TemporalNormalProcess_doc.i.in
                      AggregatedProcess.i
                      CompositeProcess.i
                      FunctionalBasisProcess.i
                      ARMAFactoryImplementation.i
                      WhittleFactory.i
                      WhittleFactoryState.i
                      ARMALikelihoodFactory.i    
                      ARMAFactory.i
                      UncertaintyProcessTemplateDefs.i
                    )

ot_add_python_module( dist_bundle1 dist_bundle1_module.i
                      DistFunc.i
                      Arcsine.i Arcsine_doc.i.in
                      ArcsineFactory.i
                      BayesDistribution.i BayesDistribution_doc.i.in
                      Bernoulli.i Bernoulli_doc.i.in
                      BernoulliFactory.i
                      Beta.i Beta_doc.i.in
                      BetaFactory.i
                      Binomial.i Binomial_doc.i.in
                      BinomialFactory.i
                      Burr.i Burr_doc.i.in
                      BurrFactory.i
                      ChiSquare.i ChiSquare_doc.i.in
                      ChiSquareFactory.i
                      Chi.i Chi_doc.i.in
                      ChiFactory.i
                      CompositeDistribution.i CompositeDistribution_doc.i.in
                      ConditionalDistribution.i ConditionalDistribution_doc.i.in
                      Dirac.i Dirac_doc.i.in
                      DiracFactory.i
                      Dirichlet.i Dirichlet_doc.i.in
                      DirichletFactory.i
                      Epanechnikov.i Epanechnikov_doc.i.in
                      Exponential.i Exponential_doc.i.in
                      ExponentialFactory.i
                      FisherSnedecor.i FisherSnedecor_doc.i.in
                      FisherSnedecorFactory.i
                      Gamma.i Gamma_doc.i.in
                      GammaFactory.i
                      GeneralizedPareto.i GeneralizedPareto_doc.i.in
                      GeneralizedParetoFactory.i
                      Geometric.i Geometric_doc.i.in
                      GeometricFactory.i
                      Gumbel.i Gumbel_doc.i.in
                      GumbelFactory.i
                    )

ot_add_python_module( dist_bundle2 dist_bundle2_module.i
                      HistogramPair.i
                      Histogram.i Histogram_doc.i.in
                      HistogramFactory.i
                      InverseChiSquare.i InverseChiSquare_doc.i.in
                      InverseGamma.i InverseGamma_doc.i.in
                      InverseNormal.i InverseNormal_doc.i.in
                      InverseNormalFactory.i
                      InverseWishart.i
                      KPermutationsDistribution.i KPermutationsDistribution_doc.i.in
                      KernelMixture.i
                      KernelSmoothing.i
                      Laplace.i Laplace_doc.i.in
                      LaplaceFactory.i
                      Logistic.i Logistic_doc.i.in
                      LogisticFactory.i
                      LogNormal.i LogNormal_doc.i.in
                      LogNormalFactory.i
                      LogUniform.i LogUniform_doc.i.in
                      LogUniformFactory.i
                      MaximumEntropyOrderStatisticsDistribution.i MaximumEntropyOrderStatisticsDistribution_doc.i.in
                      MaximumEntropyOrderStatisticsCopula.i MaximumEntropyOrderStatisticsCopula_doc.i.in
                      MeixnerDistribution.i MeixnerDistribution_doc.i.in
                      MeixnerDistributionFactory.i
                      Mixture.i
                      Multinomial.i Multinomial_doc.i.in
                      MultinomialFactory.i
                      NegativeBinomial.i NegativeBinomial_doc.i.in
                      NegativeBinomialFactory.i
                      NonCentralChiSquare.i NonCentralChiSquare_doc.i.in
                      NonCentralStudent.i NonCentralStudent_doc.i.in
                      Normal.i Normal_doc.i.in
                      NormalFactory.i
                      NormalGamma.i NormalGamma_doc.i.in
                    )

ot_add_python_module( dist_bundle3 dist_bundle3_module.i
                      Poisson.i Poisson_doc.i.in
                      PoissonFactory.i
                      PosteriorDistribution.i
                      ProductDistribution.i ProductDistribution_doc.i.in
                      RandomMixture.i RandomMixture_doc.i.in
                      Rayleigh.i Rayleigh_doc.i.in
                      RayleighFactory.i
                      Rice.i Rice_doc.i.in
                      RiceFactory.i
                      Skellam.i Skellam_doc.i.in
                      SkellamFactory.i
                      Student.i Student_doc.i.in
                      StudentFactory.i
                      Trapezoidal.i Trapezoidal_doc.i.in
                      TrapezoidalFactory.i
                      Triangular.i Triangular_doc.i.in
                      TriangularFactory.i
                      TruncatedDistribution.i
                      TruncatedNormal.i TruncatedNormal_doc.i.in
                      TruncatedNormalFactory.i
                      Uniform.i Uniform_doc.i.in
                      UniformFactory.i
                      UserDefined.i UserDefined_doc.i.in
                      UserDefinedPair.i
                      UserDefinedFactory.i
                      Weibull.i Weibull_doc.i.in
                      WeibullFactory.i
                      Wishart.i
                      ZipfMandelbrot.i ZipfMandelbrot_doc.i.in
                      UncertaintyDistTemplateDefs.i
                    )

ot_add_python_module( bayesian bayesian_module.i
                      CalibrationStrategyImplementation.i CalibrationStrategyImplementation_doc.i.in
                      CalibrationStrategy.i CalibrationStrategy_doc.i.in
                      SamplerImplementation.i SamplerImplementation_doc.i.in
                      Sampler.i Sampler_doc.i.in
                      MCMC.i MCMC_doc.i.in
                      RandomWalkMetropolisHastings.i RandomWalkMetropolisHastings_doc.i.in
                      PosteriorRandomVector.i
                      ConditionalRandomVector.i ConditionalRandomVector_doc.i.in
                      UncertaintyBayesianTemplateDefs.i
                     )

ot_add_python_module( classification classification_module.i
                      MixtureClassifier.i
                      UncertaintyClassificationTemplateDefs.i
                    )

ot_add_python_module( weightedexperiment weightedexperiment_module.i
                      WeightedExperiment.i WeightedExperiment_doc.i.in
                      BootstrapExperiment.i
                      FixedExperiment.i
                      ImportanceSamplingExperiment.i
                      GaussProductExperiment.i
                      LHSExperiment.i LHSExperiment_doc.i.in
                      LowDiscrepancyExperiment.i
                      MonteCarloExperiment.i
                      UncertaintyWeightedExperimentTemplateDefs.i
                    )

ot_add_python_module( orthogonalbasis orthogonalbasis_module.i
                      OrthogonalUniVariatePolynomial.i OrthogonalUniVariatePolynomial_doc.i.in
                      OrthogonalUniVariatePolynomialFactory.i OrthogonalUniVariatePolynomialFactory_doc.i.in
                      CharlierFactory.i CharlierFactory_doc.i.in
                      HermiteFactory.i HermiteFactory_doc.i.in
                      JacobiFactory.i JacobiFactory_doc.i.in
                      KrawtchoukFactory.i KrawtchoukFactory_doc.i.in
                      LaguerreFactory.i LaguerreFactory_doc.i.in
                      LegendreFactory.i LegendreFactory_doc.i.in
                      MeixnerFactory.i MeixnerFactory_doc.i.in
                      OrthogonalUniVariatePolynomialFamily.i OrthogonalUniVariatePolynomialFamily_doc.i.in
                      OrthonormalizationAlgorithmImplementation.i
                      OrthonormalizationAlgorithm.i
                      ChebychevAlgorithm.i
                      GramSchmidtAlgorithm.i
                      StandardDistributionPolynomialFactory.i StandardDistributionPolynomialFactory_doc.i.in
                      OrthogonalFunctionFactory.i OrthogonalFunctionFactory_doc.i.in
                      OrthogonalProductPolynomialFactory.i OrthogonalProductPolynomialFactory_doc.i.in
                      OrthogonalBasis.i OrthogonalBasis_doc.i.in
                      UncertaintyOrthogonalBasisTemplateDefs.i
                    )

ot_add_python_module( metamodel metamodel_module.i
                      MetaModelResult.i MetaModelResult_doc.i.in
                      MetaModelAlgorithm.i MetaModelAlgorithm_doc.i.in
                      KrigingResult.i KrigingResult_doc.i.in
                      MetaModelAlgorithm.i
                      LinearTaylor.i
                      QuadraticTaylor.i
                      LinearLeastSquares.i
                      QuadraticLeastSquares.i
                      AdaptiveStrategyImplementation.i
                      FixedStrategy.i
                      SequentialStrategy.i
                      CleaningStrategy.i
                      AdaptiveStrategy.i
                      ProjectionStrategyImplementation.i
                      LeastSquaresStrategy.i
                      IntegrationStrategy.i
                      ProjectionStrategy.i
                      FunctionalChaosResult.i FunctionalChaosResult_doc.i.in
                      FunctionalChaosAlgorithm.i FunctionalChaosAlgorithm_doc.i.in
                      KrigingAlgorithm.i KrigingAlgorithm_doc.i.in
                      RandomVector.i RandomVector_doc.i.in
                      PythonNumericalMathEvaluationImplementation.cxx
                      PythonNumericalMathGradientImplementation.cxx
                      PythonNumericalMathHessianImplementation.cxx
                      PythonRandomVectorImplementation.cxx
                      CompositeRandomVector.i
                      EventRandomVectorImplementation.i
                      EventDomainImplementation.i
                      EventProcess.i
                      Event.i Event_doc.i.in
                      StandardEvent.i
                      FunctionalChaosRandomVector.i
                      UncertaintyMetaModelTemplateDefs.i
                    )

ot_add_python_module( transformation transformation_module.i
                      MarginalTransformationEvaluation.i
                      MarginalTransformationGradient.i
                      MarginalTransformationHessian.i
                      NatafEllipticalCopulaEvaluation.i
                      NatafEllipticalCopulaGradient.i
                      NatafEllipticalCopulaHessian.i
                      InverseNatafEllipticalCopulaEvaluation.i
                      InverseNatafEllipticalCopulaGradient.i
                      InverseNatafEllipticalCopulaHessian.i
                      NatafIndependentCopulaEvaluation.i
                      NatafIndependentCopulaGradient.i
                      NatafIndependentCopulaHessian.i
                      InverseNatafIndependentCopulaEvaluation.i
                      InverseNatafIndependentCopulaGradient.i
                      InverseNatafIndependentCopulaHessian.i
                      NatafEllipticalDistributionEvaluation.i
                      NatafEllipticalDistributionGradient.i
                      NatafEllipticalDistributionHessian.i
                      InverseNatafEllipticalDistributionEvaluation.i
                      InverseNatafEllipticalDistributionGradient.i
                      InverseNatafEllipticalDistributionHessian.i
                      RosenblattEvaluation.i
                      InverseRosenblattEvaluation.i
                      BoxCoxFactory.i
                      TrendFactory.i
                      UncertaintyTransformationTemplateDefs.i
                    )

ot_add_python_module( analytical analytical_module.i
                      AnalyticalResult.i AnalyticalResult_doc.i.in
                      Analytical.i Analytical_doc.i.in
                      FORMResult.i
                      FORM.i
                      SORMResult.i
                      SORM.i
                      StrongMaximumTest.i
                      UncertaintyAnalyticalTemplateDefs.i
                    )

ot_add_python_module( simulation simulation_module.i
                      SimulationSensitivityAnalysis.i
                      SimulationResultImplementation.i SimulationResultImplementation_doc.i.in
                      SimulationResult.i SimulationResult_doc.i.in
                      Simulation.i Simulation_doc.i.in
                      PostAnalyticalSimulation.i
                      Wilks.i
                      MonteCarlo.i MonteCarlo_doc.i.in
                      LHS.i
                      RandomizedLHS.i
                      ImportanceSampling.i
                      PostAnalyticalControlledImportanceSampling.i
                      PostAnalyticalImportanceSampling.i
                      RootStrategyImplementation.i
                      RootStrategy.i
                      SamplingStrategyImplementation.i
                      SamplingStrategy.i
                      DirectionalSampling.i
                      OrthogonalDirection.i
                      RandomDirection.i
                      MediumSafe.i
                      RiskyAndFast.i
                      SafeAndSlow.i
                      QuasiMonteCarlo.i
                      RandomizedQuasiMonteCarlo.i
                      QuasiMonteCarloResult.i
                      UncertaintySimulationTemplateDefs.i
                     )

ot_add_python_module( stattests stattests_module.i
                      VisualTest.i VisualTest_doc.i.in
                      FittingTest.i FittingTest_doc.i.in
                      HypothesisTest.i
                      LinearModelTest.i
                      NormalityTest.i
                      DickeyFullerTest.i
                      UncertaintyStatTestsTemplateDefs.i
                     )

ot_add_python_module( uncertainty uncertainty_module.i
                      ANCOVA.i ANCOVA_doc.i.in
                      FAST.i FAST_doc.i.in
                      QuadraticCumul.i
                      UncertaintyTemplateDefs.i
                     )

ot_add_python_module( testing testing_module.i
                     )


foreach ( module ${OPENTURNS_PYTHON_MODULES} )
  install ( FILES ${CMAKE_CURRENT_BINARY_DIR}/${module}.py
            DESTINATION ${OPENTURNS_PYTHON_MODULE_PATH}/openturns
            )
  install ( TARGETS _${module}
            LIBRARY DESTINATION ${OPENTURNS_PYTHON_MODULE_PATH}/openturns
          )
endforeach ()

set (EXTRA_PYTHON_FILES __init__.py dist.py viewer.py coupling_tools.py)
install ( FILES ${EXTRA_PYTHON_FILES}
          DESTINATION ${OPENTURNS_PYTHON_MODULE_PATH}/openturns
        )

install ( FILES ${SWIGFILES}
          DESTINATION ${OPENTURNS_INCLUDE_PATH}/swig
        )

if (USE_SPHINX)
  find_program ( SPHINX_EXECUTABLE
                  NAMES sphinx-build
                  DOC "Sphinx Documentation Builder (sphinx-doc.org)"
                )

  if (SPHINX_EXECUTABLE AND MUPARSER_FOUND AND MATPLOTLIB_FOUND)

    # create a build site-package from which sphinx can import
    set (OPENTURNS_PYTHON_BUILD_MODULE_PATH ${CMAKE_CURRENT_BINARY_DIR}/site-packages)
    execute_process (COMMAND ${CMAKE_COMMAND} -E make_directory ${OPENTURNS_PYTHON_BUILD_MODULE_PATH}/openturns)
    foreach (module ${OPENTURNS_PYTHON_MODULES})
      execute_process (COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_CURRENT_BINARY_DIR}/${module}.py ${OPENTURNS_PYTHON_BUILD_MODULE_PATH}/openturns/${module}.py)
      # FIXME: get_target_property (suffix ${SWIG_MODULE_${module}_REAL_NAME} SUFFIX)
      execute_process (COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_CURRENT_BINARY_DIR}/_${module}.so ${OPENTURNS_PYTHON_BUILD_MODULE_PATH}/openturns/_${module}.so)
    endforeach ()
    foreach (file ${EXTRA_PYTHON_FILES})
      execute_process (COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_CURRENT_SOURCE_DIR}/${file} ${OPENTURNS_PYTHON_BUILD_MODULE_PATH}/openturns/${file})
    endforeach ()

    # sphinx configuration
    set (doc_formats)
    set (N_SPHINX_PROCESSES 1 CACHE STRING "The number of sphinx processes (-j <N>)")
    list (APPEND doc_formats html)
    list (APPEND doc_formats latex)
    list (APPEND doc_formats doctest)
    list (APPEND doc_formats qthelp)
    list (APPEND doc_formats devhelp)

    set (SPHINX_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/sphinx_build)
    set (SPHINX_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../doc)

    file (MAKE_DIRECTORY ${SPHINX_BINARY_DIR}/_static) # currently empty
    configure_file (${SPHINX_SOURCE_DIR}/conf.py.in ${SPHINX_BINARY_DIR}/conf.py @ONLY)

    # get sphinx sources
    file (GLOB_RECURSE sphinx_sources
      ${SPHINX_SOURCE_DIR}/*.rst
      ${SPHINX_SOURCE_DIR}/*.rst_t
      ${SPHINX_SOURCE_DIR}/*.css_t
      ${SPHINX_SOURCE_DIR}/*.conf
      ${SPHINX_SOURCE_DIR}/*.py
      ${SPHINX_SOURCE_DIR}/*.png
      ${SPHINX_SOURCE_DIR}/*.html
      ${SPHINX_SOURCE_DIR}/*.css
      ${SPHINX_SOURCE_DIR}/*.jpg
      ${SPHINX_SOURCE_DIR}/*.ico
      ${SPHINX_SOURCE_DIR}/*.sty
      ${SPHINX_SOURCE_DIR}/*.txt
      ${SPHINX_SOURCE_DIR}/*.in
    )

    # copy sphinx sources
    set (sphinx_clones)
    foreach (file ${sphinx_sources})
      if (EXISTS ${file})
        file ( RELATIVE_PATH rel_file ${SPHINX_SOURCE_DIR} ${file} )
        get_filename_component (rel_path ${rel_file} PATH)
        file (MAKE_DIRECTORY ${SPHINX_BINARY_DIR}/${rel_path})
        set (sphinx_clone ${SPHINX_BINARY_DIR}/${rel_file})
        add_custom_command (OUTPUT ${sphinx_clone}
          COMMAND ${CMAKE_COMMAND} -E copy ${file} ${sphinx_clone}
          DEPENDS ${file}
        )
        list (APPEND sphinx_clones ${sphinx_clone})
      endif ()
    endforeach ()

    # generate sphinx rule for each format
    foreach (format ${doc_formats})
      add_custom_target ( sphinx_${format}
                          COMMAND ${SPHINX_EXECUTABLE}
                                    -b ${format}
                                    -W
                                    -j ${N_SPHINX_PROCESSES}
                                    ${SPHINX_BINARY_DIR}
                                    ${SPHINX_BINARY_DIR}/${format}
                          DEPENDS ${sphinx_clones}
                        )
      foreach (module ${OPENTURNS_PYTHON_MODULES})
        add_dependencies (sphinx_${format} _${module})
      endforeach ()
    endforeach ()

    # build html by default
    set_target_properties (sphinx_html PROPERTIES EXCLUDE_FROM_ALL OFF)

    add_custom_command (OUTPUT ${SPHINX_BINARY_DIR}/latex/OpenTURNS.pdf
                        WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/latex
                        COMMAND make all-pdf
                      )
    add_custom_target (sphinx_pdf DEPENDS ${SPHINX_BINARY_DIR}/latex/OpenTURNS.pdf)
    add_dependencies (sphinx_pdf sphinx_latex)

    install (DIRECTORY ${SPHINX_BINARY_DIR}/html DESTINATION ${OPENTURNS_DOC_PATH})
  endif ()
endif ()
