cmake_minimum_required( VERSION 2.6 )
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
find_package ( Qt4 REQUIRED )
#LINK_DIRECTORIES(../bin)
SET(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin/)
#SET(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin/)

IF(APPLE)
	include(CPack)
	SET(MACOSX_BUNDLE_ICON_FILE "rds.icns")
	SET(MACOSX_BUNDLE_BUNDLE_NAME "Resara Admin Console")
	SET(MACOSX_BUNDLE_GUI_IDENTIFIER "Resara Admin Console")
ENDIF(APPLE)

IF(UNIX)
	set(CMAKE_CXX_FLAGS "-Wall")
	set(CMAKE_C_FLAGS "-Wall")
ENDIF(UNIX)

#############################################
############### SUBDIRECTORIES ##############
#############################################

SET(SUBDIRECTORIES
	qtrpc2
	shared
	rdsclient
	rdsconsole
)

SET(SUBDIRECTORIES_UNIX
	rdsldap
	rdsserver
	src
	test
	rdsd
	testclient
	testserver
	rdscontrol
	rdsprovision
	rdsacledit
	qtrpc2/testclient
	qtrpc2/testserver
)

#############################################
############# CONFIG VARIABLES ##############
#############################################

# Get the version from HG!
# current commit version
IF(WIN32)
EXECUTE_PROCESS(
	COMMAND cmd.exe
	ARGS /c hg parents
	OUTPUT_VARIABLE RDS_COMMIT_VERSION
)
ELSE(WIN32)
EXECUTE_PROCESS(
	COMMAND hg parents
	OUTPUT_VARIABLE RDS_COMMIT_VERSION
)

ENDIF(WIN32)

# get the named version from version.txt 
SET(VERSION_FILE "${CMAKE_SOURCE_DIR}/version.txt")
IF(WIN32)
STRING(REPLACE "/" "\\" VERSION_FILE ${VERSION_FILE})
EXECUTE_PROCESS(
	COMMAND cmd.exe
	ARGS /c type ${VERSION_FILE}
	OUTPUT_VARIABLE RDS_NAMED_VERSION
)
ELSE(WIN32)
EXECUTE_PROCESS(
	COMMAND cat ${VERSION_FILE}
	OUTPUT_VARIABLE RDS_NAMED_VERSION
)
ENDIF(WIN32)
STRING(REGEX REPLACE "\n" "" RDS_NAMED_VERSION ${RDS_NAMED_VERSION})

#because sometimes we build out of HG
IF(RDS_COMMIT_VERSION)
	STRING(REGEX REPLACE ".*changeset:   " "" RDS_COMMIT_VERSION "${RDS_COMMIT_VERSION}")
	STRING(REGEX REPLACE ":.*" "" RDS_COMMIT_VERSION "${RDS_COMMIT_VERSION}")
	SET(RDS_VERSION "${RDS_NAMED_VERSION}_${RDS_COMMIT_VERSION}")
ELSE(RDS_COMMIT_VERSION)
	SET(RDS_VERSION "${RDS_NAMED_VERSION}")
ENDIF(RDS_COMMIT_VERSION)


STRING(REGEX REPLACE "-.*" "" RDS_SHORT_NAMED_VERSION ${RDS_NAMED_VERSION})
SET(RDS_VERSION_NUMBER "${RDS_SHORT_NAMED_VERSION}.${RDS_COMMIT_VERSION}")

# set the prefix for samba
SET(RDS_SAMBA_PATH "/usr/local/samba/" CACHE STRING "Samba Path")
SET(RDS_SAMBA_UTIL_PATH "/usr/local/samba/bin/" CACHE STRING "Samba Util Path")

