Initial work on supporting haiku

This commit is contained in:
Kovid Goyal 2017-02-01 13:22:09 +05:30
commit 511bb93d4a
9 changed files with 125 additions and 27 deletions

75
icons/calibre_haiku.rdef Normal file
View File

@ -0,0 +1,75 @@
resource(<your resource id here>) #'VICN' array {
$"6E6369660C035B757B050003C6490502001600000000B4240934240900000046"
$"CC714B5C4D020116003B0BE5A9E62321324B327F604901F6477F20020116003A"
$"B4ABA97CE720E14E323BF7C8526C4B420E020116002E6276BBD25A3A0E232C90"
$"974901F64A6F530379ABFF030C11BA03D6B8650201160040525ABAB75A32B50C"
$"385062D1580E4C470B020116003D7EB5B802CC30304635CDBF4A1F424403D320"
$"0A04BA20B65ABF0BB65ABF0BCA6ABA20CA6A0A04BA20B65ABF0BB65ABF0BCA6A"
$"BA20CA6A0A04B477B444BA02B444BA02CA6AB477CA6A0A04B477B444BA02B444"
$"BA02CA6AB477CA6A0A04B471B59FBA07B59FBA07B682B471B6820A04B471B59F"
$"BA07B59FBA07B682B471B6820A04B470C7FAB9F7C7FAB9F7C8DEB470C8DE0A04"
$"B470C7FAB9F7C7FAB9F7C8DEB470C8DE0A04BA1BB852BF10B852BF10B8D2BA1B"
$"B8D20A04BA1BB852BF10B852BF10B8D2BA1BB8D20A04BA20C80CBF0CC80CBF0C"
$"C88CBA20C88C0A04BA20C80CBF0CC80CBF0CC88CBA20C88C0205B2D7B268B2D8"
$"B290B2D6B251B30FB241B2ECB242B327B241B361B255B345B248B382B265B395"
$"B28FB395B279B396B2A6B360B2B7B381B2B6B31EB2B80205B2D7B268B2D8B290"
$"B2D6B251B30FB241B2ECB242B327B241B361B255B345B248B382B265B395B28F"
$"B395B279B396B2A6B360B2B7B381B2B6B31EB2B80211B3D9B22EB3D9B22EB3D9"
$"B22EB3DFB238B3DFB238B3F5B25FB3F9B26CB3F8B265B3F9B273B3E9B277B3F3"
$"B277B3DFB277B393B266B3DFB277B33BB253B337B253B33BB253B333B253B331"
$"B25AB331B256B331B26421B2B4B345B28521B2B4B376B2B4B376B2B4B362B292"
$"B361B28BB362B290B361B286B36BB284B365B284B373B284B39CB28DB37BB285"
$"B400B2A5B40FB2A5B400B2A5B41DB2A5B426B297B426B29FB426B28DB40AB260"
$"B41EB27EB402B255B3F4B240B3FBB24AB3F1B23BB3E9B230B3EEB237B3E9B230"
$"0211B3D9B22EB3D9B22EB3D9B22EB3DFB238B3DFB238B3F5B25FB3F9B26CB3F8"
$"B265B3F9B273B3E9B277B3F3B277B3DFB277B393B266B3DFB277B33BB253B337"
$"B253B33BB253B333B253B331B25AB331B256B331B26421B2B4B345B28521B2B4"
$"B376B2B4B376B2B4B362B292B361B28BB362B290B361B286B36BB284B365B284"
$"B373B284B39CB28DB37BB285B400B2A5B40FB2A5B400B2A5B41DB2A5B426B297"
$"B426B29FB426B28DB40AB260B41EB27EB402B255B3F4B240B3FBB24AB3F1B23B"
$"B3E9B230B3EEB237B3E9B2300206B2C0B2BBB2C0B2BBB2E4B2EBB2EC1FB2ECB2"
$"F7B2ECB307B2D3B30CB2E4B30CB2C0B30DB291B303B2ABB30AB257B2F5B239B2"
$"C1B239B2DFB238B2B6B247B2A3B23CB2AFB247B2A30206B2C0B2BBB2C0B2BBB2"
$"E4B2EBB2EC1FB2ECB2F7B2ECB307B2D3B30CB2E4B30CB2C0B30DB291B303B2AB"
$"B30AB257B2F5B239B2C1B239B2DFB238B2B6B247B2A3B23CB2AFB247B2A30205"
$"B2D7B268B2D8B290B2D6B251B30FB241B2ECB242B327B241B361B255B345B248"
$"B382B265B395B28FB395B279B396B2A6B360B2B7B381B2B6B31EB2B80205B2D7"
$"B268B2D8B290B2D6B251B30FB241B2ECB242B327B241B361B255B345B248B382"
$"B265B395B28FB395B279B396B2A6B360B2B7B381B2B6B31EB2B80209B2BAB2B0"
$"B2B0B2ADB2C9B2C4B2D1B2CEB2D1B2CEB2DEB2E1B2E6B2F7B2E6B2F0B2E6B301"
$"B2CAB307B2DCB306B2ACB307B265B2F2B28620B245B2E5B238B2C5B239B2D8B2"
$"38B2BAB23EB294B23AB2A7B268B29EB27AB2A2B278B2A2B289B2A6B2A6B2ABB2"
$"97B2A8B2A9B2AC0209B2BAB2B0B2B0B2ADB2C9B2C4B2D1B2CEB2D1B2CEB2DEB2"
$"E1B2E6B2F7B2E6B2F0B2E6B301B2CAB307B2DCB306B2ACB307B265B2F2B28620"
$"B245B2E5B238B2C5B239B2D8B238B2BAB23EB294B23AB2A7B268B29EB27AB2A2"
$"B278B2A2B289B2A6B2A6B2ABB297B2A8B2A9B2AC0A04C31FBBFAC888BB01CB68"
$"C97FC5FFCA780A04C31FBBFAC888BB01CB68C97FC5FFCA780A05C689C2C5C6FF"
$"C1C5C7C2C28FC687BB62C54EBB980A05C689C2C5C6FFC1C5C7C2C28FC687BB62"
$"C54EBB980209C1C9B3D0C1EEB3D2C1C3B3CFC1B8B3D045B3CFC1B8B3D0BF15B4"
$"27BF15B427BEE9B42CBECFB480BECAB454BECFB480C195CA24C195CA24C19BCA"
$"50C1EFCA6AC1C3CA6FC1EFCA6AC493CA13C493CA13C4BFCA0DC4D8C9B9C4DEC9"
$"E5C4D8C9B9C212B415C212B415C20DB3EF0209C1C9B3D0C1EEB3D2C1C3B3CFC1"
$"B8B3D045B3CFC1B8B3D0BF15B427BF15B427BEE9B42CBECFB480BECAB454BECF"
$"B480C195CA24C195CA24C19BCA50C1EFCA6AC1C3CA6FC1EFCA6AC493CA13C493"
$"CA13C4BFCA0DC4D8C9B9C4DEC9E5C4D8C9B9C212B415C212B415C20DB3EF0209"
$"C1C9B3D0C1EEB3D2C1C3B3CFC1B8B3D045B3CFC1B8B3D0BF15B427BF15B427BE"
$"E9B42CBECFB480BECAB454BECFB480C195CA24C195CA24C19BCA50C1EFCA6AC1"
$"C3CA6FC1EFCA6AC493CA13C493CA13C4BFCA0DC4D8C9B9C4DEC9E5C4D8C9B9C2"
$"12B415C212B415C20DB3EF0209C1C9B3D0C1EEB3D2C1C3B3CFC1B8B3D045B3CF"
$"C1B8B3D0BF15B427BF15B427BEE9B42CBECFB480BECAB454BECFB480C195CA24"
$"C195CA24C19BCA50C1EFCA6AC1C3CA6FC1EFCA6AC493CA13C493CA13C4BFCA0D"
$"C4D8C9B9C4DEC9E5C4D8C9B9C212B415C212B415C20DB3EF0209C1C9B3D0C1EE"
$"B3D2C1C3B3CFC1B8B3D045B3CFC1B8B3D0BF15B427BF15B427BEE9B42CBECFB4"
$"80BECAB454BECFB480C195CA24C195CA24C19BCA50C1EFCA6AC1C3CA6FC1EFCA"
$"6AC493CA13C493CA13C4BFCA0DC4D8C9B9C4DEC9E5C4D8C9B9C212B415C212B4"
$"15C20DB3EF0209C1C9B3D0C1EEB3D2C1C3B3CFC1B8B3D045B3CFC1B8B3D0BF15"
$"B427BF15B427BEE9B42CBECFB480BECAB454BECFB480C195CA24C195CA24C19B"
$"CA50C1EFCA6AC1C3CA6FC1EFCA6AC493CA13C493CA13C4BFCA0DC4D8C9B9C4DE"
$"C9E5C4D8C9B9C212B415C212B415C20DB3EF160A000100000A01010110011780"
$"00040A020102000A0101031001178000040A010104000A010105100117800004"
$"0A010106000A0101071001178000040A050108000A0101091001178000040A05"
$"010A000A01010B1001178000040A070116000A0101171001178000040A080118"
$"000A0101191001178000040A09011A000A02011B1001178000040A03011C000A"
$"01011D1001178000040A09011E000A01011F100117800004"
};

