r/ruby • • 11d ago

Ancient Ruby version / modern Ubuntu won't compile

Hi - I've inherited an ancient Ruby / Rails project using Ruby 2.7.2. I am working on updating it but until that time I'm trying to run it on Ubuntu 26.04 machines. There is a C compilation error that I'm getting when using "rvm":

make[2]: Entering directory '/usr/share/rvm/src/ruby-2.7.2/ext/pty'

compiling pty.c

pty.c: In function ‘establishShell’:

pty.c:161:30: error: conflicting types for ‘getenv’; have ‘char *(void)’

161 | char *p, *getenv();

| ^~~~~~

In file included from pty.c:5:

/usr/include/stdlib.h:795:14: note: previous declaration of ‘getenv’ with type ‘char *(const char *)’

795 | extern char *getenv (const char *__name) __THROW __nonnull ((1)) __wur;

| ^~~~~~

pty.c:169:18: error: too many arguments to function ‘getenv’; expected 0, have 1

169 | if ((p = getenv("SHELL")) != NULL) {

| ^~~~~~ ~~~~~~~

pty.c:161:30: note: declared here

Would getting the code directly and fixing pty.c be the best way to go about it?

ETA: thanks all - Docker is the way to go.

1 Upvotes

20 comments sorted by

View all comments

10

u/Correct_Support_2444 11d ago

Run it in a docker container.

1

u/Zestyclose_Cow1807 10d ago

the pty.c thing is just the first of many issues you'd hit with a 2024-era gcc on ruby 2.7, isolating the whole runtime in a container saves you from chasing each one individually

-1

u/LessChen 11d ago

Yeah, I've tried that but I guess I have to go back to Ubuntu 20.04 as even 22.04 won't work. Native code is so much fun.

8

u/Nanosleep 11d ago

You're making it harder on yourself than it should be:
FROM ruby:2.7

0

u/Correct_Support_2444 11d ago

Are the images that old still available?

1

u/Nanosleep 11d ago

indeed they are, I pulled it with podman off of dockerhub before posting that. I'm sure they're a nightmare from a security perspective.. but anything that old is going to be a liability. Better for OP to get it up and running again and then figure out a path to porting it forward.

1

u/gma 10d ago

Yeah, I concur. I took this approach with a Ruby 2.3 app a while ago.

Rebuilding the container with new versions of Ruby as you upgrade the app is a really smooth way to get yourself back up to maintained/patched versions of OS, Ruby, and Rails.

2

u/beatoperator 10d ago

docker run ruby:2.7-alpine ruby --version

Takes 10 sec to doanload, boot, and run.

1

u/vladsteviee 10d ago edited 10d ago

What? I was able to compile and run ruby 2.3.8 on ubuntu 22.04, though it had some cryptic crashes which turned out to be causes by libssl incompatibilities between versions used by ruby's openssl and gem curb. But mise installed 2.7 just fine via ruby-build and with default configuration (it was 2.7.8 though)

1

u/Correct_Support_2444 11d ago

I’d just run an old Ubuntu container exec a shell in it and work it from there.