# Set the default values for the assorted subfolders of said prefix
SET(RDS_SAMBA_PROVISION_D "${RDS_SAMBA_PATH}/sbin/provision")
SET(RDS_SAMBA_PRIVATE_D "${RDS_SAMBA_PATH}/private/")
SET(RDS_SAMBA_SYSVOL_D "${RDS_SAMBA_PATH}/var/locks/sysvol/")
SET(RDS_SAMBA_RUN_D "${RDS_SAMBA_PATH}/var/run/")
SET(DNS_DEFAULT_FILE_D "${RDS_SAMBA_PRIVATE_D}/named.conf")
SET(RDS_SAMBA_CONFIGFILE_D "${RDS_SAMBA_PATH}/etc/smb.conf")
SET(SAMBA_NET_PATH_D "${RDS_SAMBA_PATH}/sbin/samba-tool")
SET(SAMBA_LDBADD_PATH_D "${RDS_SAMBA_UTIL_PATH}ldbadd")
SET(SAMBA_LDBEDIT_PATH_D "${RDS_SAMBA_UTIL_PATH}ldbedit")
SET(SAMBA_LDBDEL_PATH_D "${RDS_SAMBA_UTIL_PATH}ldbdel")
SET(LDAP_URI_D "ldapi://${RDS_SAMBA_PATH}/private/ldapi")

# Set up the options for these paths, and any other samba related paths
SET(RDS_SAMBA_PROVISION ${RDS_SAMBA_PROVISION_D} CACHE STRING "Samba Provision Script Path")
SET(RDS_SAMBA_PRIVATE ${RDS_SAMBA_PRIVATE_D} CACHE STRING "Samba Private Path")
SET(RDS_SAMBA_SYSVOL ${RDS_SAMBA_SYSVOL_D} CACHE STRING "Samba Sysvol Path")
SET(RDS_SAMBA_RUN ${RDS_SAMBA_RUN_D} CACHE STRING "Samba Run Path")
SET(DNS_DEFAULT_FILE ${DNS_DEFAULT_FILE_D} CACHE STRING "Samba's DNS config")
SET(RDS_SAMBA_CONFIGFILE ${RDS_SAMBA_CONFIGFILE_D} CACHE STRING "Samba config file")
SET(SAMBA_NET_PATH ${SAMBA_NET_PATH_D} CACHE STRING "Samba net path")
SET(SAMBA_LDBADD_PATH ${SAMBA_LDBADD_PATH_D} CACHE STRING "Samba ldbadd path")
SET(SAMBA_LDBEDIT_PATH ${SAMBA_LDBEDIT_PATH_D} CACHE STRING "Samba ldbedit path")
SET(SAMBA_LDBDEL_PATH ${SAMBA_LDBDEL_PATH_D} CACHE STRING "Samba ldbdel path")
SET(RDS_INITD_SAMBA4 "/etc/init.d/samba4" CACHE STRING "Samba Init script")
SET(LDAP_URI ${LDAP_URI_D} CACHE STRING "LDAP Uri")

# subfolders
SET(RDS_PREFIX ${CMAKE_INSTALL_PREFIX} CACHE STRING "Prefix for RDS paths to be compiled into RDS")

SET(RDS_DATA_PATH_D "${RDS_PREFIX}/lib/rds")
SET(RDS_DATA_PATH ${RDS_DATA_PATH_D} CACHE STRING "Path for RDS data files")

# RDS options
SET(RDS_LOGFILE "/var/log/rdsd.log" CACHE STRING "RDS logfile")
SET(RDS_CONF_PATH "/etc" CACHE STRING "RDS config file path")

# system level defines
SET(RDS_TIMEZONE "/etc/timezone" CACHE STRING "Timezone file")
SET(RDS_TIMEZONE_FOLDER "/usr/share/zoneinfo/%1" CACHE STRING "Timezone template path")
SET(RDS_KRB5 "/etc/krb5.conf" CACHE STRING "krb5.conf")
SET(RDS_HOSTNAME "/etc/hostname" CACHE STRING "Hostname file")
SET(RDS_HOSTS "/etc/hosts" CACHE STRING "Hosts file")
SET(RDS_NETWORK_INTERFACES "/etc/network/interfaces" CACHE STRING "Interfaces file")

