Skip to content

Commit

Permalink
have 'make dist' build a windows installer on windows
Browse files Browse the repository at this point in the history
git-svn-id: https://svn.apache.org/repos/asf/couchdb/trunk@826173 13f79535-47bb-0310-9956-ffa450edef68
  • Loading branch information
Mark Hammond committed Oct 17, 2009
1 parent 2df3fab commit ad18ea6
Show file tree
Hide file tree
Showing 7 changed files with 231 additions and 11 deletions.
1 change: 1 addition & 0 deletions NEWS
Expand Up @@ -12,6 +12,7 @@ Version 0.11.0

This version has not been released yet.

* Added support for building a Windows installer as part of 'make dist'.
* Added optional 'raw' binary collation for faster view builds where Unicode
collation is not important.
* Improved view index build time by reducing ICU collation callouts.
Expand Down
29 changes: 26 additions & 3 deletions README
Expand Up @@ -370,21 +370,44 @@ Now we need to run a complicated configure command-line.
--with-js-lib=/cygdrive/c/path_to_seamonkey_lib \
--with-win32-icu-binaries=/cygdrive/c/path_to_icu_binaries_root \
--with-erlang=$ERL_TOP/release/win32/usr/include \
--with-win32-curl=/cygdrive/c/path/to/curl/root/directory
--with-win32-curl=/cygdrive/c/path/to/curl/root/directory \
--with-openssl-bin-dir=c:/openssl/bin \
--with-msvc-redist-dir=c:/dir/with/vcredist_platform_executable \
--prefix=$ERL_TOP/release/win32

Relax, then relax some more, then get a beer and relax some more; the
above command may take many many minutes to complete...

Note that all paths must be in cygwin format. Those starting with $ERL_TOP
can be entered literally, assuming ERL_TOP is set as described above.

Notes:
When building the installer, the necessary openssl binaries are pulled from
the directory pointed to --with-openssl-bin-dir.

Now we can build it and "install" it into the $ERL_TOP/release/win32 (or
wherever you set --prefix to above) directory:

$ make install

Relax on your new couch:

The $ERL_TOP/win32/release directory is now ready to .zip up, be packaged
The $ERL_TOP/release/win32 directory is now ready to .zip up, be packaged
by an installer, etc. To test it in-place, execute:

$ $ERL_TOP/win32/release/bin/couchdb.bat
$ $ERL_TOP/release/win32/bin/couchdb.bat

and everything should work fine.

To create an installer, execute:

$ make dist

and look for etc/windows/setup-couch*.exe. Note - only do this after
a clean build, not after testing in-place - otherwise your test database and
log files will be shipped!


Additional Notes:

