Index: contrib/nightly_tests/allext.conf
===================================================================
--- contrib/nightly_tests/allext.conf	(revision 443)
+++ contrib/nightly_tests/allext.conf	(revision 583)
@@ -6,21 +6,5 @@
 set(CTEST_BUILD_NAME "All extensions")
 
-set(CTEST_BUILD_OPTIONS "${CTEST_BUILD_OPTIONS} -DBUILD_ACL_WL:BOOL=ON")
-set(CTEST_BUILD_OPTIONS "${CTEST_BUILD_OPTIONS} -DBUILD_APP_ACCT:BOOL=ON -DTEST_APP_ACCT:BOOL=ON -DTEST_APP_ACCT_CONNINFO:STRING=user=test\\ dbname=test")
-set(CTEST_BUILD_OPTIONS "${CTEST_BUILD_OPTIONS} -DBUILD_APP_DIAMEAP:BOOL=ON -DBUILD_EAP_IDENTITY:BOOL=ON -DBUILD_EAP_MD5:BOOL=ON -DBUILD_EAP_TLS:BOOL=ON")
-set(CTEST_BUILD_OPTIONS "${CTEST_BUILD_OPTIONS} -DBUILD_APP_RADGW:BOOL=ON")
-set(CTEST_BUILD_OPTIONS "${CTEST_BUILD_OPTIONS} -DBUILD_APP_SIP:BOOL=ON")
-set(CTEST_BUILD_OPTIONS "${CTEST_BUILD_OPTIONS} -DBUILD_DBG_MONITOR:BOOL=ON")
-set(CTEST_BUILD_OPTIONS "${CTEST_BUILD_OPTIONS} -DBUILD_DBG_RT:BOOL=ON")
-set(CTEST_BUILD_OPTIONS "${CTEST_BUILD_OPTIONS} -DBUILD_DICT_EAP:BOOL=ON")
-set(CTEST_BUILD_OPTIONS "${CTEST_BUILD_OPTIONS} -DBUILD_DICT_NASREQ:BOOL=ON")
-set(CTEST_BUILD_OPTIONS "${CTEST_BUILD_OPTIONS} -DBUILD_DICT_SIP:BOOL=ON")
-set(CTEST_BUILD_OPTIONS "${CTEST_BUILD_OPTIONS} -DBUILD_RGWX_ACCT:BOOL=ON")
-set(CTEST_BUILD_OPTIONS "${CTEST_BUILD_OPTIONS} -DBUILD_RGWX_AUTH:BOOL=ON")
-set(CTEST_BUILD_OPTIONS "${CTEST_BUILD_OPTIONS} -DBUILD_RGWX_DEBUG:BOOL=ON")
-set(CTEST_BUILD_OPTIONS "${CTEST_BUILD_OPTIONS} -DBUILD_RGWX_ECHODROP:BOOL=ON")
-set(CTEST_BUILD_OPTIONS "${CTEST_BUILD_OPTIONS} -DBUILD_RGWX_SAMPLE:BOOL=ON")
-set(CTEST_BUILD_OPTIONS "${CTEST_BUILD_OPTIONS} -DBUILD_RT_DEFAULT:BOOL=ON")
-set(CTEST_BUILD_OPTIONS "${CTEST_BUILD_OPTIONS} -DBUILD_TEST_APP:BOOL=ON")
-set(CTEST_BUILD_OPTIONS "${CTEST_BUILD_OPTIONS} -DBUILD_TEST_SIP:BOOL=ON")
+set(CTEST_BUILD_OPTIONS "${CTEST_BUILD_OPTIONS} -DALL_EXTENSIONS:BOOL=ON")
+set(CTEST_BUILD_OPTIONS "${CTEST_BUILD_OPTIONS} -DTEST_APP_ACCT_CONNINFO:STRING=user=test\\ dbname=test")
 
Index: extensions/CMakeLists.txt
===================================================================
--- extensions/CMakeLists.txt	(revision 524)
+++ extensions/CMakeLists.txt	(revision 583)
@@ -13,4 +13,18 @@
 ENDMACRO(FD_ADD_EXTENSION)
 
