# Makefile for FileMangler 
#   Invoke using: "gmake"         standard build
#                 "gmake clean"   virgin build
#                 "gmake config"  build only FmConfig child application
#                 "gmake all"     'clean' + 'refreshlib' + 'config' + 'standard'
#                 "gmake refreshlib" check for NcDialog library update
#
# Mahlon R. Smith - The Software Samurai
# Tools: G++ / Gcc 4.4.2 for Linux (Fedora 12), then
#                  4.6.1 for Linux (Fedora 15), then
#                  4.6.3 for Linux (Fedora 16), then
#                  4.8.0 for Linux (Fedora 16) (libstdC++.so.6.0.18), then
#                  4.8.3 for Linux (Fedora 20) (libstdC++.so.6.0.19), then
#                  9.2.1 for Linux (Fedora 30) then
#                 10.1.1 for Linux (Fedora 31) (libstdC++.so.6.0.28)
#                 11.2.1 for Linux (Fedora 34) (libstdC++.so.6.0.29)
#                 14.2.1 for Linux (Fedora 41) (libstdC++.so.6.0.33)
# NOTE: This application requires tools that fully support the C++11 standard.
# 09-Jul-2025

# This variable is defined for technical reasons
# (see 'make' documentation for more information)
.RECIPEPREFIX = >

# Files for FileMangler Application
FM_HFILES = GlobalDef.hpp FMgr.hpp NCurses.hpp NCursesKeyDef.hpp \
            NcWindow.hpp NcDialog.hpp gString.hpp WaylandCB.hpp FileDlg.hpp
FM_OFILES = FileMangler.o FmInterface.o FmCommand.o FmMenu.o FmBackup.o

# Files for FmConfig sub-application
FmC_HFILES = GlobalDef.hpp NCurses.hpp NCursesKeyDef.hpp NcWindow.hpp \
             NcDialog.hpp gString.hpp FileMangler.hpp FileDlg.hpp \
             FmConfig.hpp FmKeymap.hpp
FmC_OFILES = FmConfig.o FmConfigi.o 

# Files for FileDlg class and FMgr class (FileDlg.a link library)
FD_HFILES = FileDlg.hpp FMgrDispData.hpp \
            renamePattern.hpp Progbar.hpp Pinwheel.hpp $(FM_HFILES)
FD_OFILES = FileDlg.o FileDlgClipbrd.o FileDlgDelete.o FileDlgRename.o \
            FileDlgPaste.o FileDlgPrompt.o FileDlgContext.o FileDlgStat.o \
            FileDlgTree.o FileDlgBackup.o FileDlgTrash.o FileDlgUtil1.o \
            FileDlgUtil2.o FileDlgMedia.o Progbar.o FMgr.o FMgrSort.o \
            FMgrStats.o FMgrTree.o FMgrGvfs.o

# Standard compile
COMPILE = g++ -x c++ -std=gnu++11 -Wall -c
# Special compile: stop-on-error
#COMPILE = g++ -x c++ -std=gnu++11 -Wall -fmax-errors=1 -c


#** Build the FileMangler Application **
FileMangler: $(FM_OFILES) NcDialog.a FileDlg.a
> g++ -o FileMangler $(FM_OFILES) NcDialog.a FileDlg.a -lncursesw -lpthread

FileMangler.o: FileMangler.cpp $(FM_HFILES) FileMangler.hpp FmMenu.hpp FmConfig.hpp FmKeymap.hpp
> $(COMPILE) FileMangler.cpp

FmInterface.o: FmInterface.cpp $(FM_HFILES) FileMangler.hpp FmMenu.hpp FmKeymap.hpp Pinwheel.hpp
> $(COMPILE) FmInterface.cpp

FmCommand.o: FmCommand.cpp $(FM_HFILES) FileMangler.hpp FmMenu.hpp FmKeymap.hpp
> $(COMPILE) FmCommand.cpp

FmMenu.o: FmMenu.cpp $(FM_HFILES) FileMangler.hpp FmMenu.hpp FmKeymap.hpp
> $(COMPILE) FmMenu.cpp

FmBackup.o: FmBackup.cpp $(FM_HFILES) FileMangler.hpp FmKeymap.hpp
> $(COMPILE) FmBackup.cpp


#** Build the FileDlg link library **
FileDlg.a: $(FD_OFILES)
> ar -Pcrv FileDlg.a $(FD_OFILES)

FileDlg.o: FileDlg.cpp $(FD_HFILES) 
> $(COMPILE) FileDlg.cpp

