Install older version of gnu-make in Ubuntu 18.04

I want to install make 3.81 on Ubuntu 18.04.

So I download this version of make and run ./configure and then make. But when compiling it gives me this error:

./glob/glob.c: In function ‘glob’:
./glob/glob.c:581:23: warning: implicit declaration of function ‘__alloca’; did you mean ‘alloca’? [-Wimplicit-function-declaration]
       newp = (char *) __alloca (dirlen + 1);
                       ^~~~~~~~
                       alloca
./glob/glob.c:581:14: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
       newp = (char *) __alloca (dirlen + 1);
              ^
./glob/glob.c:709:15: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
        newp = (char *) __alloca (home_len + dirlen);
               ^
./glob/glob.c:732:15: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
        newp = (char *) __alloca (end_name - dirname);
               ^
./glob/glob.c:783:15: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
        newp = (char *) __alloca (home_len + rest_len + 1);
               ^
./glob/glob.c:814:11: warning: implicit declaration of function ‘__stat’; did you mean ‘__xstat’? [-Wimplicit-function-declaration]
         : __stat (dirname, &st)) == 0
           ^~~~~~
           __xstat
./glob/glob.c: In function ‘glob_in_dir’:
./glob/glob.c:1256:21: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
    char *fullname = (char *) __alloca (dirlen + 1 + patlen + 1);
                     ^
./glob/glob.c:1283:12: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
    names = (struct globlink *) __alloca (sizeof (struct globlink));
            ^
./glob/glob.c:1341:32: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
         struct globlink *new = (struct globlink *)
                                ^
./glob/glob.c:1367:15: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
       names = (struct globlink *) __alloca (sizeof (struct globlink));

Same situation at building version 3.82. My current version of make is 4.1.

Is anybody know what could be wrong?

Thanks

EDIT:

glob/libglob.a(glob.o): In function `glob_in_dir':
/opt/make-3.81/glob/glob.c:1361: undefined reference to `__alloca'
/opt/make-3.81/glob/glob.c:1336: undefined reference to `__alloca'
/opt/make-3.81/glob/glob.c:1277: undefined reference to `__alloca'
/opt/make-3.81/glob/glob.c:1250: undefined reference to `__alloca'
glob/libglob.a(glob.o): In function `glob':
/opt/make-3.81/glob/glob.c:575: undefined reference to `__alloca'
glob/libglob.a(glob.o):/opt/make-3.81/glob/glob.c:726: more undefined references to `__alloca' follow
collect2: error: ld returned 1 exit status
Makefile:410: recipe for target 'make' failed
make[2]: *** [make] Error 1
make[2]: Leaving directory '/opt/make-3.81'
Makefile:603: recipe for target 'all-recursive' failed
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory '/opt/make-3.81'
Makefile:326: recipe for target 'all' failed
make: *** [all] Error 2

Answers 2

  • Each new version of gcc changes slightly according to the standard or better adherence to the standard. One thing I've noticed is that it becomes stricter and stricter. So, for example, you might have code from 5 years ago that would compile fine 5 years ago, but with the latest version of gcc, you may get all these warnings and errors.

    It looks like make 3.81 was used in Ubuntu trusty: make 3.81 . It also looks like Ubuntu trusty was using gcc 4.8.2. So, one thing you can try is to install gcc 4.x and use that to compile.

    In Ubuntu 18.04, install the package gcc-4.8 . Then type ./configure --help . You will see a list of environment variables that you can set that will change the compiler. This is also explained here.

    I think this will work. (I've had to do something similar before.)


  • This looks to be a problem with gcc version 7.3.0 (Ubuntu 7.3.0-27ubuntu1~18.04)

    For some reason the compiler's default #defines are not in keeping with what make expected. I get same problems making make-4.2.1 which is the latest.

    I changed glob/glob.c lines 211 onwward to be :

    if  1 // !defined __alloca && !defined __GNU_LIBRARY__
    
    if 1  // ifdef        __GNUC__
     undef alloca
     define alloca(n)     __builtin_alloca (n)
    

    To force glob.c to use the builtin. This works. And seems to be your issue also with the older make.

    I did NOT have this problem making make under Ubuntu 16.04.


Related Questions