Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

tell if make is running on windows or linux

Is there a way to know in makefiles if GNU make is running on a linux OS or a windows OS?

I've built a bash script that generates a makefile for building my app and it works fine on my Debian machine. I want to try to build it on MinGW/MSYS, but the problem is that I have to build and run some test programs that check errors in source code, and to run it on Windows, I must add the .exe suffix.

like image 490
Gianni Pisetta Avatar asked Oct 24 '11 14:10

Gianni Pisetta


People also ask

How to determine if my computer has Linux installed or not?

How To Determine If My Computer Has Linux Installed? You can find information about the Linux or UNIX operating system on your PC by running the “uname” command. If you know your operating system is Linux or UNIX, make sure to run “uname -a” without quotation marks.

How do I check what processes are running in Linux?

The ps command displays your currently running processes in real-time. To test this, just open your terminal and run the ps command like so: This will display the process for the current shell with four columns: CMD returns the name of the command that launched the process.

How do I find out what operating system I'm running?

You can get a pretty coarse idea of the OS you're using by checking sys.platform. Once you have that information you can use it to determine if calling something like os.uname () is appropriate to gather more specific information. You could also use something like Python System Information on unix-like OSes, or pywin32 for Windows.

How to check the OS version at runtime?

The current best answer is Alex Sanséau's to Stack Overflow question How to check the OS version at runtime, e.g. on Windows or Linux, without using a conditional compilation statement .] You can detect the execution platform using System.Environment.OSVersion.Platform:


1 Answers

UPDATE
Please read this similar but better answer:
https://stackoverflow.com/a/14777895/938111


make (and gcc) can be easily installed on MS-Windows using Cygwin or MinGW.

As @ldigas says, make can detect the platform using UNAME:=$(shell uname) (the command uname is also installed by Cygwin or MinGW installer).

Below, I provide a complete example based on make (and gcc) to explain how to build a shared library: *.so or *.dll depending on the platform.

The example is basic/simple to be easily understandable :-)

Let's see the five files:

 ├── app
 │   └── Makefile
 │   └── main.c
 └── lib
     └── Makefile
     └── hello.h
     └── hello.c

The Makefiles

app/Makefile

app.exe: main.o
        gcc -o $@ $^ -L../lib -lhello
        # '-o $@'    => output file => $@ = the target file (app.exe)
        # '   $^'    => no options => Link all depended files 
        #            => $^ = main.o and other if any
        # '-L../lib' => look for libraries in directory ../lib
        # '-lhello   => use shared library hello (libhello.so or hello.dll)

%.o: %.c
        gcc -o $@ -c $< -I ../lib
        # '-o $@'     => output file => $@ = the target file (main.o)
        # '-c $<'     => COMPILE the first depended file (main.c)
        # '-I ../lib' => look for headers (*.h) in directory ../lib

clean:
        rm -f *.o *.so *.dll *.exe

lib/Makefile

UNAME := $(shell uname)

ifeq ($(UNAME), Linux)
TARGET = libhello.so
else
TARGET = hello.dll
endif

$(TARGET): hello.o
        gcc  -o $@  $^  -shared
        # '-o $@'    => output file => $@ = libhello.so or hello.dll
        # '   $^'    => no options => Link all depended files => $^ = hello.o
        # '-shared'  => generate shared library

%.o: %.c
        gcc  -o $@  -c $<  -fPIC
        # '-o $@' => output file => $@ = the target file (hello.o)
        # '-c $<' => compile the first depended file (hello.c)
        # '-fPIC' => Position-Independent Code (required for shared lib)

clean:
        rm -f *.o *.so *.dll *.exe

The source code

app/main.c

#include "hello.h" //hello()
#include <stdio.h> //puts()

int main()
{
    const char* str = hello();
    puts(str);
}

lib/hello.h

#ifndef __HELLO_H__
#define __HELLO_H__

const char* hello();

#endif

lib/hello.c

#include "hello.h"

const char* hello()
{
    return "hello";
}

The build

Fix Makefiles copy (replace leading spaces by tabulation).

> sed  -i  's/^  */\t/'  */Makefile

The make command is the same on both platforms. This is the output on MS-Windows (removed unnecessary lines).

> cd lib
> make clean
> make
gcc  -o hello.o  -c hello.c  -fPIC
gcc  -o hello.dll  hello.o  -shared
> cd ../app
> make clean
> make
gcc -o main.o -c main.c -I ../lib
gcc -o app.exe main.o -L../lib -lhello

The run

The application requires to know where is the shared library.

On MS-Windows, the simple/basic/stupid way is to copy the library where the application is:

> cp -v lib/hello.dll app
`lib/hello.dll' -> `app/hello.dll'

On Linux, use the LD_LIBRARY_PATH environment variable:

> export LD_LIBRARY_PATH=lib

The run command line and output are the same on both platforms:

> app/app.exe
hello
like image 80
oHo Avatar answered Sep 29 '22 15:09

oHo