changeset 101:113d909fdfe1

CMake: disallow absolute paths, #389
author David Demelier <markand@malikania.fr>
date Mon, 25 Apr 2016 21:16:47 +0200
parents a3814665a60d
children 4777f7e18bf2
files CMakeLists.txt cmake/IrccdOptions.cmake cmake/IrccdSystem.cmake cmake/function/IrccdDefineExecutable.cmake cmake/function/IrccdDefineHtml.cmake cmake/function/IrccdDefineMan.cmake cmake/function/IrccdDefinePlugin.cmake cmake/internal/sysconfig.hpp.in contrib/CMakeLists.txt doc/CMakeLists.txt doc/examples/CMakeLists.txt doc/html/resources/CMakeLists.txt lib/CMakeLists.txt lib/irccd/path.cpp lib/irccd/path.hpp plugins/CMakeLists.txt
diffstat 16 files changed, 51 insertions(+), 177 deletions(-) [+]
line wrap: on
line diff
--- a/CMakeLists.txt	Fri Apr 22 18:50:00 2016 +0200
+++ b/CMakeLists.txt	Mon Apr 25 21:16:47 2016 +0200
@@ -137,23 +137,3 @@
 #
 #	add_dependencies(release package_ifw)
 #endif ()
-
-# Show warnings about non-relocatable irccd.
-if (NOT IRCCD_RELOCATABLE)
-	message("Note: irccd is not relocatable, the following paths are absolute:")
-	message("")
-
-	foreach (path ${IRCCD_ABSOLUTE_PATHS})
-		message("    ${path} is set to ${${path}}")
-	endforeach ()
-
-	message("")
-	message("You can still use irccd, but you won't be able to move the application to a")
-	message("different directory.")
-	message("")
-	message("This may be an issue with some packages manager which allows relocating")
-	message("application in different directories.")
-	message("")
-	message("Set to relative paths if this is a concern.")
-	message("")
-endif ()
--- a/cmake/IrccdOptions.cmake	Fri Apr 22 18:50:00 2016 +0200
+++ b/cmake/IrccdOptions.cmake	Mon Apr 25 21:16:47 2016 +0200
@@ -37,9 +37,6 @@
 #
 # Options that controls both installations and the irccd runtime:
 #
-# Note: it is allowed to use absolute path but it's *strongly* recommended to
-#       use relative paths if you want to keep irccd relocatable.
-#
 # WITH_BINDIR		Binary directory for irccd, irccdctl
 # WITH_PLUGINDIR	Path where plugins must be installed
 # WITH_DOCDIR		Path where to install documentation
@@ -129,22 +126,14 @@
 endif ()
 
 #
-# Check if any of these path is absolute and mark irccd relocatable
-# only if all paths are relative
+# Check if any of these path is absolute and raise an error if true.
 #
-set(IRCCD_RELOCATABLE TRUE)
-
 foreach (d WITH_BINDIR WITH_CACHEDIR WITH_DATADIR WITH_CONFDIR WITH_PLUGINDIR)
 	if (IS_ABSOLUTE ${${d}})
-		list(APPEND IRCCD_ABSOLUTE_PATHS ${d})
-		set(IRCCD_RELOCATABLE FALSE)
+		message(FATAL_ERROR "${d} can not be absolute (${${d}} given)")
 	endif ()
 endforeach ()
 
-if (IRCCD_RELOCATABLE)
-	set(IRCCD_FAKEDIR ${CMAKE_BINARY_DIR}/fakeroot)
-endif ()
-
 # ---------------------------------------------------------
 # Internal dependencies
 # ---------------------------------------------------------
@@ -222,9 +211,7 @@
 
 set(IRCCD_PACKAGE FALSE)
 
-if (NOT IRCCD_RELOCATABLE)
-	set(IRCCD_PACKAGE_MSG "No (irccd not relocatable)")
-elseif (NOT WITH_HTML)
+if (NOT WITH_HTML)
 	set(IRCCD_PACKAGE_MSG "No (HTML documentation disabled)")
 elseif (NOT WIN32)
 	set(IRCCD_PACKAGE_MSG "No (only for Windows)")
--- a/cmake/IrccdSystem.cmake	Fri Apr 22 18:50:00 2016 +0200
+++ b/cmake/IrccdSystem.cmake	Mon Apr 25 21:16:47 2016 +0200
@@ -68,6 +68,12 @@
 	set(IRCCD_64BITS FALSE)
 endif ()
 
