1############################################################################### 2# 3# Makefile to build XZ Utils using MinGW 4# 5# Make flags to alter compilation: 6# 7# DEBUG=1 Enable assertions. Don't use this for production builds! 8# You may also want to set CFLAGS="-g -O0" to disable 9# optimizations. 10# 11# W64=1 Build for 64-bit Windows. Make sure that you have 64-bit 12# MinGW in PATH. 13# 14# WINE=1 Shortcut to set CC, AR, and STRIP to use Wine to run Windows 15# versions of MinGW binaries. 16# 17# The usual CPPFLAGS and CFLAGS are supported too. 18# 19############################################################################### 20# 21# Author: Lasse Collin 22# 23# This file has been put into the public domain. 24# You can do whatever you want with this file. 25# 26############################################################################### 27 28ifdef W64 29CC = x86_64-pc-mingw32-gcc 30WINDRES = x86_64-pc-mingw32-windres 31AR = x86_64-pc-mingw32-ar 32STRIP = x86_64-pc-mingw32-strip 33else 34CC = mingw32-gcc 35WINDRES = windres 36AR = ar 37STRIP = strip 38endif 39 40SED = sed 41MKDIR = mkdir 42CP = cp 43RM = rm -f 44 45CFLAGS = -g -Wall -Wextra -O2 46# CFLAGS = -Wall -Wextra -O3 -fomit-frame-pointer -funroll-loops 47 48ALL_CFLAGS = -std=gnu99 -mms-bitfields 49 50ALL_CPPFLAGS = \ 51 -I. \ 52 -I../src/common \ 53 -I../src/liblzma/api \ 54 -I../src/liblzma/common \ 55 -I../src/liblzma/check \ 56 -I../src/liblzma/rangecoder \ 57 -I../src/liblzma/lz \ 58 -I../src/liblzma/lzma \ 59 -I../src/liblzma/delta \ 60 -I../src/liblzma/simple \ 61 -I../src/liblzma/subblock 62 63ALL_CPPFLAGS += -DHAVE_CONFIG_H 64 65# This works with Wine too while using native GNU make, sed, and rm. 66ifdef WINE 67ifdef W64 68CC := wine c:/MinGW64/bin/x86_64-pc-mingw32-gcc 69WINDRES := wine c:/MinGW64/bin/x86_64-pc-mingw32-windres 70AR := wine c:/MinGW64/bin/x86_64-pc-mingw32-ar 71STRIP := wine c:/MinGW64/bin/x86_64-pc-mingw32-strip 72else 73CC := wine c:/MinGW/bin/gcc 74WINDRES := wine c:/MinGW/bin/windres 75AR := wine c:/MinGW/bin/ar 76STRIP := wine c:/MinGW/bin/strip 77endif 78endif 79 80ifdef DEBUG 81# Use echo since it works for this purpose on both Windows and POSIX. 82STRIP := echo Skipping strip 83else 84ALL_CPPFLAGS += -DNDEBUG 85endif 86 87ALL_CPPFLAGS += $(CPPFLAGS) 88ALL_CFLAGS += $(CFLAGS) 89 90 91################ 92# Common rules # 93################ 94 95.PHONY: all clean pkg 96all: liblzma xzdec xz 97clean: liblzma-clean xzdec-clean xz-clean 98 99pkg: all 100 $(RM) -r pkg 101 $(MKDIR) -p pkg/lib pkg/include/lzma 102 $(CP) liblzma.dll xz-dynamic.exe xz.exe xzdec-dynamic.exe xzdec.exe lzmadec-dynamic.exe lzmadec.exe pkg 103 $(CP) liblzma.a liblzma.def liblzma_static.lib pkg/lib 104 $(CP) ../src/liblzma/api/lzma.h pkg/include 105 $(CP) ../src/liblzma/api/lzma/*.h pkg/include/lzma 106 107%.o: %.rc 108 $(WINDRES) $(ALL_CPPFLAGS) $< $@ 109 110 111############### 112# liblzma.dll # 113############### 114 115.PHONY: liblzma 116liblzma: liblzma.dll liblzma_static.lib 117 118LIBLZMA_SRCS_C = \ 119 ../src/liblzma/common/alone_decoder.c \ 120 ../src/liblzma/common/alone_encoder.c \ 121 ../src/liblzma/common/auto_decoder.c \ 122 ../src/liblzma/common/block_buffer_decoder.c \ 123 ../src/liblzma/common/block_buffer_encoder.c \ 124 ../src/liblzma/common/block_decoder.c \ 125 ../src/liblzma/common/block_encoder.c \ 126 ../src/liblzma/common/block_header_decoder.c \ 127 ../src/liblzma/common/block_header_encoder.c \ 128 ../src/liblzma/common/block_util.c \ 129 ../src/liblzma/common/common.c \ 130 ../src/liblzma/common/easy_buffer_encoder.c \ 131 ../src/liblzma/common/easy_decoder_memusage.c \ 132 ../src/liblzma/common/easy_encoder.c \ 133 ../src/liblzma/common/easy_encoder_memusage.c \ 134 ../src/liblzma/common/easy_preset.c \ 135 ../src/liblzma/common/filter_buffer_decoder.c \ 136 ../src/liblzma/common/filter_buffer_encoder.c \ 137 ../src/liblzma/common/filter_common.c \ 138 ../src/liblzma/common/filter_decoder.c \ 139 ../src/liblzma/common/filter_encoder.c \ 140 ../src/liblzma/common/filter_flags_decoder.c \ 141 ../src/liblzma/common/filter_flags_encoder.c \ 142 ../src/liblzma/common/index.c \ 143 ../src/liblzma/common/index_decoder.c \ 144 ../src/liblzma/common/index_encoder.c \ 145 ../src/liblzma/common/index_hash.c \ 146 ../src/liblzma/common/stream_buffer_decoder.c \ 147 ../src/liblzma/common/stream_buffer_encoder.c \ 148 ../src/liblzma/common/stream_decoder.c \ 149 ../src/liblzma/common/stream_encoder.c \ 150 ../src/liblzma/common/stream_flags_common.c \ 151 ../src/liblzma/common/stream_flags_decoder.c \ 152 ../src/liblzma/common/stream_flags_encoder.c \ 153 ../src/liblzma/common/vli_decoder.c \ 154 ../src/liblzma/common/vli_encoder.c \ 155 ../src/liblzma/common/vli_size.c \ 156 ../src/liblzma/check/check.c \ 157 ../src/liblzma/check/crc32_table.c \ 158 ../src/liblzma/check/crc64_table.c \ 159 ../src/liblzma/check/sha256.c \ 160 ../src/liblzma/rangecoder/price_table.c \ 161 ../src/liblzma/lz/lz_decoder.c \ 162 ../src/liblzma/lz/lz_encoder.c \ 163 ../src/liblzma/lz/lz_encoder_mf.c \ 164 ../src/liblzma/lzma/fastpos_table.c \ 165 ../src/liblzma/lzma/lzma2_decoder.c \ 166 ../src/liblzma/lzma/lzma2_encoder.c \ 167 ../src/liblzma/lzma/lzma_decoder.c \ 168 ../src/liblzma/lzma/lzma_encoder.c \ 169 ../src/liblzma/lzma/lzma_encoder_optimum_fast.c \ 170 ../src/liblzma/lzma/lzma_encoder_optimum_normal.c \ 171 ../src/liblzma/lzma/lzma_encoder_presets.c \ 172 ../src/liblzma/delta/delta_common.c \ 173 ../src/liblzma/delta/delta_decoder.c \ 174 ../src/liblzma/delta/delta_encoder.c \ 175 ../src/liblzma/simple/arm.c \ 176 ../src/liblzma/simple/armthumb.c \ 177 ../src/liblzma/simple/ia64.c \ 178 ../src/liblzma/simple/powerpc.c \ 179 ../src/liblzma/simple/simple_coder.c \ 180 ../src/liblzma/simple/simple_decoder.c \ 181 ../src/liblzma/simple/simple_encoder.c \ 182 ../src/liblzma/simple/sparc.c \ 183 ../src/liblzma/simple/x86.c 184 185LIBLZMA_SRCS_ASM = 186 187ifdef W64 188LIBLZMA_SRCS_C += \ 189 ../src/liblzma/check/crc32_fast.c \ 190 ../src/liblzma/check/crc64_fast.c 191else 192LIBLZMA_SRCS_ASM += \ 193 ../src/liblzma/check/crc32_x86.S \ 194 ../src/liblzma/check/crc64_x86.S 195endif 196 197LIBLZMA_OBJS_C = $(LIBLZMA_SRCS_C:.c=.o) 198LIBLZMA_OBJS_ASM = $(LIBLZMA_SRCS_ASM:.S=.o) 199LIBLZMA_OBJS = \ 200 $(LIBLZMA_OBJS_C) \ 201 $(LIBLZMA_OBJS_ASM) \ 202 ../src/liblzma/liblzma_w32res.o 203 204LIBLZMA_OBJS_STATIC_C = $(LIBLZMA_SRCS_C:.c=-static.o) 205LIBLZMA_OBJS_STATIC_ASM = $(LIBLZMA_SRCS_ASM:.S=-static.o) 206LIBLZMA_OBJS_STATIC = $(LIBLZMA_OBJS_STATIC_C) $(LIBLZMA_OBJS_STATIC_ASM) 207 208# The sed is needed to remove ordinals from the .def file. I'm not going 209# to track the ordinal numbers, so people should link against liblzma.dll 210# only by using symbol names. 211liblzma.dll: $(LIBLZMA_OBJS) 212 $(CC) $(ALL_CFLAGS) -shared -o liblzma.dll $(LIBLZMA_OBJS) -Wl,--out-implib,liblzma.a,--output-def,liblzma.def.in 213 $(SED) 's/ \+@ *[0-9]\+//' liblzma.def.in > liblzma.def 214 $(RM) liblzma.def.in 215 $(STRIP) --strip-unneeded liblzma.a 216 $(STRIP) --strip-all liblzma.dll 217 218$(LIBLZMA_OBJS_C): %.o: %.c 219 $(CC) -DDLL_EXPORT $(ALL_CPPFLAGS) $(ALL_CFLAGS) -c -o $@ $< 220 221$(LIBLZMA_OBJS_ASM): %.o: %.S 222 $(CC) -DDLL_EXPORT $(ALL_CPPFLAGS) $(ALL_CFLAGS) -c -o $@ $< 223 224liblzma_static.lib: $(LIBLZMA_OBJS_STATIC) 225 $(RM) $@ 226 $(AR) rcs $@ $(LIBLZMA_OBJS_STATIC) 227 $(STRIP) --strip-unneeded $@ 228 229$(LIBLZMA_OBJS_STATIC_C): %-static.o: %.c 230 $(CC) $(ALL_CPPFLAGS) $(ALL_CFLAGS) -c -o $@ $< 231 232$(LIBLZMA_OBJS_STATIC_ASM): %-static.o: %.S 233 $(CC) $(ALL_CPPFLAGS) $(ALL_CFLAGS) -c -o $@ $< 234 235.PHONY: liblzma-clean 236liblzma-clean: 237 -$(RM) $(LIBLZMA_OBJS) $(LIBLZMA_OBJS_STATIC) liblzma.def.in liblzma.def liblzma.a liblzma.dll liblzma_static.lib 238 239 240########################### 241# xzdec.exe & lzmadec.exe # 242########################### 243 244.PHONY: xzdec 245xzdec: xzdec-dynamic.exe lzmadec-dynamic.exe xzdec.exe lzmadec.exe 246 247XZDEC_SRCS = ../src/xzdec/xzdec.c 248 249xzdec-dynamic.exe: liblzma.dll $(XZDEC_SRCS) ../src/xzdec/xzdec_w32res.o 250 $(CC) $(ALL_CPPFLAGS) $(ALL_CFLAGS) $(XZDEC_SRCS) ../src/xzdec/xzdec_w32res.o -o $@ liblzma.a 251 $(STRIP) --strip-all $@ 252 253lzmadec-dynamic.exe: liblzma.dll $(XZDEC_SRCS) ../src/xzdec/lzmadec_w32res.o 254 $(CC) $(ALL_CPPFLAGS) -DLZMADEC $(ALL_CFLAGS) $(XZDEC_SRCS) ../src/xzdec/lzmadec_w32res.o -o $@ liblzma.a 255 $(STRIP) --strip-all $@ 256 257xzdec.exe: liblzma_static.lib $(XZDEC_SRCS) ../src/xzdec/xzdec_w32res.o 258 $(CC) -DLZMA_API_STATIC $(ALL_CPPFLAGS) $(ALL_CFLAGS) $(XZDEC_SRCS) ../src/xzdec/xzdec_w32res.o -o $@ liblzma_static.lib 259 $(STRIP) --strip-all $@ 260 261lzmadec.exe: liblzma_static.lib $(XZDEC_SRCS) ../src/xzdec/lzmadec_w32res.o 262 $(CC) -DLZMA_API_STATIC $(ALL_CPPFLAGS) -DLZMADEC $(ALL_CFLAGS) $(XZDEC_SRCS) ../src/xzdec/lzmadec_w32res.o -o $@ liblzma_static.lib 263 $(STRIP) --strip-all $@ 264 265.PHONY: xzdec-clean 266xzdec-clean: 267 -$(RM) xzdec-dynamic.exe lzmadec-dynamic.exe xzdec.exe lzmadec.exe ../src/xzdec/xzdec_w32res.o ../src/xzdec/lzmadec_w32res.o 268 269 270########## 271# xz.exe # 272########## 273 274.PHONY: xz 275xz: xz-dynamic.exe xz.exe 276 277XZ_SRCS = \ 278 ../src/xz/args.c \ 279 ../src/xz/coder.c \ 280 ../src/xz/file_io.c \ 281 ../src/xz/hardware.c \ 282 ../src/xz/main.c \ 283 ../src/xz/message.c \ 284 ../src/xz/options.c \ 285 ../src/xz/signals.c \ 286 ../src/xz/suffix.c \ 287 ../src/xz/util.c 288 289XZ_OBJS = $(XZ_SRCS:.c=.o) 290XZ_OBJS_STATIC = $(XZ_SRCS:.c=-static.o) 291 292$(XZ_OBJS): %.o: %.c 293 $(CC) $(ALL_CPPFLAGS) $(ALL_CFLAGS) -c -o $@ $< 294 295xz-dynamic.exe: liblzma.dll $(XZ_OBJS) ../src/xz/xz_w32res.o 296 $(CC) $(ALL_CFLAGS) $(XZ_OBJS) ../src/xz/xz_w32res.o -o $@ liblzma.a 297 $(STRIP) --strip-all $@ 298 299$(XZ_OBJS_STATIC): %-static.o: %.c 300 $(CC) -DLZMA_API_STATIC $(ALL_CPPFLAGS) $(ALL_CFLAGS) -c -o $@ $< 301 302xz.exe: liblzma_static.lib $(XZ_OBJS_STATIC) ../src/xz/xz_w32res.o 303 $(CC) $(ALL_CFLAGS) $(XZ_OBJS_STATIC) ../src/xz/xz_w32res.o -o $@ liblzma_static.lib 304 $(STRIP) --strip-all $@ 305 306.PHONY: xz-clean 307xz-clean: 308 -$(RM) $(XZ_OBJS) $(XZ_OBJS_STATIC) ../src/xz/xz_w32res.o xz-dynamic.exe xz.exe 309