FileDlgClipbrd.o: FileDlgClipbrd.cpp $(FD_HFILES) 
> $(COMPILE) FileDlgClipbrd.cpp

FileDlgDelete.o: FileDlgDelete.cpp $(FD_HFILES) 
> $(COMPILE) FileDlgDelete.cpp

FileDlgRename.o: FileDlgRename.cpp $(FD_HFILES) 
> $(COMPILE) FileDlgRename.cpp

FileDlgPaste.o: FileDlgPaste.cpp $(FD_HFILES) 
> $(COMPILE) FileDlgPaste.cpp

FileDlgPrompt.o: FileDlgPrompt.cpp $(FD_HFILES) 
> $(COMPILE) FileDlgPrompt.cpp

FileDlgContext.o: FileDlgContext.cpp $(FD_HFILES) 
> $(COMPILE) FileDlgContext.cpp

FileDlgStat.o: FileDlgStat.cpp $(FD_HFILES) 
> $(COMPILE) FileDlgStat.cpp

FileDlgTree.o: FileDlgTree.cpp $(FD_HFILES) 
> $(COMPILE) FileDlgTree.cpp

FileDlgBackup.o: FileDlgBackup.cpp $(FD_HFILES) 
> $(COMPILE) FileDlgBackup.cpp

FileDlgTrash.o: FileDlgTrash.cpp $(FD_HFILES) 
> $(COMPILE) FileDlgTrash.cpp

FileDlgUtil1.o: FileDlgUtil1.cpp $(FD_HFILES) 
> $(COMPILE) FileDlgUtil1.cpp

FileDlgUtil2.o: FileDlgUtil2.cpp $(FD_HFILES) 
> $(COMPILE) FileDlgUtil2.cpp

FileDlgMedia.o: FileDlgMedia.cpp $(FD_HFILES) 
> $(COMPILE) FileDlgMedia.cpp

Progbar.o: Progbar.cpp Progbar.hpp 
> $(COMPILE) Progbar.cpp

FMgr.o: FMgr.cpp $(FD_HFILES) 
> $(COMPILE) FMgr.cpp

FMgrSort.o: FMgrSort.cpp $(FD_HFILES) 
> $(COMPILE) FMgrSort.cpp

FMgrStats.o: FMgrStats.cpp $(FD_HFILES) 
> $(COMPILE) FMgrStats.cpp

FMgrTree.o: FMgrTree.cpp $(FD_HFILES) 
> $(COMPILE) FMgrTree.cpp

FMgrGvfs.o: FMgrGvfs.cpp $(FD_HFILES) 
> $(COMPILE) FMgrGvfs.cpp


#** Build the FmConfig sub-application **
.PHONY: config
config:
> @echo '**Build FmConfig **'
> $(COMPILE) FmConfig.cpp
> $(COMPILE) FmConfigi.cpp
> g++ -o FmConfig $(FmC_OFILES) NcDialog.a -lncursesw


# Refresh the NcDialog family of header files and the link library
# from the source directory. Note that the path to the NcDialog/Dialog1 directory 
# may be different on your system, depending on where you installed it.
.PHONY: refreshlib
refreshlib:
> @echo '** Refreshing FileMangler copy of NcDialog headers and library **'
> rsync -pogtiu ../NcDialog/Dialog1/NcDialog.a ./.
> rsync -pogtiu ../NcDialog/Dialog1/GlobalDef.hpp ./.
> rsync -pogtiu ../NcDialog/Dialog1/NCurses.hpp ./.
> rsync -pogtiu ../NcDialog/Dialog1/NCursesKeyDef.hpp ./.
> rsync -pogtiu ../NcDialog/Dialog1/NcWindow.hpp ./.
> rsync -pogtiu ../NcDialog/Dialog1/gString.hpp ./.
> rsync -pogtiu ../NcDialog/Dialog1/WaylandCB.hpp ./.
> rsync -pogtiu ../NcDialog/Dialog4/Progbar.hpp ./.
> rsync -pogtiu ../NcDialog/Dialog4/Progbar.cpp ./.
> rsync -pogtiu ../NcDialog/Dialog4/Pinwheel.hpp ./.
> rsync -pogtiu ../NcDialog/Dialog1/NcDialog.hpp ./.


#** Build All **
.PHONY: all
all:
> gmake -si clean
> gmake --no-print-directory refreshlib
> gmake --no-print-directory config
> gmake --no-print-directory


.PHONY: clean
clean:
> rm --force $(FM_OFILES) $(FmC_OFILES) $(FD_OFILES) FileMangler FmConfig FileDlg.a 1>/dev/null 2>/dev/null