View File

@ -15,7 +15,8 @@ isfreebsd = 'freebsd' in sys.platform
isnetbsd = 'netbsd' in sys.platform isnetbsd = 'netbsd' in sys.platform
isdragonflybsd = 'dragonfly' in sys.platform isdragonflybsd = 'dragonfly' in sys.platform
isbsd = isnetbsd or isfreebsd or isdragonflybsd isbsd = isnetbsd or isfreebsd or isdragonflybsd
islinux = not isosx and not iswindows and not isbsd ishaiku = 'haiku1' in sys.platform
islinux = not isosx and not iswindows and not isbsd and not ishaiku
sys.setup_dir = os.path.dirname(os.path.abspath(__file__)) sys.setup_dir = os.path.dirname(os.path.abspath(__file__))
SRC = os.path.abspath(os.path.join(os.path.dirname(sys.setup_dir), 'src')) SRC = os.path.abspath(os.path.join(os.path.dirname(sys.setup_dir), 'src'))
sys.path.insert(0, SRC) sys.path.insert(0, SRC)

View File

@ -9,8 +9,8 @@ __docformat__ = 'restructuredtext en'
import textwrap, os, shlex, subprocess, glob, shutil, re, sys, json import textwrap, os, shlex, subprocess, glob, shutil, re, sys, json
from collections import namedtuple from collections import namedtuple
from setup import Command, islinux, isbsd, isosx, SRC, iswindows, __version__ from setup import Command, islinux, isbsd, isosx, ishaiku, SRC, iswindows, __version__
isunix = islinux or isosx or isbsd isunix = islinux or isosx or isbsd or ishaiku
py_lib = os.path.join(sys.prefix, 'libs', 'python%d%d.lib' % sys.version_info[:2]) py_lib = os.path.join(sys.prefix, 'libs', 'python%d%d.lib' % sys.version_info[:2])
@ -81,7 +81,7 @@ def is_ext_allowed(ext):
only = ext.get('only', '') only = ext.get('only', '')
if only: if only:
only = only.split() only = only.split()
q = 'windows' if iswindows else 'osx' if isosx else 'bsd' if isbsd else 'linux' q = 'windows' if iswindows else 'osx' if isosx else 'bsd' if isbsd else 'haiku' if ishaiku else 'linux'
return q in only return q in only
return True return True
@ -100,6 +100,8 @@ def parse_extension(ext):
ans = ext.pop('osx_' + k, ans) ans = ext.pop('osx_' + k, ans)
elif isbsd: elif isbsd:
ans = ext.pop('bsd_' + k, ans) ans = ext.pop('bsd_' + k, ans)
elif ishaiku:
ans = ext.pop('haiku_' + k, ans)
else: else:
ans = ext.pop('linux_' + k, ans) ans = ext.pop('linux_' + k, ans)
return ans return ans
@ -156,6 +158,12 @@ def init_env():
cflags.append('-I'+sysconfig.get_python_inc()) cflags.append('-I'+sysconfig.get_python_inc())
ldflags.append('-lpython'+sysconfig.get_python_version()) ldflags.append('-lpython'+sysconfig.get_python_version())
if ishaiku:
cflags.append('-lpthread')
ldflags.append('-shared')
cflags.append('-I'+sysconfig.get_python_inc())
ldflags.append('-lpython'+sysconfig.get_python_version())
if isosx: if isosx:
cflags.append('-D_OSX') cflags.append('-D_OSX')
ldflags.extend('-bundle -undefined dynamic_lookup'.split()) ldflags.extend('-bundle -undefined dynamic_lookup'.split())
@ -329,7 +337,7 @@ class Build(Command):
def build_headless(self): def build_headless(self):
from setup.parallel_build import cpu_count from setup.parallel_build import cpu_count
if iswindows or isosx: if iswindows or isosx or ishaiku:
return # Dont have headless operation on these platforms return # Dont have headless operation on these platforms
from setup.build_environment import glib_flags, fontconfig_flags, ft_inc_dirs, QMAKE from setup.build_environment import glib_flags, fontconfig_flags, ft_inc_dirs, QMAKE
from PyQt5.QtCore import QT_VERSION from PyQt5.QtCore import QT_VERSION