+# Use the macro FD_EXTENSION_SUBDIR(extmacroname subdir descr default) to 
+# add a new extension subdirectory.
+MACRO(FD_EXTENSION_SUBDIR EXTSUBDIR EXTDESCR EXTDEFAULT)
+   STRING(TOUPPER ${EXTSUBDIR} EXTMACRONAME)
+   IF (NOT ALL_EXTENSIONS)
+     OPTION(BUILD_${EXTMACRONAME} "Build ${EXTSUBDIR}.fdx? (${EXTDESCR})" ${EXTDEFAULT})
+   ENDIF (NOT ALL_EXTENSIONS)
+   IF (BUILD_${EXTMACRONAME} OR ALL_EXTENSIONS)
+      SUBDIRS(${EXTSUBDIR})
+   ENDIF (BUILD_${EXTMACRONAME} OR ALL_EXTENSIONS)
+ENDMACRO(FD_EXTENSION_SUBDIR)
+
+OPTION(ALL_EXTENSIONS "Build ALL available extensions? (disable to select individual components)" OFF)
+
 # The extensions include the headers of freeDiameter that contains gnutls objects
 FIND_PACKAGE(GnuTLS REQUIRED)
@@ -23,25 +37,14 @@
 INCLUDE_DIRECTORIES(${GCRYPT_INCLUDE_DIR})
 
+
 ###########################
 # Extensions section
 
 ####
-# Diameter applications dictionary
+# Diameter applications dictionaries
 
-OPTION(BUILD_DICT_NASREQ "Build NASREQ (RFC4005) Dictionary definitions?" ON)
-	IF (BUILD_DICT_NASREQ)
-	   SUBDIRS(dict_nasreq)
-	ENDIF (BUILD_DICT_NASREQ)
-
-OPTION(BUILD_DICT_EAP "Build Diameter EAP (RFC4072) Dictionary definitions?" ON)
-	IF (BUILD_DICT_EAP)
-	   SUBDIRS(dict_eap)
-	ENDIF (BUILD_DICT_EAP)
-
-OPTION(BUILD_DICT_SIP "Build Diameter SIP (RFC4740) Dictionary definitions?" ON)
-	IF (BUILD_DICT_SIP)
-	   SUBDIRS(dict_sip)
-	ENDIF (BUILD_DICT_SIP)
-
+FD_EXTENSION_SUBDIR(dict_nasreq "NASREQ (RFC4005) Dictionary definitions?"       ON)
+FD_EXTENSION_SUBDIR(dict_eap    "Diameter EAP (RFC4072) Dictionary definitions?" ON)
+FD_EXTENSION_SUBDIR(dict_sip    "Diameter SIP (RFC4740) Dictionary definitions?" ON)
 
 
@@ -49,36 +52,15 @@
 # Diameter applications
 
-OPTION(BUILD_APP_RADGW "Build app_radgw? (one-way RADIUS/Diameter gateway - RADIUS NAS <-> Diameter server)" OFF)
-	IF (BUILD_APP_RADGW)
-	   SUBDIRS(app_radgw)
-	ENDIF (BUILD_APP_RADGW)
+FD_EXTENSION_SUBDIR(app_acct    "Simple accounting application that stores accounting records in flat database" OFF)
+FD_EXTENSION_SUBDIR(app_diameap "Diameter EAP Application server (RFC 4072)" 					OFF)
+FD_EXTENSION_SUBDIR(app_radgw   "RADIUS/Diameter gateway translation - RADIUS client to Diameter server" 	OFF)
+FD_EXTENSION_SUBDIR(app_sip     "Diameter SIP Authentication and Authorization server (RFC 4740)" 		OFF)
 
-OPTION(BUILD_APP_ACCT "Build app_acct? (simple accounting application that stores accounting records in flat database)" OFF)
-	IF (BUILD_APP_ACCT)
-	   SUBDIRS(app_acct)
-	ENDIF (BUILD_APP_ACCT)
-
-OPTION(BUILD_APP_SIP "Build app_sip? (Authentication and Authorization for Diameter SIP RFC4740)" OFF)
-	IF (BUILD_APP_SIP)
-	   SUBDIRS(app_sip)
-	ENDIF (BUILD_APP_SIP)
-
-OPTION(BUILD_APP_DIAMEAP "Build app_diameap? (Diameter EAP Application - RFC 4072 )" OFF)
-	IF (BUILD_APP_DIAMEAP)
-	   SUBDIRS(app_diameap)
-	ENDIF (BUILD_APP_DIAMEAP)
 
 ####
 # Routing extensions
 
