1

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
3
  • 2
    They are warnings, not errors. Suggest you try it. Aug 3, 2018 at 15:41
  • I tried but make executable never gets generated.
    – Rastlyn
    Aug 3, 2018 at 19:12
  • + added errors to question.
    – Rastlyn
    Aug 3, 2018 at 19:13

2 Answers 2

2

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.

1

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.)

3
  • Sounds logical, but even after I change compiler I get same errors.
    – Rastlyn
    Aug 3, 2018 at 19:07
  • I see. First of all, you should try make 3.82 and not 3.81 . If you just need 3.8x, then pick the latest in case there are little bugs. Also, if you search for that error you're getting, you'll find this long discussion. Basically, change line 211 of glob/glob.c and you're set. I was able to compile that with gcc 4.8 (but you can try the latest version too).
    – Ray
    Aug 4, 2018 at 2:35
  • After changing line 211 everything works perfectly. Thank you very much.
    – Rastlyn
    Aug 4, 2018 at 10:59

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .