Main Page

From NeoBuild Wiki
Jump to: navigation, search

The purpose of this Wiki is to document the process of building the NeoOffice® office suite[1] from source on OS X.

Background

Since the source code of the original OpenOffice suite was publicly released in 2000, several ports have been made for MacOS, including Apache OpenOffice, LibreOffice, and NeoOffice®. The NeoOffice® suite was originally created in 2003 because no native OS X port of OpenOffice existed at that time; all Mac versions then available required X11 and lacked native menus, access to OS X system fonts, etc. Originally, the suite was licensed under GPL and binaries were made available for free download.

As the popularity of NeoOffice® grew, the developers concluded that they did not have enough resources to continue both development and user support for free. Accordingly, free support was discontinued in September 2009. Nonetheless, the developers pledged to "continue to provide free NeoOffice downloads to all users" in a forum post announcing a price increase in September 2010. Just over six months later, however, the developers instituted mandatory payment for binaries, without any warning, starting with version 3.2. While prior versions were posted as free downloads for some time, all free versions were eventually removed from the NeoOffice® download site. As of this writing, NeoOffice® is effectively a fully commercial product.

While few people would otherwise quibble with the idea of charging for a large, complex, well-implemented software package, many people found the way in which the aforementioned charges were introduced to be an obnoxious bait-and switch. Specifically:

  • The update checker mechanism in the last free version (3.1.2) was never modified to indicate that the next update would no longer be free, and no patch was made available to prevent the checker from continuing to issue such notifications.
  • The change to a pay-for-binaries model was made without any advance warning. Indeed, the 3.2 beta release announcement about one month prior to the final 3.2 release makes no mention whatsoever of the pending change. It is hard to imagine that the decision to charge for binaries was made without at least that much advance planning.
  • The developers insisted, quite disingenuously, on describing the payment as a "donation." If money is required to obtain the binaries, this is a straightforward sale—not a donation.
  • Furthermore, the developers defended their actions by carefully responding only to the misinformed allegations of those who claimed charging for binaries is a GPL violation per se. This is a classic straw man argument; the developers remained conspicuously silent on the fact that following the build instructions to the letter does not result in a successful build, as noted by several people who tried. According to the FSF's GPL Compliance Office,[2] posting significantly incomplete or broken instructions is indeed a GPL violation, in both spirit and letter. But it is difficult to remedy in this case because the only people with the standing to take action on the violation are the NeoOffice developers themselves.

I found these actions to be irritating on principle. This wiki is my effort to do something about that.

After much experimenting, I've figured out how to successfully build NeoOffice® from source. The goal of this page is to share my experience with others, so that those who choose to try can do so as well, in keeping with the spirit of the GPL. It is also my hope that others with more experience than I have will contribute corrections and simplifications to the steps documented below.

—Builder

Preliminaries

  1. The build process requires a specific version of OS X for each particular version of NeoOffice®. Consult the official build page to find the exact OS X version you'll need, and note the corresponding CVS tag.

  2. Create the build directory in a suitable location and navigate into it:

    mkdir NEO_HOME; cd NEO_HOME

    This directory will be referred to as $NEO_HOME throughout the rest of these instructions. Notes:

    • You may want to choose a location other than /tmp if you intend to build this more than once. Doing so will save time (potentially lots of time) for CVS checkout and especially the build itself for subsequent versions.
    • Currently, the NeoOffice® patch installer does not recognize builds created through the process described here, so subsequent patches will not install (perhaps due to a missing installation receipt?). Therefore a full (re-)build will be required each time a new patch is released.

  3. Check out the source for the version you wish to build using the exact CVS tag noted above:

    cvs -d :pserver:anoncvs@anoncvs.neooffice.org:/cvs login

    (log in with password anoncvs)

    cvs -d :pserver:anoncvs@anoncvs.neooffice.org:/cvs co -r NeoOffice-3_4_1-10 NeoOffice

    This should check out about ~610MB worth of sources.


  4. Perform all the preliminary steps in $NEO_HOME/neojava/README.txt up to (but not including) the final "make" command. Specifically, this includes:

    • Install the appropriate version of XCode (3.2.6 for MacOS 10.6; 4.6.3 for MacOS 10.8) and MacPorts (currently 2.3.3 for both 10.6.8 and 10.8.5). For XCode 4.6.3, you will also need to install "Auxiliary Tools for XCode - Late July 2012" from the same location.
    • Install the appropriate version of CPAN.
    • Create a self-signed certificate (link here to separate page of instructions) or note the name of an existing, valid developer signing certificate.

  5. Update all components of MacPorts:

    sudo /opt/local/bin/port selfupdate

    sudo /opt/local/bin/port upgrade outdated

    sudo /opt/local/bin/port install coreutils pkgconfig libIDL gperf flex wget subversion

    sudo /opt/local/bin/port upgrade --enforce-variants active +universal

    • Note: This step can take well over an hour, especially the "upgrade outdated" call; (re-)building gettext and especially boost can each take 15 minutes or more.

  6. Update all components of CPAN:

    sudo cpan install CPAN

    sudo cpan (and then type "reload cpan" at the prompt)

    sudo cpan App::cpanminus

    sudo cpanm Archive::Zip

    sudo ln -s /opt/local/bin/libIDL-config-2 /opt/local/bin/libIDL-config


  7. Step 4

    4) set up symlinks to cc / gcc so that the correct compiler is used:

    -- open a new terminal window (to get a clean bash environment with no NeoOffice-specific aliases) -- ln -s `which cc` /Developer/Library/Xcode/Plug-ins/GCC\ 4.0.xcplugin/Contents/Resources/ -- ln -s `which cc` /Developer/Library/Xcode/Plug-ins/GCC\ 4.2.xcplugin/Contents/Resources/

    Note 1: The only the 4.0 variant (item b above) seems necessary to build the martinkahr RemoteControl stuff. not sure if the 4.2 variant is necessary for other stuff in the overall build, or not necessary at all

    Note 2: the "cc"s in $NEO_HOME, above, are simply wrappers -- but they enforce 32-bit building, so they are probably necessary (even though the system is already booted into 32-bit mode).

