diff --git a/CMakeLists.txt b/CMakeLists.txt
index b45c8d3a5fdb55f5359fbc7e901f8921bf66f215..5dc0de1bfa601c3dd7985e4ce73636b44183c9df 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -3,7 +3,7 @@
 # See the LICENSE.txt file for license information. Please report all
 # bugs and problems to <gmsh@geuz.org>.
 
-cmake_minimum_required(VERSION 2.6 FATAL_ERROR)
+cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
 
 # if CMAKE_BUILD_TYPE is specified use it; otherwise set the default
 # build type to "RelWithDebInfo" ("-O2 -g" with gcc) prior to calling
@@ -181,8 +181,7 @@ macro(find_all_libraries VARNAME LISTNAME PATH SUFFIX)
     if(FOUND_LIB)
       list(APPEND ${VARNAME} ${FOUND_LIB})
     endif(FOUND_LIB)
-    set(FOUND_LIB FOUND_LIB-NOTFOUND CACHE INTERNAL "")
-    # unset(FOUND_LIB CACHE) # cleaner, but only available in cmake >= 2.6.4
+    unset(FOUND_LIB CACHE)
   endforeach(LIB)
   list(LENGTH ${VARNAME} NUM_FOUND_LIBRARIES)
   if(NUM_FOUND_LIBRARIES LESS NUM_LIST)
@@ -713,8 +712,16 @@ if(HAVE_SOLVER)
   endif(ENABLE_TAUCS)
 
   if(ENABLE_PETSC)
-    set(ENV_PETSC_DIR $ENV{PETSC_DIR})
-    set(ENV_PETSC_ARCH $ENV{PETSC_ARCH})
+    if(PETSC_DIR)
+      set(ENV_PETSC_DIR ${PETSC_DIR})
+    else(PETSC_DIR)
+      set(ENV_PETSC_DIR $ENV{PETSC_DIR})
+    endif(PETSC_DIR)
+    if(PETSC_ARCH)
+      set(ENV_PETSC_ARCH ${PETSC_ARCH})
+    else(PETSC_ARCH)
+      set(ENV_PETSC_ARCH $ENV{PETSC_ARCH})
+    endif(PETSC_ARCH)
     if(EXISTS ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/conf/petscvariables)
       # old-style PETSc installations (using PETSC_DIR and PETSC_ARCH)
       set_config_option(HAVE_PETSC "PETSc")
@@ -746,7 +753,11 @@ if(HAVE_SOLVER)
       endif(NOT PETSC_LIBS)
       # find slepc (needs to be linked in before petsc)
       if(ENABLE_SLEPC)
-        set(ENV_SLEPC_DIR $ENV{SLEPC_DIR})
+        if(SLEPC_DIR)
+          set(ENV_SLEPC_DIR ${SLEPC_DIR})
+         else(SLEPC_DIR)
+          set(ENV_SLEPC_DIR $ENV{SLEPC_DIR})
+        endif(SLEPC_DIR)
         find_library(SLEPC_LIB slepc PATHS ${ENV_SLEPC_DIR}/${ENV_PETSC_ARCH}/lib)
         if(SLEPC_LIB)
           find_path(SLEPC_INC "slepc.h" PATHS ${ENV_SLEPC_DIR} PATH_SUFFIXES include 
@@ -844,8 +855,7 @@ if(ENABLE_OCC)
     else(OCC_LIB)
       message(STATUS "OCC lib " ${OCC} " not Found")
     endif(OCC_LIB)
-    set(OCC_LIB OCC_LIB-NOTFOUND CACHE INTERNAL "")
-    # unset(OCC_LIB CACHE) # cleaner, but only available in cmake >= 2.6.4
+    unset(OCC_LIB CACHE)
   endforeach(OCC)
   list(LENGTH OCC_LIBS NUM_OCC_LIBS)
   if(NUM_OCC_LIBS EQUAL NUM_OCC_LIBS_REQUIRED)