-OPTION(BUILD_RT_DEFAULT "Build rt_default? (Configurable routing rules for freeDiameter)" ON)
-	IF (BUILD_RT_DEFAULT)
-	   SUBDIRS(rt_default)
-	ENDIF (BUILD_RT_DEFAULT)
-
-OPTION(BUILD_RT_EREG "Build rt_ereg? (Configurable routing based on regexp matching of AVP values)" OFF)
-	IF (BUILD_RT_EREG)
-	   SUBDIRS(rt_ereg)
-	ENDIF (BUILD_RT_EREG)
+FD_EXTENSION_SUBDIR(rt_default "Configurable routing rules for freeDiameter" 		     ON)
+FD_EXTENSION_SUBDIR(rt_ereg    "Configurable routing based on regexp matching of AVP values" OFF)
 
 
@@ -86,9 +68,5 @@
 # Peers security extensions
 
-OPTION(BUILD_ACL_WL "Build acl_wl? (White-list of remote connecting peers)" ON)
-	IF (BUILD_ACL_WL)
-		SUBDIRS(acl_wl)
- 	ENDIF (BUILD_ACL_WL)
-
+FD_EXTENSION_SUBDIR(acl_wl "White-list based authorization of incoming connections" ON)
 
 
@@ -96,40 +74,15 @@
 # Debug & test extensions
 
-OPTION(BUILD_DBG_MONITOR "Build dbg_monitor.fdx? (display periodical debug information on the console)" OFF)
-	IF (BUILD_DBG_MONITOR)
-	   SUBDIRS(dbg_monitor)
-	ENDIF (BUILD_DBG_MONITOR)
+FD_EXTENSION_SUBDIR(dbg_monitor "Outputs periodical status information"              OFF)
+FD_EXTENSION_SUBDIR(dbg_rt      "Routing extension for debugging the routing module" OFF)
+FD_EXTENSION_SUBDIR(test_app    "Testing application to send dummy message to another peer, like a Diameter 'ping'" OFF)
+FD_EXTENSION_SUBDIR(test_sip    "Testing application to simulate Diameter-SIP client (RFC4740)" OFF)
 
-OPTION(BUILD_DBG_RT "Build dbg_rt.fdx? (Routing extension for debugging the routing module)" OFF)
- 	IF (BUILD_DBG_RT)
- 	   SUBDIRS(dbg_rt)
- 	ENDIF (BUILD_DBG_RT)
 
-OPTION(BUILD_TEST_APP "Build test_app.fdx? (Testing application to send dummy message to another peer, for testing purpose only)" OFF)
- 	IF (BUILD_TEST_APP)
- 	   SUBDIRS(test_app)
- 	ENDIF (BUILD_TEST_APP)
-
-OPTION(BUILD_TEST_SIP "Build test_sip.fdx? (Testing application to simulate Diameter-SIP client (RFC4740), for testing purpose only)" OFF)
- 	IF (BUILD_TEST_SIP)
- 	   SUBDIRS(test_sip)
- 	ENDIF (BUILD_TEST_SIP)
- 	
 # The following extension have very little use except for specific tests, so we disable them except in Debug configurations.
 IF (CMAKE_BUILD_TYPE MATCHES "Debug")
-	OPTION(BUILD_SAMPLE "Build sample.fdx? (Simple extension to demonstrate extension mechanism, for developpers only)" OFF)
-		IF (BUILD_SAMPLE)
-		   SUBDIRS(_sample)
-		ENDIF (BUILD_SAMPLE)
-
-	OPTION(BUILD_TEST_ACCT "Build test_acct.fdx? (Receive Accounting-Requests and display the data, but no storage)" OFF)
-		IF (BUILD_TEST_ACCT)
-		   SUBDIRS(test_acct)
-		ENDIF (BUILD_TEST_ACCT)
-		
-	OPTION(BUILD_TEST_RT_ANY "Build test_rt_any.fdx? (Routing extension randomly sending message to any peer available, for testing purpose only)" OFF)
- 		IF (BUILD_TEST_RT_ANY)
- 		   SUBDIRS(test_rt_any)
- 		ENDIF (BUILD_TEST_RT_ANY)
+	FD_EXTENSION_SUBDIR(_sample     "Simple extension to demonstrate extension mechanism, for developpers" OFF)
+	FD_EXTENSION_SUBDIR(test_acct   "Receive Accounting-Requests and display the data, but no storage" OFF)
+	FD_EXTENSION_SUBDIR(test_rt_any "Routing extension randomly sending message to any peer available, for testing purpose" OFF)
 ENDIF (CMAKE_BUILD_TYPE MATCHES "Debug")
 
