Files
nethack/sys/unix/hints/linux.370
nhmall bac8ebad34 revisit Makefile sysconf steps
Add distinct potential steps into Makefile.top for putting
sysconf into place, instead of appending the steps for doing so
to the generic POSTINSTALL.

SYSCONFINSTALL is used for 'make install' and unconditionally
copies sys/unix/sysconf to the install directory.

SYSCONFENSURE is used for 'make update' and only copies
sys/unix/sysconf to the installation directory if it doesn't
already exist.

The initial trigger for revisiting this was because of new reports
that cp from (GNU coreutils) 9.4 is now issuing a warning during
NetHack builds. The warning pertains to deprecated use of the '-n'
switch with cp, which is used to only copy the file if the target
does not exist.

After this update, the shell is used to make that determination,
and if the file doesn't exist, cp is now invoked on Linux without
the '-n' switch.

For the macOS hints file, macOS.370, cp wasn't being used for sysconf
anyway, a utility script was being invoked and this doesn't change
that. macOS.370 was updated to remain in sync with linux.370 and
Makefile.top regarding the use of SYSCONFINSTALL and SYSCONFENSURE.
2024-01-27 18:12:18 -05:00

418 lines
12 KiB
Plaintext
Executable File

# NetHack 3.7 linux.370 $NHDT-Date: 1693519390 2023/08/31 22:03:10 $ $NHDT-Branch: keni-crashweb2 $:$NHDT-Revision: 1.61 $
# Copyright (c) Kenneth Lorber, Kensington, Maryland, 2007.
# NetHack may be freely redistributed. See license for details.
#
#---------------------------------------------------------------------
# Linux hints file with support for multiple window ports (interfaces)
# Tested on:
# - Ubuntu focal
#
# If this doesn't work for your distribution, consider making a new
# hints file for it, rather than changing this one.
# And let us know about it.
#
#-PRE
# linux.370 hints file provides a single-user build for Linux (such
# as Ubuntu focal).
# note: '#-INCLUDE' is not just a comment
# multiw-1.370 contains sections 1 to 2
#-INCLUDE multiw-1.370
HINTSVERSION := 370
ifdef MAKEFILE_TOP
ifeq ($(MAKELEVEL),0)
PRECHECK+=checkmakefiles
# all files included from this hints file get listed
# in HINTSINCLNAMES (without suffix and without a path)
HINTSINCLNAMES := compiler cross-pre cross-post \
gbdates-pre gbdates-post \
multiw-1 multiw-2 misc \
multisnd1-pre multisnd2-pre multisnd-post
HINTSINCLFILES := $(addsuffix .$(HINTSVERSION), $(HINTSINCLNAMES))
endif
endif
ifndef LIBXPM
LIBXPM= -L/opt/X11/lib -lXpm
endif
#4. Other
GAMEUID = $(USER)
GAMEGRP = games
#-----------------------------------------------------------------------------
# You shouldn't need to change anything below here (in the hints file; if
# you're reading this in Makefile augmented by hints, that may not be true).
#
#-INCLUDE multiw-2.370
# compiler.370 contains compiler detection and adjustments common
# to both linux and macOS
#-INCLUDE compiler.370
ifdef WANT_WIN_QT
ifdef WANT_WIN_QT5
QTDIR=/usr
endif # WANT_WIN_QT5
ifdef WANT_WIN_QT6
#if your Qt6 is elsewhere, change this to match
QTDIR=/usr/local/qt6
endif # WANT_WIN_QT6
endif # WANT_WIN_QT
# misc.370 must come after compiler.370
# and after QTDIR is defined.
#
#-INCLUDE misc.370
ifeq "$(USE_ASAN)" "1"
CFLAGS+=-fsanitize=address
LFLAGS+=-fsanitize=address
endif
ifeq "$(USE_CURSESLIB)" "1"
# default
CURSESLIB = -lncurses -ltinfo
# If CURSES_UNICODE is defined, we need ncursesw.
# Without CURSES_UNICODE the following simpler setting works.
# CURSESLIB = -lncurses -ltinfo
ifdef MAKEFILE_SRC
comma:=,
NCURSES_LFLAGS = $(shell pkg-config ncursesw --libs)
ifeq (,$(findstring ncursesw, $(NCURSES_LFLAGS)))
ifeq (,$(findstring ncurses, $(NCURSES_LFLAGS)))
#this indicates that pkg-config itself was unavailable
NCURSES_LFLAGS = -lncursesw -ltinfo
endif
endif
#$(info $(NCURSES_LFLAGS))
ifeq (,$(findstring ncursesw, $(NCURSES_LFLAGS)))
HAVE_NCURSESW=0
else
HAVE_NCURSESW=1
endif
#$(info $(NCURSES_LFLAGS))
#$(info HAVE_NCURSESW=$(HAVE_NCURSESW))
ifeq "$(HAVE_NCURSESW)" "1"
# remove unnecessary -Wl,-Bsymbolic-functions if present
ifneq (,$(findstring -Wl$(comma)-Bsymbolic-functions, $(NCURSES_LFLAGS)))
CURSESLIB = $(subst -Wl$(comma)-Bsymbolic-functions,,$(NCURSES_LFLAGS))
else
CURSESLIB = $(NCURSES_LFLAGS)
endif
#$(info $(CURSESLIB))
endif #HAVE_NCURSESW
endif #MAKEFILE_SRC
endif #USE_CURSESLIB
AUTOLIBS=$(shell (../util/makedefs --grep-defined CRASHREPORT && echo "-lcrypto" ) || true )
# NetHack sources control
NHCFLAGS+=-DDLB
NHCFLAGS+=-DHACKDIR=\"$(HACKDIR)\"
NHCFLAGS+=-DDEFAULT_WINDOW_SYS=\"$(WANT_DEFAULT)\"
NHCFLAGS+=-DSYSCF -DSYSCF_FILE=\"$(HACKDIR)/sysconf\" -DSECURE
NHCFLAGS+=-DTIMED_DELAY
NHCFLAGS+=-DDUMPLOG
NHCFLAGS+=-DCONFIG_ERROR_SECURE=FALSE
#NHCFLAGS+=-DGREPPATH=\"/usr/bin/grep\"
NHCFLAGS+=-DCOMPRESS=\"/bin/gzip\" -DCOMPRESS_EXTENSION=\".gz\"
#NHCFLAGS+=-DNOMAIL
#NHCFLAGS+=-DEXTRA_SANITY_CHECKS
#NHCFLAGS+=-DEDIT_GETLIN
#NHCFLAGS+=-DSCORE_ON_BOTL
#NHCFLAGS+=-DMSGHANDLER
#NHCFLAGS+=-DTTY_TILES_ESCCODES
#NHCFLAGS+=-DTTY_SOUND_ESCCODES
#NHCFLAGS+=-DNO_CHRONICLE
#NHCFLAGS+=-DLIVELOG
ifdef WANT_WIN_CURSES
ifeq "$(HAVE_NCURSESW)" "1"
NHCFLAGS+=-DCURSES_UNICODE
else
ifdef MAKEFILE_SRC
$(info Attention: CURSES_UNICODE is not being defined without ncursesw)
endif #MAKEFILE_SRC
endif #HAVE_NCURSESW
endif #WANT_WIN_CURSES
#
#-INCLUDE multisnd1-pre.370
#
# WINCFLAGS set from multiw-2.370
# SNDCFLAGS set from multisnd-pre.370
CFLAGS+= $(WINCFLAGS)
CFLAGS+= $(SNDCFLAGS)
CFLAGS+= $(NHCFLAGS)
# WINCFLAGS set from multiw-2.370
# SNDCFLAGS set from multisnd-pre.370
CCXXFLAGS+= $(WINCFLAGS)
CCXXFLAGS+= $(SNDCFLAGS)
CCXXFLAGS+= $(NHCFLAGS)
VARDATND =
VARDATND0 =
#ifdef WANT_WIN_CHAIN
#HINTSRC=$(CHAINSRC)
#HINTOBJ=$(CHAINOBJ)
#endif # WANT_WIN_CHAIN
ifdef MAKEFILE_SRC
ifdef CURSESLIB
WINLIB += $(CURSESLIB)
endif #CURSESLIB
endif #MAKEFILE_SRC
ifdef WANT_WIN_X11
USE_XPM=1
WINX11LIB = -lXaw -lXmu -lXext -lXt -lX11
VARDATND0 += x11tiles NetHack.ad pet_mark.xbm pilemark.xbm
# -x: if built without dlb, some versions of mkfontdir think *.lev are fonts
POSTINSTALL += bdftopcf win/X11/nh10.bdf > $(HACKDIR)/nh10.pcf; ( cd $(HACKDIR); mkfontdir -x .lev );
# separate from CFLAGS so that we don't pass it to every file
X11CFLAGS = -I/opt/X11/include
# avoid repeated complaints about _X_NONNULL(args...) in <X11/Xfuncproto.h>
X11CFLAGS += -Wno-variadic-macros
ifdef USE_XPM
CFLAGS += -DUSE_XPM
WINX11LIB += -lXpm
VARDATND0 += rip.xpm
endif
WINLIB += $(WINX11LIB)
LFLAGS+=-L/opt/X11/lib
endif # WANT_WIN_X11
ifdef WANT_WIN_QT
LINK = $(CXX)
ifdef WANT_WIN_QT4
QTCXXFLAGS += $(sort $(shell PKG_CONFIG_PATH=$(QTDIR)/lib/pkgconfig pkg-config QtGui --cflags)) -DQT_NO_SOUND=1
WINLIB += $(shell PKG_CONFIG_PATH=$(QTDIR)/lib/pkgconfig pkg-config QtGui --libs)
endif # WANT_WIN_QT4
ifdef WANT_WIN_QT5
QTCXXFLAGS += $(sort $(shell PKG_CONFIG_PATH=$(QTDIR)/lib/pkgconfig pkg-config Qt5Gui Qt5Widgets Qt5Multimedia --cflags))
WINLIB += $(shell PKG_CONFIG_PATH=$(QTDIR)/lib/pkgconfig pkg-config Qt5Gui Qt5Widgets Qt5Multimedia --libs)
endif # WANT_WIN_QT5
ifdef WANT_WIN_QT6
ifdef QT6MANUAL
# Try some likely spots for a self-built Qt6.
# You'll have to change these manually before using the hints file
# if they don't match the installed location on your system.
ifneq "$(HOSTTYPE)" ""
QTHOST=$(HOSTTYPE)
else
QTHOST=x86_64
endif
QTTOP=/usr/include/$(HOSTTYPE)-linux-gnu/qt6
ifneq ($(wildcard $(QTTOP)/*),)
#we don't set QTLOCATED=1 for this
QTINCDIR=/usr/include/$(QTHOST)-linux-gnu/qt6
QTLIBDIR=/usr/lib/$(QTHOST)-linux.gnu
QTCXXFLAGS += -DQT_WIDGETS_LIB -DQT_MULTIMEDIA_LIB -DQT_NETWORK_LIB -DQT_GUI_LIB -DQT_CORE_LIB
QTCXXFLAGS += -I$(QTINCDIR)/QtWidgets -I$(QTINCDIR) -I$(QTINCDIR)/QtMultimedia
QTCXXFLAGS += -I$(QTINCDIR)/QtNetwork -I$(QTINCDIR)/QtGui -I$(QTINCDIR)/QtCore
WINLIB += -L$(QTLIBDIR) -lQt6Widgets -lQt6Multimedia -lQt6Network -lQt6Gui -lQt6Core
MOCPATH = /usr/lib/qt6/libexec/moc
#/usr/lib/x86_64-linux-gnu/libQt6EglFSDeviceIntegration.so
endif # QTTOP/*
ifndef QTINCDIR
ifneq ($(wildcard /usr/local/Qt6/*),)
QTDIR=/usr/local/Qt6
QTLOCATED=1
endif # wildcard /usr/local/Qt6
ifneq ($(wildcard /usr/local/qt6/*),)
QTDIR=/usr/local/qt6
QTLOCATED=1
endif # wildcard /usr/local/qt6
endif # !QTINCDIR
ifdef QTLOCATED
QTCXXFLAGS += -I$(QTDIR)/include/QtCore
QTCXXFLAGS += -I$(QTDIR)/include/QtGui
QTCXXFLAGS += -I$(QTDIR)/include/QtMultimedia
QTCXXFLAGS += -I$(QTDIR)/include/QtWidgets
MOCPATH = $(QTDIR)/libexec/moc
WINLIB += -L$(QTDIR)/lib -lQt6Widgets -lQt6Multimedia -lQt6Network -lQt6Gui -lQt6Core
endif # QTLOCATED
else # !QT6MANUAL
MOCDIR = $(shell pkg-config Qt6Gui --variable=libexecdir)
ifneq ($(wildcard $(MOCDIR)/*),)
MOCPATH = $(MOCDIR)/moc
else
MOCPATH = /usr/lib/qt6/libexec/moc
endif # MOCDIR
QTCXXFLAGS += $(sort $(shell pkg-config Qt6Gui Qt6Widgets Qt6Multimedia --cflags))
WINLIB += $(shell pkg-config Qt6Gui Qt6Widgets Qt6Multimedia --libs)
endif # QT6MANUAL
endif # WANT_WIN_QT6
ifndef QTDIR
$(error QTDIR not defined in the environment or Makefile)
endif # QTDIR
# XXX if /Developer/qt exists and QTDIR not set, use that
# XXX make sure QTDIR points to something reasonable
QTCXXFLAGS += -fPIC
POSTINSTALL+= bdftopcf win/X11/nh10.bdf > $(INSTDIR)/nh10.pcf; \
( cd $(INSTDIR); mkfontdir -x .lev );
VARDATND0 += nhtiles.bmp rip.xpm nhsplash.xpm
else # WANT_WIN_QT
LINK = $(CC)
endif # !WANT_WIN_QT
# prevent duplicate tile.o in WINOBJ
WINOBJ = $(WINOBJ0) $(sort $(XTRAOBJ))
# prevent duplicates in VARDATND if both X11 and Qt are being supported
VARDATND += $(sort $(VARDATND0))
GIT_HASH := $(shell echo `git rev-parse --verify HEAD` 2>&1)
GIT_BRANCH := $(shell echo `git rev-parse --abbrev-ref HEAD` 2>&1)
ifdef GIT_HASH
GITHASH = -DNETHACK_GIT_SHA=\"$(GIT_HASH)\"
endif
ifdef GIT_BRANCH
GITBRANCH = -DNETHACK_GIT_BRANCH=\"$(GIT_BRANCH)\"
endif
ifdef WANT_LIBNH
CFLAGS += -DSHIM_GRAPHICS -DNOTTYGRAPHICS -DNOSHELL -DLIBNH -fpic
LIBNHSYSSRC = ../sys/libnh/libnhmain.c \
../sys/share/ioctl.c ../sys/share/unixtty.c \
../sys/unix/unixunix.c ../sys/unix/unixres.c \
../win/shim/winshim.c
LIBNHSYSOBJ = $(TARGETPFX)libnhmain.o $(TARGETPFX)ioctl.o \
$(TARGETPFX)unixtty.o $(TARGETPFX)unixunix.o \
$(TARGETPFX)unixres.o $(TARGETPFX)winshim.o \
$(TARGETPFX)date.o
#don't bother building the game executable as it will fail
#without winshim
override GAME=
MOREALL += ( cd src ; $(MAKE) pregame ; $(MAKE) $(TARGETPFX)libnh.a )
endif # WANT_LIBNH
SYSCONFCREATE = cp sys/unix/sysconf $(INSTDIR)/sysconf
SYSCONFINSTALL = $(SYSCONFCREATE) && \
$(CHOWN) $(GAMEUID) $(INSTDIR)/sysconf && \
$(CHGRP) $(GAMEGRP) $(INSTDIR)/sysconf && \
chmod $(VARFILEPERM) $(INSTDIR)/sysconf;
SYSCONFENSURE = (if ! test -f $(INSTDIR)/sysconf ; then \
$(SYSCONFCREATE) && \
$(CHOWN) $(GAMEUID) $(INSTDIR)/sysconf && \
$(CHGRP) $(GAMEGRP) $(INSTDIR)/sysconf && \
chmod $(VARFILEPERM) $(INSTDIR)/sysconf; fi );
ifdef WANT_SOURCE_INSTALL
PREFIX=$(abspath $(NHSROOT))
#SHELLDIR=
HACKDIR=$(PREFIX)/playground
GAMEPERM = 0700
VARFILEPERM = 0600
VARDIRPERM = 0700
CFLAGS+=-DSYSCF -DSYSCF_FILE=\"$(HACKDIR)/sysconf\" -DSECURE
MOREALL=$(MAKE) install
else #!WANT_SOURCE_INTSALL
#PREFIX=/usr
PREFIX=$(wildcard ~)/nh/install
HACKDIR=$(PREFIX)/games/lib/nethackdir
SHELLDIR = $(PREFIX)/games
VARDIRPERM = 0755
VARFILEPERM = 0600
GAMEPERM = 0755
endif #?WANT_SOURCE_INSTALL
INSTDIR=$(HACKDIR)
VARDIR = $(HACKDIR)
POSTINSTALL+= ( util/makedefs --grep-defined CRASHREPORT && \
( cp win/share/nhcrashreport.lua $(INSTDIR) ; \
chmod 555 $(INSTDIR)/nhcrashreport.lua ; \
cp $(LUATOP)/lua $(INSTDIR)/nhlua); true );
ifneq "$(CCISCLANG)" ""
# gdb may not be installed if clang is chosen compiler so the game
# won't start in that case due to a sysconf error. Comment out
# relevant lines in sysconf.
POSTINSTALL+= sed -i -e 's;^GDBPATH=/usr/bin/gdb;\#GDBPATH=/usr/bin/gdb;' \
-e 's;PANICTRACE_GDB=1;PANICTRACE_GDB=0;' $(INSTDIR)/sysconf;
endif
# Lua
# when building liblua.a, avoid warning that use of tmpnam() should be
# replaced by mkstemp(); the lua code doesn't use nethack's config.h so
# this needs to be passed via make rather than defined in unixconf.h
SYSCFLAGS=-DLUA_USE_LINUX
ifdef GITSUBMODULES
LUAFLAGS=CC='$(CC)' SYSCFLAGS='$(SYSCFLAGS)'
ifneq "$(CCISCLANG)" ""
# clang
LUAFLAGS +=CWARNGCC=''
endif # clang
override LUAHEADERS = submodules/lua
override LUA2NHTOP = ../..
override LUAMAKEFLAGS=$(LUAFLAGS)
endif # GITSUBMODULES
DLLIB = -ldl
# Only needed for GLIBC stack trace:
LFLAGS+=-rdynamic
# if TTY_TILES_ESCCODES
#WINSRC += tile.c
#WINOBJ += tile.o
# endif
CHOWN=true
CHGRP=true
# manpages directory
MANDIR=/usr/share/man/man6
#
#-INCLUDE cross-pre.370
#
#
#-INCLUDE gbdates-pre.370
#
#
#-INCLUDE multisnd2-pre.370
#
#-POST
#
#-INCLUDE gbdates-post.370
#
#
#-INCLUDE multisnd-post.370
#
ifdef MAKEFILE_TOP
ifeq ($(MAKELEVEL),0)
.PHONY: checkmakefiles
checkmakefiles:
@$(MAKE) -f sys/unix/Makefile.check \
HINTSFILE="$(HINTSFILE)" HINTSINCLFILES="$(HINTSINCLFILES)"
endif
endif
ifdef WANT_LIBNH
$(TARGETPFX)libnh.a: $(HOBJ) $(LIBNHSYSOBJ) ../lib/lua/liblua.a
$(AR) rcs $@ $(HOBJ) $(LIBNHSYSOBJ) ../lib/lua/liblua.a
@echo "$@ built."
$(TARGETPFX)libnhmain.o : ../sys/libnh/libnhmain.c $(HACK_H)
$(CC) $(CFLAGS) -c -o$@ $<
$(TARGETPFX)winshim.o : ../win/shim/winshim.c $(HACK_H)
$(CC) $(CFLAGS) -c -o$@ $<
endif # WANT_LIBNH
#
#-INCLUDE cross-post.370
#