# DNS related defines
SET(RDS_INITD_BIND "/etc/init.d/bind9" CACHE STRING "Bind9 init script")
SET(RDS_DNS_CONFIGDIR "/etc/bind/" CACHE STRING "Bind9 config directory")
SET(RDS_DNS_CONFIGDIR_BACKUP "/etc/bind.rdsbak" CACHE STRING "Backup directory for bind9 writing")
SET(RDS_DNS_ZONEDIR "/etc/bind/zones/" CACHE STRING "Bind9 zones path")

# DHCP
SET(RDS_INITD_DHCP "/etc/init.d/dhcp3-server" CACHE STRING "DHCPD init script")
SET(RDS_DHCP_CONFIGFILE "/etc/dhcp3/dhcpd.conf" CACHE STRING "DHCPD config file")

# put it all into config.h
CONFIGURE_FILE("${CMAKE_SOURCE_DIR}/shared/config.h.in" "${CMAKE_BINARY_DIR}/config.h" @ONLY)
CONFIGURE_FILE("${CMAKE_SOURCE_DIR}/windeps/rdsconsole.nsi.in" "${CMAKE_BINARY_DIR}/rdsconsole.nsi" @ONLY)


#############################################
################### MACROS ##################
#############################################

MACRO(USE_QT_LIB lib)
	SET(QT_USE_QT${lib} true)
	SET(LIBRARIES ${LIBRARIES} ${QT_QT${lib}_LIBRARIES})
	SET(INCLUDES ${INCLUDES} ${QT_QT${lib}_INCLUDE_DIR})
ENDMACRO(USE_QT_LIB)

MACRO(CALL_PROJECT_HACK name)
#	PROJECT(${name})
ENDMACRO(CALL_PROJECT_HACK)

MACRO(PROJECT_BEGIN name apptype)
	SET(PROJECT_NAME ${name})
	SET(PROJECT_APP_TYPE ${apptype})
	IF("${PROJECT_APP_TYPE}" MATCHES "LIBRARY")
		IF("${PROJECT_APP_TYPE}" MATCHES "STATIC_LIBRARY")
			SET(BUILD_${PROJECT_NAME}_STATIC ON)
			OPTION(BUILD_${PROJECT_NAME}_STATIC "Build ${PROJECT_NAME} statically." ON)
		ELSE("${PROJECT_APP_TYPE}" MATCHES "STATIC_LIBRARY")
			OPTION(BUILD_${PROJECT_NAME}_STATIC "Build ${PROJECT_NAME} statically." OFF)
		ENDIF("${PROJECT_APP_TYPE}" MATCHES "STATIC_LIBRARY")
	ENDIF("${PROJECT_APP_TYPE}" MATCHES "LIBRARY")
	CALL_PROJECT_HACK(${PROJECT_NAME})
ENDMACRO(PROJECT_BEGIN)