Step 5

5) cd $NEO_HOME/neojava/ and edit the makefile as follows:

a. edit the PRODUCT_NAME and PRODUCT_DIR_NAME lines as appropriate. For simplicity, set both values to just "NeoOffice" (note that the build will automatically append the "-3.4.1-Intel" part throughout).

b. near the end of the build, the build script looks for $NEO_HOME/neojava/install/package/Contents/help/ and dies when it's not found. this directory instead exists one level down, at $NEO_HOME/neojava/install/package/Contents/basis-link/help -- so change all four (4) instances of the string "/Contents/help" in the makefile to instead read "/Contents/basis-link/help"

c. the absence of Planamesa's code signing certificate will break the build right at the point where the first language module is signed (as of Neo 3.4.1-7, it's Arabic). to fix this, make one of the following three changes:

-- comment out the three (3) calls to productsign and the twelve (12) calls to codesign throughout the makefile. but note that this may(??) cause problems with installation and/or use under 10.7 and later, where Gatekeeper is deployed to enforce signing checks.

OR

-- replace the line "-include certs.mk" with "-include certs.neo.mk", then edit $NEO_HOME/neojava/certs.neo.mk to point to a valid certificate on the build machine's keychain (see http://www.digicert.com/code-signing/mac-os-codesign-tool.htm for an example of how to do this). note that the certificate name, which is specified in the stock source code tree as

 "CERTAPPIDENTITY=Developer ID Application: Planamesa, Inc."

should be changed to something like

 "CERTAPPIDENTITY=Dummy Certificate"

(in other words, the "Developer ID Application: " bit should be removed)

OR

-- cp $NEO_HOME/neojava/certs.neo.mk $NEO_HOME/neojava/certs.mk and edit certs.mk to point to a valid certificate,

if using a certificate (as opposed to commenting out the "productsign" calls), this can be tested before re-running "make all" by trying, e.g.,

   productsign --sign "(available certificate identifier)" "install/unsigned_Bulgarian.pkg" \
   "install/My_Untested_Office_Suite-3.4.1-Language_Pack_Bulgarian-Intel/Install My Untested Office Suite 3.4.1 Language Pack Bulgarian.pkg"

where "My_Untested_Office_Suite" and "My Untested Office Suite" are replaced by whatever PRODUCT_NAME and PRODUCT_DIR were set to in step 4a above.

Step 5

5) [OPTIONAL]: by default, the file $NEO_HOME/neojava/etc/supportedlanguages.txt is configured to build something like 20 language packs (full list at http://www.neooffice.org/neojava/en/oldlangpackdownload.php). each of these is ~20MB. for brevity, comment out all but en-US, French, German, and Italian -- these are the four languages bundled in the Neo installer by default. later the rest of the language packs on the above page can be built separately.

UPDATE 2014-08-31 (NeoOffice 3.4.1-7): the makefile now assumes that the languages bundled by default are:

 PRODUCT_BUNDLED_LANG_PACKS=en-US de fr it he ja ar es ru nl en-GB # sv pl nb fi pt-BR da zh-TW cs th zh-CN el\
 hu sk ko

that is, in addition to the four mentioned above, it also expects hebrew, japanese, arabic, spanish, russian, dutch, and british english. assuming the supportedlanguages.txt is changed as described above, the pound sign (comment) in the above line in the makefile should be changed accordingly, namely:

 PRODUCT_BUNDLED_LANG_PACKS=en-US de fr it # he ja ar es ru nl en-GB # sv pl nb fi pt-BR da zh-TW cs th zh-CN el\
 hu sk ko

Step 8

8) run "make all". note that this will probably NOT work; if it fails, proceed to next step. if it works, note that the build may require a root password on one or two occasions to invoke "sudo" near the end. notes:

