diff --git a/CHANGELOG b/CHANGELOG index f8d232f1c36852666d780e4473cc79420c4e9084..c14374f2cad9cede24eac20e6bdbf5d00cb8b561 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,42 @@ +BornAgain-1.4.0, released 2015.10.30 + > No API changes + > Summary: + 1) Improved usability of IntensityData objects (slicing, histogram filling, ...) + 2) GUI: export of simulation results into tiff or ascii file + 3) Core: rectangular detector added (not yet in GUI) + 4) Documentation: extra fitting examples on website + 5) Various bugfixes + > Details of Sprint #29 (see http://apps.jcns.fz-juelich.de/redmine/projects/bornagain/issues) + * Bug #1083: Trivial MultiLayer samples (no roughness, no particles) cause simulation crash. + * Bug #1130: Validate form factor of truncated sphere for absorption case + * Bug #1136: Numerical instability at phi_f=0 on MacOS for Pyramid based form factors + * Bug #1152: In Real Time Activity view, negative positions cannot be achieved + * Bug #1157: Qt dependency is not mentioned in INSTALL + * Bug #1158: many checks fail (1.3.0) + * Bug #1167: GUI crash when showing projection + * Bug #1170: GUI: InstrumentView alignment problem in detector parameters + * Bug #1171: GUI: make thickness disabled for air and substrate layers + * Bug #1173: Revise ParticleDistribution base class + * Bug #1174: GUI: color of layer does not change if color of material has been changed + * Bug #1198: GUI: fix simulation for particle distributions and negative z coordinate + * Bug #1212: Windows: modify installer to prepend BornAgain location to system PATH instead of appending to it + * Bug #1215: Repair wrong usage of double_epsilon in Core + * Bug #1216: GUI: normalization of intensity + * Bug #1223: FormFactorTruncatedCube instability under MacOS + * Feature #922: Add slicing to IntensityDataFunctions + * Feature #948: Implement new IntensityData object with improved usability + * Feature #1055: Implement Genetic minimizer to get rid from ROOT dependency + * Feature #1081: GUI: provide export of simulation results into tiff file + * Feature #1095: Implement rectangular (real space) detector + * Feature #1099: Repair fitting with masks + * Feature #1179: GUI: provide export of simulation results into text file (*.int) + * Feature #1186: Implement tiff import/export in kernel + * Documentation #1176: Drupal: update installation instructions, tutorials for coming release 1.4 + * Documentation #1181: Drupal: provide fitting example along slices + * Documentation #1182: Drupal: provide fitting example with simultaneous fit of two datasets + * Refactoring #619: Masked simulation doesn't use all threads all the time + * Refactoring #1064: Get rid of "pylab" in Python scripts + BornAgain-1.3.0, released 2015.07.30 > API Changes: 1) Removed 'depth' from ParticleLayout::addParticle: new interface provides for abundance, position and possible rotation diff --git a/Core/CMakeLists.txt b/Core/CMakeLists.txt index 970d691ac3f5017de94a56d976e2e30421944fa0..14be4a4e3f3e7635b3588edcfcd96d0bc64a1150 100644 --- a/Core/CMakeLists.txt +++ b/Core/CMakeLists.txt @@ -194,7 +194,11 @@ else() endif() if(NOT BORNAGAIN_APPLE_BUNDLE) - # installing bornagain/__init__.py + # installing bornagain/__init__.py and utilites install (DIRECTORY ${CMAKE_SOURCE_DIR}/dev-tools/python-setup/bornagain DESTINATION ${destination_lib} COMPONENT Libraries) + install (FILES "${destination_runtime_configs}/__init__.py" DESTINATION ${destination_lib}/bornagain COMPONENT Libraries) +else() + install (DIRECTORY ${CMAKE_SOURCE_DIR}/dev-tools/python-setup/bornagain DESTINATION ${destination_libexec} COMPONENT Libraries) + install (FILES "${destination_runtime_configs}/__init__.py" DESTINATION ${destination_libexec}/bornagain COMPONENT Libraries) endif() diff --git a/Core/Samples/inc/BAVersion.h b/Core/Samples/inc/BAVersion.h index 95740aa1ca915a1eb98e57bbe9f4211f7edc7052..de40bd97620795c5a63ee3868a42ed84bcfa1ea8 100644 --- a/Core/Samples/inc/BAVersion.h +++ b/Core/Samples/inc/BAVersion.h @@ -22,7 +22,7 @@ namespace BornAgain { const int major_version_number = 1; - const int minor_version_number = 3; + const int minor_version_number = 4; const int patch_version_number = 0; inline int GetMajorVersionNumber() { return major_version_number; } diff --git a/Core/Tools/src/PyGenVisitor.cpp b/Core/Tools/src/PyGenVisitor.cpp index 962b3c11ea8ac072aa4fb7d2f57ea95173fd388b..e353ef86816dc23f39a416d2882f720e53aa0d8b 100644 --- a/Core/Tools/src/PyGenVisitor.cpp +++ b/Core/Tools/src/PyGenVisitor.cpp @@ -268,8 +268,8 @@ std::string PyGenVisitor::definePreamble() const std::ostringstream result; result << "import numpy\n"; result << "#NOTE: Uncomment the next import statements for plotting\n"; - result << "#import pylab\n"; result << "#import matplotlib\n"; + result << "#from matplotlib import pyplot as plt\n"; result << "from bornagain import *\n\n\n"; // result << "#NOTE: All the ANGLES are displayed in RADIANS\n\n"; // result << "#NOTE: Running this Script by default will write output data" @@ -1339,10 +1339,9 @@ std::string PyGenVisitor::definePlotting(const GISASSimulation *simulation) cons // result << "#NOTE: Uncomment the next function for plotting\n"; // result << "#NOTE: This requires the presence of matplotlib library\n"; result << "def plotSimulation(simulation):\n"; - result << "" << indent() << "result = simulation.getIntensityData().getArray()" - << "+ 1 # +1 for log scale\n"; - result << "" << indent() << "im = pylab.imshow(result, " - << "norm=matplotlib.colors.LogNorm(), extent=["; + result << "" << indent() << "result = simulation.getIntensityData()\n"; + result << "" << indent() << "im = plt.imshow(result.getArray(), " + << "norm=matplotlib.colors.LogNorm(1, result.getMaximum()), extent=["; size_t index = 0; size_t numberOfDetectorDimensions = simulation->getInstrument().getDetectorDimension(); while (index < numberOfDetectorDimensions) { @@ -1356,8 +1355,8 @@ std::string PyGenVisitor::definePlotting(const GISASSimulation *simulation) cons index++; } result << "]) \n"; - result << indent() << "pylab.colorbar(im)\n"; - result << indent() << "pylab.show()\n\n\n"; + result << indent() << "plt.colorbar(im)\n"; + result << indent() << "plt.show()\n\n\n"; return result.str(); } diff --git a/Doc/Doxygen/Doxyfile b/Doc/Doxygen/Doxyfile index cda121287b3ad55bff61a0f99f3fa44e6e42c193..361e2f225ce2c949a109fdd42a80f1ac31f2d5a2 100644 --- a/Doc/Doxygen/Doxyfile +++ b/Doc/Doxygen/Doxyfile @@ -38,7 +38,7 @@ PROJECT_NAME = "BornAgain" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 1.3.0 +PROJECT_NUMBER = 1.4.0 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/Doc/UserManual/UserManualVersion.tex b/Doc/UserManual/UserManualVersion.tex index 07fea37e47c07d9fbff4adc2aadd88a3ef196a88..bc3f52ccc9de455fadb4dfe4e5efb1daaf7e7d9d 100644 --- a/Doc/UserManual/UserManualVersion.tex +++ b/Doc/UserManual/UserManualVersion.tex @@ -4,4 +4,4 @@ % using cmake/scripts/UserManualVersion.tex.in \newcommand{\UserManualVersionNumber} -{1.3.0} +{1.4.0} diff --git a/Examples/cpp/CylindersAndPrisms/modules/FindBornAgain.cmake b/Examples/cpp/CylindersAndPrisms/modules/FindBornAgain.cmake index 0b03f6482ddd6e8e4f43e594ab6a4c72a78e93f5..6af50792b0c544362b47550d5b5d460404674667 100644 --- a/Examples/cpp/CylindersAndPrisms/modules/FindBornAgain.cmake +++ b/Examples/cpp/CylindersAndPrisms/modules/FindBornAgain.cmake @@ -6,8 +6,8 @@ set(BORNAGAINSYS $ENV{BORNAGAINSYS}) if(BORNAGAINSYS) - set(BORNAGAIN_LIBRARY_DIR ${BORNAGAINSYS}/lib/BornAgain-1.3) - set(BORNAGAIN_INCLUDE_DIR ${BORNAGAINSYS}/include/BornAgain-1.3) + set(BORNAGAIN_LIBRARY_DIR ${BORNAGAINSYS}/lib/BornAgain-1.4) + set(BORNAGAIN_INCLUDE_DIR ${BORNAGAINSYS}/include/BornAgain-1.4) endif() find_library (BORNAGAIN_CORE BornAgainCore diff --git a/Examples/python/fitting/ex01_SampleParametersIntro/SampleParametersIntro.py b/Examples/python/fitting/ex01_SampleParametersIntro/SampleParametersIntro.py index dde849c24d826431c0a2bd041eb129cd345e6cb0..6b7c9369d86cac50cd2b9b1eb66a7034a5d7f5aa 100644 --- a/Examples/python/fitting/ex01_SampleParametersIntro/SampleParametersIntro.py +++ b/Examples/python/fitting/ex01_SampleParametersIntro/SampleParametersIntro.py @@ -1,10 +1,5 @@ """ -Mixture of cylinders and prisms without interference. - -This example shows how to create a sample with fixed parameters and then -change this parameters on the fly during runtime. -The example doesn't contain any fitting and serve as a gentle introduction -to other fitting examples. +Working with sample parameters """ import matplotlib diff --git a/Examples/python/fitting/ex02_FitCylindersAndPrisms/FitCylindersPrisms.py b/Examples/python/fitting/ex02_FitCylindersAndPrisms/FitCylindersPrisms.py index ac97a24e75c7f33a45bd4c55c9db9c421ad5b557..aef9adb63ba3770127c38adf34e890fba3b74085 100644 --- a/Examples/python/fitting/ex02_FitCylindersAndPrisms/FitCylindersPrisms.py +++ b/Examples/python/fitting/ex02_FitCylindersAndPrisms/FitCylindersPrisms.py @@ -1,22 +1,5 @@ """ -Fitting example -In this example we use a simple geometry: cylinders and prisms in -air layer, deposited on a substrate layer, with no interference. -There are 4 fitting parameters: -1) radius of cylinders -2) height of cylinders -3) side length of prisms -4) height of prisms - -Our reference data is 2D intensity map obtained from the simulation of -the same geometry with fixed values cylinder_height = prism3_height - = cylinder_radius = prism3_half_side = 5nm. - -Then we run our minimization using default minizer settings, with starting values of fit parameters -cylinder_height = 4nm, cylinder_radius = 6nm -prism3_height = 4nm, prism3_length = 12nm - -See example FitCylindersPrisms_detailed.py for more details & graphical output +Fitting example: 4 parameters fit with simple output """ from bornagain import * diff --git a/Examples/python/fitting/ex02_FitCylindersAndPrisms/FitCylindersPrisms_detailed.py b/Examples/python/fitting/ex02_FitCylindersAndPrisms/FitCylindersPrisms_detailed.py index cd9c39cd7c55e67ac8f1e31867187b4726a43d8a..9492aa54929a132f4e589cce6648df3eea352dd8 100644 --- a/Examples/python/fitting/ex02_FitCylindersAndPrisms/FitCylindersPrisms_detailed.py +++ b/Examples/python/fitting/ex02_FitCylindersAndPrisms/FitCylindersPrisms_detailed.py @@ -1,8 +1,6 @@ """ -Fitting example -This is more detailed version of FitCylindersPrisms.py. -We show how to generate "real" data and how to draw fit progress. - +Fitting example: 4 parameters fit with simple output +This is more detailed version of FitCylindersPrisms.py. We show how to generate "real" data and how to draw fit progress. Please take a note, that performance here is determined by poor performance of matplotlib drawing routines. """ diff --git a/Examples/python/simulation/ex01_BasicParticles/CylindersWithSizeDistribution.py b/Examples/python/simulation/ex01_BasicParticles/CylindersWithSizeDistribution.py index c768872a2aabb12374f6615646f56a2d74597c59..e32738a8591801e6445b262cde83ee1eda1dc681 100644 --- a/Examples/python/simulation/ex01_BasicParticles/CylindersWithSizeDistribution.py +++ b/Examples/python/simulation/ex01_BasicParticles/CylindersWithSizeDistribution.py @@ -1,5 +1,5 @@ """ -Cylinder formfactor in BA with size distribution +Cylinders with size distribution """ import numpy import matplotlib diff --git a/Examples/python/simulation/ex04_ComplexShapes/HexagonalLatticesWithBasis.py b/Examples/python/simulation/ex04_ComplexShapes/HexagonalLatticesWithBasis.py index e0e9261a64be497ac4b2e7939ef32c1311d4d574..36eedd285a657e9113b34d61a4a2465be7a7d5b6 100644 --- a/Examples/python/simulation/ex04_ComplexShapes/HexagonalLatticesWithBasis.py +++ b/Examples/python/simulation/ex04_ComplexShapes/HexagonalLatticesWithBasis.py @@ -62,7 +62,7 @@ def run_simulation(): simulation = get_simulation() simulation.setSample(sample) simulation.runSimulation() - result = simulation.getIntensityData().getArray() + result = simulation.getIntensityData() # showing the result im = plt.imshow(result.getArray(), diff --git a/Examples/python/simulation/ex05_BeamAndDetector/DetectorResolutionFunction.py b/Examples/python/simulation/ex05_BeamAndDetector/DetectorResolutionFunction.py index 662b1711cd955a45cdcd64f29fe01d496098522c..19336324b42343ad5fe9f189d78ea97135ee20cc 100644 --- a/Examples/python/simulation/ex05_BeamAndDetector/DetectorResolutionFunction.py +++ b/Examples/python/simulation/ex05_BeamAndDetector/DetectorResolutionFunction.py @@ -1,5 +1,5 @@ """ -Cylinder form factor in DWBA with beam divergence +Cylinder form factor in DWBA with detector resolution function applied """ import numpy import matplotlib diff --git a/GUI/main/CMakeLists.txt b/GUI/main/CMakeLists.txt index 74721d64dea1e311035c3e045712e0619f23270d..5ba8390b85408ea7d9a1186e11a36e7a0fcaf369 100644 --- a/GUI/main/CMakeLists.txt +++ b/GUI/main/CMakeLists.txt @@ -134,6 +134,18 @@ if(UNIX) install(DIRECTORY "$ENV{QTDIR}/plugins/platforms" DESTINATION ${plugin_dest_dir} COMPONENT Runtime) set(fixup_path @rpath) + + # FIXME handling the case when cmake prefix path contains more than one entry FIXME + # the problem here is FixAppleBundle is working in install phase and doesn't see some cmake variables + set(cmake_prefix_path_to_parse ${CMAKE_PREFIX_PATH}) + list(LENGTH cmake_prefix_path_to_parse len) + list(GET cmake_prefix_path_to_parse 0 cmake_prefix_path1) + set(cmake_prefix_path2 "undefined_cmake_prefix_path2") + if(len EQUAL 2) + list(GET cmake_prefix_path_to_parse 1 cmake_prefix_path2) + endif() +message(INFO "XXX ${cmake_prefix_path1} ${cmake_prefix_path2}") + configure_file(${CMAKE_SOURCE_DIR}/cmake/modules/FixAppleBundle.cmake.in ${destination_runtime_configs}/FixAppleBundle.cmake @ONLY) install(SCRIPT ${destination_runtime_configs}/FixAppleBundle.cmake COMPONENT Runtime) elseif(NOT BUILD_DEBIAN) diff --git a/VERSION.cmake b/VERSION.cmake index 6af1536943dda35d627eedcc5852928456a5f5ce..a07b1258e405dc4208f9ff16b24010b8a3328c90 100644 --- a/VERSION.cmake +++ b/VERSION.cmake @@ -1,3 +1,3 @@ set(BornAgain_VERSION_MAJOR 1) -set(BornAgain_VERSION_MINOR 3) +set(BornAgain_VERSION_MINOR 4) set(BornAgain_VERSION_PATCH 0) diff --git a/cmake/modules/BornAgainConfiguration.cmake b/cmake/modules/BornAgainConfiguration.cmake index bdec08be2e11e13125faaa88d570b459fe64b4b7..275f3c8b765d95b6fe1bc8c263ad9e32349ca67f 100644 --- a/cmake/modules/BornAgainConfiguration.cmake +++ b/cmake/modules/BornAgainConfiguration.cmake @@ -104,6 +104,14 @@ set(this_libdir $BORNAGAINSYS/lib/${destination_suffix}) configure_file("${CMAKE_SOURCE_DIR}/cmake/scripts/thisbornagain.sh.in" "${destination_runtime_configs}/frombin_setup_paths.sh" @ONLY) configure_file("${CMAKE_SOURCE_DIR}/cmake/scripts/thisbornagain.csh.in" "${destination_runtime_configs}/frombin_setup_paths.csh" @ONLY) +# -- configure BornAgain init module --- +set(BA_MODULES_IMPORT_PATH "..") +if(BORNAGAIN_APPLE_BUNDLE) + set(BA_MODULES_IMPORT_PATH lib/BornAgain-${BornAgain_VERSION_MAJOR}.${BornAgain_VERSION_MINOR}) +endif() +configure_file("${CMAKE_SOURCE_DIR}/cmake/scripts/__init__.py.in" "${destination_runtime_configs}/__init__.py" @ONLY) +execute_process(COMMAND ${CMAKE_COMMAND} -E copy "${destination_runtime_configs}/__init__.py" ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/bornagain) + # --- configure C++ source code --------- configure_file("${CMAKE_SOURCE_DIR}/cmake/scripts/BAConfigure.h.in" "${destination_runtime_configs}/BAConfigure.h" @ONLY) diff --git a/cmake/modules/FindNumpy.cmake b/cmake/modules/FindNumpy.cmake index 1f1dd84c53ad4cd637590319461637fabd3e6658..04c7b8e0cd701ef8aa5fb80dc769b7d2f4ff9ca5 100644 --- a/cmake/modules/FindNumpy.cmake +++ b/cmake/modules/FindNumpy.cmake @@ -25,12 +25,16 @@ else() else() set (NUMPY_FOUND TRUE) set (NUMPY_INCLUDE_DIR ${NUMPY_INCLUDE_DIR} CACHE STRING "Numpy include path") + EXEC_PROGRAM ("${PYTHON_EXECUTABLE}" + ARGS "-c \"import numpy; print numpy.__version__\"" + OUTPUT_VARIABLE numpy_version_number + RETURN_VALUE numpy_return_value) endif() endif() if (NUMPY_FOUND) if (NOT Numpy_FIND_QUIETLY) - message (STATUS "Numpy headers found at ${NUMPY_INCLUDE_DIR}") + message (STATUS "Numpy headers found at ${NUMPY_INCLUDE_DIR}, version ${numpy_version_number}.") endif() else() if (Numpy_FIND_REQUIRED) diff --git a/cmake/modules/FixAppleBundle.cmake.in b/cmake/modules/FixAppleBundle.cmake.in index 69e08c2868d7768ac17418c928089c582e27dfa8..5d68c90d3a41738f9bfa64b212da8be00c114ea7 100644 --- a/cmake/modules/FixAppleBundle.cmake.in +++ b/cmake/modules/FixAppleBundle.cmake.in @@ -1,7 +1,6 @@ set(bundle ${CMAKE_INSTALL_PREFIX}/BornAgain.app ) set(bornagain_libs ${CMAKE_INSTALL_PREFIX}/@destination_lib@) set(thirdparty_libs ${bundle}/Contents/lib/ThirdParty) -set(cmake_prefix_path @CMAKE_PREFIX_PATH@ ) set(BU_CHMOD_BUNDLE_ITEMS True) set(BU_COPY_FULL_FRAMEWORK_CONTENTS False) @@ -25,7 +24,11 @@ function(gp_resolved_file_type_override resolved_file type_var) message("XXX_Python resolving file as system : ${file}") set(${type_var} system PARENT_SCOPE) - elseif(file MATCHES "@CMAKE_PREFIX_PATH@") + elseif(file MATCHES "@cmake_prefix_path1@") + message("XXX_PREFFIX resolving file as _embedded : ${file}") + set(${type_var} embedded PARENT_SCOPE) + + elseif(file MATCHES "@cmake_prefix_path2@") message("XXX_PREFFIX resolving file as _embedded : ${file}") set(${type_var} embedded PARENT_SCOPE) diff --git a/cmake/scripts/__init__.py.in b/cmake/scripts/__init__.py.in new file mode 100644 index 0000000000000000000000000000000000000000..79fb2939c019db4f72a07e44ac3caddcc6828b0b --- /dev/null +++ b/cmake/scripts/__init__.py.in @@ -0,0 +1,10 @@ +import sys +import os + +sys.path.append(os.path.abspath( + os.path.join(os.path.split(__file__)[0], '@BA_MODULES_IMPORT_PATH@'))) + +from libBornAgainCore import * +from libBornAgainFit import * +from plot_utils import * + diff --git a/dev-tools/python-setup/bornagain/__init__.py b/dev-tools/python-setup/bornagain/plot_utils.py similarity index 91% rename from dev-tools/python-setup/bornagain/__init__.py rename to dev-tools/python-setup/bornagain/plot_utils.py index 66642d8b7e747a75e6ca397a04f772d546e6e1b7..9ce5066d04fc35262d77bb0aebca19ee48a2a875 100644 --- a/dev-tools/python-setup/bornagain/__init__.py +++ b/dev-tools/python-setup/bornagain/plot_utils.py @@ -1,12 +1,6 @@ -import sys -import os - -sys.path.append(os.path.abspath( - os.path.join(os.path.split(__file__)[0], - '..'))) - -from libBornAgainCore import * -from libBornAgainFit import * +''' +BornAgain plot utils +''' try: import matplotlib @@ -14,6 +8,8 @@ try: except ImportError: print "bornagain/__init__.py -> Error. Can't import matplotlib." +from bornagain import deg as deg +from bornagain import IFitObserver as IFitObserver class DefaultFitObserver(IFitObserver): """ diff --git a/dev-tools/python-setup/bornagain_python_install.py b/dev-tools/python-setup/bornagain_python_install.py index 3bb696ce3b07a225db738d2d1af1dad018207286..f9f13ae708dc9459c8f90b6c3e327521aa964efb 100644 --- a/dev-tools/python-setup/bornagain_python_install.py +++ b/dev-tools/python-setup/bornagain_python_install.py @@ -165,9 +165,18 @@ from libBornAgainFit import * pass +def prepare_init_module(app_dir, bundle_dir): + source_dir = os.path.join(app_dir, "Contents", "libexec") + libexec_dir = os.path.join(source_dir, "BornAgain-"+BORNAGAIN_VERSION, "bornagain") + package_dir = os.path.join(bundle_dir, "bornagain") + print "--> Copying modules from '{0}' to '{1}'".format(libexec_dir, package_dir) + shutil.copytree(libexec_dir, package_dir) + return package_dir + + def copy_libraries(app_dir, destination_dir): """ - Coopy libraries from BornAgain.app into corresponding BornAgain Python package directory + Copy libraries from BornAgain.app into corresponding BornAgain Python package directory """ print "--> Copying libraries from '{0}'".format(app_dir) source_dir = os.path.join(app_dir, "Contents", "lib") @@ -212,8 +221,7 @@ def create_bundle(app_dir): generate_setup_py(bundle_dir) - package_dir = create_package_dir(bundle_dir) - generate_init_py(package_dir) + package_dir = prepare_init_module(app_dir, bundle_dir) library_dir = create_library_dir(package_dir) copy_libraries(app_dir, library_dir) diff --git a/dev-tools/release/utils/prepare_release.py b/dev-tools/release/utils/prepare_release.py index d879d16e21187f23dee8c4b805054a84847e0e4a..194d0b4456d9f7a7088916fee88387cf5e5627a7 100644 --- a/dev-tools/release/utils/prepare_release.py +++ b/dev-tools/release/utils/prepare_release.py @@ -34,8 +34,7 @@ def download_from_app_server(): def cmake_release(): print "\nRunning cmake ...", get_build_dir() - # cmd = "cd %s; cmake -DBORNAGAIN_APP=ON -DBORNAGAIN_GUI=ON -DBORNAGAIN_USERMANUAL=ON -DBORNAGAIN_RELEASE=ON -DCMAKE_INSTALL_PREFIX=%s %s" % (get_build_dir(), get_install_dir(), get_source_dir() ) - cmd = "cd %s; cmake -DBORNAGAIN_RELEASE=ON -DCMAKE_INSTALL_PREFIX=%s %s" % (get_build_dir(), get_install_dir(), get_source_dir() ) + cmd = "cd %s; cmake -DBORNAGAIN_USERMANUAL=ON -DBORNAGAIN_RELEASE=ON -DCMAKE_INSTALL_PREFIX=%s %s" % (get_build_dir(), get_install_dir(), get_source_dir() ) run_command(cmd)