View File

@ -9,7 +9,7 @@ __docformat__ = 'restructuredtext en'
import os, subprocess, re, sys, sysconfig import os, subprocess, re, sys, sysconfig
from distutils.spawn import find_executable from distutils.spawn import find_executable
from setup import isosx, iswindows, is64bit, islinux from setup import isosx, iswindows, is64bit, islinux, ishaiku
is64bit is64bit
NMAKE = RC = msvc = MT = win_inc = win_lib = None NMAKE = RC = msvc = MT = win_inc = win_lib = None
@ -37,7 +37,7 @@ QMAKE = os.environ.get('QMAKE', QMAKE)
PKGCONFIG = find_executable('pkg-config') PKGCONFIG = find_executable('pkg-config')
PKGCONFIG = os.environ.get('PKG_CONFIG', PKGCONFIG) PKGCONFIG = os.environ.get('PKG_CONFIG', PKGCONFIG)
if islinux and not PKGCONFIG: if (islinux or ishaiku) and not PKGCONFIG:
raise SystemExit('Failed to find pkg-config on your system. You can use the environment variable PKG_CONFIG to point to the pkg-config executable') raise SystemExit('Failed to find pkg-config on your system. You can use the environment variable PKG_CONFIG to point to the pkg-config executable')
def run_pkgconfig(name, envvar, default, flag, prefix): def run_pkgconfig(name, envvar, default, flag, prefix):
@ -97,8 +97,8 @@ def get_sip_dir():
pyqt['pyqt_sip_dir'] = get_sip_dir() pyqt['pyqt_sip_dir'] = get_sip_dir()
pyqt['sip_inc_dir'] = os.environ.get('SIP_INC_DIR', sysconfig.get_path('include')) pyqt['sip_inc_dir'] = os.environ.get('SIP_INC_DIR', sysconfig.get_path('include'))
glib_flags = subprocess.check_output([PKGCONFIG, '--libs', 'glib-2.0']).strip() if islinux else '' glib_flags = subprocess.check_output([PKGCONFIG, '--libs', 'glib-2.0']).strip() if islinux or ishaiku else ''
fontconfig_flags = subprocess.check_output([PKGCONFIG, '--libs', 'fontconfig']).strip() if islinux else '' fontconfig_flags = subprocess.check_output([PKGCONFIG, '--libs', 'fontconfig']).strip() if islinux or ishaiku else ''
qt_inc = pyqt['inc'] qt_inc = pyqt['inc']
qt_lib = pyqt['lib'] qt_lib = pyqt['lib']
ft_lib_dirs = [] ft_lib_dirs = []
@ -121,7 +121,7 @@ QT_DLLS = ['Qt5' + x for x in (
'WebKit', 'WebKitWidgets', 'Widgets', 'Multimedia', 'MultimediaWidgets', 'Xml', # 'XmlPatterns', 'WebKit', 'WebKitWidgets', 'Widgets', 'Multimedia', 'MultimediaWidgets', 'Xml', # 'XmlPatterns',
)] )]
QT_PLUGINS = ('imageformats', 'audio', 'iconengines', 'mediaservice', 'platforms', 'playlistformats', 'printsupport', 'sqldrivers') QT_PLUGINS = ('imageformats', 'audio', 'iconengines', 'mediaservice', 'platforms', 'playlistformats', 'printsupport', 'sqldrivers')
if islinux: if islinux or ishaiku:
# platformthemes cause crashes in Ubuntu # platformthemes cause crashes in Ubuntu
QT_PLUGINS += ('platforminputcontexts', 'generic',) QT_PLUGINS += ('platforminputcontexts', 'generic',)

