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?
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
# 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
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.
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?
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" ]
And I invoke it like this (just set a variable with the output of the script):