MACRO(PROJECT_END)
	SET(INCLUDES ${INCLUDES}
		./
	)
	include ( ${QT_USE_FILE} )

	QT4_WRAP_CPP(MOC_SOURCES ${HEADERS})
	QT4_WRAP_UI(FORMS_UI ${FORMS})
	QT4_ADD_RESOURCES(RESOURCES_SRCS ${RESOURCES})
	SET(SOURCES ${SOURCES} ${RESOURCES_SRCS})

	INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_BINARY_DIR})

	IF("${PROJECT_APP_TYPE}" MATCHES "LIBRARY")
		IF(BUILD_${PROJECT_NAME}_STATIC)
			SET(${PROJECT_NAME}_LIBRARY_TYPE STATIC)
		ELSE(BUILD_${PROJECT_NAME}_STATIC)
			SET(${PROJECT_NAME}_LIBRARY_TYPE SHARED)
		ENDIF(BUILD_${PROJECT_NAME}_STATIC)

		IF("${${PROJECT_NAME}_LIBRARY_TYPE}" MATCHES "STATIC")
			MESSAGE(STATUS "Building ${PROJECT_NAME} as a static library.")
		ELSE("${${PROJECT_NAME}_LIBRARY_TYPE}" MATCHES "STATIC")
			IF("${${PROJECT_NAME}_LIBRARY_TYPE}" MATCHES "SHARED")
				MESSAGE(STATUS "Building ${PROJECT_NAME} as a shared library.")
				IF(UNIX)
					ADD_CUSTOM_TARGET(
							lib${PROJECT_NAME}.so.1 ALL
							ln -fs lib${PROJECT_NAME}.so.1.0.0 lib${PROJECT_NAME}.so.1
							DEPENDS ${PROJECT_NAME}
					)
					INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/lib${PROJECT_NAME}.so.1
						DESTINATION lib
					)
				ENDIF(UNIX)
			ELSE("${${PROJECT_NAME}_LIBRARY_TYPE}" MATCHES "SHARED")
				MESSAGE(FATAL_ERROR "Library type must be either SHARED or STATIC, found ${${PROJECT_NAME}_LIBRARY_TYPE}. Please fix the PROJECT_BEGIN macro in CMakeLists.txt")
			ENDIF("${${PROJECT_NAME}_LIBRARY_TYPE}" MATCHES "SHARED")
		ENDIF("${${PROJECT_NAME}_LIBRARY_TYPE}" MATCHES "STATIC")

		ADD_LIBRARY(${PROJECT_NAME} ${${PROJECT_NAME}_LIBRARY_TYPE} ${SOURCES} ${MOC_SOURCES} ${FORMS_UI})
		SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES
					VERSION 1.0.0
					SOVERSION 1)
	ELSE("${PROJECT_APP_TYPE}" MATCHES "LIBRARY")
		IF("${PROJECT_APP_TYPE}" MATCHES "EXECUTABLE")
			MESSAGE(STATUS "Building ${PROJECT_NAME} as an executable.")
		ELSE("${PROJECT_APP_TYPE}" MATCHES "EXECUTABLE")
			MESSAGE(FATAL_ERROR "Project type must be either LIBRARY or EXECUTABLE, found ${PROJECT_APP_TYPE}. Please fix the PROJECT_BEGIN macro in CMakeLists.txt")
		ENDIF("${PROJECT_APP_TYPE}" MATCHES "EXECUTABLE")
		IF(WIN32)
			USE_QT_LIB(MAIN)
		ENDIF(WIN32)
		ADD_EXECUTABLE(${PROJECT_NAME} WIN32 MACOSX_BUNDLE ${SOURCES} ${MOC_SOURCES} ${FORMS_UI})
	ENDIF("${PROJECT_APP_TYPE}" MATCHES "LIBRARY")

	SET(LIBRARIES ${LIBRARIES} ${QT_LIBRARIES})
	TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIBRARIES})
	INCLUDE_DIRECTORIES(
		${INCLUDES}
		${QT_INCLUDE_DIR}
	)

	TARGET_LINK_LIBRARIES(${PROJECT_NAME}
		${QT_LIBRARIES}
	)
	SET(SOURCES)
	SET(HEADERS)
	SET(LIBRARIES)
	SET(INCLUDES)
	SET(RESOURCES)
	SET(FORMS)
	SET(PROJECT_NAME)
	SET(PROJECT_APP_TYPE)
ENDMACRO(PROJECT_END)


MACRO(INCLUDE_SHARED)
SET(INCLUDES ${INCLUDES}
	../lutil
	../shared/
)