View File

@ -201,13 +201,13 @@
}, },
{ {
"name": "libusb", "name": "libusb",
"only": "osx linux", "only": "osx linux haiku",
"sources": "calibre/devices/libusb/libusb.c", "sources": "calibre/devices/libusb/libusb.c",
"libraries": "usb-1.0" "libraries": "usb-1.0"
}, },
{ {
"name": "libmtp", "name": "libmtp",
"only": "osx linux", "only": "osx linux haiku",
"sources": "calibre/devices/mtp/unix/devices.c calibre/devices/mtp/unix/libmtp.c", "sources": "calibre/devices/mtp/unix/devices.c calibre/devices/mtp/unix/libmtp.c",
"headers": "calibre/devices/mtp/unix/devices.h calibre/devices/mtp/unix/upstream/music-players.h calibre/devices/mtp/unix/upstream/device-flags.h", "headers": "calibre/devices/mtp/unix/devices.h calibre/devices/mtp/unix/upstream/music-players.h calibre/devices/mtp/unix/upstream/device-flags.h",
"libraries": "mtp" "libraries": "mtp"
@ -218,6 +218,8 @@
"inc_dirs": "unrar", "inc_dirs": "unrar",
"defines": "SILENT RARDLL UNRAR _FILE_OFFSET_BITS=64 _LARGEFILE_SOURCE", "defines": "SILENT RARDLL UNRAR _FILE_OFFSET_BITS=64 _LARGEFILE_SOURCE",
"windows_defines": "SILENT RARDLL UNRAR", "windows_defines": "SILENT RARDLL UNRAR",
"haiku_defines": "LITTLE_ENDIAN SILENT RARDLL UNRAR _FILE_OFFSET_BITS=64 _LARGEFILE_SOURCE _BSD_SOURCE",
"haiku_libraries": "bsd",
"optimize_level": 2, "optimize_level": 2,
"windows_libraries": "User32 Advapi32 kernel32 Shell32" "windows_libraries": "User32 Advapi32 kernel32 Shell32"
} }

