I was writing a makefile for a web interface program that installs the cgi scripts to a (Linux) OS. The makefile works fine, but it needs to be able to install to different directories for different distributions (Fedora, Ubuntu). On Fedora, the scripts need to go to /var/www/cgi-bin and on Ubuntu, I believe it is /usr/lib/www/cgi-bin.
When I run uname -n on Ubuntu, it outputs "ubuntu", but on Fedora, it gives a combination of the username, computer name, and "hostname".
Does anyone have any idea how to determine the distribution in a makefile?

5 Years
Discussion Span
Last Post by iamthesgt

Hello iamthesgt!

I'm sure there's some standard way to do this, but I don't know it. There are lots of pre-existing scripts out there that are similar to this one, but here's something I have been using for a while:


# Check for FreeBSD in the uname output
# If it's not FreeBSD, then we move on!
if [ "$(uname -s)" == 'FreeBSD' ]; then

# Check for a redhat-release file and see if we can
# tell which Red Hat variant it is
elif [ -f "/etc/redhat-release" ]; then
  RHV=$(egrep -o 'Fedora|CentOS|Red.Hat' /etc/redhat-release)
  case $RHV in
    Fedora)  OS='fedora';;
    CentOS)  OS='centos';;
   Red.Hat)  OS='redhat';;

# Check for debian_version
elif [ -f "/etc/debian_version" ]; then

# Check for arch-release
elif [ -f "/etc/arch-release" ]; then

# Check for SuSE-release
elif [ -f "/etc/SuSE-release" ]; then


# echo the result
echo "$OS"

It probably needs to be updated, and if you want to get more granular (debian vs ubuntu) or go as far as specific versions for each distro, it'll require a bit more than what's here. Hopefully, though, this will get you started.



Works for me (I was using this in a makefile to determine install directories). This is what I had:

$(shell if [ -f "/etc/redhat-release" ]; then installdir="$fedora"; elif [ -f "/etc/debian_version" ]; then installdir="$ubuntu"; fi)

Actually I initially thought this worked, but it doesn't inside the Makefile (actually deleted the entire computer because the variable was not set, but that's another story). Looking around, I found I needed to set the variable to the end result of a statement, otherwise the variable will only work in local scope of the shell command. So now I've got:


installdir=$(shell `if [ -f "/etc/redhat-release" ]; then "$(fedora)"; elif [ -f "/etc/debian_version" ]; then "$(ubuntu)"; fi`)

However, this gives me the error: "/bin/sh: /usr/lib/cgi-bin: Permission denied" (even when run as super user, which is how the Makefile must be run). It appears the variable is getting set, but for some reason it can't access the directory. When just run as a shell script (slightly modified):

installdir=`if [ -f "/etc/redhat-release" ]; then "$fedora"; elif [ -f "/etc/debian_version" ]; then "$ubuntu"; fi`

I get the error "/usr/lib/cgi-bin: Is a directory"
It appears the commands are setting the variables or evaluating the commands at least, but just not going further. I don't have a clue to why this is not working. Can anyone help?

Edited by iamthesgt: n/a


Computers are dumb; you need to 'verb' the script what to do. You are executing those values; instead, you need to echo them so that the outer assignment can catch the printed value.


I got it actually, I ended up writing an external shell script an invoking it within the makefile. This is the shell script:

# This is a bash script written to determine the operating system being used. 
# Furthermore, this allows a value to be passed back to a variable within the Makefile.
# The paths that follow are for executable files.
# Paths for Fedora distros are /var/www/cgi-bin
# Paths for Ubuntu distros are /usr/lib/cig-bin


if [ -f "/etc/redhat-release" ]
elif [ -f "/etc/debian_version" ]
echo $returnval

And I invoke it like this (just set a variable with the output of the script):

app_path=$(shell ./osfinder_app)
	app_path=$(shell ./osfinder_app)

It now properly returns the proper path for the makefile's use. Thanks for everyone's help.

This question has already been answered. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.