/build-cairo-windows.sh

https://github.com/preshing/cairo-windows · Shell · 144 lines · 118 code · 11 blank · 15 comment · 16 complexity · d89653ce3e08f677b73503f64d2e00cd MD5 · raw file

  1. #! bash
  2. set -e
  3. trap 'previous_command=$this_command; this_command=$BASH_COMMAND' DEBUG
  4. trap 'echo FAILED COMMAND: $previous_command' EXIT
  5. # Versions used
  6. USE_FREETYPE=1
  7. CAIRO_VERSION=cairo-1.17.2
  8. PIXMAN_VERSION=pixman-0.40.0
  9. LIBPNG_VERSION=libpng-1.6.37
  10. ZLIB_VERSION=zlib-1.2.11
  11. FREETYPE_VERSION=freetype-2.10.2
  12. # Set variables according to command line argument
  13. if [ ${1:-x86} = x64 ]; then
  14. MSVC_PLATFORM_NAME=x64
  15. OUTPUT_PLATFORM_NAME=x64
  16. else
  17. MSVC_PLATFORM_NAME=Win32
  18. OUTPUT_PLATFORM_NAME=x86
  19. fi
  20. # Make sure the MSVC linker appears first in the path
  21. MSVC_LINK_PATH=`whereis link | sed "s| /usr/bin/link.exe||" | sed "s|.*\(/c.*\)link.exe.*|\1|"`
  22. export PATH="$MSVC_LINK_PATH:$PATH"
  23. # Download packages if not already
  24. wget -nc https://www.cairographics.org/snapshots/$CAIRO_VERSION.tar.xz
  25. wget -nc https://www.cairographics.org/releases/$PIXMAN_VERSION.tar.gz
  26. wget -nc https://download.sourceforge.net/libpng/$LIBPNG_VERSION.tar.gz
  27. wget -nc http://www.zlib.net/$ZLIB_VERSION.tar.gz
  28. if [ $USE_FREETYPE -ne 0 ]; then
  29. wget -nc http://download.savannah.gnu.org/releases/freetype/$FREETYPE_VERSION.tar.gz
  30. fi
  31. # Extract packages if not already
  32. if [ ! -d cairo ]; then
  33. echo "Extracting $CAIRO_VERSION..."
  34. tar -xJf $CAIRO_VERSION.tar.xz
  35. mv $CAIRO_VERSION cairo
  36. fi
  37. if [ ! -d pixman ]; then
  38. echo "Extracting $PIXMAN_VERSION..."
  39. tar -xzf $PIXMAN_VERSION.tar.gz
  40. mv $PIXMAN_VERSION pixman
  41. fi
  42. if [ ! -d libpng ]; then
  43. echo "Extracting $LIBPNG_VERSION..."
  44. tar -xzf $LIBPNG_VERSION.tar.gz
  45. mv $LIBPNG_VERSION libpng
  46. fi
  47. if [ ! -d zlib ]; then
  48. echo "Extracting $ZLIB_VERSION..."
  49. tar -xzf $ZLIB_VERSION.tar.gz
  50. mv $ZLIB_VERSION zlib
  51. fi
  52. if [ $USE_FREETYPE -ne 0 ] && [ ! -d freetype ]; then
  53. echo "Extracting $FREETYPE_VERSION..."
  54. tar -xzf $FREETYPE_VERSION.tar.gz
  55. mv $FREETYPE_VERSION freetype
  56. fi
  57. # Build libpng and zlib
  58. cd libpng
  59. sed 's#4996</Disable#4996;5045</Disable#' projects/vstudio/zlib.props > zlib.props.fixed
  60. mv zlib.props.fixed projects/vstudio/zlib.props
  61. if [ ! -d "projects\vstudio\Backup" ]; then
  62. # Upgrade solution if not already
  63. devenv.com "projects\vstudio\vstudio.sln" -upgrade
  64. fi
  65. devenv.com "projects\vstudio\vstudio.sln" -build "Release Library|$MSVC_PLATFORM_NAME" -project libpng
  66. cd ..
  67. if [ $MSVC_PLATFORM_NAME = x64 ]; then
  68. cp "libpng/projects/vstudio/x64/Release Library/libpng16.lib" libpng/libpng.lib
  69. cp "libpng/projects/vstudio/x64/Release Library/zlib.lib" zlib/zlib.lib
  70. else
  71. cp "libpng/projects/vstudio/Release Library/libpng16.lib" libpng/libpng.lib
  72. cp "libpng/projects/vstudio/Release Library/zlib.lib" zlib/zlib.lib
  73. fi
  74. # Build pixman
  75. cd pixman
  76. sed s/-MD/-MT/ Makefile.win32.common > Makefile.win32.common.fixed
  77. mv Makefile.win32.common.fixed Makefile.win32.common
  78. if [ $MSVC_PLATFORM_NAME = x64 ]; then
  79. # pass -B for switching between x86/x64
  80. make pixman -B -f Makefile.win32 "CFG=release" "MMX=off"
  81. else
  82. make pixman -B -f Makefile.win32 "CFG=release"
  83. fi
  84. cd ..
  85. if [ $USE_FREETYPE -ne 0 ]; then
  86. cd freetype
  87. # Build freetype
  88. if [ ! -d "builds/windows/vc2010/Backup" ]; then
  89. # Upgrade solution if not already
  90. devenv.com "builds/windows/vc2010/freetype.sln" -upgrade
  91. fi
  92. devenv.com "builds/windows/vc2010/freetype.sln" -build "Release Static|$MSVC_PLATFORM_NAME"
  93. cp "`ls -1d "objs/$MSVC_PLATFORM_NAME/Release Static/freetype.lib"`" .
  94. cd ..
  95. fi
  96. # Build cairo
  97. cd cairo
  98. sed 's/-MD/-MT/;s/zdll.lib/zlib.lib/' build/Makefile.win32.common > Makefile.win32.common.fixed
  99. mv Makefile.win32.common.fixed build/Makefile.win32.common
  100. if [ $USE_FREETYPE -ne 0 ]; then
  101. sed '/^CAIRO_LIBS =/s/$/ $(top_builddir)\/..\/freetype\/freetype.lib/;/^DEFAULT_CFLAGS =/s/$/ -I$(top_srcdir)\/..\/freetype\/include/' build/Makefile.win32.common > Makefile.win32.common.fixed
  102. else
  103. sed '/^CAIRO_LIBS =/s/ $(top_builddir)\/..\/freetype\/freetype.lib//;/^DEFAULT_CFLAGS =/s/ -I$(top_srcdir)\/..\/freetype\/include//' build/Makefile.win32.common > Makefile.win32.common.fixed
  104. fi
  105. mv Makefile.win32.common.fixed build/Makefile.win32.common
  106. sed "s/CAIRO_HAS_FT_FONT=./CAIRO_HAS_FT_FONT=$USE_FREETYPE/" build/Makefile.win32.features > Makefile.win32.features.fixed
  107. mv Makefile.win32.features.fixed build/Makefile.win32.features
  108. # pass -B for switching between x86/x64
  109. make -B -f Makefile.win32 cairo "CFG=release"
  110. cd ..
  111. # Package headers with DLL
  112. OUTPUT_FOLDER=output/${CAIRO_VERSION/cairo-/cairo-windows-}
  113. mkdir -p $OUTPUT_FOLDER/include
  114. for file in cairo/cairo-version.h \
  115. cairo/src/cairo-features.h \
  116. cairo/src/cairo.h \
  117. cairo/src/cairo-deprecated.h \
  118. cairo/src/cairo-win32.h \
  119. cairo/src/cairo-script.h \
  120. cairo/src/cairo-ps.h \
  121. cairo/src/cairo-pdf.h \
  122. cairo/src/cairo-svg.h; do
  123. cp $file $OUTPUT_FOLDER/include
  124. done
  125. if [ $USE_FREETYPE -ne 0 ]; then
  126. cp cairo/src/cairo-ft.h $OUTPUT_FOLDER/include
  127. fi
  128. mkdir -p $OUTPUT_FOLDER/lib/$OUTPUT_PLATFORM_NAME
  129. cp cairo/src/release/cairo.lib $OUTPUT_FOLDER/lib/$OUTPUT_PLATFORM_NAME
  130. cp cairo/src/release/cairo.dll $OUTPUT_FOLDER/lib/$OUTPUT_PLATFORM_NAME
  131. cp cairo/COPYING* $OUTPUT_FOLDER
  132. trap - EXIT
  133. echo 'Success!'