View File

@ -8,7 +8,7 @@ __docformat__ = 'restructuredtext en'
import sys, os, textwrap, subprocess, shutil, tempfile, atexit, glob import sys, os, textwrap, subprocess, shutil, tempfile, atexit, glob
from setup import (Command, islinux, isbsd, basenames, modules, functions, from setup import (Command, islinux, isbsd, ishaiku, basenames, modules, functions,
__appname__, __version__) __appname__, __version__)
HEADER = '''\ HEADER = '''\
@ -115,7 +115,7 @@ class Develop(Command):
self.info('\tSHARE:', self.staging_sharedir) self.info('\tSHARE:', self.staging_sharedir)
def pre_sub_commands(self, opts): def pre_sub_commands(self, opts):
if not (islinux or isbsd): if not (islinux or isbsd or ishaiku):
self.info('\nSetting up a source based development environment is only ' self.info('\nSetting up a source based development environment is only '
'supported on linux. On other platforms, see the User Manual' 'supported on linux. On other platforms, see the User Manual'
' for help with setting up a development environment.') ' for help with setting up a development environment.')

View File

@ -22,9 +22,10 @@ isfreebsd = 'freebsd' in _plat
isnetbsd = 'netbsd' in _plat isnetbsd = 'netbsd' in _plat
isdragonflybsd = 'dragonfly' in _plat isdragonflybsd = 'dragonfly' in _plat
isbsd = isfreebsd or isnetbsd or isdragonflybsd isbsd = isfreebsd or isnetbsd or isdragonflybsd
islinux = not(iswindows or isosx or isbsd) ishaiku = 'haiku1' in _plat
islinux = not(iswindows or isosx or isbsd or ishaiku)
isfrozen = hasattr(sys, 'frozen') isfrozen = hasattr(sys, 'frozen')
isunix = isosx or islinux isunix = isosx or islinux or ishaiku
isportable = os.environ.get('CALIBRE_PORTABLE_BUILD', None) is not None isportable = os.environ.get('CALIBRE_PORTABLE_BUILD', None) is not None
ispy3 = sys.version_info.major > 2 ispy3 = sys.version_info.major > 2
isxp = iswindows and sys.getwindowsversion().major < 6 isxp = iswindows and sys.getwindowsversion().major < 6