+set(IRCCD_FAKEROOTDIR ${CMAKE_BINARY_DIR}/fakeroot)
+
+if (NOT EXISTS ${IRCCD_FAKEROOTDIR})
+	file(MAKE_DIRECTORY ${IRCCD_FAKEROOTDIR})
+endif ()
+
 # ---------------------------------------------------------
 # System identification
 # ---------------------------------------------------------
@@ -250,22 +256,7 @@
 check_struct_has_member("struct stat" st_uid sys/stat.h HAVE_STAT_ST_UID)
 
 # Configuration file.
-file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/irccd)
-
 configure_file(
 	${CMAKE_CURRENT_LIST_DIR}/internal/sysconfig.hpp.in
-	${CMAKE_BINARY_DIR}/irccd/sysconfig.hpp
-)
-
-install(
-	FILES ${CMAKE_BINARY_DIR}/irccd/sysconfig.hpp
-	DESTINATION include/irccd
+	${IRCCD_FAKEROOTDIR}/include/irccd/sysconfig.hpp
 )
-
-# Also copy to fakedir if possible
-if (IRCCD_RELOCATABLE)
-	file(
-		COPY ${CMAKE_BINARY_DIR}/irccd/sysconfig.hpp
-		DESTINATION ${IRCCD_FAKEDIR}/include/irccd
-	)
-endif ()
--- a/cmake/function/IrccdDefineExecutable.cmake	Fri Apr 22 18:50:00 2016 +0200
+++ b/cmake/function/IrccdDefineExecutable.cmake	Mon Apr 25 21:16:47 2016 +0200
@@ -56,24 +56,9 @@
 	target_compile_definitions(${EXE_TARGET} PRIVATE ${EXE_FLAGS})
 	target_link_libraries(${EXE_TARGET} ${EXE_LIBRARIES})
 
-	# use fakeroot if relocatable for public executables.
-	if (IRCCD_RELOCATABLE AND NOT EXE_PRIVATE)
-		file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/fakeroot/${WITH_BINDIR})
-
-		set_target_properties(
-			${EXE_TARGET}
-			PROPERTIES
-				RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/fakeroot/${WITH_BINDIR}
-				RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/fakeroot/${WITH_BINDIR}
-				RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/fakeroot/${WITH_BINDIR}
-		)
-	endif ()
-
-	# Install the target.
-	if (EXE_INSTALL)
-		install(
-			TARGETS ${EXE_TARGET}
-			RUNTIME DESTINATION ${WITH_BINDIR}
-		)
+	# use fakeroot for public executables.
+	if (NOT EXE_PRIVATE)
+		set_target_properties(${EXE_TARGET} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${IRCCD_FAKEROOTDIR}/${WITH_BINDIR})
+		install(TARGETS ${EXE_TARGET} RUNTIME DESTINATION ${WITH_BINDIR})
 	endif ()
 endfunction()
--- a/cmake/function/IrccdDefineHtml.cmake	Fri Apr 22 18:50:00 2016 +0200
+++ b/cmake/function/IrccdDefineHtml.cmake	Mon Apr 25 21:16:47 2016 +0200
@@ -57,11 +57,7 @@
 		message(FATAL_ERROR "Please specify a target")
 	endif ()
 
-	if (IRCCD_RELOCATABLE)
-		set(base ${CMAKE_BINARY_DIR}/fakeroot/${WITH_DOCDIR})
-	else ()
-		set(base ${CMAKE_BINARY_DIR}/docs)
-	endif ()
+	set(base ${IRCCD_FAKEROOTDIR}/${WITH_DOCDIR})
 
 	if (HTML_OUTPUT)
 		#
--- a/cmake/function/IrccdDefineMan.cmake	Fri Apr 22 18:50:00 2016 +0200
+++ b/cmake/function/IrccdDefineMan.cmake	Mon Apr 25 21:16:47 2016 +0200
@@ -28,16 +28,9 @@
 
 function(irccd_define_man file man)
 	if (WITH_MAN)
-		set(path ${doc_SOURCE_DIR}/man/${file}.in)
-
-		# install to fakeroot if applicable.
-		if (IRCCD_RELOCATABLE)
-			set(output ${CMAKE_BINARY_DIR}/fakeroot/${WITH_MANDIR}/${man}/${file})
-		else ()
-			set(output ${CMAKE_BINARY_DIR}/docs/man/${man}/${file})
-		endif ()
-
-		configure_file(${path} ${output} @ONLY)
+		set(input ${doc_SOURCE_DIR}/man/${file}.in)
+		set(output ${IRCCD_FAKEROOTDIR}/${WITH_MANDIR}/${man}/${file})
+		configure_file(${input} ${output} @ONLY)
 		install(FILES ${output} DESTINATION ${WITH_MANDIR}/${man})
 	endif ()
 endfunction()