Index: extensions/app_diameap/plugins/CMakeLists.txt
===================================================================
--- extensions/app_diameap/plugins/CMakeLists.txt	(revision 438)
+++ extensions/app_diameap/plugins/CMakeLists.txt	(revision 583)
@@ -10,22 +10,25 @@
 ENDMACRO(EAP_ADD_METHOD)
 
+# Use the macro FD_EAP_PLUGIN(extmacroname subdir descr default) to 
+# add a new extension subdirectory.
+MACRO(FD_EAP_PLUGIN EXTSUBDIR EXTDESCR EXTDEFAULT)
+   STRING(TOUPPER ${EXTSUBDIR} EXTMACRONAME)
+   IF (NOT ALL_EXTENSIONS)
+     OPTION(BUILD_${EXTMACRONAME} ${EXTDESCR} ${EXTDEFAULT})
+   ENDIF (NOT ALL_EXTENSIONS)
+   IF (BUILD_${EXTMACRONAME} OR ALL_EXTENSIONS)
+      ADD_SUBDIRECTORY(${EXTSUBDIR})
+   ENDIF (BUILD_${EXTMACRONAME} OR ALL_EXTENSIONS)
+ENDMACRO(FD_EAP_PLUGIN)
+
 ###########################
 # EAP Methods Plugins Section
 
 # EAP Identity plugin
-OPTION(BUILD_EAP_IDENTITY "Build EAP Identity Plugin " ON)
-	IF (BUILD_EAP_IDENTITY)
-	   ADD_SUBDIRECTORY(eap_identity)
-	ENDIF (BUILD_EAP_IDENTITY)
+FD_EAP_PLUGIN(eap_identity "Build EAP Identity Plugin " ON)
 
 # EAP MD5 plugin
-OPTION(BUILD_EAP_MD5 "Build EAP-MD5 Plugin " OFF)
-	IF (BUILD_EAP_MD5)
-	   ADD_SUBDIRECTORY(eap_md5)
-	ENDIF (BUILD_EAP_MD5)
+FD_EAP_PLUGIN(eap_md5 "Build EAP-MD5 Plugin " OFF)
 
 # EAP TLS plugin
-OPTION(BUILD_EAP_TLS "Build EAP-TLS Plugin " OFF)
-	IF (BUILD_EAP_TLS)
-	   ADD_SUBDIRECTORY(eap_tls)
-	ENDIF (BUILD_EAP_TLS)
+FD_EAP_PLUGIN(eap_tls "Build EAP-TLS Plugin " OFF)
Index: extensions/app_radgw/CMakeLists.txt
===================================================================
--- extensions/app_radgw/CMakeLists.txt	(revision 561)
+++ extensions/app_radgw/CMakeLists.txt	(revision 583)
@@ -60,48 +60,61 @@
 ENDMACRO(RGWX_ADD_PLUGIN)
 
+# Ask unless ALL_EXTENSIONS is set:
+MACRO(FD_OPTION_PLUGIN PLGVAR DESCR DEFLT)
+   IF (NOT ALL_EXTENSIONS)
+     OPTION(BUILD_${PLGVAR} ${DESCR} ${DEFLT})
+   ENDIF (NOT ALL_EXTENSIONS)
+   IF (BUILD_${PLGVAR} OR ALL_EXTENSIONS)
+     SET(${PLGVAR} TRUE)
+   ELSE (BUILD_${PLGVAR} OR ALL_EXTENSIONS)
+     SET(${PLGVAR} FALSE)
+   ENDIF (BUILD_${PLGVAR} OR ALL_EXTENSIONS)
+ENDMACRO(FD_OPTION_PLUGIN PLGVAR DESCR DEFLT)
+
 
 ### Debug 
 # Example of plugin:
-OPTION(BUILD_RGWX_SAMPLE "Build sample plugin? (for developers only)" OFF)
- 	IF (BUILD_RGWX_SAMPLE)
+
+FD_OPTION_PLUGIN(RGWX_SAMPLE "Build sample plugin? (for developers only)" OFF)
+ 	IF (RGWX_SAMPLE)
  	   RGWX_ADD_PLUGIN(sample ${RG_COMMON_HEADER} rgwx_sample.c)
