How to determine operating system in elisp?

EmacsElisp

Emacs Problem Overview


How do I programmatically determine which OS Emacs is running under in ELisp?

I would like to run different code in .emacs depending on the OS.

Emacs Solutions


Solution 1 - Emacs

The system-type variable:

system-type is a variable defined in `C source code'.
Its value is darwin

Documentation:
Value is symbol indicating type of operating system you are using.
Special values:
  `gnu'         compiled for a GNU Hurd system.
  `gnu/linux'   compiled for a GNU/Linux system.
  `darwin'      compiled for Darwin (GNU-Darwin, Mac OS X, ...).
  `ms-dos'      compiled as an MS-DOS application.
  `windows-nt'  compiled as a native W32 application.
  `cygwin'      compiled using the Cygwin library.
Anything else indicates some sort of Unix system.

Solution 2 - Emacs

For folks newer to elisp, a sample usage:

(if (eq system-type 'darwin)
  ; something for OS X if true
  ; optional something if not
)

Solution 3 - Emacs

I created a simple macro to easily run code depending on the system-type:

(defmacro with-system (type &rest body)
  "Evaluate BODY if `system-type' equals TYPE."
  (declare (indent defun))
  `(when (eq system-type ',type)
     ,@body))

(with-system gnu/linux
  (message "Free as in Beer")
  (message "Free as in Freedom!"))

Solution 4 - Emacs

In a .emacs, there is not only the system-type, but also the window-system variable. This is useful when you want to choose between some x only option, or a terminal, or macos setting.

Solution 5 - Emacs

Now there is also Linux Subsystem for Windows (bash under Windows 10) where system-type is gnu/linux. To detect this system type use:

(if
    (string-match "Microsoft"
         (with-temp-buffer (shell-command "uname -r" t)
                           (goto-char (point-max))
                           (delete-char -1)
                           (buffer-string)))
    (message "Running under Linux subsystem for Windows")
    (message "Not running under Linux subsystem for Windows")
  )

Solution 6 - Emacs

This is mostly already answered, but for those interested, I just tested this on FreeBSD and there the reported value was "berkeley-unix".

Solution 7 - Emacs

There's also (in versions 24-26 at least) system-configuration, if you want to adjust for differences in build system. However, the documentation of this variable does not describe the possible vales that it may contain like the documentation of the system-type variable does.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionljsView Question on Stackoverflow
Solution 1 - EmacsscottfrazerView Answer on Stackoverflow
Solution 2 - EmacsEndrjuView Answer on Stackoverflow
Solution 3 - EmacsGerstmannView Answer on Stackoverflow
Solution 4 - EmacsEricView Answer on Stackoverflow
Solution 5 - EmacsKonrad EiseleView Answer on Stackoverflow
Solution 6 - EmacsJostein KjønigsenView Answer on Stackoverflow
Solution 7 - EmacsJürgen A. ErhardView Answer on Stackoverflow