SET(SOURCES ${SOURCES}
	../shared/rdsadobject.cpp
	../shared/rdscomputer.cpp
	../shared/rdsgroup.cpp
	../shared/rdsguid.cpp
	../shared/rdsntacl.cpp
	../shared/rdsntsecuritydescriptor.cpp
	../shared/rdsorganizationalunit.cpp
	../shared/rdssid.cpp
	../shared/rdsuser.cpp
	../shared/rdsentity.cpp
	../shared/rdsutils.cpp
	../shared/rdsdnsshared.cpp
	../shared/rdsdnsrecord.cpp
	../shared/rdsschedule.cpp
)

SET(HEADERS ${HEADERS}
	../shared/rdsadobject.h
	../shared/rdsadobject_p.h
	../shared/rdscomputer.h
	../shared/rdscomputer_p.h
	../shared/rdsglobal.h
	../shared/rdsgroup.h
	../shared/rdsgroup_p.h
	../shared/rdsguid.h
	../shared/rdsguid_p.h
	../shared/rdsntacl.h
	../shared/rdsntacl_p.h
	../shared/rdsntsecuritydescriptor.h
	../shared/rdsntsecuritydescriptor_p.h
	../shared/rdsorganizationalunit.h
	../shared/rdsorganizationalunit_p.h
	../shared/rdssid.h
	../shared/rdssid_p.h
	../shared/rdsuser.h
	../shared/rdsuser_p.h
	../shared/security.h
	../shared/rdsentity.h
	../shared/rdsentity_p.h
	../shared/rdsutils.h
	../shared/rdsdnsrecord.h
	../shared/rdsdnsrecord_p.h
	../shared/rdsschedule.h
	../shared/rdsschedule_p.h
)

SET(INCLUDES ${INCLUDES}
	../shared/include/
	../qtrpc2/
	../qtrpc2/include/
)

SET(LIBRARIES ${LIBRARIES}
	qtrpc2
)

USE_QT_LIB(NETWORK)
ENDMACRO(INCLUDE_SHARED)

MACRO(INCLUDE_TESTSHARED)

SET(LIBRARIES ${LIBRARIES}
	qtrpc2
)

SET(HEADERS ${HEADERS}
	../testshared/rdstest.h
	../testshared/exampletest.h
	../testshared/rdsldapactionstester.h
	../testshared/rdsldapobjecttester.h
	../testshared/rdsldapsessiontester.h
	../testshared/rdssharingtester.h
	../testshared/rdsentitytester.h
	../testshared/rdscomputertester.h
	../testshared/rdsadobjecttester.h
	../testshared/rdsgrouptester.h
	../testshared/rdsusertester.h
	../testshared/rdsorganizationalunittester.h
	../testshared/rdssidtester.h
	../testshared/rdsguidtester.h
	../testshared/rdsntsecuritydescriptortester.h
	../testshared/rdsntacltester.h
)

SET(SOURCES ${SOURCES}
	../testshared/rdstest.cpp
	../testshared/exampletest.cpp
	../testshared/rdsldapactionstester.cpp
	../testshared/rdsldapobjecttester.cpp
	../testshared/rdsldapsessiontester.cpp
	../testshared/rdssharingtester.cpp
	../testshared/rdsentitytester.cpp
	../testshared/rdscomputertester.cpp
	../testshared/rdsadobjecttester.cpp
	../testshared/rdsgrouptester.cpp
	../testshared/rdsusertester.cpp
	../testshared/rdsorganizationalunittester.cpp
	../testshared/rdssidtester.cpp
	../testshared/rdsguidtester.cpp
	../testshared/rdsntsecuritydescriptortester.cpp
	../testshared/rdsntacltester.cpp
)

SET(INCLUDES ${INCLUDES}
	../shared/include/
	/usr/include/qtrpc2/
)

SET(LIBRARIES ${LIBRARIES}
	qtrpc2
)

USE_QT_LIB(NETWORK)

ENDMACRO(INCLUDE_TESTSHARED)

