diff --git a/cmake/systemd.cmake b/cmake/systemd.cmake
index ed021227dfc31fb52a3f0a246d88095fcbeba5c6..4cf2acb8e053c5c4b2ba291e34a31559f90e2da0 100644
--- a/cmake/systemd.cmake
+++ b/cmake/systemd.cmake
@@ -1,32 +1,51 @@
-find_package(PkgConfig QUIET)
-if (PKG_CONFIG_FOUND)
-    pkg_check_modules(SYSTEMD "systemd")
+# Disable systemd and sysvinit by default if target is not Linux
+if (NOT DEFINED WITH_SYSTEMD AND NOT TARGET_OS_LINUX)
+    set(WITH_SYSTEMD OFF)
+endif()
+if (NOT DEFINED WITH_SYSVINIT AND NOT TARGET_OS_LINUX)
+    set(WITH_SYSVINIT OFF)
+endif()
+
+# try to find systemd if it wasn't implicitly disabled
+if (NOT DEFINED WITH_SYSTEMD OR WITH_SYSTEMD)
+    find_package(PkgConfig QUIET)
+    if (PKG_CONFIG_FOUND)
+        pkg_check_modules(SYSTEMD "systemd")
+    endif()
 endif()
 
 if (NOT SYSTEMD_FOUND)
+    # systemd was implicitly requsted by the user
     if (WITH_SYSTEMD)
         message (FATAL_ERROR "WITH_SYSTEMD is defined, "
             "but we can't find systemd using pkg-config")
     endif()
     set(WITH_SYSTEMD "OFF")
-    file(APPEND "${_OptionalPackagesFile}" "-- WITH_SYSTEMD=OFF\n")
-    return()
-endif()
+    # Fallback to sysvinit if it wasn't implicitly enabled
+    if (NOT DEFINED WITH_SYSVINIT)
+        set(WITH_SYSVINIT ON)
+    endif()    
+else()
+    if ("${SYSTEMD_UNIT_DIR}" STREQUAL "")
+        execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE}
+            --variable=systemdsystemunitdir systemd
+            OUTPUT_VARIABLE SYSTEMD_UNIT_DIR)
+        string(REGEX REPLACE "[ \t\n]+" "" SYSTEMD_UNIT_DIR
+            "${SYSTEMD_UNIT_DIR}")
+    endif()
 
-if ("${SYSTEMD_UNIT_DIR}" STREQUAL "")
-    execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE}
-        --variable=systemdsystemunitdir systemd
-        OUTPUT_VARIABLE SYSTEMD_UNIT_DIR)
-    string(REGEX REPLACE "[ \t\n]+" "" SYSTEMD_UNIT_DIR
-        "${SYSTEMD_UNIT_DIR}")
-endif()
+    if ("${SYSTEMD_TMPFILES_DIR}" STREQUAL "")
+        # NOTE: don't use ${CMAKE_INSTALL_LIBDIR} here
+        set(SYSTEMD_TMPFILES_DIR "${CMAKE_INSTALL_PREFIX}/lib/tmpfiles.d")
+    endif()
 
-if ("${SYSTEMD_TMPFILES_DIR}" STREQUAL "")
-    # NOTE: don't use ${CMAKE_INSTALL_LIBDIR} here
-    set(SYSTEMD_TMPFILES_DIR "${CMAKE_INSTALL_PREFIX}/lib/tmpfiles.d")
+    set(WITH_SYSTEMD "ON")
+    message(STATUS "SYSTEMD_UNIT_DIR: ${SYSTEMD_UNIT_DIR}")
+    message(STATUS "SYSTEMD_TMPFILES_DIR: ${SYSTEMD_TMPFILES_DIR}")
+    # Disable sysvinit if it wasn't implicitly requested
+    if (NOT DEFINED WITH_SYSVINIT)
+        set(WITH_SYSVINIT "OFF")
+    endif()
 endif()
-
-set(WITH_SYSTEMD "ON")
-message(STATUS "SYSTEMD_UNIT_DIR: ${SYSTEMD_UNIT_DIR}")
-message(STATUS "SYSTEMD_TMPFILES_DIR: ${SYSTEMD_TMPFILES_DIR}")
-file(APPEND "${_OptionalPackagesFile}" "-- WITH_SYSTEMD=ON\n")
+file(APPEND "${_OptionalPackagesFile}" "-- WITH_SYSTEMD=${WITH_SYSTEMD}\n")
+file(APPEND "${_OptionalPackagesFile}" "-- WITH_SYSVINIT=${WITH_SYSVINIT}\n")
diff --git a/extra/dist/CMakeLists.txt b/extra/dist/CMakeLists.txt
index 9924bd8dfb4c0b04fea213644351f3bb2a4462d1..35a13dc3e19fb19e123502bc65d4264ad6819eb4 100644
--- a/extra/dist/CMakeLists.txt
+++ b/extra/dist/CMakeLists.txt
@@ -113,10 +113,9 @@ if (WITH_SYSTEMD)
         OWNER_READ OWNER_WRITE
         GROUP_READ GROUP_READ
         WORLD_READ WORLD_READ)
+endif()
 
-elseif(TARGET_OS_FREEBSD)
-    message (STATUS "Skip installation of init.d scripts on FreeBSD")
-else() # sysvinit
+if(WITH_SYSVINIT)
     message (STATUS "Using scripts for sysvinit")
     install (FILES tarantool.init DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/init.d/
         RENAME tarantool