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

  • Sounds logical, but even after I change compiler I get same errors. – Rastlyn Aug 3 '18 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 '18 at 2:35
  • After changing line 211 everything works perfectly. Thank you very much. – Rastlyn Aug 4 '18 at 10:59
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.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.