MACRO(INSTALL_HEADERS path)
FILE(GLOB CONVHEADERS ./include/[A-Z]*)
FOREACH(CH ${CONVHEADERS})
	STRING(REGEX REPLACE ".*/" "" HEADERNAME ${CH})
	SET(HEADERNAME ${HEADERNAME}.h)
	STRING(TOLOWER ${HEADERNAME} HEADERNAME)
	INSTALL(FILES ${CH} ${HEADERNAME}
		DESTINATION include/${path})
ENDFOREACH()
ENDMACRO(INSTALL_HEADERS)

FOREACH(SUBDIR ${SUBDIRECTORIES})
	add_subdirectory(${SUBDIR})
ENDFOREACH()

IF(UNIX AND NOT APPLE)
FOREACH(SUBDIR ${SUBDIRECTORIES_UNIX})
	add_subdirectory(${SUBDIR})
ENDFOREACH()
ENDIF(UNIX AND NOT APPLE)

#############################################
################## INSTALL ##################
#############################################

IF(UNIX AND NOT APPLE)
	STRING(REGEX REPLACE "${RDS_PREFIX}/" "" ICONS_INSTALL_PATH "${RDS_DATA_PATH}/icons")
	INSTALL(DIRECTORY rdsconsole/icons/ DESTINATION ${ICONS_INSTALL_PATH})
	INSTALL(FILES rdsd/launchapp.vbs rdsd/drivemap.vbs rdsd/secrets.ldiff rdsd/secrets-edit.ldiff
		DESTINATION lib/rds/)
	INSTALL(FILES rdsd/provision
		DESTINATION lib/rds/
		PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
	)
	INSTALL(FILES rdsconsole/rdsconsole.desktop DESTINATION share/applications)
	INSTALL(FILES rdsconsole/icons/rdsconsole.png DESTINATION share/pixmaps)
ENDIF(UNIX AND NOT APPLE)

IF(APPLE)
	INSTALL(FILES rdsconsole/icons/rds.icns DESTINATION ${CMAKE_INSTALL_PREFIX}/rdsconsole.app/Contents/Resources/)
        INSTALL(DIRECTORY rdsconsole/icons/ DESTINATION ${CMAKE_INSTALL_PREFIX}/rdsconsole.app/Contents/Resources/icons/)
ENDIF(APPLE)

#############################################
############ WINDOWS INSTALLERS #############
#############################################

IF(WIN32)

ADD_CUSTOM_TARGET (
	installers
	DEPENDS rdsconsole rdsclient qtrpc2 "${CMAKE_BINARY_DIR}/bin/rdsconsole-${RDS_NAMED_VERSION}.zip" "${CMAKE_BINARY_DIR}/bin/rdsconsole-${RDS_NAMED_VERSION}.exe" ${CMAKE_BINARY_DIR}/WindowsInstaller/rdsconsole/rdsconsole.nsi ${CMAKE_SOURCE_DIR}/version.txt
)

STRING(REGEX REPLACE "/" "\\\\" WINDOWS_SOURCE_DIR ${CMAKE_SOURCE_DIR})
STRING(REGEX REPLACE "/" "\\\\" WINDOWS_BINARY_DIR ${CMAKE_BINARY_DIR})
STRING(REGEX REPLACE "/" "\\\\" WINDOWS_QT_DIR ${QT_BINARY_DIR})

ADD_CUSTOM_COMMAND(
	COMMAND   ${CMAKE_SOURCE_DIR}/windeps/install.bat
	ARGS      "${WINDOWS_SOURCE_DIR}" "${WINDOWS_BINARY_DIR}" "${RDS_NAMED_VERSION}" "${WINDOWS_QT_DIR}"
	OUTPUT    "${CMAKE_BINARY_DIR}/bin/rdsconsole-${RDS_NAMED_VERSION}.zip" "${CMAKE_BINARY_DIR}/bin/rdsconsole-${RDS_NAMED_VERSION}.exe"
	DEPENDS   rdsconsole rdsclient qtrpc2
)

ENDIF(WIN32)


