]> wimlib.net Git - wimlib/blob - tools/make-windows-release
compiler.h: remove _unused_attribute
[wimlib] / tools / make-windows-release
1 #!/bin/bash
2 #
3 # This script prepares a Windows binary distribution of wimlib.
4
5 set -e -u
6
7 SCRIPTNAME="$0"
8 TOPDIR=$(dirname "$(dirname "$(realpath "$0")")")
9 cd "$TOPDIR" # Top-level directory of the git repo
10
11 MSYSTEM=${MSYSTEM:-}
12 if [ -z "$MSYSTEM" ]; then
13         ARCH=x86_64
14 else
15         case "$MSYSTEM" in
16         MINGW32)
17                 ARCH=i686
18                 CC_PKG=mingw-w64-i686-gcc
19                 ;;
20         MINGW64)
21                 ARCH=x86_64
22                 CC_PKG=mingw-w64-x86_64-gcc
23                 ;;
24         CLANG32)
25                 ARCH=i686
26                 CC_PKG=mingw-w64-clang-i686-clang
27                 ;;
28         CLANG64)
29                 ARCH=x86_64
30                 CC_PKG=mingw-w64-clang-x86_64-clang
31                 ;;
32         CLANGARM64)
33                 ARCH=aarch64
34                 CC_PKG=mingw-w64-clang-aarch64-clang
35                 ;;
36         *)
37                 echo 1>&2 "Unsupported MSYS2 environment: $MSYSTEM.  This script supports"
38                 echo 1>&2 "MINGW32, MINGW64, CLANG32, CLANG64, and CLANGARM64."
39                 echo 1>&2 "See https://www.msys2.org/docs/environments/"
40                 exit 1
41         esac
42 fi
43 INCLUDE_DOCS=false
44 INSTALL_MSYS2_PACKAGES=false
45 SKIP_CONFIGURE=false
46 ZIP=false
47
48 longopts="help"
49 longopts+=",arch:"
50 longopts+=",include-docs"
51 longopts+=",install-msys2-packages"
52 longopts+=",skip-configure"
53 longopts+=",zip"
54
55 usage()
56 {
57         cat << EOF
58 Usage: $SCRIPTNAME [OPTION]... [EXTRA_CONFIGURE_ARG]...
59 Options:
60   --arch=ARCH               Specify the CPU architecture.  This is unnecessary
61                             when using MSYS2.
62
63   --include-docs            Build and install the PDF manual pages.
64
65   --install-msys2-packages  Install the MSYS2 packages needed to build wimlib.
66                             You can omit this if you have already done this for
67                             the same MSYS2 environment.
68
69   --skip-configure          Skip running the configure script again.  You can
70                             use this to save time in incremental builds if you
71                             are sure you didn't change any options.
72
73   --zip                     Zip the output files up into a zip file.
74 EOF
75 }
76
77 if ! options=$(getopt -o "" -l "$longopts" -- "$@"); then
78         usage 1>&2
79         exit 1
80 fi
81 eval set -- "$options"
82 while true; do
83         case "$1" in
84         --help)
85                 usage
86                 exit 0
87                 ;;
88         --arch)
89                 ARCH=$2
90                 shift
91                 ;;
92         --include-docs)
93                 INCLUDE_DOCS=true
94                 ;;
95         --install-msys2-packages)
96                 if [ -z "$MSYSTEM" ]; then
97                         echo 1>&2 "--install-msys2-packages is not allowed outside MSYS2."
98                         exit 1
99                 fi
100                 INSTALL_MSYS2_PACKAGES=true
101                 ;;
102         --skip-configure)
103                 SKIP_CONFIGURE=true
104                 ;;
105         --zip)
106                 ZIP=true
107                 ;;
108         --)
109                 shift
110                 break
111                 ;;
112         *)
113                 echo 1>&2 "Invalid option '$1'"
114                 usage 1>&2
115                 exit 1
116                 ;;
117         esac
118         shift
119 done
120
121 EXTRA_CONFIGURE_ARGS=("$@")
122
123 case "$ARCH" in
124 i686|x86_64|aarch64)
125         ;;
126 *)
127         echo 1>&2 "Unknown ARCH: $ARCH.  Please specify a supported architecture with --arch"
128         exit 1
129         ;;
130 esac
131
132 VERSION=$(tools/get-version-number)
133 DESTDIR=wimlib-${VERSION}-windows-${ARCH}-bin
134 ZIPFILE=$DESTDIR.zip
135 MAKE="make -j$(getconf _NPROCESSORS_ONLN)"
136
137 rm -rf "$DESTDIR" "$ZIPFILE"
138 mkdir "$DESTDIR"
139
140 # Install the required MSYS2 packages if requested.
141 if $INSTALL_MSYS2_PACKAGES; then
142         echo "Installing the MSYS2 $MSYSTEM packages needed to build wimlib..."
143         pacman -Syu --noconfirm --needed \
144                 autoconf \
145                 automake \
146                 git \
147                 libtool \
148                 make \
149                 "$CC_PKG" \
150                 pkgconf
151         echo "Done installing the MSYS2 $MSYSTEM packages needed to build wimlib."
152 fi
153
154 # Bootstrap the repository if not already done.
155 if [ ! -e configure ]; then
156         echo "Bootstrapping the wimlib repository..."
157         ./bootstrap
158 fi
159
160 # Configure wimlib.
161 if ! [ -e config.log ] || ! $SKIP_CONFIGURE; then
162         echo "Configuring wimlib..."
163         configure_args=("--host=${ARCH}-w64-mingw32")
164         configure_args+=("--disable-static")
165         # -static-libgcc is needed with gcc.  It should go in the CFLAGS, but
166         # libtool strips it, so it must go directly in CC instead.  See
167         # http://www.gnu.org/software/libtool/manual/libtool.html#Stripped-link-flags
168         if "${ARCH}-w64-mingw32-cc" --version | grep -q '(GCC)'; then
169                 configure_args+=("CC=${ARCH}-w64-mingw32-cc -static-libgcc")
170         fi
171         configure_args+=("${EXTRA_CONFIGURE_ARGS[@]}")
172         ./configure "${configure_args[@]}"
173         $MAKE clean
174 fi
175
176 echo "Building wimlib..."
177 $MAKE
178
179 echo "Installing binaries..."
180 cp .libs/*.{dll,exe} "$DESTDIR"
181 strip "$DESTDIR"/*.{dll,exe}
182
183 echo "Installing NEWS, README, and licenses..."
184 cp NEWS README* COPYING* "$DESTDIR"
185 sed -n '/^#/q; s/^[\/\* ]*//; p' src/divsufsort.c > "$DESTDIR"/COPYING.libdivsufsort-lite
186 if ! grep -q 'Copyright' "$DESTDIR"/COPYING.libdivsufsort-lite; then
187         echo 1>&2 "ERROR: failed to extract libdivsufsort-lite license text"
188         exit 1
189 fi
190 cd "$DESTDIR"
191 for fil in NEWS README* COPYING*; do
192         sed < "$fil" > "${fil}".txt -e 's/$/\r/g'
193         rm "$fil"
194 done
195 cd ..
196
197 IMAGEX_CMDS=()
198 for cmd in ./doc/man1/wim*.1; do
199         cmd=${cmd##*/}
200         cmd=${cmd%.1}
201         case "$cmd" in
202         wimlib-imagex|wimmount|wimmountrw|wimunmount)
203                 ;;
204         *)
205                 IMAGEX_CMDS+=("$cmd")
206                 ;;
207         esac
208 done
209
210 function gen_pdf_from_man_page()
211 {
212         local cmd=$1
213         local pdf=${DESTDIR}/doc/${cmd}.pdf
214
215         echo "Generating $pdf"
216         MANPATH="./doc" man -t "$cmd" | ps2pdf - "$pdf"
217 }
218
219 if $INCLUDE_DOCS; then
220         echo "Installing manual pages..."
221         mkdir "$DESTDIR"/doc
222         for cmd in "${IMAGEX_CMDS[@]}"; do
223                 gen_pdf_from_man_page "$cmd"
224         done
225         gen_pdf_from_man_page wimlib-imagex
226 fi
227
228 echo "Installing wim*.cmd files..."
229 for cmd in "${IMAGEX_CMDS[@]}"; do
230         sed 's/$/\r/g' > "${DESTDIR}/${cmd}.cmd" <<- EOF
231                 @echo off
232                 "%~dp0\\wimlib-imagex" ${cmd#wim} %*
233         EOF
234         chmod +x "${DESTDIR}/${cmd}.cmd"
235 done
236
237 echo "Installing development files..."
238 mkdir "$DESTDIR"/devel
239 cp .libs/libwim.dll.a "$DESTDIR"/devel/libwim.lib
240 cp include/wimlib.h "$DESTDIR"/devel/
241
242 if $ZIP; then
243         echo "Creating zip file..."
244         cd "$DESTDIR"
245         7z -mx9 a ../"$ZIPFILE" . > /dev/null
246         cd ..
247         echo "Success!  Output is in $ZIPFILE"
248 else
249         echo "Success!  Output is in $DESTDIR"
250 fi