- 	ENDIF (BUILD_RGWX_SAMPLE)
+ 	ENDIF (RGWX_SAMPLE)
 
 # A plugin for debug: dumps RADIUS and Diameter messages state at the time the plugin is called.
-OPTION(BUILD_RGWX_DEBUG "Build debug plugin? (display status of RADIUS and Diameter messages)" ON)
- 	IF (BUILD_RGWX_DEBUG)
+FD_OPTION_PLUGIN(RGWX_DEBUG "Build debug plugin? (display status of RADIUS and Diameter messages)" ON)
+ 	IF (RGWX_DEBUG)
  	   RGWX_ADD_PLUGIN(debug ${RG_COMMON_HEADER} rgwx_debug.c)
- 	ENDIF (BUILD_RGWX_DEBUG)
+ 	ENDIF (RGWX_DEBUG)
 
 
 ### Authentication, Authorization messages translation.
-OPTION(BUILD_RGWX_AUTH "Build Authentication & Authorization RADIUS translation plugin? (RFC2865, RFC3579)" ON)
-	IF (BUILD_RGWX_AUTH)
+FD_OPTION_PLUGIN(RGWX_AUTH "Build Authentication & Authorization RADIUS translation plugin? (RFC2865, RFC3579)" ON)
+	IF (RGWX_AUTH)
  	   RGWX_ADD_PLUGIN(auth ${RG_COMMON_HEADER} rgwx_auth.c)
-	ENDIF (BUILD_RGWX_AUTH)
+	ENDIF (RGWX_AUTH)
 
 ### SIP Authentication, Authorization messages translation.
-OPTION(BUILD_RGWX_SIP "Build SIP RADIUS translation plugin? (RFC4740 or RFC5090)" OFF)
-        IF (BUILD_RGWX_SIP)
+FD_OPTION_PLUGIN(RGWX_SIP "Build SIP RADIUS translation plugin? (RFC4740 or RFC5090)" OFF)
+        IF (RGWX_SIP)
            RGWX_ADD_PLUGIN(sip ${RG_COMMON_HEADER} rgwx_sip.c)
-        ENDIF (BUILD_RGWX_SIP)
+        ENDIF (RGWX_SIP)
 
 
 
 ### Accounting messages translation.
-OPTION(BUILD_RGWX_ACCT "Build Accounting RADIUS translation plugin? (RFC2866)" ON)
-	IF (BUILD_RGWX_ACCT)
+FD_OPTION_PLUGIN(RGWX_ACCT "Build Accounting RADIUS translation plugin? (RFC2866)" ON)
+	IF (RGWX_ACCT)
  	   RGWX_ADD_PLUGIN(acct ${RG_COMMON_HEADER} rgwx_acct.c)
-	ENDIF (BUILD_RGWX_ACCT)
+	ENDIF (RGWX_ACCT)
 
 
 ### Generic plugin to handle some attributes (either delete them or simply echo them in the answer) 
-OPTION(BUILD_RGWX_ECHODROP "Build 'echo/drop' plugin? (drop specific RADIUS attributes or echo them in RADIUS answer)" ON)
-  	IF (BUILD_RGWX_ECHODROP)
+FD_OPTION_PLUGIN(RGWX_ECHODROP "Build 'echo/drop' plugin? (drop specific RADIUS attributes or echo them in RADIUS answer)" ON)
+  	IF (RGWX_ECHODROP)
   	   BISON_FILE(rgwx_echodrop.y)
   	   FLEX_FILE(rgwx_echodrop.l)
   	   SET_SOURCE_FILES_PROPERTIES(lex.rgwx_echodrop.c rgwx_echodrop.tab.c PROPERTIES COMPILE_FLAGS "-I ${CMAKE_CURRENT_SOURCE_DIR}")
  	   RGWX_ADD_PLUGIN(echodrop ${RG_COMMON_HEADER} rgwx_echodrop.h rgwx_echodrop.c lex.rgwx_echodrop.c rgwx_echodrop.tab.c rgwx_echodrop.tab.h )
-  	ENDIF (BUILD_RGWX_ECHODROP)
+  	ENDIF (RGWX_ECHODROP)
 	
 	