a. an easy way to get the paths in the make command (which does NOT say 'make all' in the README.txt file…) is:

make GNUCP=`which gcp` LIBIDL_CONFIG=`which libIDL-config-2` PKG_CONFIG=`which pkg-config`

b. see http://stackoverflow.com/questions/3063507/list-goals-targets-in-gnu-make/3632592#3632592 for ideas on how to unpack stuff without building. (worth a try. however, note that this approach _may_ fail because the build script needs to check out OOo code first.)

c. to debug individual modules that fail to build, see below.

now that the build directory ($NEO_HOME/neojava/build/) exists, the following tweaks will probably need to be applied...

Step 9

9) fix issue with libuno_sal.dylib.3, testtool, etc.:

edit the file $NEO_HOME/neojava/build/ooo-build-3.1.1.1/build/ooo310-m19/solenv/bin/macosx-create-bundle by changing the line

   if printf "$filetype" | grep -q 'Mach-O executable'; then

to

   if printf "$filetype" | grep -q -E 'Mach-O (i386 )?executable'; then

and the line

   elif printf "$filetype" | grep -q 'Mach-O dynamically linked shared library'; then

to

   elif printf "$filetype" | grep -q -E 'Mach-O (i386 )?dynamically linked shared library'; then

-- note the additional "-E" flag and the exact spacing around the closing paren in the replacement versions!!! -- see explanation for how to debug these kinds of issues below

Step 10

10) fix compilation errors in hunspell-1.2.8 (which fails to build -- with the exact same error -- from the stock tarball on sourceforge!) by using a newer version:

a) download latest .tgz from http://hunspell.sourceforge.net/ and put it in $NEO_HOME/neojava/build/ooo-build-3.1.1.1/build/ooo310-m19/hunspell/download/ (no need to unzip/untar it; build script will do that)

b) edit $NEO_HOME/neojava/build/ooo-build-3.1.1.1/build/ooo310-m19/hunspell/makefile.mk to use the version of hunspell just downloaded -- for example, if downloaded version is 1.3.3, change all instances of "1.2.8" to "1.3.3", _except_ the one to "1.2.8.patch", which should just be set to blank (i.e. empty)

c) [optional] to make sure the module builds: source $NEO_HOME/neojava/build/ooo-build-3.1.1.1/build/ooo310-m19/MacOSXX86Env.Set.sh to set up "build" alias then run 'VERBOSE="TRUE" build' in $NEO_HOME/neojava/build/ooo-build-3.1.1.1/build/ooo310-m19/hunspell/ to make sure the module builds without errors. NOTE: this may not work until after the make has been run at least once...

Step 11

11) for some reason the lingucomponent module doesn't find the header file hunvisapi.h and fails to build. fix this by:

a) cd ~/NEO_HOME_3.4/neojava/build/ooo-build-3.1.1.1/build/ooo310-m19/lingucomponent/source/lingutil b) ln -s ../../../hunspell/unxmacxi.pro/misc/build/hunspell-1.3.2/src/hunspell/hunvisapi.h . (using version of hunspell downloaded previously) c) [optional] run VERBOSE="TRUE" build in the lingucomponent module directory to make sure it builds

Step 12

12) when all of the above steps are done, run "make all" again (or, as noted above, instead use the form make GNUCP=`which gcp` LIBIDL_CONFIG=`which libIDL-config-2` PKG_CONFIG=`which pkg-config`) note that the build may require a root password on one or two occasions to invoke "sudo" near the end.

assuming everything compiles, the installer will end up at $NEO_HOME/neojava/build/install/NeoOffice-3.4.1-Intel.dmg

also, note that $NEO_HOME will be quite large at the end of the build -- about 10GB on my machine.

Module Debugging

To debug an error when a module fails to build, add an echo statement in

   $NEO_HOME/neojava/build/ooo-build-3.1.1.1/build/ooo310-m19/solenv/bin/macosx-create-bundle

just before the block containing the error text (e.g. "not a Mach-O executable", etc.) to see why the "if" statement fails. then test this by: -- cd $NEO_HOME/neojava/build/ooo-build-3.1.1.1/build/ooo310-m19/sal/ (where "sal" is the name of the problem module in this example; replace it with the name of the actual problem module) -- VERBOSE="TRUE" build -- now examine the verbose output to see if it's possible to figure out what's happening when something breaks

  • Building the non-App Store version (currently 3.4.1 patch 10)
  • Building the App Store version (currently 2014.6)

/cell /row /table

References

  1. NeoOffice® is a registered trademark of Planamesa Inc. For more information, see the NeoOffice® FAQ.
  2. Personal correspondence with licensing@fsf.org, 19 October 2013.