aboutsummaryrefslogtreecommitdiff
path: root/Makefile
diff options
context:
space:
mode:
Diffstat (limited to 'Makefile')
-rw-r--r--Makefile157
1 files changed, 145 insertions, 12 deletions
diff --git a/Makefile b/Makefile
index 0d7309c..af9701c 100644
--- a/Makefile
+++ b/Makefile
@@ -1,30 +1,160 @@
-CFLAGS+=-D_FILE_OFFSET_BITS=64
-#CXXFLAGS+=-Wall -D_FILE_OFFSET_BITS=64 -D USE_UTF16
-CXXFLAGS+=-Wall -D_FILE_OFFSET_BITS=64
+# Makefile for GPT fdisk
+
+# Copyright (c) 2022 by Rod Smith
+# This program is licensed under the terms of the GNU GPL, version 2,
+# or (at your option) any later version.
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# This is a consolidated Makefile for Linux, FreeBSD, Solaris (untested),
+# macOS, and Windows (x86_64 and i686).
+
+# Builds for host OS by default; pass TARGET={target_os} to cross-compile,
+# where {target_os} is one of linux, freebsd, solaris, macos, win32, or win64.
+# Appropriate cross-compiler support must be installed, of course, and build
+# options below may need to be changed.
+
+# DETECTED_OS is used both to set certain options for the build
+# environment and to determine the default TARGET if it's not
+# otherwise specified.
+DETECTED_OS := $(shell uname -s)
+
+ifeq ($(origin TARGET),undefined)
+ $(info TARGET is not set; trying to determine target based on host OS....)
+ $(info Detected OS is $(DETECTED_OS))
+ ifeq ($(DETECTED_OS),Linux)
+ # Note: TARGET is set to "linux", but this is never tested, since it's
+ # the default.
+ TARGET=linux
+ else ifeq ($(DETECTED_OS),Darwin)
+ TARGET=macos
+ else ifeq ($(DETECTED_OS),MINGW64_NT-10.0-19042)
+ # Works for my MSYS2 installation, but seems awfully version-specific
+ # Also, uname may not exist in some Windows environments.
+ TARGET=windows
+ else ifeq ($(DETECTED_OS),FreeBSD)
+ TARGET=freebsd
+ else ifeq ($(DETECTED_OS),SunOS)
+ TARGET=solaris
+ endif
+endif
+
+# A second way to detect Windows....
+ifeq ($(origin TARGET),undefined)
+ ifeq ($(OS),Windows_NT)
+ TARGET=windows
+ endif
+endif
+
+# For Windows, we need to know the bit depth, too
+ifeq ($(TARGET),windows)
+ ARCH=$(shell uname -m)
+ $(info ARCH is $(ARCH))
+ ifeq ($(ARCH),x86_64)
+ TARGET=win64
+ else ifeq ($(ARCH),i686)
+ TARGET=win32
+ else
+ # In theory, there could be ARM versions, but we aren't set up for them yet;
+ # also, default to win64 in case uname doesn't exist on the system
+ TARGET=win64
+ endif
+endif
+
+$(info Build target is $(TARGET))
+
+# Default/Linux settings....
+STRIP?=strip
+#CXXFLAGS+=-O2 -Wall -D_FILE_OFFSET_BITS=64 -D USE_UTF16
+CXXFLAGS+=-O2 -Wall -D_FILE_OFFSET_BITS=64
LDFLAGS+=
+LDLIBS+=-luuid #-licuio -licuuc
+FATBINFLAGS=
+THINBINFLAGS=
+SGDISK_LDLIBS=-lpopt
+CGDISK_LDLIBS=-lncursesw
LIB_NAMES=crc32 support guid gptpart mbrpart basicmbr mbr gpt bsd parttypes attributes diskio diskio-unix
MBR_LIBS=support diskio diskio-unix basicmbr mbrpart
+ALL=gdisk cgdisk sgdisk fixparts
+FN_EXTENSION=
+
+# Settings for non-Linux OSes....
+ifeq ($(TARGET),win64)
+ CXX=x86_64-w64-mingw32-g++
+ ifeq ($(DETECTED_OS),Linux)
+ STRIP=x86_64-w64-mingw32-strip
+ else
+ STRIP=strip
+ endif
+ CXXFLAGS=-O2 -Wall -D_FILE_OFFSET_BITS=64 -static -static-libgcc -static-libstdc++
+ #CXXFLAGS=-O2 -Wall -D_FILE_OFFSET_BITS=64 -I /usr/local/include -I/opt/local/include -g
+ LDFLAGS+=-static -static-libgcc -static-libstdc++
+ LDLIBS+=-lrpcrt4
+ SGDISK_LDLIBS=-lpopt -lintl -liconv
+ LIB_NAMES=guid gptpart bsd parttypes attributes crc32 mbrpart basicmbr mbr gpt support diskio diskio-windows
+ MBR_LIBS=support diskio diskio-windows basicmbr mbrpart
+ FN_EXTENSION=64.exe
+ ifeq ($(DETECTED_OS),Linux)
+ # Omit cgdisk when building under Linux for Windows because it doesn't
+ # work on my system
+ ALL=gdisk sgdisk fixparts
+ endif
+else ifeq ($(TARGET),win32)
+ CXX=i686-w64-mingw32-g++
+ ifeq ($(DETECTED_OS),Linux)
+ STRIP=i686-w64-mingw32-strip
+ else
+ STRIP=strip
+ endif
+ CXXFLAGS=-O2 -Wall -D_FILE_OFFSET_BITS=64 -static -static-libgcc -static-libstdc++
+ #CXXFLAGS=-O2 -Wall -D_FILE_OFFSET_BITS=64 -I /usr/local/include -I/opt/local/include
+ LDFLAGS+=-static -static-libgcc -static-libstdc++
+ LDLIBS+=-lrpcrt4
+ SGDISK_LDLIBS=-lpopt -lintl -liconv
+ LIB_NAMES=guid gptpart bsd parttypes attributes crc32 mbrpart basicmbr mbr gpt support diskio diskio-windows
+ MBR_LIBS=support diskio diskio-windows basicmbr mbrpart
+ FN_EXTENSION=32.exe
+ ifeq ($(DETECTED_OS),Linux)
+ # Omit cgdisk when building for Windows under Linux because it doesn't
+ # work on my system
+ ALL=gdisk sgdisk fixparts
+ endif
+else ifeq ($(TARGET),freebsd)
+ CXX=clang++
+ CXXFLAGS+=-O2 -Wall -D_FILE_OFFSET_BITS=64 -I /usr/local/include
+ LDFLAGS+=-L/usr/local/lib
+ LDLIBS+=-luuid #-licuio
+else ifeq ($(TARGET),macos)
+ FATBINFLAGS=-arch x86_64 -arch arm64 -mmacosx-version-min=10.9
+ THINBINFLAGS=-arch x86_64 -mmacosx-version-min=10.9
+ CXXFLAGS=$(FATBINFLAGS) -O2 -Wall -D_FILE_OFFSET_BITS=64 -stdlib=libc++ -I/opt/local/include -I /usr/local/include -I/opt/local/include
+ LDLIBS= #-licucore
+ CGDISK_LDLIBS=/usr/local/Cellar/ncurses/6.2/lib/libncurses.dylib
+else ifeq ($(TARGET),solaris)
+ CXXFLAGS+=-Wall -D_FILE_OFFSET_BITS=64 -I/usr/include/ncurses
+ LDFLAGS+=-L/lib -licuio -licuuc -luuid
+endif
+
+# More default settings, for all OSes....
LIB_OBJS=$(LIB_NAMES:=.o)
MBR_LIB_OBJS=$(MBR_LIBS:=.o)
LIB_HEADERS=$(LIB_NAMES:=.h)
DEPEND= makedepend $(CXXFLAGS)
+ALL_EXE=$(ALL:=$(FN_EXTENSION))
-all: cgdisk gdisk sgdisk fixparts
+all: $(ALL)
gdisk: $(LIB_OBJS) gdisk.o gpttext.o
- $(CXX) $(LIB_OBJS) gdisk.o gpttext.o $(LDFLAGS) -luuid $(LDLIBS) -o gdisk
-# $(CXX) $(LIB_OBJS) gdisk.o gpttext.o $(LDFLAGS) -licuio -licuuc -luuid -o gdisk
+ $(CXX) $(LIB_OBJS) gdisk.o gpttext.o $(LDFLAGS) $(LDLIBS) $(FATBINFLAGS) -o gdisk$(FN_EXTENSION)
cgdisk: $(LIB_OBJS) cgdisk.o gptcurses.o
- $(CXX) $(LIB_OBJS) cgdisk.o gptcurses.o $(LDFLAGS) -luuid -lncursesw $(LDLIBS) -o cgdisk
-# $(CXX) $(LIB_OBJS) cgdisk.o gptcurses.o $(LDFLAGS) -licuio -licuuc -luuid -lncurses -o cgdisk
+ $(CXX) $(LIB_OBJS) cgdisk.o gptcurses.o $(LDFLAGS) $(LDLIBS) $(CGDISK_LDLIBS) -o cgdisk$(FN_EXTENSION)
sgdisk: $(LIB_OBJS) sgdisk.o gptcl.o
- $(CXX) $(LIB_OBJS) sgdisk.o gptcl.o $(LDFLAGS) -luuid -lpopt $(LDLIBS) -o sgdisk
-# $(CXX) $(LIB_OBJS) sgdisk.o gptcl.o $(LDFLAGS) -licuio -licuuc -luuid -lpopt -o sgdisk
+ $(CXX) $(LIB_OBJS) sgdisk.o gptcl.o $(LDFLAGS) $(LDLIBS) $(SGDISK_LDLIBS) $(THINBINFLAGS) -o sgdisk$(FN_EXTENSION)
fixparts: $(MBR_LIB_OBJS) fixparts.o
- $(CXX) $(MBR_LIB_OBJS) fixparts.o $(LDFLAGS) $(LDLIBS) -o fixparts
+ $(CXX) $(MBR_LIB_OBJS) fixparts.o $(LDFLAGS) $(FATBINFLAGS) -o fixparts$(FN_EXTENSION)
test:
./gdisk_test.sh
@@ -33,7 +163,10 @@ lint: #no pre-reqs
lint $(SRCS)
clean: #no pre-reqs
- rm -f core *.o *~ gdisk sgdisk cgdisk fixparts
+ rm -f core *.o *~ $(ALL_EXE)
+
+strip: #no pre-reqs
+ $(STRIP) $(ALL_EXE)
# what are the source dependencies
depend: $(SRCS)