--- a/cmake/function/IrccdDefinePlugin.cmake	Fri Apr 22 18:50:00 2016 +0200
+++ b/cmake/function/IrccdDefinePlugin.cmake	Mon Apr 25 21:16:47 2016 +0200
@@ -27,12 +27,7 @@
 #
 macro(irccd_define_plugin file)
 	get_filename_component(name ${file} NAME)
-
-	if (IRCCD_RELOCATABLE)
-		set(base ${CMAKE_BINARY_DIR}/fakeroot/${WITH_PLUGINDIR})
-	else ()
-		set(base ${CMAKE_BINARY_DIR}/plugin)
-	endif ()
+	set(base ${IRCCD_FAKEROOTDIR}/${WITH_PLUGINDIR})
 
 	# Substitude variables in the JavaScript file.
 	configure_file(${file} ${base}/${name})
--- a/cmake/internal/sysconfig.hpp.in	Fri Apr 22 18:50:00 2016 +0200
+++ b/cmake/internal/sysconfig.hpp.in	Mon Apr 25 21:16:47 2016 +0200
@@ -38,8 +38,6 @@
 #define IRCCD_VERSION_MINOR	@IRCCD_VERSION_MINOR@
 #define IRCCD_VERSION_PATCH	@IRCCD_VERSION_PATCH@
 
