mirror of
https://github.com/ariya/phantomjs.git
synced 2024-10-05 16:57:15 +03:00
Use CMake build system (#15397)
This commit is contained in:
parent
10a3d932ab
commit
e4a26a2cfe
15
.gitignore
vendored
15
.gitignore
vendored
@ -60,3 +60,18 @@ bin/
|
||||
*.class
|
||||
build/
|
||||
.gradle/
|
||||
|
||||
# CMake
|
||||
CMakeLists.txt.user
|
||||
CMakeCache.txt
|
||||
CMakeFiles
|
||||
CMakeScripts
|
||||
Testing
|
||||
Makefile
|
||||
cmake_install.cmake
|
||||
install_manifest.txt
|
||||
compile_commands.json
|
||||
CTestTestfile.cmake
|
||||
_deps
|
||||
*_autogen
|
||||
|
||||
|
34
CMakeLists.txt
Normal file
34
CMakeLists.txt
Normal file
@ -0,0 +1,34 @@
|
||||
cmake_minimum_required(VERSION 3.5.0)
|
||||
project(phantomjs)
|
||||
|
||||
set (CMAKE_CXX_STANDARD 11)
|
||||
|
||||
find_package(Qt5 COMPONENTS Core Network WebKitWidgets REQUIRED)
|
||||
find_package(Threads REQUIRED)
|
||||
|
||||
message("Using Qt version ${Qt5Core_VERSION}")
|
||||
if (Qt5Core_VERSION VERSION_LESS 5.5.0)
|
||||
message(FATAL_ERROR "This version of Qt is not supported. Please use Qt 5.5 or later")
|
||||
endif()
|
||||
|
||||
set(CMAKE_AUTOMOC ON)
|
||||
set(CMAKE_AUTORCC ON)
|
||||
|
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
||||
|
||||
file(GLOB_RECURSE PHANTOMJS_SOURCES src/*.cpp)
|
||||
include_directories(src)
|
||||
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||
|
||||
set(THIRDPARTY_SOURCES src/mongoose/mongoose.c src/qcommandline/qcommandline.cpp src/linenoise/src/linenoise.c)
|
||||
include_directories(src/linenoise/src)
|
||||
include_directories(src/mongoose)
|
||||
include_directories(src/qcommandline)
|
||||
|
||||
set(EXTRA_LIBS dl)
|
||||
|
||||
add_executable(${PROJECT_NAME} src/phantomjs.qrc src/ghostdriver/ghostdriver.qrc ${PHANTOMJS_SOURCES} ${THIRDPARTY_SOURCES})
|
||||
target_link_libraries(${PROJECT_NAME} ${EXTRA_LIBS} Qt5::Core Qt5::Network Qt5::WebKitWidgets Threads::Threads)
|
||||
install(TARGETS ${PROJECT_NAME} DESTINATION bin)
|
||||
|
||||
add_custom_target(check COMMAND python test/run-tests.py -v)
|
46
INSTALL
Normal file
46
INSTALL
Normal file
@ -0,0 +1,46 @@
|
||||
Installation Instructions
|
||||
*************************
|
||||
|
||||
System requirements:
|
||||
|
||||
* C++ toolchain such as g++ 7 or later
|
||||
* CMake version 3.5 or later
|
||||
* Qt 5 toolkit
|
||||
* Python 2.7 (to run the tests)
|
||||
|
||||
|
||||
Installation on Linux
|
||||
---------------------
|
||||
|
||||
On Debian/Ubuntu, the requirements can be fulfilled by installing these packages:
|
||||
|
||||
sudo apt install g++ cmake qt5-default libqt5webkit5-dev python
|
||||
|
||||
After unpacking the source tarball or cloning the repository:
|
||||
|
||||
./configure && make
|
||||
|
||||
Do a quick sanity check:
|
||||
|
||||
./bin/phantomjs --version
|
||||
|
||||
Run the test suite:
|
||||
|
||||
make check
|
||||
|
||||
Install it (may require sudo):
|
||||
|
||||
make install
|
||||
|
||||
|
||||
Installation on Windows
|
||||
-----------------------
|
||||
|
||||
To be written.
|
||||
|
||||
|
||||
Installation on macOS
|
||||
---------------------
|
||||
|
||||
To be written.
|
||||
|
492
build.py
492
build.py
@ -1,492 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
#
|
||||
# This file is part of the PhantomJS project from Ofi Labs.
|
||||
#
|
||||
# Copyright (C) 2014 Milian Wolff, KDAB <milian.wolff@kdab.com>
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of the <organization> nor the
|
||||
# names of its contributors may be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
|
||||
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import argparse
|
||||
import os
|
||||
import platform
|
||||
import sys
|
||||
import subprocess
|
||||
import re
|
||||
import multiprocessing
|
||||
|
||||
root = os.path.abspath(os.path.dirname(__file__))
|
||||
third_party_names = ["libicu", "libxml", "openssl", "zlib"]
|
||||
third_party_path = os.path.join(root, "src", "qt", "3rdparty")
|
||||
|
||||
openssl_search_paths = [{
|
||||
"name": "Brew",
|
||||
"header": "/usr/local/opt/openssl/include/openssl/opensslv.h",
|
||||
"flags": [
|
||||
"-I/usr/local/opt/openssl/include",
|
||||
"-L/usr/local/opt/openssl/lib"
|
||||
]
|
||||
}, {
|
||||
"name": "MacPorts",
|
||||
"header": "/opt/local/include/openssl/opensslv.h",
|
||||
"flags": [
|
||||
"-I/opt/local/include",
|
||||
"-L/opt/local/lib"
|
||||
]
|
||||
}]
|
||||
|
||||
# check if path points to an executable
|
||||
# source: http://stackoverflow.com/a/377028
|
||||
def isExe(fpath):
|
||||
return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
|
||||
|
||||
# find path to executable in PATH environment variable, similar to UNIX which command
|
||||
# source: http://stackoverflow.com/a/377028
|
||||
def which(program):
|
||||
if isExe(program):
|
||||
return program
|
||||
else:
|
||||
for path in os.environ["PATH"].split(os.pathsep):
|
||||
path = path.strip("")
|
||||
exe_file = os.path.join(path, program)
|
||||
if isExe(exe_file):
|
||||
return exe_file
|
||||
return None
|
||||
|
||||
# returns the path to the QMake executable which gets built in our internal QtBase fork
|
||||
def qmakePath():
|
||||
exe = "qmake"
|
||||
if platform.system() == "Windows":
|
||||
exe += ".exe"
|
||||
return os.path.abspath("src/qt/qtbase/bin/" + exe)
|
||||
|
||||
# returns paths for 3rd party libraries (Windows only)
|
||||
def findThirdPartyDeps():
|
||||
include_dirs = []
|
||||
lib_dirs = []
|
||||
for dep in third_party_names:
|
||||
include_dirs.append("-I")
|
||||
include_dirs.append(os.path.join(third_party_path, dep, "include"))
|
||||
lib_dirs.append("-L")
|
||||
lib_dirs.append(os.path.join(third_party_path, dep, "lib"))
|
||||
return (include_dirs, lib_dirs)
|
||||
|
||||
class PhantomJSBuilder(object):
|
||||
options = {}
|
||||
makeCommand = []
|
||||
|
||||
def __init__(self, options):
|
||||
self.options = options
|
||||
|
||||
# setup make command or equivalent with arguments
|
||||
if platform.system() == "Windows":
|
||||
makeExe = which("jom.exe")
|
||||
if not makeExe:
|
||||
makeExe = "nmake"
|
||||
self.makeCommand = [makeExe, "/NOLOGO"]
|
||||
else:
|
||||
flags = []
|
||||
if self.options.jobs:
|
||||
# number of jobs explicitly given
|
||||
flags = ["-j", self.options.jobs]
|
||||
elif not re.match("-j\s*[0-9]+", os.getenv("MAKEFLAGS", "")):
|
||||
# if the MAKEFLAGS env var does not contain any "-j N", set a sane default
|
||||
flags = ["-j", multiprocessing.cpu_count()]
|
||||
self.makeCommand = ["make"]
|
||||
self.makeCommand.extend(flags)
|
||||
|
||||
# if there is no git subdirectory, automatically go into no-git
|
||||
# mode
|
||||
if not os.path.isdir(".git"):
|
||||
self.options.skip_git = True
|
||||
|
||||
# run the given command in the given working directory
|
||||
def execute(self, command, workingDirectory):
|
||||
# python 2 compatibility: manually convert to strings
|
||||
command = [str(c) for c in command]
|
||||
workingDirectory = os.path.abspath(workingDirectory)
|
||||
print("Executing in %s: %s" % (workingDirectory, " ".join(command)))
|
||||
if self.options.dry_run:
|
||||
return 0
|
||||
process = subprocess.Popen(command, stdout=sys.stdout, stderr=sys.stderr, cwd=workingDirectory)
|
||||
process.wait()
|
||||
return process.returncode
|
||||
|
||||
# run git clean in the specified path
|
||||
def gitClean(self, path):
|
||||
if self.options.skip_git: return 0
|
||||
return self.execute(["git", "clean", "-xfd"], path)
|
||||
|
||||
# run make, nmake or jom in the specified path
|
||||
def make(self, path):
|
||||
return self.execute(self.makeCommand, path)
|
||||
|
||||
# run qmake in the specified path
|
||||
def qmake(self, path, options):
|
||||
qmake = qmakePath()
|
||||
# verify that qmake was properly built
|
||||
if not isExe(qmake) and not self.options.dry_run:
|
||||
raise RuntimeError("Could not find QMake executable: %s" % qmake)
|
||||
command = [qmake]
|
||||
if self.options.qmake_args:
|
||||
command.extend(self.options.qmake_args)
|
||||
if options:
|
||||
command.extend(options)
|
||||
return self.execute(command, path)
|
||||
|
||||
# returns a list of platform specific Qt Base configure options
|
||||
def platformQtConfigureOptions(self):
|
||||
platformOptions = []
|
||||
if platform.system() == "Windows":
|
||||
platformOptions = [
|
||||
"-mp",
|
||||
"-static-runtime",
|
||||
"-no-cetest",
|
||||
"-no-angle",
|
||||
"-icu",
|
||||
"-openssl",
|
||||
"-openssl-linked",
|
||||
]
|
||||
deps = findThirdPartyDeps()
|
||||
platformOptions.extend(deps[0])
|
||||
platformOptions.extend(deps[1])
|
||||
else:
|
||||
# Unix platform options
|
||||
platformOptions = [
|
||||
# use the headless QPA platform
|
||||
"-qpa", "phantom",
|
||||
# explicitly compile with SSL support, so build will fail if headers are missing
|
||||
"-openssl", "-openssl-linked",
|
||||
# disable unnecessary Qt features
|
||||
"-no-openvg",
|
||||
"-no-eglfs",
|
||||
"-no-egl",
|
||||
"-no-glib",
|
||||
"-no-gtkstyle",
|
||||
"-no-cups",
|
||||
"-no-sm",
|
||||
"-no-xinerama",
|
||||
"-no-xkb",
|
||||
"-no-xcb",
|
||||
"-no-kms",
|
||||
"-no-linuxfb",
|
||||
"-no-directfb",
|
||||
"-no-mtdev",
|
||||
"-no-libudev",
|
||||
"-no-evdev",
|
||||
"-no-pulseaudio",
|
||||
"-no-alsa",
|
||||
"-no-feature-PRINTPREVIEWWIDGET"
|
||||
]
|
||||
|
||||
if self.options.silent:
|
||||
platformOptions.append("-silent")
|
||||
|
||||
if platform.system() == "Darwin":
|
||||
# Mac OS specific options
|
||||
# NOTE: fontconfig is not required on Darwin (we use Core Text for font enumeration)
|
||||
platformOptions.extend([
|
||||
"-no-pkg-config",
|
||||
"-no-c++11", # Build fails on mac right now with C++11 TODO: is this still valid?
|
||||
])
|
||||
# Dirty hack to find OpenSSL libs
|
||||
openssl = os.getenv("OPENSSL", "")
|
||||
if openssl == "":
|
||||
# search for OpenSSL
|
||||
openssl_found = False
|
||||
for search_path in openssl_search_paths:
|
||||
if os.path.exists(search_path["header"]):
|
||||
openssl_found = True
|
||||
platformOptions.extend(search_path["flags"])
|
||||
print("Found OpenSSL installed via %s" % search_path["name"])
|
||||
|
||||
if not openssl_found:
|
||||
raise RuntimeError("Could not find OpenSSL")
|
||||
else:
|
||||
if os.path.exists(openssl + "/include/openssl/opensslv.h"):
|
||||
openssl_found = True
|
||||
openssl_include = "-I" + openssl + "/include"
|
||||
openssl_lib = "-L" + openssl + "/lib"
|
||||
platformOptions.extend([openssl_include, openssl_lib])
|
||||
print("Using OpenSSL at %s" % openssl)
|
||||
|
||||
if not openssl_found:
|
||||
raise RuntimeError("No OpenSSL specified: OPENSSL environment variable not found")
|
||||
else:
|
||||
# options specific to other Unixes, like Linux, BSD, ...
|
||||
platformOptions.extend([
|
||||
"-fontconfig", # Fontconfig for better font matching
|
||||
"-icu", # ICU for QtWebKit (which provides the OSX headers) but not QtBase
|
||||
])
|
||||
return platformOptions
|
||||
|
||||
# configure Qt Base
|
||||
def configureQtBase(self):
|
||||
print("configuring Qt Base, please wait...")
|
||||
|
||||
configureExe = os.path.abspath("src/qt/qtbase/configure")
|
||||
if platform.system() == "Windows":
|
||||
configureExe += ".bat"
|
||||
|
||||
configure = [configureExe,
|
||||
"-static",
|
||||
"-opensource",
|
||||
"-confirm-license",
|
||||
# we use an in-source build for now and never want to install
|
||||
"-prefix", os.path.abspath("src/qt/qtbase"),
|
||||
# use the bundled libraries, vs. system-installed ones
|
||||
"-qt-zlib",
|
||||
"-qt-libpng",
|
||||
"-qt-libjpeg",
|
||||
"-qt-pcre",
|
||||
# disable unnecessary Qt features
|
||||
"-nomake", "examples",
|
||||
"-nomake", "tools",
|
||||
"-nomake", "tests",
|
||||
"-no-audio-backend",
|
||||
"-no-dbus",
|
||||
"-no-gstreamer",
|
||||
"-no-journald",
|
||||
"-no-opengl",
|
||||
"-no-qml-debug",
|
||||
"-no-sql-db2",
|
||||
"-no-sql-ibase",
|
||||
"-no-sql-mysql",
|
||||
"-no-sql-oci",
|
||||
"-no-sql-odbc",
|
||||
"-no-sql-psql",
|
||||
"-no-sql-sqlite",
|
||||
"-no-sql-sqlite2",
|
||||
"-no-sql-tds",
|
||||
"-no-tslib",
|
||||
"-no-xcb-xlib",
|
||||
"-D", "QT_NO_GRAPHICSVIEW",
|
||||
"-D", "QT_NO_GRAPHICSEFFECT",
|
||||
"-D", "QT_NO_STYLESHEET",
|
||||
"-D", "QT_NO_STYLE_CDE",
|
||||
"-D", "QT_NO_STYLE_CLEANLOOKS",
|
||||
"-D", "QT_NO_STYLE_MOTIF",
|
||||
"-D", "QT_NO_STYLE_PLASTIQUE",
|
||||
"-D", "QT_NO_PRINTPREVIEWDIALOG"
|
||||
]
|
||||
configure.extend(self.platformQtConfigureOptions())
|
||||
if self.options.qt_config:
|
||||
configure.extend(self.options.qt_config)
|
||||
|
||||
if self.options.debug:
|
||||
configure.append("-debug")
|
||||
elif self.options.release:
|
||||
configure.append("-release")
|
||||
else:
|
||||
# build Release by default
|
||||
configure.append("-release")
|
||||
|
||||
if self.execute(configure, "src/qt/qtbase") != 0:
|
||||
raise RuntimeError("Configuration of Qt Base failed.")
|
||||
|
||||
# build Qt Base
|
||||
def buildQtBase(self):
|
||||
if self.options.skip_qtbase:
|
||||
print("Skipping build of Qt Base")
|
||||
return
|
||||
|
||||
if self.options.git_clean_qtbase:
|
||||
self.gitClean("src/qt/qtbase")
|
||||
|
||||
if self.options.git_clean_qtbase or not self.options.skip_configure_qtbase:
|
||||
self.configureQtBase()
|
||||
|
||||
print("building Qt Base, please wait...")
|
||||
if self.make("src/qt/qtbase") != 0:
|
||||
raise RuntimeError("Building Qt Base failed.")
|
||||
|
||||
# build Qt WebKit
|
||||
def buildQtWebKit(self):
|
||||
if self.options.skip_qtwebkit:
|
||||
print("Skipping build of Qt WebKit")
|
||||
return
|
||||
|
||||
if self.options.git_clean_qtwebkit:
|
||||
self.gitClean("src/qt/qtwebkit")
|
||||
|
||||
os.putenv("SQLITE3SRCDIR", os.path.abspath("src/qt/qtbase/src/3rdparty/sqlite"))
|
||||
|
||||
print("configuring Qt WebKit, please wait...")
|
||||
configureOptions = [
|
||||
# disable some webkit features we do not need
|
||||
"WEBKIT_CONFIG-=build_tests",
|
||||
"WEBKIT_CONFIG-=build_webkit2",
|
||||
"WEBKIT_CONFIG-=have_glx",
|
||||
"WEBKIT_CONFIG-=have_qtquick",
|
||||
"WEBKIT_CONFIG-=have_qtsensors",
|
||||
"WEBKIT_CONFIG-=have_qttestlib",
|
||||
"WEBKIT_CONFIG-=have_qttestsupport",
|
||||
"WEBKIT_CONFIG-=have_xcomposite",
|
||||
"WEBKIT_CONFIG-=have_xrender",
|
||||
"WEBKIT_CONFIG-=netscape_plugin_api",
|
||||
"WEBKIT_CONFIG-=use_gstreamer",
|
||||
"WEBKIT_CONFIG-=use_gstreamer010",
|
||||
"WEBKIT_CONFIG-=use_native_fullscreen_video",
|
||||
"WEBKIT_CONFIG-=use_webp",
|
||||
"WEBKIT_CONFIG-=video",
|
||||
"WEBKIT_CONFIG-=web_audio",
|
||||
"WEBKIT_TOOLS_CONFIG-=build_imagediff",
|
||||
"WEBKIT_TOOLS_CONFIG-=build_minibrowser",
|
||||
"WEBKIT_TOOLS_CONFIG-=build_qttestsupport",
|
||||
"WEBKIT_TOOLS_CONFIG-=build_test_npapi",
|
||||
"WEBKIT_TOOLS_CONFIG-=build_wtr",
|
||||
]
|
||||
if self.options.webkit_qmake_args:
|
||||
configureOptions.extend(self.options.webkit_qmake_args)
|
||||
if self.qmake("src/qt/qtwebkit", configureOptions) != 0:
|
||||
raise RuntimeError("Configuration of Qt WebKit failed.")
|
||||
|
||||
print("building Qt WebKit, please wait...")
|
||||
if self.make("src/qt/qtwebkit") != 0:
|
||||
raise RuntimeError("Building Qt WebKit failed.")
|
||||
|
||||
# build PhantomJS
|
||||
def buildPhantomJS(self):
|
||||
print("Configuring PhantomJS, please wait...")
|
||||
if self.qmake(".", self.options.phantomjs_qmake_args) != 0:
|
||||
raise RuntimeError("Configuration of PhantomJS failed.")
|
||||
print("Building PhantomJS, please wait...")
|
||||
if self.make(".") != 0:
|
||||
raise RuntimeError("Building PhantomJS failed.")
|
||||
|
||||
# ensure the git submodules are all available
|
||||
def ensureSubmodulesAvailable(self):
|
||||
if self.options.skip_git: return
|
||||
if self.execute(["git", "submodule", "init"], ".") != 0:
|
||||
raise RuntimeError("Initialization of git submodules failed.")
|
||||
if self.execute(["git", "submodule", "update", "--init"], ".") != 0:
|
||||
raise RuntimeError("Initial update of git submodules failed.")
|
||||
|
||||
# run all build steps required to get a final PhantomJS binary at the end
|
||||
def run(self):
|
||||
self.ensureSubmodulesAvailable();
|
||||
self.buildQtBase()
|
||||
self.buildQtWebKit()
|
||||
self.buildPhantomJS()
|
||||
|
||||
# parse command line arguments and return the result
|
||||
def parseArguments():
|
||||
parser = argparse.ArgumentParser(description="Build PhantomJS from sources.")
|
||||
parser.add_argument("-r", "--release", action="store_true",
|
||||
help="Enable compiler optimizations.")
|
||||
parser.add_argument("-d", "--debug", action="store_true",
|
||||
help="Build with debug symbols enabled.")
|
||||
parser.add_argument("-j", "--jobs", type=int,
|
||||
help="How many parallel compile jobs to use. Defaults to %d." % multiprocessing.cpu_count())
|
||||
parser.add_argument("-c", "--confirm", action="store_true",
|
||||
help="Silently confirm the build.")
|
||||
parser.add_argument("-n", "--dry-run", action="store_true",
|
||||
help="Only print what would be done without actually executing anything.")
|
||||
|
||||
# NOTE: silent build does not exist on windows apparently
|
||||
if platform.system() != "Windows":
|
||||
parser.add_argument("-s", "--silent", action="store_true",
|
||||
help="Reduce output during compilation.")
|
||||
|
||||
advanced = parser.add_argument_group("advanced options")
|
||||
advanced.add_argument("--qmake-args", type=str, action="append",
|
||||
help="Additional arguments that will be passed to all QMake calls.")
|
||||
advanced.add_argument("--webkit-qmake-args", type=str, action="append",
|
||||
help="Additional arguments that will be passed to the Qt WebKit QMake call.")
|
||||
advanced.add_argument("--phantomjs-qmake-args", type=str, action="append",
|
||||
help="Additional arguments that will be passed to the PhantomJS QMake call.")
|
||||
advanced.add_argument("--qt-config", type=str, action="append",
|
||||
help="Additional arguments that will be passed to Qt Base configure.")
|
||||
advanced.add_argument("--git-clean-qtbase", action="store_true",
|
||||
help="Run git clean in the Qt Base folder.\n"
|
||||
"ATTENTION: This will remove all untracked files!")
|
||||
advanced.add_argument("--git-clean-qtwebkit", action="store_true",
|
||||
help="Run git clean in the Qt WebKit folder.\n"
|
||||
"ATTENTION: This will remove all untracked files!")
|
||||
advanced.add_argument("--skip-qtbase", action="store_true",
|
||||
help="Skip Qt Base completely and do not build it.\n"
|
||||
"Only enable this option when Qt Base was built "
|
||||
"previously and no update is required.")
|
||||
advanced.add_argument("--skip-configure-qtbase", action="store_true",
|
||||
help="Skip configure step of Qt Base, only build it.\n"
|
||||
"Only enable this option when the environment has "
|
||||
"not changed and only an update of Qt Base is required.")
|
||||
advanced.add_argument("--skip-qtwebkit", action="store_true",
|
||||
help="Skip Qt WebKit completely and do not build it.\n"
|
||||
"Only enable this option when Qt WebKit was built "
|
||||
"previously and no update is required.")
|
||||
advanced.add_argument("--skip-configure-qtwebkit", action="store_true",
|
||||
help="Skip configure step of Qt WebKit, only build it.\n"
|
||||
"Only enable this option when neither the environment nor Qt Base "
|
||||
"has changed and only an update of Qt WebKit is required.")
|
||||
advanced.add_argument("--skip-git", action="store_true",
|
||||
help="Skip all actions that require Git. For use when building from "
|
||||
"a tarball release.")
|
||||
options = parser.parse_args()
|
||||
if options.debug and options.release:
|
||||
raise RuntimeError("Cannot build with both debug and release mode enabled.")
|
||||
return options
|
||||
|
||||
# main entry point which gets executed when this script is run
|
||||
def main():
|
||||
# change working directory to the folder this script lives in
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
|
||||
try:
|
||||
options = parseArguments()
|
||||
if not options.confirm:
|
||||
print("""\
|
||||
----------------------------------------
|
||||
WARNING
|
||||
----------------------------------------
|
||||
|
||||
Building PhantomJS from source takes a very long time, anywhere from 30 minutes
|
||||
to several hours (depending on the machine configuration). It is recommended to
|
||||
use the premade binary packages on supported operating systems.
|
||||
|
||||
For details, please go the the web site: http://phantomjs.org/download.html.
|
||||
""")
|
||||
while True:
|
||||
sys.stdout.write("Do you want to continue (Y/n)? ")
|
||||
sys.stdout.flush()
|
||||
answer = sys.stdin.readline().strip().lower()
|
||||
if answer == "n":
|
||||
print("Cancelling PhantomJS build.")
|
||||
return
|
||||
elif answer == "y" or answer == "":
|
||||
break
|
||||
else:
|
||||
print("Invalid answer, try again.")
|
||||
|
||||
builder = PhantomJSBuilder(options)
|
||||
builder.run()
|
||||
except RuntimeError as error:
|
||||
sys.stderr.write("\nERROR: Failed to build PhantomJS! %s\n" % error)
|
||||
sys.stderr.flush()
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
317
configure
vendored
Executable file
317
configure
vendored
Executable file
@ -0,0 +1,317 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Autotools-style (./configure) wrapper for CMake
|
||||
# <https://github.com/nemequ/configure-cmake>
|
||||
#
|
||||
# *** IMPORTANT ***
|
||||
#
|
||||
# You must include the GNUInstallDirs module (which comes with
|
||||
# CMake) in your project. Just put "include (GNUInstallDirs)" in
|
||||
# you CMakeLists.txt and you should be good.
|
||||
#
|
||||
# This script was originally written for Squash
|
||||
# <https://quixdb.github.io/squash/> by Evan Nemerson
|
||||
# <evan@nemerson.com>, but has been spun off into a separate
|
||||
# repository. Please feel free to copy it into your own repository,
|
||||
# though I would appreciate it if you would post improvements, bugs,
|
||||
# feature requests, etc. to the issue tracker at
|
||||
# <https://github.com/nemequ/configure-cmake/issues>.
|
||||
#
|
||||
# To the extent possible under law, the author(s) hereby waive all
|
||||
# copyright and related or neighboring rights to this work. For
|
||||
# details, see <https://creativecommons.org/publicdomain/zero/1.0/>
|
||||
|
||||
TOP_SRCDIR="$(dirname $0)"
|
||||
|
||||
if [ "${CMAKE_CMD}" = "" ]; then
|
||||
CMAKE_CMD="cmake"
|
||||
fi
|
||||
|
||||
BUILD_TYPE="Debug"
|
||||
PREFIX=/usr/local
|
||||
LIBDIR=
|
||||
CMAKE_ARGS=
|
||||
|
||||
if [ -e "${TOP_SRCDIR}/.configure-custom.sh" ]; then
|
||||
. "${TOP_SRCDIR}/.configure-custom.sh"
|
||||
fi
|
||||
|
||||
quote() {
|
||||
echo "$1" | sed -e "s|'|'\\\\''|g; 1s/^/'/; \$s/\$/'/"
|
||||
}
|
||||
|
||||
extract_var_string() {
|
||||
VAR_NAME=$1
|
||||
VAR_NAME=$(echo $1 | sed -e 's/[ \t]*$//')
|
||||
if [ "x$2" != "x" ]; then
|
||||
VAR_VALUE=$2
|
||||
else
|
||||
VAR_VALUE=yes
|
||||
fi
|
||||
|
||||
if [ "x$3" != "x" ]; then
|
||||
VAR_UC_NAME=$3
|
||||
else
|
||||
VAR_UC_NAME=$(echo "$1" | tr '[:lower:]' '[:upper:]' | tr -c '[:alnum:]' '_' | sed 's/_$//g')
|
||||
fi
|
||||
}
|
||||
|
||||
set_config_var() {
|
||||
is_with=n
|
||||
case "$1" in
|
||||
"--enable-"*)
|
||||
name="${1#--enable-}"
|
||||
cfg="${ENABLE_VARS}"
|
||||
;;
|
||||
"--disable-"*)
|
||||
name="${1#--disable-}";
|
||||
cfg="${DISABLE_VARS}";
|
||||
;;
|
||||
"--with-"*)
|
||||
# IFS="=" read -ra WITHARGS <<< "${1}"
|
||||
name="${1#--with-}"
|
||||
cfg="${WITH_VARS}"
|
||||
is_with=y
|
||||
;;
|
||||
esac
|
||||
|
||||
found=n
|
||||
for varstring in $cfg; do
|
||||
extract_var_string $(echo "${varstring}" | tr '|' ' ')
|
||||
if [ "x$VAR_NAME" = "x$name" ]; then
|
||||
found=y
|
||||
break;
|
||||
fi
|
||||
done
|
||||
|
||||
if [ "$found" = "y" ]; then
|
||||
if [ "x$is_with" = "xy" ]; then
|
||||
CMAKE_ARGS="$CMAKE_ARGS -D${VAR_UC_NAME}=$(quote "$2")"
|
||||
else
|
||||
CMAKE_ARGS="$CMAKE_ARGS -D${VAR_UC_NAME}=$(quote "${VAR_VALUE}")"
|
||||
fi
|
||||
else
|
||||
echo "Unknown parameter: ${1}"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
prefix_to_offset() {
|
||||
expr $(echo "${1}" | awk '{ print length }') + 1
|
||||
}
|
||||
|
||||
print_help() {
|
||||
cat <<EOF >&2
|
||||
-h, --help display this help and exit
|
||||
--disable-debug disable debugging mode
|
||||
--pass-thru pass remaining arguments through to CMake
|
||||
|
||||
--prefix=PREFIX install architecture-independent files in PREFIX
|
||||
[$PREFIX]
|
||||
--bindir=DIR user executables [PREFIX/bin]
|
||||
--sbindir=DIR system admin executables [PREFIX/sbin]
|
||||
--libexecdir=DIR program executables [PREFIX/libexec]
|
||||
--sysconfdir=DIR read-only single-machine data [PREFIX/etc]
|
||||
--sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
|
||||
--localstatedir=DIR modifiable single-machine data [PREFIX/var]
|
||||
--libdir=DIR object code libraries [PREFIX/lib]
|
||||
--includedir=DIR C header files [PREFIX/include]
|
||||
--oldincludedir=DIR C header files for non-gcc [/usr/include]
|
||||
--datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
|
||||
--datadir=DIR read-only architecture-independent data [DATAROOTDIR]
|
||||
--infodir=DIR info documentation [DATAROOTDIR/info]
|
||||
--localedir=DIR locale-dependent data [DATAROOTDIR/locale]
|
||||
--mandir=DIR man documentation [DATAROOTDIR/man]
|
||||
--docdir=DIR documentation root [DATAROOTDIR/doc/PROJECT_NAME]
|
||||
EOF
|
||||
|
||||
first=y
|
||||
for varstring in ${ENABLE_VARS}; do
|
||||
if [ $first = 'y' ]; then
|
||||
echo ""
|
||||
first=n
|
||||
fi
|
||||
extract_var_string $(echo "${varstring}" | tr '|' ' ')
|
||||
var_doc_name="ENABLE_${VAR_UC_NAME}_DOC"
|
||||
eval "docstring=\$$var_doc_name"
|
||||
if [ "x${docstring}" = "x" ]; then
|
||||
printf " --enable-%-14s enable %s support\n" "${VAR_NAME}" "$(echo -n "${VAR_NAME}" | tr '-' ' ')"
|
||||
else
|
||||
printf " --enable-%-14s %s\n" "${VAR_NAME}" "$docstring"
|
||||
fi
|
||||
done
|
||||
|
||||
first=y
|
||||
for varstring in ${DISABLE_VARS}; do
|
||||
if [ $first = 'y' ]; then
|
||||
echo ""
|
||||
first=n
|
||||
fi
|
||||
extract_var_string $(echo "${varstring}" | tr '|' ' ')
|
||||
var_doc_name="DISABLE_${VAR_UC_NAME}_DOC"
|
||||
eval "docstring=\$$var_doc_name"
|
||||
if [ "x${docstring}" = "x" ]; then
|
||||
printf " --disable-%-13s disable %s support\n" "${VAR_NAME}" "$(echo -n "${VAR_NAME}" | tr '-' ' ')"
|
||||
else
|
||||
printf " --disable-%-13s %s\n" "${VAR_NAME}" "$docstring"
|
||||
fi
|
||||
done
|
||||
|
||||
first=y
|
||||
for varstring in ${WITH_VARS}; do
|
||||
if [ $first = 'y' ]; then
|
||||
echo ""
|
||||
first=n
|
||||
fi
|
||||
extract_var_string $(echo "${varstring}" | tr '|' ' ')
|
||||
var_doc_name="WITH_${VAR_UC_NAME}_DOC"
|
||||
eval "docstring=\$$var_doc_name"
|
||||
paraminfo="${VAR_NAME}=${VAR_VALUE}"
|
||||
if [ "x${docstring}" = "x" ]; then
|
||||
printf " --with-%-16s enable %s support\n" "$paraminfo" "$(echo -n "${VAR_NAME}" | tr '-' ' ')"
|
||||
else
|
||||
printf " --with-%-16s %s\n" "$paraminfo" "$docstring"
|
||||
fi
|
||||
done
|
||||
|
||||
exit 0
|
||||
}
|
||||
|
||||
while [ $# != 0 ]; do
|
||||
case "$1" in
|
||||
"--prefix="*)
|
||||
PREFIX="${1#*=}";;
|
||||
"--prefix")
|
||||
PREFIX="${2}"; shift;;
|
||||
"--bindir="*)
|
||||
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_BINDIR=$(quote "${1#*=}")";;
|
||||
"--bindir")
|
||||
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_BINDIR=$(quote "$2")"; shift;;
|
||||
"--sbindir="*)
|
||||
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_SBINDIR=$(quote "${1#*=}")";;
|
||||
"--sbindir")
|
||||
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_SBINDIR=$(quote "$2")"; shift;;
|
||||
"--libexecdir="*)
|
||||
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_LIBEXECDIR=$(quote "${1#*=}")";;
|
||||
"--libexecdir")
|
||||
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_LIBEXECDIR=$(quote "$2")"; shift;;
|
||||
"--sysconfdir="*)
|
||||
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_SYSCONFDIR=$(quote "${1#*=}")";;
|
||||
"--sysconfdir")
|
||||
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_SYSCONFDIR=$(quote "$2")"; shift;;
|
||||
"--sharedstatedir="*)
|
||||
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_SHAREDSTATEDIR=$(quote "${1#*=}")";;
|
||||
"--sharedstatedir")
|
||||
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_SHAREDSTATEDIR=$(quote "$2")"; shift;;
|
||||
"--localstatedir="*)
|
||||
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_LOCALSTATEDIR=$(quote "${1#*=}")";;
|
||||
"--localstatedir")
|
||||
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_LOCALSTATEDIR=$(quote "$2")"; shift;;
|
||||
"--libdir="*)
|
||||
LIBDIR="${1#*=}";;
|
||||
"--libdir")
|
||||
LIBDIR="${2}"; shift;;
|
||||
"--includedir="*)
|
||||
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_INCLUDEDIR=$(quote "${1#*=}")";;
|
||||
"--includedir")
|
||||
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_INCLUDEDIR=$(quote "$2")"; shift;;
|
||||
"--oldincludedir="*)
|
||||
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_OLDINCLUDEDIR=$(quote "${1#*=}")";;
|
||||
"--oldincludedir")
|
||||
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_OLDINCLUDEDIR=$(quote "$2")"; shift;;
|
||||
"--datarootdir="*)
|
||||
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_DATAROOTDIR=$(quote "${1#*=}")";;
|
||||
"--datarootdir")
|
||||
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_DATAROOTDIR=$(quote "$2")"; shift;;
|
||||
"--datadir="*)
|
||||
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_DATADIR=$(quote "${1#*=}")";;
|
||||
"--datadir")
|
||||
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_DATADIR=$(quote "$2")"; shift;;
|
||||
"--infodir="*)
|
||||
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_INFODIR=$(quote "${1#*=}")";;
|
||||
"--infodir")
|
||||
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_INFODIR=$(quote "$2")"; shift;;
|
||||
"--localedir="*)
|
||||
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_LOCALEDIR=$(quote "${1#*=}")";;
|
||||
"--localedir")
|
||||
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_LOCALEDIR=$(quote "$2")"; shift;;
|
||||
"--mandir="*)
|
||||
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_MANDIR=$(quote "${1#*=}")";;
|
||||
"--mandir")
|
||||
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_MANDIR=$(quote "$2")"; shift;;
|
||||
"--docdir="*)
|
||||
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_DOCDIR=$(quote "${1#*=}")";;
|
||||
"--docdir")
|
||||
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_DOCDIR=$(quote "$2")"; shift;;
|
||||
|
||||
"CC="*)
|
||||
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_C_COMPILER=$(quote "${1#*=}")";;
|
||||
"CXX="*)
|
||||
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_CXX_COMPILER=$(quote "${1#*=}")";;
|
||||
"CFLAGS="*)
|
||||
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_C_FLAGS=$(quote "${1#*=}")";;
|
||||
"CXXFLAGS="*)
|
||||
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_CXX_FLAGS=$(quote "${1#*=}")";;
|
||||
"LDFLAGS="*)
|
||||
LDFLAGS="$LDFLAGS ${1#*=}";;
|
||||
|
||||
"--help")
|
||||
print_help;;
|
||||
"-h")
|
||||
print_help;;
|
||||
|
||||
# This flag is the only one which may be a bit surprising to
|
||||
# people. Autotools always builds with debugging symbols enabled
|
||||
# (AFAIK), but for cmake you have to do -DCMAKE_BUILD_TYPE=Debug.
|
||||
# Unfortunately this can change other things as well, so although
|
||||
# I realize there is no --disable-debug flag I thought it would be
|
||||
# prudent to support one here.
|
||||
"--disable-debug")
|
||||
BUILD_TYPE="Release";;
|
||||
|
||||
"--pass-thru")
|
||||
while [ $# != 1 ]; do
|
||||
shift;
|
||||
CMAKE_ARGS="$CMAKE_ARGS $(quote "${1}")";
|
||||
done;;
|
||||
|
||||
"--enable-"*)
|
||||
set_config_var "$1"
|
||||
;;
|
||||
|
||||
"--disable-"*)
|
||||
set_config_var "$1"
|
||||
;;
|
||||
|
||||
"--with-"*)
|
||||
name=$(echo "${1#--with-}" | awk '{split($1,v,"="); print v[1]}')
|
||||
case "${1}" in
|
||||
"--with-${name}="*)
|
||||
set_config_var "--with-${name}" "${1#--with-${name}=}";;
|
||||
"--with-${name}")
|
||||
set_config_var "$1" "$2";
|
||||
shift;;
|
||||
esac
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "$0: error: unrecognized option: \`$1'" >&2
|
||||
echo "Try \`$0 --help' for more information" >&2
|
||||
exit -1
|
||||
esac;
|
||||
shift
|
||||
done
|
||||
|
||||
if [ "x${LIBDIR}" = "x" ]; then
|
||||
LIBDIR="${PREFIX}/lib"
|
||||
fi
|
||||
|
||||
# Unlike CFLAGS/CXXFLAGS/CC/CXX, LDFLAGS isn't handled by CMake, so we
|
||||
# need to parse it here.
|
||||
if [ "x${LDFLAGS}" != "x" ]; then
|
||||
for varname in EXE MODULE SHARED STATIC; do
|
||||
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_${varname}_LINKER_FLAGS=$(quote "$LDFLAGS")"
|
||||
done
|
||||
fi
|
||||
|
||||
eval "${CMAKE_CMD}" "${TOP_SRCDIR}" -DCMAKE_BUILD_TYPE="${BUILD_TYPE}" -DCMAKE_INSTALL_PREFIX="${PREFIX}" -DCMAKE_INSTALL_LIBDIR="${LIBDIR}" ${CMAKE_ARGS}
|
2
deploy/.gitignore
vendored
2
deploy/.gitignore
vendored
@ -1,2 +0,0 @@
|
||||
.vagrant
|
||||
/brandelf
|
@ -1,44 +0,0 @@
|
||||
Packaging PhantomJS
|
||||
===================
|
||||
|
||||
This directory contains various scripts to assist with making PhantomJS
|
||||
packages.
|
||||
|
||||
Packaging for Linux
|
||||
-------------------
|
||||
|
||||
Linux building/packaging is best done in a container to ensure
|
||||
isolation. We use [Docker](https://www.docker.com/) to automate the
|
||||
process. Please see the [Docker documentation](https://docs.docker.com/)
|
||||
for instructions on installing Docker. For OS X or Windows host,
|
||||
please use [Docker Toolbox](https://www.docker.com/docker-toolbox).
|
||||
|
||||
Once you have Docker installed, run these commands from the top level
|
||||
of the PhantomJS source repository:
|
||||
|
||||
```bash
|
||||
$ git clean -xfd .
|
||||
$ docker run -v $PWD:/src debian:wheezy /src/deploy/docker-build.sh
|
||||
```
|
||||
|
||||
For the 32-bit version:
|
||||
|
||||
```bash
|
||||
$ git clean -xfd .
|
||||
$ docker run -v $PWD:/src tubia/debian:wheezy /src/deploy/docker-build.sh
|
||||
```
|
||||
|
||||
The built binary will be extracted out of the container and copied to
|
||||
the current directory.
|
||||
|
||||
|
||||
Packaging for OS X
|
||||
------------------
|
||||
|
||||
Run `deploy/build-and-package.sh`. That's it.
|
||||
|
||||
However, if you have previously built the sources in release mode, you
|
||||
should clean your tree to make sure all the debugging symbols gets
|
||||
compiled:
|
||||
|
||||
$ make clean && cd src/qt && make clean && cd ../..
|
@ -1,212 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 2000, 2001 David O'Brien
|
||||
* Copyright (c) 1996 Søren Schmidt
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer
|
||||
* in this position and unchanged.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
//NOTE: commented out to make it compile on linux
|
||||
// __FBSDID("$FreeBSD: src/usr.bin/brandelf/brandelf.c,v 1.25.22.2 2012/03/16 03:22:37 eadler Exp $");
|
||||
|
||||
#include <sys/types.h>
|
||||
//NOTE: changed path to make it compile on linux
|
||||
#include <elf.h>
|
||||
#include <sys/errno.h>
|
||||
#include <err.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
static int elftype(const char *);
|
||||
static const char *iselftype(int);
|
||||
static void printelftypes(void);
|
||||
static void usage(void);
|
||||
|
||||
struct ELFtypes {
|
||||
const char *str;
|
||||
int value;
|
||||
};
|
||||
/* XXX - any more types? */
|
||||
static struct ELFtypes elftypes[] = {
|
||||
{ "FreeBSD", ELFOSABI_FREEBSD },
|
||||
{ "Linux", ELFOSABI_LINUX },
|
||||
{ "Solaris", ELFOSABI_SOLARIS },
|
||||
{ "SVR4", ELFOSABI_SYSV }
|
||||
};
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
|
||||
const char *strtype = "FreeBSD";
|
||||
int type = ELFOSABI_FREEBSD;
|
||||
int retval = 0;
|
||||
int ch, change = 0, force = 0, listed = 0;
|
||||
|
||||
while ((ch = getopt(argc, argv, "f:lt:v")) != -1)
|
||||
switch (ch) {
|
||||
case 'f':
|
||||
if (change)
|
||||
errx(1, "f option incompatible with t option");
|
||||
force = 1;
|
||||
type = atoi(optarg);
|
||||
if (errno == ERANGE || type < 0 || type > 255) {
|
||||
warnx("invalid argument to option f: %s",
|
||||
optarg);
|
||||
usage();
|
||||
}
|
||||
break;
|
||||
case 'l':
|
||||
printelftypes();
|
||||
listed = 1;
|
||||
break;
|
||||
case 'v':
|
||||
/* does nothing */
|
||||
break;
|
||||
case 't':
|
||||
if (force)
|
||||
errx(1, "t option incompatible with f option");
|
||||
change = 1;
|
||||
strtype = optarg;
|
||||
break;
|
||||
default:
|
||||
usage();
|
||||
}
|
||||
argc -= optind;
|
||||
argv += optind;
|
||||
if (!argc) {
|
||||
if (listed)
|
||||
exit(0);
|
||||
else {
|
||||
warnx("no file(s) specified");
|
||||
usage();
|
||||
}
|
||||
}
|
||||
|
||||
if (!force && (type = elftype(strtype)) == -1) {
|
||||
warnx("invalid ELF type '%s'", strtype);
|
||||
printelftypes();
|
||||
usage();
|
||||
}
|
||||
|
||||
while (argc) {
|
||||
int fd;
|
||||
char buffer[EI_NIDENT];
|
||||
|
||||
if ((fd = open(argv[0], change || force ? O_RDWR : O_RDONLY, 0)) < 0) {
|
||||
warn("error opening file %s", argv[0]);
|
||||
retval = 1;
|
||||
goto fail;
|
||||
}
|
||||
if (read(fd, buffer, EI_NIDENT) < EI_NIDENT) {
|
||||
warnx("file '%s' too short", argv[0]);
|
||||
retval = 1;
|
||||
goto fail;
|
||||
}
|
||||
if (buffer[0] != ELFMAG0 || buffer[1] != ELFMAG1 ||
|
||||
buffer[2] != ELFMAG2 || buffer[3] != ELFMAG3) {
|
||||
warnx("file '%s' is not ELF format", argv[0]);
|
||||
retval = 1;
|
||||
goto fail;
|
||||
}
|
||||
if (!change && !force) {
|
||||
fprintf(stdout,
|
||||
"File '%s' is of brand '%s' (%u).\n",
|
||||
argv[0], iselftype(buffer[EI_OSABI]),
|
||||
buffer[EI_OSABI]);
|
||||
if (!iselftype(type)) {
|
||||
warnx("ELF ABI Brand '%u' is unknown",
|
||||
type);
|
||||
printelftypes();
|
||||
}
|
||||
}
|
||||
else {
|
||||
buffer[EI_OSABI] = type;
|
||||
lseek(fd, 0, SEEK_SET);
|
||||
if (write(fd, buffer, EI_NIDENT) != EI_NIDENT) {
|
||||
warn("error writing %s %d", argv[0], fd);
|
||||
retval = 1;
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
fail:
|
||||
close(fd);
|
||||
argc--;
|
||||
argv++;
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
static void
|
||||
usage(void)
|
||||
{
|
||||
(void)fprintf(stderr,
|
||||
"usage: brandelf [-lv] [-f ELF_ABI_number] [-t string] file ...\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
static const char *
|
||||
iselftype(int etype)
|
||||
{
|
||||
size_t elfwalk;
|
||||
|
||||
for (elfwalk = 0;
|
||||
elfwalk < sizeof(elftypes)/sizeof(elftypes[0]);
|
||||
elfwalk++)
|
||||
if (etype == elftypes[elfwalk].value)
|
||||
return elftypes[elfwalk].str;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
elftype(const char *elfstrtype)
|
||||
{
|
||||
size_t elfwalk;
|
||||
|
||||
for (elfwalk = 0;
|
||||
elfwalk < sizeof(elftypes)/sizeof(elftypes[0]);
|
||||
elfwalk++)
|
||||
if (strcasecmp(elfstrtype, elftypes[elfwalk].str) == 0)
|
||||
return elftypes[elfwalk].value;
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void
|
||||
printelftypes(void)
|
||||
{
|
||||
size_t elfwalk;
|
||||
|
||||
fprintf(stderr, "known ELF types are: ");
|
||||
for (elfwalk = 0;
|
||||
elfwalk < sizeof(elftypes)/sizeof(elftypes[0]);
|
||||
elfwalk++)
|
||||
fprintf(stderr, "%s(%u) ", elftypes[elfwalk].str,
|
||||
elftypes[elfwalk].value);
|
||||
fprintf(stderr, "\n");
|
||||
}
|
@ -1,6 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
cd `dirname $0`/..
|
||||
|
||||
./build.py --confirm --release --git-clean-qtbase --git-clean-qtwebkit "$@" || exit 1
|
||||
|
@ -1,62 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
|
||||
SOURCE_PATH=/src
|
||||
BUILD_PATH=$HOME/build
|
||||
|
||||
# In case the old package URL is still being used
|
||||
sed -i 's/http\.debian\.net/httpredir\.debian\.org/g' /etc/apt/sources.list
|
||||
|
||||
echo "Installing packages for development tools..." && sleep 1
|
||||
apt-get -y update
|
||||
apt-get install -y build-essential git flex bison gperf python ruby git libfontconfig1-dev
|
||||
echo
|
||||
|
||||
echo "Preparing to download Debian source package..."
|
||||
echo "deb-src http://httpredir.debian.org/debian wheezy main" >> /etc/apt/sources.list
|
||||
apt-get -y update
|
||||
echo
|
||||
|
||||
OPENSSL_TARGET='linux-x86_64'
|
||||
if [ `getconf LONG_BIT` -eq 32 ]; then
|
||||
OPENSSL_TARGET='linux-generic32'
|
||||
fi
|
||||
echo "Recompiling OpenSSL for ${OPENSSL_TARGET}..." && sleep 1
|
||||
apt-get source openssl
|
||||
cd openssl-1.0.1e
|
||||
OPENSSL_FLAGS='no-idea no-mdc2 no-rc5 no-zlib enable-tlsext no-ssl2 no-ssl3 no-ssl3-method enable-rfc3779 enable-cms'
|
||||
./Configure --prefix=/usr --openssldir=/etc/ssl --libdir=lib ${OPENSSL_FLAGS} ${OPENSSL_TARGET}
|
||||
make depend && make && make install
|
||||
cd ..
|
||||
echo
|
||||
|
||||
echo "Building the static version of ICU library..." && sleep 1
|
||||
apt-get source icu
|
||||
cd icu-4.8.1.1/source
|
||||
./configure --prefix=/usr --enable-static --disable-shared
|
||||
make && make install
|
||||
cd ..
|
||||
echo
|
||||
|
||||
echo "Recreating the build directory $BUILD_PATH..."
|
||||
rm -rf $BUILD_PATH && mkdir -p $BUILD_PATH
|
||||
echo
|
||||
|
||||
echo "Transferring the source: $SOURCE_PATH -> $BUILD_PATH. Please wait..."
|
||||
cd $BUILD_PATH && cp -rp $SOURCE_PATH . && cd src
|
||||
echo
|
||||
|
||||
echo "Compiling PhantomJS..." && sleep 1
|
||||
python build.py --confirm --release --qt-config="-no-pkg-config" --git-clean-qtbase --git-clean-qtwebkit
|
||||
echo
|
||||
|
||||
echo "Stripping the executable..." && sleep 1
|
||||
ls -l bin/phantomjs
|
||||
strip bin/phantomjs
|
||||
echo "Copying the executable..." && sleep 1
|
||||
ls -l bin/phantomjs
|
||||
cp bin/phantomjs $SOURCE_PATH
|
||||
echo
|
||||
|
||||
echo "Finished."
|
@ -1,120 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
#
|
||||
# usage: just run this script (after having run build.sh)
|
||||
# and deploy the created tarball to your target machine.
|
||||
#
|
||||
# It creates a phantomjs-$version folder and copies the binary,
|
||||
# example, license etc. together with all shared library dependencies
|
||||
# to that folder. Furthermore brandelf is used to make the lib
|
||||
# and binary compatible with older unix/linux machines that don't
|
||||
# know the new Linux ELF ABI.
|
||||
#
|
||||
|
||||
cd $(dirname $0)
|
||||
|
||||
if [[ ! -f ../bin/phantomjs ]]; then
|
||||
echo "phantomjs was not built yet, please run build.sh first"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ "$1" = "--bundle-libs" ]]; then
|
||||
bundle_libs=1
|
||||
else
|
||||
bundle_libs=0
|
||||
fi
|
||||
|
||||
version=$(../bin/phantomjs --version | sed 's/ /-/' | sed 's/[()]//g')
|
||||
src=..
|
||||
|
||||
echo "packaging phantomjs $version"
|
||||
|
||||
if [[ $OSTYPE = darwin* ]]; then
|
||||
dest="phantomjs-$version-macosx"
|
||||
else
|
||||
dest="phantomjs-$version-linux-$(uname -m)"
|
||||
fi
|
||||
|
||||
rm -Rf $dest{.tar.bz2,} &> /dev/null
|
||||
mkdir -p $dest/bin
|
||||
|
||||
echo
|
||||
|
||||
echo -n "copying files..."
|
||||
cp $src/bin/phantomjs $dest/bin
|
||||
cp -r $src/{ChangeLog,examples,LICENSE.BSD,third-party.txt,README.md} $dest/
|
||||
echo "done"
|
||||
echo
|
||||
|
||||
phantomjs=$dest/bin/phantomjs
|
||||
|
||||
if [[ "$bundle_libs" = "1" ]]; then
|
||||
mkdir -p $dest/lib
|
||||
|
||||
if [[ ! -f brandelf ]]; then
|
||||
echo
|
||||
echo "brandelf executable not found in current dir"
|
||||
echo -n "compiling it now..."
|
||||
g++ brandelf.c -o brandelf || exit 1
|
||||
echo "done"
|
||||
fi
|
||||
|
||||
libs=$(ldd $phantomjs | egrep -o "/[^ ]+ ")
|
||||
|
||||
echo -n "copying shared libs..."
|
||||
libld=
|
||||
for l in $libs; do
|
||||
ll=$(basename $l)
|
||||
cp $l $dest/lib/$ll
|
||||
|
||||
if [[ "$bundle_libs" = "1" ]]; then
|
||||
# ensure OS ABI compatibility
|
||||
./brandelf -t SVR4 $dest/lib/$ll
|
||||
if [[ "$l" == *"ld-linux"* ]]; then
|
||||
libld=$ll
|
||||
fi
|
||||
fi
|
||||
done
|
||||
echo "done"
|
||||
echo
|
||||
|
||||
echo -n "writing run script..."
|
||||
mv $phantomjs $phantomjs.bin
|
||||
phantomjs=$phantomjs.bin
|
||||
run=$dest/bin/phantomjs
|
||||
echo '#!/bin/sh' >> $run
|
||||
echo 'path=$(dirname $(dirname $(readlink -f $0)))' >> $run
|
||||
echo 'export LD_LIBRARY_PATH=$path/lib' >> $run
|
||||
echo 'exec $path/lib/'$libld' $phantomjs $@' >> $run
|
||||
chmod +x $run
|
||||
echo "done"
|
||||
echo
|
||||
fi
|
||||
|
||||
echo -n "stripping binary and libs..."
|
||||
if [[ $OSTYPE = darwin* ]]; then
|
||||
strip -x $phantomjs
|
||||
else
|
||||
strip -s $phantomjs
|
||||
[[ -d $dest/lib ]] && strip -s $dest/lib/*
|
||||
fi
|
||||
echo "done"
|
||||
echo
|
||||
|
||||
echo -n "compressing binary..."
|
||||
if type upx >/dev/null 2>&1; then
|
||||
upx -qqq -9 $phantomjs
|
||||
echo "done"
|
||||
else
|
||||
echo "upx not found"
|
||||
fi
|
||||
echo
|
||||
|
||||
echo -n "creating archive..."
|
||||
if [[ $OSTYPE = darwin* ]]; then
|
||||
zip -r $dest.zip $dest
|
||||
else
|
||||
tar -cjf $dest{.tar.bz2,}
|
||||
fi
|
||||
echo "done"
|
||||
echo
|
@ -1,3 +0,0 @@
|
||||
TEMPLATE = subdirs
|
||||
CONFIG += ordered
|
||||
SUBDIRS += src/phantomjs.pro
|
@ -1,9 +0,0 @@
|
||||
VPATH += $$PWD/src
|
||||
INCLUDEPATH += $$PWD/src
|
||||
|
||||
DEFINES += USE_UTF8
|
||||
|
||||
SOURCES += linenoise.c \
|
||||
utf8.c
|
||||
HEADERS += linenoise.h \
|
||||
utf8.h
|
@ -1,7 +0,0 @@
|
||||
VPATH += $$PWD
|
||||
INCLUDEPATH += $$PWD
|
||||
|
||||
SOURCES += mongoose.c
|
||||
HEADERS += mongoose.h
|
||||
linux*:LIBS += -ldl
|
||||
win32:LIBS += -lWs2_32
|
@ -1,103 +0,0 @@
|
||||
|
||||
if(!equals(QT_MAJOR_VERSION, 5)|!equals(QT_MINOR_VERSION, 5)) {
|
||||
error("This program can only be compiled with Qt 5.5.x.")
|
||||
}
|
||||
|
||||
TEMPLATE = app
|
||||
TARGET = phantomjs
|
||||
QT += network webkitwidgets
|
||||
CONFIG += console
|
||||
|
||||
DESTDIR = ../bin
|
||||
|
||||
RESOURCES = phantomjs.qrc \
|
||||
ghostdriver/ghostdriver.qrc
|
||||
|
||||
win32 {
|
||||
RESOURCES += \
|
||||
qt/qtwebkit/Source/WebCore/inspector/front-end/WebKit.qrc \
|
||||
qt/qtwebkit/Source/WebCore/generated/InspectorBackendCommands.qrc
|
||||
}
|
||||
|
||||
HEADERS += \
|
||||
phantom.h \
|
||||
callback.h \
|
||||
webpage.h \
|
||||
webserver.h \
|
||||
consts.h \
|
||||
utils.h \
|
||||
networkaccessmanager.h \
|
||||
cookiejar.h \
|
||||
filesystem.h \
|
||||
system.h \
|
||||
env.h \
|
||||
terminal.h \
|
||||
encoding.h \
|
||||
config.h \
|
||||
childprocess.h \
|
||||
repl.h \
|
||||
crashdump.h
|
||||
|
||||
SOURCES += phantom.cpp \
|
||||
callback.cpp \
|
||||
webpage.cpp \
|
||||
webserver.cpp \
|
||||
main.cpp \
|
||||
utils.cpp \
|
||||
networkaccessmanager.cpp \
|
||||
cookiejar.cpp \
|
||||
filesystem.cpp \
|
||||
system.cpp \
|
||||
env.cpp \
|
||||
terminal.cpp \
|
||||
encoding.cpp \
|
||||
config.cpp \
|
||||
childprocess.cpp \
|
||||
repl.cpp \
|
||||
crashdump.cpp
|
||||
|
||||
OTHER_FILES += \
|
||||
bootstrap.js \
|
||||
configurator.js \
|
||||
modules/fs.js \
|
||||
modules/webpage.js \
|
||||
modules/webserver.js \
|
||||
modules/child_process.js \
|
||||
modules/cookiejar.js \
|
||||
repl.js
|
||||
|
||||
include(mongoose/mongoose.pri)
|
||||
include(linenoise/linenoise.pri)
|
||||
include(qcommandline/qcommandline.pri)
|
||||
|
||||
win32: RC_FILE = phantomjs_win.rc
|
||||
os2: RC_FILE = phantomjs_os2.rc
|
||||
|
||||
mac {
|
||||
QMAKE_CXXFLAGS += -fvisibility=hidden
|
||||
QMAKE_LFLAGS += '-sectcreate __TEXT __info_plist Info.plist'
|
||||
CONFIG -= app_bundle
|
||||
# Uncomment to build a Mac OS X Universal Binary (i.e. x86 + ppc)
|
||||
# CONFIG += x86 ppc
|
||||
}
|
||||
|
||||
win32-msvc* {
|
||||
DEFINES += NOMINMAX \
|
||||
WIN32_LEAN_AND_MEAN \
|
||||
_CRT_SECURE_NO_WARNINGS
|
||||
# ingore warnings:
|
||||
# 4049 - locally defined symbol 'symbol' imported
|
||||
QMAKE_LFLAGS += /ignore:4049 /LARGEADDRESSAWARE
|
||||
LIBS += -lCrypt32 -lzlib
|
||||
CONFIG(static) {
|
||||
DEFINES += STATIC_BUILD
|
||||
}
|
||||
}
|
||||
|
||||
linux {
|
||||
CONFIG += c++11
|
||||
}
|
||||
|
||||
openbsd* {
|
||||
LIBS += -L/usr/X11R6/lib
|
||||
}
|
@ -1,7 +0,0 @@
|
||||
VPATH += $$PWD
|
||||
INCLUDEPATH += $$PWD
|
||||
|
||||
DEFINES += STATIC_BUILD QCOMMANDLINE_STATIC
|
||||
|
||||
SOURCES += qcommandline.cpp
|
||||
HEADERS += qcommandline.h
|
Loading…
Reference in New Issue
Block a user