diff --git a/gpucublas/compute/cuda_gemmex.c b/gpucublas/compute/cuda_gemmex.c
index 9384e39811ecdf503f3f73bcb506cbe2a3dcace9..b7dccdbf28da03eeb57173a792c0141680c627a3 100644
--- a/gpucublas/compute/cuda_gemmex.c
+++ b/gpucublas/compute/cuda_gemmex.c
@@ -16,6 +16,10 @@
  */
 #include "gpucublas.h"
 
+#if !defined(GPUCUBLAS_HAVE_CUBLASGEMMEX)
+#error "This file should not be compiled"
+#endif
+
 int
 CUDA_gemmex( cham_trans_t transa, cham_trans_t transb,
              int m, int n, int k,
diff --git a/gpucublas/compute/cuda_hgemm.c b/gpucublas/compute/cuda_hgemm.c
index a4898d24f1eb497eac0f6461c8b0654b3ffbbefb..85088d04d4510df0c54493aa72411650cd2883c6 100644
--- a/gpucublas/compute/cuda_hgemm.c
+++ b/gpucublas/compute/cuda_hgemm.c
@@ -16,6 +16,10 @@
  */
 #include "gpucublas.h"
 
+#if !defined(GPUCUBLAS_HAVE_CUBLASHGEMM)
+#error "This file should not be compiled"
+#endif
+
 extern "C" int
 CUDA_hgemm( cham_trans_t transa, cham_trans_t transb,
             int m, int n, int k,
diff --git a/gpucublas/include/CMakeLists.txt b/gpucublas/include/CMakeLists.txt
index 35b0dd0b6faaf99d45fdfb1f556cd744666974e9..a2cb62b5cf9cb41573c561bc5c359f2d3f023a54 100644
--- a/gpucublas/include/CMakeLists.txt
+++ b/gpucublas/include/CMakeLists.txt
@@ -38,9 +38,13 @@ precisions_rules_py(
 
 # Define the list of headers
 # --------------------------
+configure_file("gpucublas.h.in"
+               "gpucublas.h"
+               @ONLY)
+
 set(GPUCUBLAS_HDRS
-    gpucublas.h
-    )
+  ${CMAKE_CURRENT_BINARY_DIR}/gpucublas.h
+)
 
 # Add generated headers
 # ---------------------
@@ -55,7 +59,7 @@ set(CHAMELEON_SOURCES_TARGETS "${CHAMELEON_SOURCES_TARGETS};gpucublas_include" C
 
 # Installation
 # ------------
-install( FILES gpucublas.h
+install( FILES ${CMAKE_CURRENT_BINARY_DIR}/gpucublas.h
          DESTINATION include )
 
 install( FILES ${GPUCUBLAS_HDRS}
diff --git a/gpucublas/include/gpucublas.h b/gpucublas/include/gpucublas.h.in
similarity index 93%
rename from gpucublas/include/gpucublas.h
rename to gpucublas/include/gpucublas.h.in
index b9a0ecf3ea56255367f13524bccd423368cd5475..451a494f21e77bc5cb3f77dccec21520f5d43082 100644
--- a/gpucublas/include/gpucublas.h
+++ b/gpucublas/include/gpucublas.h.in
@@ -52,6 +52,11 @@
 #include "chameleon/struct.h"
 #include "chameleon/constants.h"
 
+#cmakedefine GPUCUBLAS_HAVE_CUDA_TOOLKIT
+#cmakedefine GPUCUBLAS_HAVE_CUDA_HALF
+#cmakedefine GPUCUBLAS_HAVE_CUBLASHGEMM
+#cmakedefine GPUCUBLAS_HAVE_CUBLASGEMMEX
+
 /**
  * CUDA BLAS headers
  */
@@ -64,6 +69,7 @@ BEGIN_C_DECLS
 #include "gpucublas/gpucublas_zc.h"
 #include "gpucublas/gpucublas_ds.h"
 
+#if defined(GPUCUBLAS_HAVE_CUBLASHGEMM)
 int CUDA_hgemm( cham_trans_t transa, cham_trans_t transb,
                 int m, int n, int k,
                 const CHAMELEON_Real16_t *alpha,
@@ -72,7 +78,9 @@ int CUDA_hgemm( cham_trans_t transa, cham_trans_t transb,
                 const CHAMELEON_Real16_t *beta,
                 CHAMELEON_Real16_t *C, int ldc,
                 cublasHandle_t handle );
+#endif
 
+#if defined(GPUCUBLAS_HAVE_CUBLASGEMMEX)
 int CUDA_gemmex( cham_trans_t transa, cham_trans_t transb,
                  int m, int n, int k,
                  const void *alpha,
@@ -81,6 +89,7 @@ int CUDA_gemmex( cham_trans_t transa, cham_trans_t transb,
                  const void *beta,
                  void *C, int ldc, cham_flttype_t Ctype,
                  cublasHandle_t handle );
+#endif
 
 static inline cublasComputeType_t
 chameleon_cublas_ctype( cham_flttype_t flttype ) {
diff --git a/gpucublas/include/gpucublas/gpucublas_z.h b/gpucublas/include/gpucublas/gpucublas_z.h
index fa04fc878084a891c90d9a04a871ba91f38b0fb3..6a44ee9f967192d714c471775a4857b5015fc058 100644
--- a/gpucublas/include/gpucublas/gpucublas_z.h
+++ b/gpucublas/include/gpucublas/gpucublas_z.h
@@ -24,8 +24,10 @@
 /**
  *  Declarations of cuda kernels - alphabetical order
  */
+#if defined(GPUCUBLAS_HAVE_CUDA_HALF)
 int CUDA_dlag2h( int m, int n, const double *A, int lda, CHAMELEON_Real16_t *B, int ldb, cublasHandle_t handle );
 int CUDA_hlag2d( int m, int n, const CHAMELEON_Real16_t *A, int lda, double *B, int ldb, cublasHandle_t handle );
+#endif
 int CUDA_zgeadd( cham_trans_t trans, int m, int n, const cuDoubleComplex *alpha, const cuDoubleComplex *A, int lda, const cuDoubleComplex *beta, cuDoubleComplex *B, int ldb, cublasHandle_t handle );
 int CUDA_zgemerge( cham_side_t side, cham_diag_t diag, int M, int N, const cuDoubleComplex *A, int LDA, cuDoubleComplex *B, int LDB, cublasHandle_t handle );
 int CUDA_zgemm(  cham_trans_t transa, cham_trans_t transb, int m, int n, int k, const cuDoubleComplex *alpha, const cuDoubleComplex *A, int lda, const cuDoubleComplex *B, int ldb, const cuDoubleComplex *beta, cuDoubleComplex *C, int ldc, cublasHandle_t handle );
diff --git a/gpucublas/include/gpucublas/gpucublas_zc.h b/gpucublas/include/gpucublas/gpucublas_zc.h
index e0140cfa3a7700ce22756749c11a577beeadf0bc..ee29dcefecdd388ee412cc61acc69b2b6381f8de 100644
--- a/gpucublas/include/gpucublas/gpucublas_zc.h
+++ b/gpucublas/include/gpucublas/gpucublas_zc.h
@@ -18,7 +18,9 @@
 #ifndef _gpucublas_zc_h_
 #define _gpucublas_zc_h_
 
+#if defined(GPUCUBLAS_HAVE_CUDA_TOOLKIT)
 int CUDA_clag2z( int m, int n, const cuFloatComplex *A, int lda, cuDoubleComplex *B, int ldb, cublasHandle_t handle );
 int CUDA_zlag2c( int m, int n, const cuDoubleComplex *A, int lda, cuFloatComplex *B, int ldb, cublasHandle_t handle );
+#endif
 
 #endif /* _gpucublas_zc_h_ */
diff --git a/runtime/starpu/CMakeLists.txt b/runtime/starpu/CMakeLists.txt
index 633013b28911d36172b6acc64cb1492f8fb6068e..7f2eab94cd34acadf580ed42f5c858562d927ae4 100644
--- a/runtime/starpu/CMakeLists.txt
+++ b/runtime/starpu/CMakeLists.txt
@@ -252,9 +252,15 @@ set(RUNTIME_SRCS_GENERATED "")
 set(ZSRC
   codelets/codelet_zcallback.c
   codelets/codelet_zccallback.c
-  codelets/codelet_dlag2h.c
   ${CODELETS_ZSRC}
+)
+
+if(GPUCUBLAS_HAVE_CUDA_HALF OR CHAMELEON_SIMULATION)
+  set(ZSRC
+    ${ZSRC}
+    codelets/codelet_dlag2h.c
   )
+endif()
 
 precisions_rules_py(RUNTIME_SRCS_GENERATED "${ZSRC}"
   PRECISIONS "${CHAMELEON_PRECISION}"
@@ -262,11 +268,23 @@ precisions_rules_py(RUNTIME_SRCS_GENERATED "${ZSRC}"
 
 set(CODELETS_SRC
   codelets/codelet_convert.c
-  codelets/codelet_hgemm.c
   codelets/codelet_gemm.c
   ${CODELETS_SRC}
   )
 
+if(GPUCUBLAS_HAVE_CUBLASHGEMM OR CHAMELEON_SIMULATION)
+  set(CODELETS_SRC
+    codelets/codelet_hgemm.c
+    ${CODELETS_SRC}
+  )
+endif()
+if(GPUCUBLAS_HAVE_CUBLASGEMMEX OR CHAMELEON_SIMULATION)
+  set(CODELETS_SRC
+    codelets/codelet_gemmex.c
+    ${CODELETS_SRC}
+  )
+endif()
+
 set(RUNTIME_SRCS
   ${RUNTIME_COMMON}
   ${RUNTIME_SRCS_GENERATED}
diff --git a/runtime/starpu/codelets/codelet_convert.c b/runtime/starpu/codelets/codelet_convert.c
index 8a637a493c00b0169b1aedae56c043070c93fcc4..8a8b34fccc628069e41d23ed3eb2ad11fa6942b7 100644
--- a/runtime/starpu/codelets/codelet_convert.c
+++ b/runtime/starpu/codelets/codelet_convert.c
@@ -75,7 +75,7 @@ insert_task_convert( const RUNTIME_option_t *options,
         break;
 #endif
 
-#if defined(CHAMELEON_PREC_D) && defined(CHAMELON_USE_CUDA)
+#if defined(CHAMELEON_PREC_D) && defined(GPUCUBLAS_HAVE_CUDA_HALF)
     case ChamConvertRealDoubleToHalf:
         codelet = &cl_dlag2h;
         callback = cl_dlag2h_callback;
@@ -87,7 +87,7 @@ insert_task_convert( const RUNTIME_option_t *options,
         break;
 #endif
 
-#if defined(CHAMELEON_PREC_S) && defined(CHAMELON_USE_CUDA)
+#if defined(CHAMELEON_PREC_S) && defined(GPUCUBLAS_HAVE_CUDA_HALF)
     case ChamConvertRealSingleToHalf:
         codelet = &cl_slag2h;
         callback = cl_slag2h_callback;