-#cmakedefine IRCCD_RELOCATABLE
-
 /*
  * System identification.
  * ------------------------------------------------------------------
--- a/contrib/CMakeLists.txt	Fri Apr 22 18:50:00 2016 +0200
+++ b/contrib/CMakeLists.txt	Mon Apr 25 21:16:47 2016 +0200
@@ -21,12 +21,7 @@
 if (WITH_SYSTEMD)
 	# Directory for systemd
 	set(WITH_SYSTEMDDIR "/usr/lib/systemd/system" CACHE STRING "Absolute path where to install systemd files")
-
-	if (IRCCD_RELOCATABLE)
-		set(PATH "${CMAKE_INSTALL_PREFIX}/${WITH_BINDIR}/irccd")
-	else ()
-		set(PATH "${WITH_BINDIR}/irccd")
-	endif ()
+	set(PATH "${CMAKE_INSTALL_PREFIX}/${WITH_BINDIR}/irccd")
 
 	configure_file(
 		${CMAKE_CURRENT_SOURCE_DIR}/irccd.service
--- a/doc/CMakeLists.txt	Fri Apr 22 18:50:00 2016 +0200
+++ b/doc/CMakeLists.txt	Mon Apr 25 21:16:47 2016 +0200
@@ -31,20 +31,6 @@
 		${doc_SOURCE_DIR}/procs/60.new-command.md
 )
 
-#
-# Set the DOC_OUTPUT variable to where files will be installed
-# -------------------------------------------------------------------
-#
-# Depending if irccd is relocatable or not, documentation generated will be in a different folder, either
-# in the real fakeroot documentation directory or not.
-#
-
-if (IRCCD_RELOCATABLE)
-	set(DOC_OUTPUT ${CMAKE_BINARY_DIR}/fakeroot/${WITH_DOCDIR})
-else ()
-	set(DOC_OUTPUT ${CMAKE_BINARY_DIR}/docs)
-endif ()
-
 # Needed for fakeroot
 if (WITH_DOXYGEN)
 	add_subdirectory(doxygen)
--- a/doc/examples/CMakeLists.txt	Fri Apr 22 18:50:00 2016 +0200
+++ b/doc/examples/CMakeLists.txt	Mon Apr 25 21:16:47 2016 +0200
@@ -18,32 +18,30 @@
 
 project(examples)
 
-if (IRCCD_RELOCATABLE)
-	add_custom_command(
-		OUTPUT
-			${CMAKE_BINARY_DIR}/fakeroot/${WITH_CONFDIR}/irccd.conf.sample
-			${CMAKE_BINARY_DIR}/fakeroot/${WITH_CONFDIR}/irccdctl.conf.sample
-		COMMAND
-			${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/irccd.conf ${CMAKE_BINARY_DIR}/fakeroot/${WITH_CONFDIR}/irccd.conf.sample
-		COMMAND
-			${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/irccdctl.conf ${CMAKE_BINARY_DIR}/fakeroot/${WITH_CONFDIR}/irccdctl.conf.sample
-		DEPENDS
-			${CMAKE_CURRENT_SOURCE_DIR}/irccd.conf
-			${CMAKE_CURRENT_SOURCE_DIR}/irccdctl.conf
-	)
+add_custom_command(
+	OUTPUT
+		${IRCCD_FAKEROOTDIR}/${WITH_CONFDIR}/irccd.conf.sample
+		${IRCCD_FAKEROOTDIR}/${WITH_CONFDIR}/irccdctl.conf.sample
+	COMMAND
+		${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/irccd.conf ${IRCCD_FAKEROOTDIR}/${WITH_CONFDIR}/irccd.conf.sample
+	COMMAND
+		${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/irccdctl.conf ${IRCCD_FAKEROOTDIR}/${WITH_CONFDIR}/irccdctl.conf.sample
+	DEPENDS
+		${CMAKE_CURRENT_SOURCE_DIR}/irccd.conf
+		${CMAKE_CURRENT_SOURCE_DIR}/irccdctl.conf
+)
 
-	add_custom_target(
-		docs-examples
-		DEPENDS
-			${CMAKE_BINARY_DIR}/fakeroot/${WITH_CONFDIR}/irccd.conf.sample
-			${CMAKE_BINARY_DIR}/fakeroot/${WITH_CONFDIR}/irccdctl.conf.sample
-		SOURCES
-			${CMAKE_CURRENT_SOURCE_DIR}/irccd.conf
-			${CMAKE_CURRENT_SOURCE_DIR}/irccdctl.conf
-	)
+add_custom_target(
+	docs-examples
+	DEPENDS
+		${IRCCD_FAKEROOTDIR}/${WITH_CONFDIR}/irccd.conf.sample
+		${IRCCD_FAKEROOTDIR}/${WITH_CONFDIR}/irccdctl.conf.sample
+	SOURCES
+		${CMAKE_CURRENT_SOURCE_DIR}/irccd.conf
+		${CMAKE_CURRENT_SOURCE_DIR}/irccdctl.conf
+)
 
-	add_dependencies(docs docs-examples)
-endif ()
+add_dependencies(docs docs-examples)
 
 install(
 	FILES irccdctl.conf
--- a/doc/html/resources/CMakeLists.txt	Fri Apr 22 18:50:00 2016 +0200
+++ b/doc/html/resources/CMakeLists.txt	Mon Apr 25 21:16:47 2016 +0200
@@ -41,9 +41,9 @@
 foreach (f ${CSS_FILES} ${JS_FILES})
 	get_filename_component(base ${f} DIRECTORY)
 	get_filename_component(name ${f} NAME)
-	list(APPEND OUTPUTS ${DOC_OUTPUT}/${base}/${name})
+	list(APPEND OUTPUTS ${IRCCD_FAKEROOTDIR}/${WITH_DOCDIR}/${base}/${name})
 	list(APPEND SOURCES ${resources_SOURCE_DIR}/${f})
-	list(APPEND COMMANDS COMMAND ${CMAKE_COMMAND} -E copy ${resources_SOURCE_DIR}/${f} ${DOC_OUTPUT}/${base})
+	list(APPEND COMMANDS COMMAND ${CMAKE_COMMAND} -E copy ${resources_SOURCE_DIR}/${f} ${IRCCD_FAKEROOTDIR}/${WITH_DOCDIR}/${base})
 	install(FILES ${resources_SOURCE_DIR}/${f} DESTINATION ${WITH_DOCDIR}/${base})
 endforeach ()
 
@@ -51,8 +51,8 @@
 	OUTPUT ${OUTPUTS}
 	DEPENDS ${SOURCES}
 	COMMENT "Copying HTML resources"
-	COMMAND ${CMAKE_COMMAND} -E make_directory ${DOC_OUTPUT}/css
-	COMMAND ${CMAKE_COMMAND} -E make_directory ${DOC_OUTPUT}/js
+	COMMAND ${CMAKE_COMMAND} -E make_directory ${IRCCD_FAKEROOTDIR}/${WITH_DOCDIR}/css
+	COMMAND ${CMAKE_COMMAND} -E make_directory ${IRCCD_FAKEROOTDIR}/${WITH_DOCDIR}/js
 	${COMMANDS}
 )
 
--- a/lib/CMakeLists.txt	Fri Apr 22 18:50:00 2016 +0200
+++ b/lib/CMakeLists.txt	Mon Apr 25 21:16:47 2016 +0200
@@ -27,8 +27,8 @@
 	PUBLIC
 		$<BUILD_INTERFACE:${duktape_SOURCE_DIR}>
 		$<BUILD_INTERFACE:${extern-libircclient_SOURCE_DIR}/include>
-		$<BUILD_INTERFACE:${irccd_BINARY_DIR}/irccd>
-		$<BUILD_INTERFACE:${irccd_BINARY_DIR}>
+		$<BUILD_INTERFACE:${IRCCD_FAKEROOTDIR}/include/irccd>
+		$<BUILD_INTERFACE:${IRCCD_FAKEROOTDIR}/include>
 		$<BUILD_INTERFACE:${lib_SOURCE_DIR}>
 		$<INSTALL_INTERFACE:include>
 		${OPENSSL_INCLUDE_DIR}
--- a/lib/irccd/path.cpp	Fri Apr 22 18:50:00 2016 +0200
+++ b/lib/irccd/path.cpp	Mon Apr 25 21:16:47 2016 +0200
@@ -71,14 +71,11 @@
  * Base program directory
  * ------------------------------------------------------------------
  *
- * This variable stores the program base directory. It is only enabled when irccd is relocatable because we can
- * retrieve the base directory by removing WITH_BINDIR.
+ * This variable stores the program base directory.
  *
  * If it is empty, the program was not able to detect it (e.g. error, not supported).
  */
 
