User Tools

Site Tools


====== Building MinGW for Mac OS X ====== You need Apple Developer Tools, that you can download from [[|Apple Developer Connection]]. I have installed XCode Tools 2.2, and I have used ''gcc-3.3'' for cross-compiling MinGW. MinGW for Mac OS X Source package is available [[|here]] as a DMG file. Mount DMG file, and copy its contents in any directory. ====== Building steps overview ====== All operations are organized by the ''makefile'' file. For making things easier, I have included numerous shell script files (file with ''**.command**'' extensions). Theses files just invoke ''make'' with a specific goal. ===== Makefile Variables ====== The ''makefile'' defines several variables: ^Variable ^Default Value ^Meaning ^ |''TARGET'' |''i386-mingw32'' |Target name | |''GCC_VERSION'' |''3.4.4'' |The GCC version used for MinGW port | |''MINGW_VERSION'' |''$(GCC_VERSION)-20050522-1'' |the MinGW port full name | |''PREFIX'' |''$(PWD)/products'' |Where products are installed by ''step<sub>i</sub>'' goals) | |''INSTALLATION_DIR'' |''/usr/local/$(TARGET)-$(GCC_VERSION)'' |Where products are installed (by ''install'' goal) | |''NATIVE_COMPILER'' |''gcc-3.3'' |The Mac OS X native compiler used for compiling tool chain; I have used gcc-3.3, provided in Developer Tools 2.2 | |''LANGUAGES'' |''--enable-languages=c++,objc,ada,java,f77'' |Languages built by fifth step | ===== Build Steps ====== As full building takes a while, I have divided it in five steps, as described in the following table. All building steps are provided by the ''makefile'' file, which defines the ''step1'', ''step2'', ..., ''step5'' goals. ''step<sub>i</sub>'' (for ''i>1'') makes ''step<sub>i-1</sub>'' before performing its own work. All step products are installed by in the ''$(PREFIX)'' directory. The ''install'' goal builds all products and copies them in ''$(INSTALLATION_DIR)'' directory, that is by default ''/usr/local/i386-mingw32-3.4.4/''. The ''build_binary_package'' just builds a package from a previously installation package (see here for more details). The ''build_source_disk_image'' builds a DMG file that contains all source tarballs, makefile, all command files, ... exactly like the one you have downloaded. ^Command File ^Makefile Goal ^Operation ^ |''build_step1.command''|''step1'' |Builds and installs binutils in ''$PREFIX'' directory | |''build_step2.command''|''step2'' |performs ''step1'', then builds and installs C compiler in ''$(PREFIX)'' directory | |''build_step3.command''|''step3'' |performs ''step2'', then builds and installs Win32 API in ''$(PREFIX)'' directory | |''build_step4.command''|''step4'' |performs ''step3'', then builds and installs MinGW Runtime in ''$(PREFIX)'' directory | |''build_step5.command''|''step5'' |performs ''step4'', then builds and installs other compilers in ''$(PREFIX)'' directory | |''build_step5and_install.command''|''install'' |step5, then copy products in ''$(INSTALLATION_DIR)'' directory | |''build_step5and_binary_distribution.command''|''build_binary_package'' |builds a package embbedded in a DMG file | |''build_source_disk_image.command''|''build_source_disk_image'' |builds the source tarballs distribution in a DMG file (like the one you have downloaded) | ===== Cleaning and Uninstalling ====== The ''cleanstep<sub>i</sub>'' steps delete files from ''$PREFIX'' directory. They do not modify ''$(INSTALLATION_DIR)'' contents. The ''cleanstep<sub>1</sub>'' step is a //clean all// operation. Other steps do not remove all files created from the corresponding //build// steps, but only some files that trigger //build// steps. The ''uninstall'' removes ''$(INSTALLATION_DIR)'' directory, that a ''install'' goal execution has previously populated. ^Command File ^Makefile Goal ^Operation ^ |''clean_step1.command''|''cleanstep1'' |removes ''$(PREFIX)'' directory | |''clean_step2.command''|''cleanstep2'' |removes C compiler, then performs ''cleanstep3'' | |''clean_step3.command''|''cleanstep3'' |removes ''$(PREFIX)/$(TARGET)/lib/libadvapi32.a'' file, then performs ''cleanstep4'' | |''clean_step4.command''|''cleanstep4'' |removes ''$(PREFIX)/$(TARGET)/lib/libcoldname.a'' file, then performs ''cleanstep5'' | |''clean_step5.command''|''cleanstep5'' |Removes C++ compiler from ''$(PREFIX)'' file | |''uninstall.command''|''uninstall'' |removes ''$(INSTALLATION_DIR)'' directory | ===== Build Steps Durations ====== Theses are approximative durations of build steps, for an iMac G5 1,8 GHz: ^Step ^Building... ^Duration ^ |1|binutils |8' | |2|C compiler |9' | |3|Win32 API |1' | |4|MinGW Runtime |1' | |5|C++ Compiler Only |16' | |5|All Compilers (C++, Objective-C, Java, Ada, Fortran 77) |1h 6' | ====== Building details ====== ===== Step 1: building binutils ===== Building ''binutils'' is very easy: configure them, build them and install them succeeded at the first attempt. ===== Step 2: building C compiler ===== ==== Copying headers ==== C Compiler needs header files for compiling successfully. Headers from //gcc-core tarball// are not sufficient. In fact, C compiler needs headers from //win32 api// and //MinGW runtime//, that we copy in ''$(PREFIX)/$(TARGET)/include/'' directory. ==== Handling end of line warning ==== gcc warns each time it finds an include file that is not terminated by an end of line, that is a CRLF for MinGW (as it deals with Windows formatted text files). Our cross compiler will run on Mac OS X, and will process text files with with CR, LF or CRLF end of line marks. The result is you get many warnings when included files use a LF or a CR as end of line mark. By default, gcc provides no command line option to disable this warning. **I have found [[|here]] a GCC patch that disables it. However, this patch is available for GCC 3.3.3, and trying to apply it to GCC 3.4.4 fails.** In fact, options handling in 3.4.4 is very different from 3.3.3. So I have written my own patch. The ''patch'' files are located in the ''patches'' directory. The patches are applied to the C compiler sources before performing configuration. By default, our compiler outputs no warning for any of end of line mark (if you want to re-enable it, use **-Weof-newline** command line option, that warns when a file does not end with a CRLF). ===== Step 3: building win32 api ===== No particular point to hilite about configuration. Invoking make from building and installing needs to associate specific shell variables to cross tools full names, for example ''%%"%%AS=i386-mingw32-as%%"%%''. ===== Step 4: building MinGW runtime ===== As for previous step. ===== Step 5: building other compilers ===== Building all compilers takes a while (1h 6' for all languages). I have introduced the ''LANGUAGES'' makefile variable, for selecting the languages you want to build. Note the languages are not independant: for example, ''java'' needs ''C++''. ===== Building the binary distribution ===== I have implemented a three-stage process for the ''build_binary_package'' makefile goal: - build and install tools by calling ''step5'' goal; - use ''PackageMaker'' as command line tool, for building a package from the ''MinGW-binaries.pmproj'' project file; - build a DMG file from the package. However, using ''PackageMaker'' as command line tool is not as easy as I thought it. Performing build from GUI was working fine, althought trying to build from makefile was allways failing. **At last, I realized that PackagerMaker Version 2.1 (122) cannot build successfully from command line when the project file contains relative pathes.** So I change all relative pathes to absolute ones and build process works correctly. ^Of course, for building successfully, you must replace my absolute pathes with yours.^ The ''MinGW-binaries.pmproj'' project file uses pathes at three locations: - //Installer Interface// tab, //Show Interface Installer Editor// button, background image; the relative path would be: ''files_for_package_maker/gerwinski-gnu-head.gif''; - //Installer Interface// tab, //Show Interface Installer Editor// button, License file; the relative path would be: ''files_for_package_maker/License.txt''; - //Contents// tab, //Root// text field; the relative path would be: ''products''. ===== Building the source distribution ===== The ''build_source_disk_image'' makefile goal just builds a DMG file using ''hdutil'' command line tool. This is the way I distribute the source package. ====== Release 2 ====== For release 2, I have used XCode 2.4.1; ''gcc-3.3'' and ''gcc-4.0'' are both available, but building the distribution fails with ''gcc-3.3'' on an Intel Mac. Running the scripts builds the tool chain for current platform, i.e. ppc binaries on a ppc based Mac, and Intel binaries on an Intel based Mac. ===== PackageMaker 2.1.1 (123) ===== With XCode 2.4.1, PackageMaker 2.1.1 (123) is provided. This release handles relative pathes. I have modified the '''' file so that it uses now only relative pathes, making obsolete [[#building_the_binary_distribution|path adjustments]]. ===== Universal binaries ===== I have tried on a ppc Mac to build universal binaries, by defining in the makefile (line 74) : ''  NATIVE_COMPILER := gcc-3.3 -arch pcc -arch i386''\\ But this setting make the step 1 to fail, with the message: ''  checking for powerpc-apple-darwin8.8.0-gcc... gcc-3.3 -arch ppc -arch i386''\\ ''  checking for suffix of object files... configure: error: cannot compute suffix of object files: cannot compile''\\ With ''gcc-4.0'', the error message is: ''  checking how to run the C preprocessor... /lib/cpp''\\ ''  configure: error: C preprocessor "/lib/cpp" fails sanity check''\\ ''  See `config.log' for more details.''\\ I have found no interesting details in ''config.log'' file. ===== MinGW Packages ===== See [[mingwinstallation2|here]]. ===== Build log ===== Here is the full build log, on an Intel Mac: |Build log on an Intel Mac |[[| (249.8 KB)]] |

mingwformac.txt · Last modified: 2006/12/30 11:18 (external edit)