diff --git a/README.md b/README.md index 3b7835ed..be86e0f4 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,8 @@ for debugging. You can also provide a path to a folder containing a novelWriter project as the last parameter. +For more install options, see [Build and Install novelWriter](setup/BUILD.md). + ### Launcher and Icons diff --git a/make.py b/make.py index 7a0923b9..15ed18ae 100755 --- a/make.py +++ b/make.py @@ -28,28 +28,29 @@ OS_DARWIN = 3 # Package Installer # =============================================================================================== # -def installPackages(): +def installPackages(hostOS): + """Install package dependencies both for this script and for running + novelWriter itself. + """ print("") print("Installing Dependencies") print("#######################") print("") - try: - subprocess.call([ - sys.executable, "-m", - "pip", "install", "--user", "--upgrade", "pip" - ]) - subprocess.call([ - sys.executable, "-m", - "pip", "install", "--user", "--upgrade", "pyinstaller" - ]) - subprocess.call([ - sys.executable, "-m", - "pip", "install", "--user", "--upgrade", "-r", "requirements.txt" - ]) - except Exception as e: - print("Failed with error:") - print(str(e)) - sys.exit(1) + + installQueue = ["pip", "pyinstaller", "-r requirements.txt"] + if hostOS == OS_DARWIN: + installQueue.append("pyobjc") + + pyCmd = [sys.executable, "-m"] + pipCmd = ["pip", "install", "--user", "--upgrade"] + for stepCmd in installQueue: + pkgCmd = stepCmd.split(" ") + try: + subprocess.call(pyCmd + pipCmd + pkgCmd) + except Exception as e: + print("Failed with error:") + print(str(e)) + sys.exit(1) return @@ -73,6 +74,7 @@ def freezePackage(buildWindowed, oneFile, makeSetup, hostOS): else: dotDot = ":" + sys.modules["FixTk"] = None instOpt = [ "--name=novelWriter", "--clean", @@ -92,6 +94,12 @@ def freezePackage(buildWindowed, oneFile, makeSetup, hostOS): "--exclude-module=PyQt5.QtSensors", "--exclude-module=PyQt5.QtSerialPort", "--exclude-module=PyQt5.QtSql", + "--exclude-module=FixTk", + "--exclude-module=tcl", + "--exclude-module=tk", + "--exclude-module=_tkinter", + "--exclude-module=tkinter", + "--exclude-module=Tkinter", ] if buildWindowed: @@ -263,8 +271,9 @@ if __name__ == "__main__": "This tool provides build commands for distibuting novelWriter as a\n" "package. The available options are as follows:\n" "\n" + "help Print the help message.\n" "freeze Freeze the package and produces a folder of all\n" - " dependecies using pyinstaller.\n" + " dependencies using pyinstaller.\n" "onefile Build a standalone executable with all dependencies\n" " bundled. Implies 'freeze', cannot be used with 'setup'.\n" "pip Run pip to install all package dependencies for\n" @@ -290,11 +299,10 @@ if __name__ == "__main__": if "clean" in sys.argv: sys.argv.remove("clean") cleanInstall() - sys.exit(0) if "pip" in sys.argv: sys.argv.remove("pip") - installPackages() + installPackages(hostOS) if "freeze" in sys.argv: sys.argv.remove("freeze") diff --git a/setup/BUILD.md b/setup/BUILD.md new file mode 100644 index 00000000..d97e702a --- /dev/null +++ b/setup/BUILD.md @@ -0,0 +1,44 @@ +# Build and Install novelWriter + +The root folder of the repository contains two scripts for setup and install: + +## Script `setup.py` + +The `setup.py` is a standard Python setup script with a couple of additional options: + +* `qthelp`: Will attempt to build a single file QtAssistand documentation file. + This requires the Qt tools to be installed on the local system, as well as the sphinx build tools + for the documentation. +* `sample`: Will create a `sample.zip` file in the `nw/assets` folder. + This is the file the New Project Wizard uses to generate an example project. + If novelWriter is run from source, this file is not needed. + +To install novelWriter as a local Python package, run: +```bash +sudo python setup.py install +``` + +## Script `make.py` + +The `make.py` script provides a number of convenient options for building packages if novelWriter. + +Usage: +```bash +python make.py [command] +``` + +It currently accept the following commands: + +* `help`: Print the help message. +* `freeze`: Freeze the package and produces a folder of all dependencies using pyinstaller. +* `onefile`: Build a standalone executable with all dependencies bundled. + Implies `freeze`, cannot be used with `setup`. +* `pip`: Run pip to install all package dependencies for novelWriter and this build tool. +* `setup`: Build a setup.exe installer for Windows. + This option automaticall disables the `onefile` option. +* `clean`: This will attempt to delete the `build` and `dist` folders in the current folder. + +For instance, to create a Windows installer, run: +```bash +python make.py freeze setup +```