From 25654fa09069c18384746e555474d28451d04d19 Mon Sep 17 00:00:00 2001 From: Frank Halasz Date: Fri, 13 Mar 2026 23:51:50 -0700 Subject: [PATCH] For Linux makefiles, automated selection of gcc versus clang compiler depending on whats installed. Refactored Linux makefiles to simplify top level makefiles with slightly more complicated common makefiles. Makefiles for Cygwin and WSL1 all rewritten to use the common linux makefiles code. --- bin/linux-common.mk | 28 ++++++++++++++++++----- bin/linux-compiler.mk | 40 +++++++++++++++++++++++++++++++++ bin/linux-sdl.mk | 2 +- bin/makefile-cygwin.x86_64-sdl | 29 +++++------------------- bin/makefile-cygwin.x86_64-x | 31 +++++-------------------- bin/makefile-init-linux.aarch64 | 9 +++----- bin/makefile-init-linux.x86_64 | 9 +++----- bin/makefile-init-wsl1.aarch64 | 28 ++++------------------- bin/makefile-init-wsl1.x86_64 | 28 ++++------------------- bin/makefile-linux.386-sdl | 6 ++--- bin/makefile-linux.386-x | 6 ++--- bin/makefile-linux.aarch64-sdl | 5 ++--- bin/makefile-linux.aarch64-x | 5 ++--- bin/makefile-linux.armv7l-sdl | 5 ++--- bin/makefile-linux.armv7l-x | 5 ++--- bin/makefile-linux.x86_64-sdl | 6 ++--- bin/makefile-linux.x86_64-x | 5 ++--- bin/makefile-wsl1.aarch64-sdl | 26 ++++----------------- bin/makefile-wsl1.aarch64-x | 28 ++++------------------- bin/makefile-wsl1.x86_64-sdl | 28 +++++------------------ bin/makefile-wsl1.x86_64-x | 31 +++++-------------------- 21 files changed, 126 insertions(+), 234 deletions(-) create mode 100644 bin/linux-compiler.mk diff --git a/bin/linux-common.mk b/bin/linux-common.mk index c39251e..7129f74 100644 --- a/bin/linux-common.mk +++ b/bin/linux-common.mk @@ -1,15 +1,33 @@ # Common Options for All Linuxes -CC = gcc $(GCC_CFLAGS) -# CC = clang $(CLANG_CFLAGS) +include linux-compiler.mk -include linux-libbsd.mk +ifeq ($(USE_LIBBSD),T) + include linux-libbsd.mk +else + BSD_CFLAGS := + BSD_LDFLAGS := +endif -# OPTFLAGS is normally -O2. -OPTFLAGS = -O2 -g3 +ifeq ($(USE_DISPLAY),x) + include linux-x.mk + DEFAULT_TARGET := ../$(OSARCHNAME)/lde ../$(OSARCHNAME)/ldex +endif +ifeq ($(USE_DISPLAY),sdl) + include linux-sdl.mk + DEFAULT_TARGET := ../$(OSARCHNAME)/lde ../$(OSARCHNAME)/ldesdl +endif +ifeq ($(USE_DISPLAY),init) + include linux-x.mk + DEFAULT_TARGET := ../$(OSARCHNAME)/ldeinit +endif + +OPTFLAGS ?= -O2 -g3 DFLAGS = $(XFLAGS) -DRELEASE=$(RELEASE) $(BSD_CFLAGS) $(ADDITIONAL_DFLAGS) LDFLAGS = $(XLDFLAGS) -lc -lm $(BSD_LDFLAGS) LDELDFLAGS = $(XLDFLAGS) -lc -lm $(BSD_LDFLAGS) OBJECTDIR = ../$(RELEASENAME)/ + +default: $(DEFAULT_TARGET) diff --git a/bin/linux-compiler.mk b/bin/linux-compiler.mk new file mode 100644 index 0000000..e147e8a --- /dev/null +++ b/bin/linux-compiler.mk @@ -0,0 +1,40 @@ +# Select whether to use clang or gcc +# Priority +# 1. If -DUSE_GCC or -DUSE_CLANG on command line (but not both) use the requested compiler. +# 2. If one compiler is installed but not the other, use the installed compiler. +# 3. Use clang + +EXISTS_GCC := $(shell command -v gcc) +EXISTS_CLANG := $(shell command -v clang) +ifeq ($(or $(EXISTS_GCC),$(EXISTS_CLANG)),) + $(error "Cannot find compiler: neither gcc nor clang. Exiting.") +endif +ifneq ($(and $(USE_CLANG),$(USE_GCC)),) + $(error "Cannot use both USE_CLANG=T and USE_GCC=T. Exiting.") +endif +COMPILER := +ifdef USE_CLANG + ifeq ($(EXISTS_CLANG),) + $(error "USE_CLANG=T given, but cannot find the clang compiler. Exiting") + endif + COMPILER := clang +endif +ifdef USE_GCC + ifeq ($(EXISTS_GCC),) + $(error "USE_GCC=T given, but cannot find the gcc compiler. Exiting") + endif + COMPILER := gcc +endif +ifeq ($(COMPILER),) + ifneq ($(EXISTS_CLANG),) + COMPILER := clang + else + COMPILER := gcc + endif +endif + +ifeq ($(COMPILER),gcc) + CC := gcc $(GCC_CFLAGS) +else + CC := clang $(CLANG_CFLAGS) +endif diff --git a/bin/linux-sdl.mk b/bin/linux-sdl.mk index 764d2fa..f24b3a9 100644 --- a/bin/linux-sdl.mk +++ b/bin/linux-sdl.mk @@ -10,5 +10,5 @@ XFILES = $(OBJECTDIR)sdl.o # XFLAGS = -DSDL=2 -XLDFLAGS = -lSDL2 +XLDFLAGS ?= -lSDL2 diff --git a/bin/makefile-cygwin.x86_64-sdl b/bin/makefile-cygwin.x86_64-sdl index 28531eb..2de38d5 100644 --- a/bin/makefile-cygwin.x86_64-sdl +++ b/bin/makefile-cygwin.x86_64-sdl @@ -1,26 +1,9 @@ # Options for Linux, Intel x86_64 and X-Window -CC = gcc -m64 $(GCC_CFLAGS) -I/usr/local/include -#CC = clang -m64 $(CLANG_CFLAGS) +GCC_CFLAGS := -m64 $(GCC_CFLAGS) -I/usr/local/include +CLANG_CFLAGS := -m64 $(CLANG_CFLAGS) -I/usr/local/include +USE_DISPLAY=sdl +USE_LIBBSD=F +XLDFLAGS := -L/usr/local/lib -lSDL2 -XFILES = $(OBJECTDIR)sdl.o - -# -# For SDL version 2 -# -DSDL=2 in XFLAGS and -lSDL2 in LDFLAGS -# For SDL version 3 -# -DSDL=3 in XFLAGS and -lSDL3 in LDFLAGS -# -XFLAGS = -DSDL=2 - -# OPTFLAGS is normally -O2. -OPTFLAGS = -O2 -g3 -DFLAGS = $(XFLAGS) -DRELEASE=$(RELEASE) - -LDFLAGS = -lm -L/usr/local/lib -lSDL2 -# -LDELDFLAGS = - -OBJECTDIR = ../$(RELEASENAME)/ - -default : ../$(OSARCHNAME)/lde ../$(OSARCHNAME)/ldesdl +include linux-common.mk diff --git a/bin/makefile-cygwin.x86_64-x b/bin/makefile-cygwin.x86_64-x index 499d5d1..8747f35 100644 --- a/bin/makefile-cygwin.x86_64-x +++ b/bin/makefile-cygwin.x86_64-x @@ -1,28 +1,9 @@ -# Options for Linux, Intel x86_64 and X-Window +# Options for Cygwin, Intel x86_64 and X-Window -#CC = gcc -m64 $(GCC_CFLAGS) -CC = clang -m64 $(CLANG_CFLAGS) +GCC_CFLAGS := -m64 $(GCC_CFLAGS) +CLANG_CFLAGS := -m64 $(CLANG_CFLAGS) +USE_DISPLAY=x +USE_LIBBSD=F -XFILES = $(OBJECTDIR)xmkicon.o \ - $(OBJECTDIR)xbbt.o \ - $(OBJECTDIR)dspif.o \ - $(OBJECTDIR)xinit.o \ - $(OBJECTDIR)xscroll.o \ - $(OBJECTDIR)xcursor.o \ - $(OBJECTDIR)xlspwin.o \ - $(OBJECTDIR)xrdopt.o \ - $(OBJECTDIR)xwinman.o +include linux-common.mk - -XFLAGS = -DXWINDOW - -# OPTFLAGS is normally -O2. -OPTFLAGS = -O2 -g3 -DFLAGS = $(XFLAGS) -DRELEASE=$(RELEASE) - -LDFLAGS = -L/usr/X11/lib -lX11 -lc -lm -LDELDFLAGS = -L/usr/X11/lib -lX11 -lc -lm - -OBJECTDIR = ../$(RELEASENAME)/ - -default : ../$(OSARCHNAME)/lde ../$(OSARCHNAME)/ldex diff --git a/bin/makefile-init-linux.aarch64 b/bin/makefile-init-linux.aarch64 index 3920d46..1e4502a 100644 --- a/bin/makefile-init-linux.aarch64 +++ b/bin/makefile-init-linux.aarch64 @@ -1,12 +1,9 @@ # Options for Linux, aarch64 processor, X windows, for INIT processing -include linux-x.mk - +OPTFLAGS = -O0 -g DEBUGFLAGS = ADDITIONAL_DFLAGS = $(DEBUGFLAGS) -DNOVERSION -DINIT +USE_LIBBSD=T +USE_DISPLAY=init include linux-common.mk - -OPTFLAGS = -O0 -g - -default : ../$(OSARCHNAME)/ldeinit diff --git a/bin/makefile-init-linux.x86_64 b/bin/makefile-init-linux.x86_64 index eb33754..bd2074a 100644 --- a/bin/makefile-init-linux.x86_64 +++ b/bin/makefile-init-linux.x86_64 @@ -1,12 +1,9 @@ # Options for Linux, x86 processor, X windows, for INIT processing -include linux-x.mk - +OPTFLAGS = -O0 -g DEBUGFLAGS = ADDITIONAL_DFLAGS = $(DEBUGFLAGS) -DNOVERSION -DINIT +USE_LIBBSD=T +USE_DISPLAY=init include linux-common.mk - -OPTFLAGS = -O0 -g - -default : ../$(OSARCHNAME)/ldeinit diff --git a/bin/makefile-init-wsl1.aarch64 b/bin/makefile-init-wsl1.aarch64 index 7fb5fce..d8e7051 100644 --- a/bin/makefile-init-wsl1.aarch64 +++ b/bin/makefile-init-wsl1.aarch64 @@ -1,29 +1,9 @@ # Options for Windows System for Linux v1, aarch64 processor, X windows, for INIT processing -CC = gcc $(GCC_CFLAGS) -#CC = clang $(CLANG_CFLAGS) - -XFILES = $(OBJECTDIR)xmkicon.o \ - $(OBJECTDIR)xbbt.o \ - $(OBJECTDIR)dspif.o \ - $(OBJECTDIR)xinit.o \ - $(OBJECTDIR)xscroll.o \ - $(OBJECTDIR)xcursor.o \ - $(OBJECTDIR)xlspwin.o \ - $(OBJECTDIR)xrdopt.o \ - $(OBJECTDIR)xwinman.o - - -XFLAGS = -DXWINDOW - -# OPTFLAGS is normally -O2, for INIT we want unoptimized in case we need to debug it OPTFLAGS = -O0 -g DEBUGFLAGS = -DFLAGS = $(DEBUGFLAGS) $(XFLAGS) -DRELEASE=$(RELEASE) -DNOVERSION -DINIT -D__wsl1__ +ADDITIONAL_DFLAGS = $(DEBUGFLAGS) -DNOVERSION -DINIT -D__wsl1__ +USE_LIBBSD=T +USE_DISPLAY=init -LDFLAGS = -L/usr/X11/lib -lX11 -lc -lm -lbsd -LDELDFLAGS = -L/usr/X11/lib -lX11 -lc -lm -lbsd - -OBJECTDIR = ../$(RELEASENAME)/ - -default : ../$(OSARCHNAME)/ldeinit +include linux-common.mk diff --git a/bin/makefile-init-wsl1.x86_64 b/bin/makefile-init-wsl1.x86_64 index a35a195..5f7a542 100644 --- a/bin/makefile-init-wsl1.x86_64 +++ b/bin/makefile-init-wsl1.x86_64 @@ -1,29 +1,9 @@ # Options for Windows System for Linux v1, Intel x86_64 processor, X windows, for INIT processing -CC = gcc $(GCC_CFLAGS) -#CC = clang $(CLANG_CFLAGS) - -XFILES = $(OBJECTDIR)xmkicon.o \ - $(OBJECTDIR)xbbt.o \ - $(OBJECTDIR)dspif.o \ - $(OBJECTDIR)xinit.o \ - $(OBJECTDIR)xscroll.o \ - $(OBJECTDIR)xcursor.o \ - $(OBJECTDIR)xlspwin.o \ - $(OBJECTDIR)xrdopt.o \ - $(OBJECTDIR)xwinman.o - - -XFLAGS = -DXWINDOW - -# OPTFLAGS is normally -O2, for INIT we want unoptimized in case we need to debug it OPTFLAGS = -O0 -g DEBUGFLAGS = -DFLAGS = $(DEBUGFLAGS) $(XFLAGS) -DRELEASE=$(RELEASE) -DNOVERSION -DINIT -D__wsl1__ +ADDITIONAL_DFLAGS = $(DEBUGFLAGS) -DNOVERSION -DINIT -D__wsl1__ +USE_LIBBSD=T +USE_DISPLAY=init -LDFLAGS = -L/usr/X11/lib -lX11 -lc -lm -lbsd -LDELDFLAGS = -L/usr/X11/lib -lX11 -lc -lm -lbsd - -OBJECTDIR = ../$(RELEASENAME)/ - -default : ../$(OSARCHNAME)/ldeinit +include linux-common.mk diff --git a/bin/makefile-linux.386-sdl b/bin/makefile-linux.386-sdl index 28b61fe..18c26fb 100644 --- a/bin/makefile-linux.386-sdl +++ b/bin/makefile-linux.386-sdl @@ -2,9 +2,7 @@ GCC_CFLAGS := -m64 $(GCC_CFLAGS) CLANG_CFLAGS := -m64 $(CLANG_CFLAGS) - -include linux-sdl.mk +USE_DISPLAY=sdl +USE_LIBBSD=T include linux-common.mk - -default : ../$(OSARCHNAME)/lde ../$(OSARCHNAME)/ldesdl diff --git a/bin/makefile-linux.386-x b/bin/makefile-linux.386-x index 3ce00c4..0abcc25 100644 --- a/bin/makefile-linux.386-x +++ b/bin/makefile-linux.386-x @@ -2,9 +2,7 @@ GCC_CFLAGS := -m32 $(GCC_CFLAGS) CLANG_CFLAGS := -m32 $(CLANG_CFLAGS) - -include linux-x.mk +USE_DISPLAY=x +USE_LIBBSD=T include linux-common.mk - -default : ../$(OSARCHNAME)/lde ../$(OSARCHNAME)/ldex diff --git a/bin/makefile-linux.aarch64-sdl b/bin/makefile-linux.aarch64-sdl index dcf5c1d..4241218 100644 --- a/bin/makefile-linux.aarch64-sdl +++ b/bin/makefile-linux.aarch64-sdl @@ -1,7 +1,6 @@ # Options for Linux, ARM64 and SDL -include linux-sdl.mk +USE_DISPLAY=sdl +USE_LIBBSD=T include linux-common.mk - -default : ../$(OSARCHNAME)/lde ../$(OSARCHNAME)/ldesdl diff --git a/bin/makefile-linux.aarch64-x b/bin/makefile-linux.aarch64-x index 90ecd86..48bfc97 100644 --- a/bin/makefile-linux.aarch64-x +++ b/bin/makefile-linux.aarch64-x @@ -1,7 +1,6 @@ # Options for Linux, aarch64 and X-Window -include linux-x.mk +USE_DISPLAY=x +USE_LIBBSD=T include linux-common.mk - -default : ../$(OSARCHNAME)/lde ../$(OSARCHNAME)/ldex diff --git a/bin/makefile-linux.armv7l-sdl b/bin/makefile-linux.armv7l-sdl index 5d5f53a..2a31fca 100644 --- a/bin/makefile-linux.armv7l-sdl +++ b/bin/makefile-linux.armv7l-sdl @@ -1,7 +1,6 @@ # Options for Linux, ARMv7 and SDL -include linux-sdl.mk +USE_DISPLAY=sdl +USE_LIBBSD=T include linux-common.mk - -default : ../$(OSARCHNAME)/lde ../$(OSARCHNAME)/ldesdl diff --git a/bin/makefile-linux.armv7l-x b/bin/makefile-linux.armv7l-x index b113143..c69d063 100644 --- a/bin/makefile-linux.armv7l-x +++ b/bin/makefile-linux.armv7l-x @@ -1,7 +1,6 @@ # Options for Linux, ARMv7 and X-Window -include linux-x.mk +USE_DISPLAY=x +USE_LIBBSD=T include linux-common.mk - -default : ../$(OSARCHNAME)/lde ../$(OSARCHNAME)/ldex diff --git a/bin/makefile-linux.x86_64-sdl b/bin/makefile-linux.x86_64-sdl index 47698cb..396e303 100644 --- a/bin/makefile-linux.x86_64-sdl +++ b/bin/makefile-linux.x86_64-sdl @@ -2,9 +2,7 @@ GCC_CFLAGS := -m64 $(GCC_CFLAGS) CLANG_CFLAGS := -m64 $(CLANG_CFLAGS) - -include linux-sdl.mk +USE_DISPLAY=sdl +USE_LIBBSD=T include linux-common.mk - -default : ../$(OSARCHNAME)/lde ../$(OSARCHNAME)/ldesdl diff --git a/bin/makefile-linux.x86_64-x b/bin/makefile-linux.x86_64-x index 6c9f398..7ffbb6b 100644 --- a/bin/makefile-linux.x86_64-x +++ b/bin/makefile-linux.x86_64-x @@ -2,9 +2,8 @@ GCC_CFLAGS := -m64 $(GCC_CFLAGS) CLANG_CFLAGS := -m64 $(CLANG_CFLAGS) - -include linux-x.mk +USE_DISPLAY=x +USE_LIBBSD=T include linux-common.mk -default : ../$(OSARCHNAME)/lde ../$(OSARCHNAME)/ldex diff --git a/bin/makefile-wsl1.aarch64-sdl b/bin/makefile-wsl1.aarch64-sdl index 7e756e9..c7ce045 100644 --- a/bin/makefile-wsl1.aarch64-sdl +++ b/bin/makefile-wsl1.aarch64-sdl @@ -1,25 +1,7 @@ # Options for Windows System for Linux v1, ARM64 and SDL -CC = gcc $(GCC_CFLAGS) -#CC = clang $(CLANG_CFLAGS) +USE_DISPLAY=sdl +USE_LIBBSD=T +ADDITIONAL_DFLAGS := -D__wsl1__ -XFILES = $(OBJECTDIR)sdl.o - -# -# For SDL version 2 -# -DSDL=2 in SDLFLAGS and -lSDL2 in LDFLAGS -# For SDL version 3 -# -DSDL=3 in SDLFLAGS and -lSDL3 in LDFLAGS -# -SDLFLAGS = -DSDL=2 - -# OPTFLAGS is normally -O2. -OPTFLAGS = -O2 -g3 -DFLAGS = $(SDLFLAGS) -DRELEASE=$(RELEASE) -D__wsl1__ - -LDFLAGS = -lSDL2 -lm -lbsd -LDELDFLAGS = -lbsd - -OBJECTDIR = ../$(RELEASENAME)/ - -default : ../$(OSARCHNAME)/lde ../$(OSARCHNAME)/ldesdl +include linux-common.mk diff --git a/bin/makefile-wsl1.aarch64-x b/bin/makefile-wsl1.aarch64-x index fb57847..b742b42 100644 --- a/bin/makefile-wsl1.aarch64-x +++ b/bin/makefile-wsl1.aarch64-x @@ -1,27 +1,7 @@ # Options for Windows System for Linux v1, aarch64 and X-Window -CC = gcc $(GCC_CFLAGS) -#CC = clang $(CLANG_CFLAGS) +USE_DISPLAY=x +USE_LIBBSD=T +ADDITIONAL_DFLAGS := -D__wsl1__ -XFILES = $(OBJECTDIR)xmkicon.o \ - $(OBJECTDIR)xbbt.o \ - $(OBJECTDIR)dspif.o \ - $(OBJECTDIR)xinit.o \ - $(OBJECTDIR)xscroll.o \ - $(OBJECTDIR)xcursor.o \ - $(OBJECTDIR)xlspwin.o \ - $(OBJECTDIR)xrdopt.o \ - $(OBJECTDIR)xwinman.o - -XFLAGS = -DXWINDOW - -# OPTFLAGS is normally -O2. -OPTFLAGS = -O2 -g3 -DFLAGS = $(XFLAGS) -DRELEASE=$(RELEASE) -D__wsl1__ - -LDFLAGS = -L/usr/X11/lib -lX11 -lc -lm -lbsd -LDELDFLAGS = -L/usr/X11/lib -lX11 -lc -lm -lbsd - -OBJECTDIR = ../$(RELEASENAME)/ - -default : ../$(OSARCHNAME)/lde ../$(OSARCHNAME)/ldex +include linux-common.mk diff --git a/bin/makefile-wsl1.x86_64-sdl b/bin/makefile-wsl1.x86_64-sdl index 5bad16a..6c6e045 100644 --- a/bin/makefile-wsl1.x86_64-sdl +++ b/bin/makefile-wsl1.x86_64-sdl @@ -1,25 +1,9 @@ # Options for Windows System for Linux v1, Intel x86_64 and SDL -CC = gcc -m64 $(GCC_CFLAGS) -# CC = clang -m64 $(CLANG_CFLAGS) +GCC_CFLAGS := -m64 $(GCC_CFLAGS) +CLANG_CFLAGS := -m64 $(CLANG_CFLAGS) +USE_DISPLAY=sdl +USE_LIBBSD=T +ADDITIONAL_DFLAGS := -D__wsl1__ -XFILES = $(OBJECTDIR)sdl.o - -# -# For SDL version 2 -# -DSDL=2 in XFLAGS and -lSDL2 in LDFLAGS -# For SDL version 3 -# -DSDL=3 in XFLAGS and -lSDL3 in LDFLAGS -# -XFLAGS = -DSDL=2 - -# OPTFLAGS is normally -O2. -OPTFLAGS = -O2 -g3 -DFLAGS = $(XFLAGS) -DRELEASE=$(RELEASE) -D__wsl1__ - -LDFLAGS = -lm -lSDL2 -lbsd -LDELDFLAGS = -lbsd - -OBJECTDIR = ../$(RELEASENAME)/ - -default : ../$(OSARCHNAME)/lde ../$(OSARCHNAME)/ldesdl +include linux-common.mk diff --git a/bin/makefile-wsl1.x86_64-x b/bin/makefile-wsl1.x86_64-x index 6c12433..c1f5f3d 100644 --- a/bin/makefile-wsl1.x86_64-x +++ b/bin/makefile-wsl1.x86_64-x @@ -1,28 +1,9 @@ # Options for Windows System for Linux v1, Intel x86_64 and X-Window -CC = gcc -m64 $(GCC_CFLAGS) -# CC = clang -m64 $(CLANG_CFLAGS) +GCC_CFLAGS := -m64 $(GCC_CFLAGS) +CLANG_CFLAGS := -m64 $(CLANG_CFLAGS) +USE_DISPLAY=x +USE_LIBBSD=T +ADDITIONAL_DFLAGS := -D__wsl1__ -XFILES = $(OBJECTDIR)xmkicon.o \ - $(OBJECTDIR)xbbt.o \ - $(OBJECTDIR)dspif.o \ - $(OBJECTDIR)xinit.o \ - $(OBJECTDIR)xscroll.o \ - $(OBJECTDIR)xcursor.o \ - $(OBJECTDIR)xlspwin.o \ - $(OBJECTDIR)xrdopt.o \ - $(OBJECTDIR)xwinman.o - - -XFLAGS = -DXWINDOW - -# OPTFLAGS is normally -O2. -OPTFLAGS = -O2 -g3 -DFLAGS = $(XFLAGS) -DRELEASE=$(RELEASE) -D__wsl1__ - -LDFLAGS = -L/usr/X11/lib -lX11 -lc -lm -lbsd -LDELDFLAGS = -L/usr/X11/lib -lX11 -lc -lm -lbsd - -OBJECTDIR = ../$(RELEASENAME)/ - -default : ../$(OSARCHNAME)/lde ../$(OSARCHNAME)/ldex +include linux-common.mk