Building erlang:
Expand Down
63 changes: 58 additions & 5 deletions configure.ac
Expand Up @@ -73,7 +73,13 @@ AC_ARG_WITH([js-include], [AC_HELP_STRING([--with-js-include=PATH],

AC_ARG_WITH([js-lib], [AC_HELP_STRING([--with-js-lib=PATH],
[set PATH to the SpiderMonkey library directory])],
[JS_LIB_FLAGS="-L$withval"], [])
[
JS_LIB_DIR=$withval
JS_LIB_FLAGS="-L$withval"
], [
JS_LIB_DIR=
])
AC_SUBST(JS_LIB_DIR)

AC_ARG_VAR([ERLC_FLAGS], [general flags to prepend to ERLC_FLAGS])
AC_ARG_VAR([FLAGS], [general flags to prepend to LDFLAGS and CPPFLAGS])
Expand Down Expand Up @@ -103,14 +109,61 @@ esac

AM_CONDITIONAL([WINDOWS], [test x$IS_WINDOWS = xTRUE])

AC_CHECK_LIB([mozjs], [JS_NewContext], [JSLIB=-lmozjs], [
AC_CHECK_LIB([js], [JS_NewContext], [JSLIB=-ljs], [
AC_CHECK_LIB([js3250], [JS_NewContext], [JSLIB=-ljs3250], [
AC_CHECK_LIB([js32], [JS_NewContext], [JSLIB=-ljs32], [
AC_CHECK_LIB([mozjs], [JS_NewContext], [JS_LIB_BASE=mozjs], [
AC_CHECK_LIB([js], [JS_NewContext], [JS_LIB_BASE=js], [
AC_CHECK_LIB([js3250], [JS_NewContext], [JS_LIB_BASE=js3250], [
AC_CHECK_LIB([js32], [JS_NewContext], [JS_LIB_BASE=js32], [
AC_MSG_ERROR([Could not find the js library.
Is the Mozilla SpiderMonkey library installed?])])])])])

AC_SUBST(JS_LIB_BASE)

if test x${IS_WINDOWS} = xTRUE; then
if test -f "$JS_LIB_DIR/$JS_LIB_BASE.dll"; then
# seamonkey 1.7- build layout on Windows
JS_LIB_BINARY="$JS_LIB_DIR/$JS_LIB_BASE.dll"
else
# seamonkey 1.8+ build layout on Windows
if test -f "$JS_LIB_DIR/../bin/$JS_LIB_BASE.dll"; then
JS_LIB_BINARY="$JS_LIB_DIR/../bin/$JS_LIB_BASE.dll"
else
AC_MSG_ERROR([Could not find $JS_LIB_BASE.dll.])
fi
fi
AC_SUBST(JS_LIB_BINARY)

# On windows we need to know the path to the openssl binaries.
AC_ARG_WITH([openssl-bin-dir], [AC_HELP_STRING([--with-openssl-bin-dir=PATH],
[path to the open ssl binaries for distribution on Windows])], [
openssl_bin_dir=`cygpath -m "$withval"`
AC_SUBST(openssl_bin_dir)
], [])

# Windows uses Inno setup - look for its compiler.
AC_PATH_PROG([INNO_COMPILER_EXECUTABLE], [iscc])
if test x${INNO_COMPILER_EXECUTABLE} = x; then
AC_MSG_WARN([You will be unable to build the Windows installer.])
fi

# We need the msvc redistributables for this platform too
# (in theory we could just install the assembly locally - but
# there are at least 4 directories with binaries, meaning 4 copies;
# so using the redist .exe means it ends up installed globally...)
AC_ARG_WITH([msvc-redist-dir], [AC_HELP_STRING([--with-msvc-redist-dir=PATH],
[path to the msvc redistributables for the Windows platform])], [
msvc_redist_dir=`cygpath -m "$withval"`
msvc_redist_name="vcredist_x86.exe"
AC_SUBST(msvc_redist_dir)
AC_SUBST(msvc_redist_name)
], [])
if test ! -f ${msvc_redist_dir}/${msvc_redist_name}; then
AC_MSG_WARN([The MSVC redistributable seems to be missing; expect the installer to fail.])
fi
fi

JSLIB=-l$JS_LIB_BASE

AC_CHECK_HEADER([jsapi.h], [], [
AC_CHECK_HEADER([js/jsapi.h],
[
Expand Down
36 changes: 36 additions & 0 deletions etc/Makefile.am
Expand Up @@ -27,6 +27,10 @@ nobase_sysconf_DATA = $(default_sysconf_data) $(init_sysconf_data)

EXTRA_DIST = $(init_sysconf_data)

if WINDOWS
EXTRA_DIST += windows/setup-couchdb-@version@.exe
endif

CLEANFILES = $(init_DATA) $(default_sysconf_data) $(launchd_DATA)

transform = @program_transform_name@
Expand Down Expand Up @@ -63,6 +67,38 @@ launchd/org.apache.couchdb.plist: launchd/org.apache.couchdb.plist.tpl
-e "s|%couchdb_command_name%|$(couchdb_command_name)|" \
< $< > $@

if WINDOWS

# README.txt has \n line endings in the repo and must have \r\n
# when installed as notepad is used to view it.
# Also: the targets below don't seem to update after an svn-up (which
# changes the version string in the generated files) so we trick make
# into always building it with the FORCE pattern...
windows/README.txt: windows/README.txt.tpl FORCE
sed -e "s|%package_name%|@package_name@|g" \
-e "s|%version%|@version@|g" \
< $< | unix2dos > $@

windows/couchdb.iss: windows/couchdb.iss.tpl FORCE
sed -e "s|%configure_input%|$@. Generated from $< by configure.|" \
-e "s|%package_name%|@package_name@|g" \
-e "s|%locallibbindir%|`cygpath -m @locallibbindir@`|g" \
-e "s|%version%|@version@|g" \
-e "s|%openssl_bin_dir%|@openssl_bin_dir@|g" \
-e "s|%msvc_redist_dir%|@msvc_redist_dir@|g" \
-e "s|%msvc_redist_name%|@msvc_redist_name@|g" \
< $< > $@

# The installer depends on all files, not just the source .iss file,
# so we trick make into always building it with the FORCE pattern...
windows/setup-couchdb-@version@.exe: windows/couchdb.iss windows/README.txt FORCE
$(INNO_COMPILER_EXECUTABLE) /q $<
@echo Windows Installer is at: `cygpath -a -w windows/setup-couchdb-@version@.exe`

FORCE:

endif

install-data-hook:
if test -n "$(init_DATA)"; then \
chmod +x "$(DESTDIR)$(initdir)/couchdb"; \
Expand Down
24 changes: 24 additions & 0 deletions etc/windows/README.txt.tpl
@@ -0,0 +1,24 @@
This is the README for the %package_name% binary distribution for
Windows, version %version%.

* Although CouchDB defaults to installing into your "Program Files" directory,
the permissions on the 'var' and 'etc' sub-directories have been adjusted
to allow modification by any authorized user so the couchdb databases, logs
and .ini files can be written. You may like to further restrict these
permissions to only the user who will be running couchdb.

* To start couchdb execute couchdb.bat in the 'bin' directory. A shortcut
to this batch file should have been installed. There is currently no
support for Windows Services etc, but you are encouraged to look at the
various tools which allow arbitrary programs to be run as services.

* The Futon application which comes with CouchDB does not work with
Internet Explorer - Mozilla Firefox is generally recommended.

* The test suite is known to fail on Windows due to what appear to be
permissions errors; this is due to couch being unable to delete a
file while it is in use on Windows.
See also https://issues.apache.org/jira/browse/COUCHDB-326

* Additional help with the Windows support is needed - please contact the
couchdb-dev list if you can help.
68 changes: 68 additions & 0 deletions etc/windows/couchdb.iss.tpl
@@ -0,0 +1,68 @@
; Licensed under the Apache License, Version 2.0 (the "License"); you may not
; use this file except in compliance with the License. You may obtain a copy of
; the License at
;
; http://www.apache.org/licenses/LICENSE-2.0
;
; Unless required by applicable law or agreed to in writing, software
; distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
; WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
; License for the specific language governing permissions and limitations under
; the License.

; CouchDB inno installer script
; %configure_input%

[Setup]
AppID=ApacheCouchDB
AppName=%package_name%
AppVerName=%package_name% %version%
AppPublisher=Apache Software Foundation
AppPublisherURL=http://couchdb.apache.org/
LicenseFile=../../LICENSE
DefaultDirName={pf}\Apache Software Foundation\CouchDB
DefaultGroupName=%package_name%
OutputBaseFilename=setup-couchdb-%version%
OutputDir=.

[Files]
Source: "%locallibbindir%\..\*.*"; DestDir: "{app}"; Flags: ignoreversion uninsrestartdelete restartreplace
; bin dir
Source: "%locallibbindir%\*.*"; DestDir: "{app}\bin"; Flags: ignoreversion uninsrestartdelete restartreplace recursesubdirs
; other dirs copied '*.*'
Source: "%locallibbindir%\..\erts-5.7.2\*.*"; DestDir: "{app}\erts-5.7.2"; Flags: ignoreversion uninsrestartdelete restartreplace recursesubdirs
Source: "%locallibbindir%\..\lib\*.*"; DestDir: "{app}\lib"; Flags: ignoreversion uninsrestartdelete restartreplace recursesubdirs
Source: "%locallibbindir%\..\share\*.*"; DestDir: "{app}\share"; Flags: ignoreversion uninsrestartdelete restartreplace recursesubdirs
Source: "%locallibbindir%\..\releases\*.*"; DestDir: "{app}\releases"; Flags: ignoreversion uninsrestartdelete restartreplace recursesubdirs
; skip ./usr, ./var

; custom stuff...
; ./etc/default.ini is unconditional
Source: "%locallibbindir%\..\etc\couchdb\default.ini"; DestDir: "{app}\etc\couchdb"; Flags: ignoreversion uninsrestartdelete restartreplace
; ./etc/local.ini is preserved and should not be updated if it exists
Source: "%locallibbindir%\..\etc\couchdb\local.ini"; DestDir: "{app}\etc\couchdb"; Flags: onlyifdoesntexist uninsneveruninstall
; readme
Source: "README.txt"; DestDir: "{app}"; Flags: isreadme

; msvc redists - see comments in configure.ac for notes about these...
; ( deleteafterinstall - not needed - {tmp} auto cleaned????
Source: "%msvc_redist_dir%\%msvc_redist_name%"; DestDir: "{tmp}"; Flags: deleteafterinstall

; These are erlang requirements and not copied by our makefiles.
Source: "%openssl_bin_dir%\ssleay32.dll"; DestDir: "{app}\bin"; Flags: ignoreversion uninsrestartdelete restartreplace
Source: "%openssl_bin_dir%\libeay32.dll"; DestDir: "{app}\bin"; Flags: ignoreversion uninsrestartdelete restartreplace

[Dirs]
Name: "{app}\var\lib\couchdb"; Permissions: authusers-modify
Name: "{app}\var\log\couchdb"; Permissions: authusers-modify
Name: "{app}\etc\couchdb"; Permissions: authusers-modify

[Icons]
Name: "{group}\Start CouchDB"; Filename: "{app}\bin\couchdb.bat"
Name: "{group}\Futon (CouchDB web interface)"; Filename: "http://127.0.0.1:5984/_utils"
Name: "{group}\CouchDB Web Site"; Filename: "http://couchdb.apache.org/"

[Run]
Filename: "{tmp}\%msvc_redist_name%"; Parameters: "/q"
; This is erlang's Install.exe which updates erl.ini correctly.
Filename: "{app}\Install.exe"; Parameters: "-s"; Flags: runhidden
21 changes: 18 additions & 3 deletions src/couchdb/Makefile.am
Expand Up @@ -40,9 +40,6 @@ couchjs_LDADD = $(CURL_LDFLAGS) @JSLIB@

if WINDOWS
couch_erl_driver_la_LDFLAGS += -no-undefined
# copy ICU dlls for the erlang driver
#dist_couch_erl_driver_la_DATA=$(ICU_LOCAL_BIN)/icuuc42.dll $(ICU_LOCAL_BIN)/icudt42.dll $(ICU_LOCAL_BIN)/icuin42.dll
couch_erl_driver_ladir=$(bindir)
endif

couchinclude_DATA = couch_db.hrl
Expand Down Expand Up @@ -196,8 +193,19 @@ compiled_files = \
# couch_util.html \
# couch_view.html

if WINDOWS
couch.app: couch.app.tpl
modules=`find . -name "couch*.erl" -exec basename {} .erl \; | tr '\n' ',' | sed "s/,$$//"`; \
sed -e "s|%package_name%|@package_name@|g" \
-e "s|%version%|@version@|g" \
-e "s|@modules@|$$modules|g" \
-e "s|%localconfdir%|../etc/couchdb|g" \
-e "s|@defaultini@|default.ini|g" \
-e "s|@localini@|local.ini|g" > \
$@ < $<
else
couch.app: couch.app.tpl
modules=`find . -name "*.erl" -exec basename {} .erl \; | tr '\n' ',' | sed "s/,$$//"`; \
sed -e "s|%package_name%|@package_name@|g" \
-e "s|%version%|@version@|g" \
-e "s|@modules@|$$modules|g" \
Expand All @@ -206,6 +214,7 @@ couch.app: couch.app.tpl
-e "s|@localini@|local.ini|g" > \
$@ < $<
chmod +x $@
endif

# $(dist_devdoc_DATA): edoc-info

Expand All @@ -220,6 +229,12 @@ install-data-hook:
cd "$(DESTDIR)$(couchprivlibdir)" && \
$(LN_S) couch_erl_driver couch_erl_driver.so; \
fi
if WINDOWS
$(INSTALL) $(ICU_LOCAL_BIN)/icuuc42.dll $(bindir)
$(INSTALL) $(ICU_LOCAL_BIN)/icudt42.dll $(bindir)
$(INSTALL) $(ICU_LOCAL_BIN)/icuin42.dll $(bindir)
$(INSTALL) $(JS_LIB_BINARY) $(bindir)
endif

uninstall-local:
if test -f "$(DESTDIR)$(couchprivlibdir)/couch_erl_driver"; then \
Expand Down

0 comments on commit ad18ea6

Please sign in to comment.