View File

@ -1,23 +1,30 @@
__license__ = 'GPL v3' __license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>' __copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
import sys, os, time, socket, traceback, re import os
import re
import socket
import sys
import time
import traceback
from functools import partial from functools import partial
import apsw import apsw
from PyQt5.Qt import ( from PyQt5.Qt import QCoreApplication, QIcon, QObject, QTimer
QCoreApplication, QIcon, QObject, QTimer)
from calibre import prints, plugins, force_unicode from calibre import force_unicode, plugins, prints
from calibre.constants import (iswindows, __appname__, isosx, DEBUG, islinux, from calibre.constants import (
filesystem_encoding, get_portable_base) DEBUG, __appname__, filesystem_encoding, get_portable_base, islinux, isosx,
from calibre.utils.ipc import gui_socket_address, RC iswindows
)
from calibre.gui2 import ( from calibre.gui2 import (
initialize_file_icon_provider, Application, choose_dir, Application, choose_dir, error_dialog, gprefs, initialize_file_icon_provider,
error_dialog, question_dialog, gprefs, setup_gui_option_parser) question_dialog, setup_gui_option_parser
)
from calibre.gui2.main_window import option_parser as _option_parser from calibre.gui2.main_window import option_parser as _option_parser
from calibre.gui2.splash_screen import SplashScreen from calibre.gui2.splash_screen import SplashScreen
from calibre.utils.config import prefs, dynamic from calibre.utils.config import dynamic, prefs
from calibre.utils.ipc import RC, gui_socket_address
if iswindows: if iswindows:
winutil = plugins['winutil'][0] winutil = plugins['winutil'][0]

View File

@ -6,7 +6,7 @@ __docformat__ = 'restructuredtext en'
Secure access to locked files from multiple processes. Secure access to locked files from multiple processes.
''' '''
from calibre.constants import iswindows, __appname__, islinux, win32api, win32event, winerror, fcntl from calibre.constants import iswindows, __appname__, islinux, ishaiku, win32api, win32event, winerror, fcntl
import time, atexit, os, stat, errno import time, atexit, os, stat, errno
@ -228,6 +228,10 @@ elif islinux:
fcntl.fcntl(fd, fcntl.F_SETFD, old_flags | fcntl.FD_CLOEXEC) fcntl.fcntl(fd, fcntl.F_SETFD, old_flags | fcntl.FD_CLOEXEC)
atexit.register(sock.close) atexit.register(sock.close)
return True return True
elif ishaiku:
def singleinstance(name):
# Somebody should fix this.
return True
else: else:
def singleinstance_path(name): def singleinstance_path(name):
home = os.path.expanduser('~') home = os.path.expanduser('~')