-#if defined(IRCCD_RELOCATABLE)
-
 std::string base;
 
 #if defined(IRCCD_SYSTEM_WINDOWS)
@@ -167,8 +164,6 @@
 
 #endif
 
-#endif // !IRCCD_RELOCATABLE
-
 /*
  * System paths
  * ------------------------------------------------------------------
@@ -180,46 +175,30 @@
 
 std::string systemConfig()
 {
-#if defined(IRCCD_RELOCATABLE)
 	assert(!base.empty());
 
 	return base + WITH_CONFDIR;
-#else
-	return fs::isAbsolute(WITH_CONFDIR) ? WITH_CONFDIR : std::string(PREFIX) + fs::separator() + WITH_CONFDIR;
-#endif
 }
 
 std::string systemData()
 {
-#if defined(IRCCD_RELOCATABLE)
 	assert(!base.empty());
 
 	return base + WITH_DATADIR;
-#else
-	return fs::isAbsolute(WITH_DATADIR) ? WITH_CONFDIR : std::string(PREFIX) + fs::separator() + WITH_DATADIR;
-#endif
 }
 
 std::string systemCache()
 {
-#if defined(IRCCD_RELOCATABLE)
 	assert(!base.empty());
 
 	return base + WITH_CACHEDIR;
-#else
-	return fs::isAbsolute(WITH_CACHEDIR) ? WITH_CACHEDIR : std::string(PREFIX) + fs::separator() + WITH_CACHEDIR;
-#endif
 }
 
 std::string systemPlugins()
 {
-#if defined(IRCCD_RELOCATABLE)
 	assert(!base.empty());
 
 	return base + WITH_PLUGINDIR;
-#else
-	return fs::isAbsolute(WITH_PLUGINDIR) ? WITH_PLUGINDIR : std::string(PREFIX) + fs::separator() + WITH_PLUGINDIR;
-#endif
 }
 
 /*
@@ -388,7 +367,6 @@
 
 void setApplicationPath(const std::string &argv0)
 {
-#if defined(IRCCD_RELOCATABLE)
 	try {
 		base = executablePath();
 	} catch (const std::exception &) {
@@ -439,9 +417,6 @@
 	base = clean(base);
 
 	assert(!base.empty());
-#else
-	(void)argv0;
-#endif
 }
 
 std::string clean(std::string input)
--- a/lib/irccd/path.hpp	Fri Apr 22 18:50:00 2016 +0200
+++ b/lib/irccd/path.hpp	Mon Apr 25 21:16:47 2016 +0200
@@ -89,8 +89,7 @@
 /**
  * Generic function for multiple paths.
  *
- * This function will add more directories than pathSystem*() and pathUser*() functions, for example
- * it will add some path if irccd is relocatable.
+ * This function will add more directories than pathSystem*() and pathUser*() functions.
  *
  * \pre setApplicationPath must have been called
  * \param path the type of path
--- a/plugins/CMakeLists.txt	Fri Apr 22 18:50:00 2016 +0200
+++ b/plugins/CMakeLists.txt	Mon Apr 25 21:16:47 2016 +0200
@@ -32,11 +32,7 @@
 
 		# 2. Build documentation.
 		if (WITH_HTML)
-			if (IRCCD_RELOCATABLE)
-				set(basedocdir ${CMAKE_BINARY_DIR}/fakeroot/${WITH_DOCDIR})
-			else ()
-				set(basedocdir ${CMAKE_BINARY_DIR}/docs)
-			endif ()
+			set(basedocdir ${IRCCD_FAKEROOTDIR}/${WITH_DOCDIR})
 
 			file(RELATIVE_PATH baseurl ${basedocdir}/plugin ${basedocdir})