Compare commits

..

46 Commits

Author SHA1 Message Date
Matthew Johnson 48d17550a7 Release v1.2.0
This release adds several new features:
* Bitbake infile parsing using the --infile flag (see README)
* Support override file for %description section
* Default python pattern now distutils3 instead of distutils23
* Improved Rust/Cargo support
* Improved 32bit make/make_install args support
* Print fingerprint of imported pubkey
* Change default keyring to package repository with fallback the
  autospec repository.
* Improved output

...makes some configuration updates:
* Adds several new public keys
* Adds lines to configure_whitelist
* Adds patterns for failed_patterns

...and makes several fixes as well:
* Print guessed commitmessage as string instead of list
* Fix several issues with catkin support
* Follow redirects by the license server
* Add a couple new URL patterns
* Remove unneeded V and VERBOSE flags for make lines
* Remove no-longer-used functional test suite
* Turn off string interpolation for URLs containing '%'
* Respect [autospec][urlban] for archive URLs

Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2018-01-18 15:20:26 -08:00
Matthew Johnson 02c63d802c Record imported public key in commit message
When the user chooses to import a public key during the autospec run
display information on that key in the commit message.

Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2018-01-18 15:20:30 -08:00
Matthew Johnson 6593bfb3b5 Change default keyring to package directory
Instead of relying on a centralized keyring that resides in the autospec
repository, make the default keyring the package directory itself. Any
key imports will be to the package repository and will be committed as
part of the automatic autospec commit.

Retain the autospec repo keyring as a fallback keyring when the public
key does not exist in the package repo.

Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2018-01-18 15:20:30 -08:00
Matthew Johnson a7e0d4b53e Add --fingerprint output when importing pubkeys
Fixes #79

Print the key's fingerprint so the user can cross-reference a PGP key
server and make a more informed decision to import the public key.

Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2018-01-18 08:51:18 -08:00
Matthew Johnson 7e28a3a7de Print instructions when not automatically committing
When skipping automatic git commit due to --skip-git flag print a
message informing the user they must commit their changes themselves.

Fixes #89

Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2018-01-17 17:02:23 -08:00
Matthew Johnson 4b2ca0518b Respect [autospec][urlban] for archive URLs
Fixes #104

Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2018-01-17 17:02:02 -08:00
Matthew Johnson 4d4ae84553 Add new mappings to failed_commands
Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2018-01-17 13:43:25 -08:00
Matthew Johnson 56eaaea26c Construct gnome git urls with github
Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2018-01-17 13:43:08 -08:00
William Douglas 165752000c Add 32bit versions of make/make_install args
Add make32_args and make32_install_args config file handling to allow
specific options to be passed that are specific to the 32bit builds.
2018-01-17 13:42:50 -08:00
William Douglas 4befc85602 Fixups for rust/cargo building
Improve rust/cargo support by:
1) Better handling only toplevel Cargo configuration files for dependency
lookup.
2) Adding runtime requirements for buildreq packages in order to get
dependencies from non directly dependent packages resolved.
3) Add cargo as a buildreq for rust packages to handle the rustc/cargo
split.
4) Add cargo detection from failed_commands.
5) Fix rust source directory destination to not append version in case
the package name already had version information in it.
6) Get name and version information from crates.io package files.
2018-01-16 14:17:09 -08:00
Matthew Johnson 3dd33f1daf Add several new strings to the configure_whitelist
Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2018-01-12 10:32:56 -08:00
Matthew Johnson 7c3dd04b17 Fix mismatched quotes in specfile write
The intention here is to use the self.cmake_srcdir variable, not print
the literal string to the file...

Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2018-01-12 10:32:42 -08:00
Matthew Johnson e7b1302768 Check for ConfigParser regressions in all source files
Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2018-01-11 17:31:49 -08:00
Matthew Johnson 9739ab703a Turn off ConfigParser string interpolation
configparser.ConfigParser attempts to interpolate "%" characters in the
values of the key-value pairs when parsing. This is absolutely unwanted
behavior, especially when parsing URLs such as

<sourceforge url>/joe-editor/files/JOE%20sources/<joe tar>

which cause an uncaught exception.

Turn off interpolation by passing the interpolation=None argument to
ConfigParser.

Add a unit tests to report when ConfigParser(...) is called in the
codebase without setting interpolation to None.

Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2018-01-11 17:24:39 -08:00
Matthew Johnson eb4ba41d37 Remove no-longer-used functional test suite
This test suite is extremely hard to keep up-to-date and is no longer as
valuable now that unit tests have been written for much of the code
base. Actual functional testing can be done against package repos
without requiring them to be included in the autospec repository.

Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2018-01-11 14:47:39 -08:00
Matthew Johnson 6cfd31086a Remove remaining VERBOSE make flags
Finish the work of 9bb89743d4 and remove
remaining VERBOSE flags for make. As mentioned in the previous commit
autospec does not parse the verbose output from make, so the flag is not
necessary and causes a considerable slowdown when parsing large build
logs.

Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2018-01-10 16:27:54 -08:00
Matthew Johnson e7fc47f019 Import new public key (Matthew Johnson)
Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2018-01-10 10:58:59 -08:00
Patrick McCarty 00ae2e0cfb Import new public key (William Douglas)
Signed-off-by: Patrick McCarty <patrick.mccarty@intel.com>
2018-01-10 10:53:33 -08:00
William Douglas 6e5e7f6107 Import new public key FPComplete
This key is needed to verify the signature for 'stack' release
tarballs.
2018-01-03 09:02:26 -08:00
Arzhan Kinzhalin a950d006a4 Add Arzhan Kinzhalin to known signers.
Needed to verify clrtrust release signatures.

pub   rsa2048 2017-10-02 [SC] [expires: 2022-10-01]
      42EE4AEEE3AA6BA74215C289C9D50845DE5519CB
uid           Arzhan Kinzhalin (kai) <arzhan@kinzhalin.com>
uid           Arzhan Kinzhalin (kai) <arzhan.i.kinzhalin@intel.com>
sub   rsa2048 2017-10-02 [E] [expires: 2022-10-01]

Yours faithfully.
2017-12-26 09:53:43 -08:00
Arzhan Kinzhalin a148072bf7 Do not follow location when using HEAD request.
Suffice to get 302 or 200 on HEAD. Subsequent locations may point to
arbitrary servers which may return 403 on HEAD (while allow GET). This
issue happens with releases hosted on github.com, for example.
2017-12-22 16:58:12 -08:00
Leandro Dorileo f718e18275 more catkin patterns
Depending on the dependencies name catkin will break the line or not,
this new patterns will catch more errors.

Signed-off-by: Leandro Dorileo <leandro.maciel.dorileo@intel.com>
2017-12-19 13:48:29 -08:00
Matthew Johnson 4bf66cbc4e Change default python buildpattern to distutils3
Change default python buildpattern from distutils23 (both python2 and
python3) to distutils3 (python3 only). This is a step toward deprecating
python2 usage in distro packages. Any packages that rely on python2
should have "distutils23" added to the build_pattern configuration file
to maintain their python2 subpackage (or, preferrably, built with
python3 only as is default).

Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2017-12-19 12:10:56 -08:00
Matthew Johnson 9bb89743d4 Remove verbose flag for make line
Autospec does not parse the verbose output from make, so V=1 is not
necessary and slows down autospec build log parsing considerably. If
users want to debug a build at that level they should add the V=1 back
manually.

Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2017-12-14 15:11:50 -08:00
Leandro Dorileo af19c7e567 add new url pattern
Consider package names with an underscore separator.

Signed-off-by: Leandro Dorileo <leandro.maciel.dorileo@intel.com>
2017-12-14 14:50:03 -08:00
Matthew Johnson 4897e3974e Follow redirects from license server
Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2017-12-13 14:24:01 -08:00
Leandro Dorileo 28d7fb63c4 catkin: add the detected module (not only the pkgconfig)
We want to add a buildreq of the package providing the detected module'
pkgconfig (-lib/-dev), but, the package providing it will not install
the expected cmake files then make sure we also add it.

Signed-off-by: Leandro Dorileo <leandro.maciel.dorileo@intel.com>
2017-12-07 16:45:29 -08:00
Leandro Dorileo 04161a1c24 catkin: add one more catkin failure pattern
Signed-off-by: Leandro Dorileo <leandro.maciel.dorileo@intel.com>
2017-12-07 16:45:29 -08:00
Leandro Dorileo b0f8925c97 catkin: fix issue with CMakeLists.txt parsing
Only try to parse CMakeLists.txt (looking for catkin' deps) only if
the CMakeLists.txt being processed is in the root tarball dir or in
the cmake_srcdir directory. With this we prevent to detect
dependencies on undesired sub components.

Signed-off-by: Leandro Dorileo <leandro.maciel.dorileo@intel.com>
2017-12-07 16:45:29 -08:00
Gabi Beyer 77584ce991 Add README information for infile argument
Provide information ahout the infile parser to the README for a
better user experience.

Signed-off-by: Gabi Beyer <Gabib@live.com>
2017-12-06 15:02:32 -08:00
Patrick McCarty 834314211c Import new public key (Thomas Orgis)
This key is needed to verify the signature for 'mpg123' release
tarballs.

Signed-off-by: Patrick McCarty <patrick.mccarty@intel.com>
2017-12-05 09:01:10 -08:00
Patrick McCarty 9c5f24d17a Support spec %description section override
Resolves #34

In case the user wants to override the base package %description content
autodetected by autospec, add support for a config file named
"description" to provide the content instead.

Signed-off-by: Patrick McCarty <patrick.mccarty@intel.com>
2017-12-04 14:45:40 -08:00
Matthew Johnson 76a62e0c10 Print commitmessage as a string
commitmessage is a list and is being printed as a string representation
of a list. Join it to a string to the print looks sane.

Signed-off-by: Matthew Johnson <matthew.johnson@intel.com>
2017-12-01 14:22:33 -08:00
Patrick McCarty 52f5d0e2ea Add new public key from Andy Wingo
I verified that the fingerprint on this key matches the one listed on
PGP key servers.

Signed-off-by: Patrick McCarty <patrick.mccarty@intel.com>
2017-12-01 12:27:00 -08:00
Gabi Beyer 7da1d6c9e8 Add infile print statements
Add print statements with the INFILE header to show when a value
from the infile has been incorporated into the autospec build
of a package.

Signed-off-by: Gabi Beyer <gabib@live.com>
2017-11-30 09:07:19 -08:00
Gabi Beyer a904b9869a Logic to write bb tasks to files as comments
Bitbake files contain executable tasks like configure and install.
Additionally, some have operations like append and prepend with
the task names. Scrape these commands, perform the operations and
store them in the dictionary as appropriate.

Then, after updating the specfile, write these patterns, as
comments to their mapped file name.

Signed-off-by: Gabi Beyer <gabib@live.com>
2017-11-30 09:07:19 -08:00
Gabi Beyer 5d4644720c Add request requirement and pass infile dict
To use the infile_dict after the creation of the specfile, it
must be passed into the package function.

Also the requirement request for python is needed.

Signed-off-by: Gabi Beyer <gabib@live.com>
2017-11-30 09:07:19 -08:00
Gabi Beyer 5474ed39d1 fix make check for infile
Signed-off-by: Gabi Beyer <gabib@live.com>
2017-11-30 09:07:19 -08:00
Gabi Beyer 953dffd893 Move license to update sooner
Add the license from the recipe file to the spec licenses
prior to the specfile creation, so that tarball analysis
that does not find a license file will get one from the
bitbake file.

Signed-off-by: Gabi Beyer <gabib@live.com>
2017-11-30 09:07:19 -08:00
Gabi Beyer 0ef4314c4d scrape src url from bb and inc file
Get the source url to set the url if one is not passed into
autospec. This allows a user to use an infile file as the
source for the tarball, and prevents them having to manually
find the url. It also requires that the variable PV and ROS_SPN
are replaced with their correct strings (version and name,
respectively).

Changed the name of the infile_parsers.py file to infile_bb_parser
since it is specific to recipe files.

Have string read into lists and joined to fix spacing issues.

Signed-off-by: Gabi Beyer <gabib@live.com>
2017-11-30 09:07:19 -08:00
Gabi Beyer aef3399d10 Refactor to use multiple files and change inputs
Create 3 separate infile files, the infile_handler reads in the
inputs and determnes how to parse them. The --infile argument now
allows a url, file, or directory of files to be passed as the
input. The infile_handler determines that type of input, calls the
correct parser depending on the filetype, and calls the update to
the specfile.

The infile parsers contains the scraping and parsing for all file
types. Currently it scrapes both .bb and .inc files and stores the
data into one dictionary. Because these files are both for recipes
their data corresponds and the .inc file takes presedence.

The infile update spec file udpates aspects of the specfile that
have been scraped and stored into a dict from the infile parsers
file. If there exists a value for ROS_SPN in the .bb file, use that
when replace the ROS_SNP value in the replace PV function.

Signed-off-by: Gabi Beyer <gabib@live.com>
2017-11-30 09:07:19 -08:00
Gabi Beyer 07d0d53470 Add update license function and fix comments
Add comments to the update functions (summary, license, build
deps) within the funcion.

Add an update_license function that appends any licenses scraped
from the bb file to the autospec licenses list if they don't
already exist.

Also added unittests for functionality

Signed-off-by: Gabi Beyer <gabib@live.com>
2017-11-30 09:07:19 -08:00
Gabi Beyer bc7f5a8b51 Update dependencies in specfile from infile
The specfile dependencies are a set, so create a set from the
deps scraped from the bb file, union the two sets, and write
it to the specfile.

Signed-off-by: Gabi Beyer <gabib@live.com>
2017-11-30 09:07:19 -08:00
Gabi Beyer 0a1def5f0b Update specfile summary from infile file
If the specfile doesn't have a summary in the specfile, it
is overwritten by the summary provided by the bitbake recipe.

Signed-off-by: Gabi Beyer <gabib@live.com>
2017-11-30 09:07:19 -08:00
Gabi Beyer 8b0c5439e5 Initial commit for infile parser
Add --infile argument that takes a url, path, or directory
to a bitbake/recipe file. It scrapes the .bb/.inc file for
configuration data and stores it in a dictionary. This
architecture can be used for multiple file formats.

Also adds some initial unit tests for scraping functionality.

Signed-off-by: Gabi Beyer <gabib@live.com>
2017-11-30 09:07:19 -08:00
Caio Marcelo de Oliveira Filho 25724b09a1 Extra case for name/version extraction with GitHub
In this case, the project uses one GitHub repo to distribute different
packages. The existing extraction rules are not enough

Signed-off-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
2017-11-29 17:55:47 -08:00
561 changed files with 1924 additions and 194170 deletions
+5 -2
View File
@@ -43,8 +43,11 @@ test_test:
test_util:
PYTHONPATH=${CURDIR}/autospec python3 tests/test_util.py
test_autospec:
python3 tests/test_autospec.py -c ${CASES}
test_infile_parser:
PYTHONPATH=${CURDIR}/autospec python3 -m unittest discover -b -s tests -p 'test_infile_*'
test_general:
PYTHONPATH=${CURDIR}/autospec python3 tests/test_general.py
unittests:
PYTHONPATH=${CURDIR}/autospec coverage run -m unittest discover -b -s tests -p 'test_*.py' && coverage report
+55 -2
View File
@@ -61,10 +61,11 @@ Synopsis
usage: autospec.py [-h] [-g] [-n NAME] [-v VERSION]
[-a [ARCHIVES [ARCHIVES ...]]] [-l] [-b] [-c CONFIG]
[-t TARGET] [-i] [-p] [--non_interactive] [-C]
[--infile INFILE]
[url]
url (required) tarball URL (e.g.
http://example.com/downloads/mytar.tar.gz)
url (required - unless infile is passed) tarball URL
(e.g. http://example.com/downloads/mytar.tar.gz)
optional arguments:
-h, --help show this help message and exit
@@ -87,6 +88,8 @@ optional arguments:
attempt to verify package
-p, --prep-only Only perform preparatory work on package
--non_interactive Disable interactive mode for package verification
--infile INFILE Additional input to contribute to specfile creation.
Can be a url, directory of files, or a file.
-C, --cleanup Clean up mock chroot after building the package
@@ -110,6 +113,38 @@ constitutes a license definition, for example::
794a893e510ca5c15c9c97a609ce47b0df74fc1a, BSD-2-Clause
Infile option
=============
To provide additional build information for a package, a supplementary format
file may be used with the --infile command. The file is scraped and the data is
mapped to the appropriate location for the specfile build. A source URL is not
required when using the ``--infile`` argument, for it can be scraped from the
additional format file.
Supported format types:
Currently autospec supports recipe / bitbake (``.bb``) filetypes, and their
include directives (``.inc``)
Input type:
The --infile argument can parse a url to a file, a path to a directory of
files (that are the same format and support the same packages), or a path
to a file.
Variables included:
All variables, and commands are scraped from the format file, however not all
are added to the specfile build process. The following are incorporated into
the specfile build flow, unless they already exist:
* Source url - If a source url is not passed in, or already found, the tarball
used for building the package can be scraped from the infile.
* Summary
* Licenses
* Build dependencies
* Commands - These are appended to the associated files as comments
* ``configure``
* ``make_install_append``
Control files
==============
It is possible to influence precisely how autospec will behave in order to gain
@@ -193,10 +228,20 @@ make_args
The contents of this file are appended to the ``make`` invocation. This may be
useful for passing arguments to ``make``, i.e. ``make TOOLDIR=/usr``
make32_args
The contents of this file are appended to the ``make`` invocation of the 32bit
build. It is appended after the make_args content so 32bit specific overrides
can be added.
make_install_args
Much like ``make_args``, this will pass arguments to the ``make install``
macro in the ``.spec``
make32_install_args
Much like ``make32_args``, this will pass arguments to the ``make install``
macro in the ``.spec`` for the 32bit build. Again it is appended after
make_install_args so 32bit specific overrides can be added.
make_install_append
Additional actions that should take place after the ``make install`` step has
completed. This will be placed in the resulting ``.spec``, and is used for
@@ -282,6 +327,14 @@ make_check_command
This may be useful when a package uses a custom test suite, or requires
additional work/parameters, to work correctly.
Controlling miscellaneous spec metadata
---------------------------------------
description
Provides content for the %description section, overriding the content
autospec autodetects. This is useful if autospec cannot find proper content
for the description, if one wants to customize the content for better
presentation, etc.
Controlling flags and optimization
----------------------------------
+34 -6
View File
@@ -38,8 +38,10 @@ import commitmessage
import pkg_integrity
import specfiles
import pkg_scan
import infile_handler
import infile_update_spec
from util import print_fatal, binary_in_path, write_out
from util import print_fatal, binary_in_path, write_out, print_infile
from abireport import examine_abi
from logcheck import logcheck
@@ -103,7 +105,7 @@ def read_old_metadata():
if not os.path.exists(os.path.join(os.getcwd(), 'options.conf')):
return None, None, []
config_f = configparser.ConfigParser()
config_f = configparser.ConfigParser(interpolation=None)
config_f.read('options.conf')
if "package" not in config_f.sections():
return None, None, []
@@ -196,12 +198,30 @@ def main():
parser.add_argument("-C", "--cleanup", dest="cleanup", action="store_true",
default=False,
help="Clean up mock chroot after building the package")
parser.add_argument("--infile", action="store", dest="infile", default="",
help="type of input file for .specfile creation")
args = parser.parse_args()
name, url, archives = read_old_metadata()
name = args.name or name
url = args.url or url
archives = args.archives or archives
infile_dict = {}
if args.infile:
infile_dict = infile_handler.infile_reader(args.infile, name)
if not url:
try:
url = infile_dict.get('URL')
except:
pass
else:
print_infile("Source url found: {}".format(url))
if infile_dict.get("LICENSE"):
license.add_license(infile_dict.get("LICENSE"))
print_infile("License added: {}".format(infile_dict.get("LICENSE")))
if not url:
parser.error(argparse.ArgumentTypeError(
@@ -213,13 +233,13 @@ def main():
"even number of arguments"))
if args.prep_only:
package(args, url, name, archives, "./workingdir")
package(args, url, name, archives, "./workingdir", infile_dict)
else:
with tempfile.TemporaryDirectory() as workingdir:
package(args, url, name, archives, workingdir)
package(args, url, name, archives, workingdir, infile_dict)
def package(args, url, name, archives, workingdir):
def package(args, url, name, archives, workingdir, infile_dict):
check_requirements(args.git)
build.setup_workingdir(workingdir)
@@ -269,6 +289,12 @@ def package(args, url, name, archives, workingdir):
filemanager.load_specfile(specfile)
load_specfile(specfile)
#
# If infile is passed, parse it and overwrite the specfile configurations
# with the newly found values.
#
if args.infile:
specfile = infile_update_spec.update_specfile(specfile, infile_dict, args.target)
print("\n")
if args.integrity:
@@ -321,10 +347,12 @@ def package(args, url, name, archives, workingdir):
# record logcheck output
logcheck(build.download_path)
commitmessage.guess_commit_message()
commitmessage.guess_commit_message(pkg_integrity.IMPORTED)
if args.git:
git.commit_to_git(build.download_path)
else:
print("To commit your changes, run 'git commit -F commitmsg'")
if __name__ == '__main__':
+1
View File
@@ -103,6 +103,7 @@ def failed_pattern(line, pattern, verbose, buildtool=None):
must_restart += buildreq.add_buildreq('jdk-%s' % s)
elif buildtool == 'catkin':
must_restart += buildreq.add_pkgconfig_buildreq(s)
must_restart += buildreq.add_buildreq(s)
except:
if verbose > 0:
+40 -26
View File
@@ -224,6 +224,7 @@ def parse_cargo_toml(filename):
"""
global cargo_bin
buildpattern.set_build_pattern("cargo", 1)
add_buildreq("cargo")
add_buildreq("rustc")
with open(filename, "r", encoding="latin-1") as ctoml:
cargo = toml.loads(ctoml.read())
@@ -231,8 +232,9 @@ def parse_cargo_toml(filename):
cargo_bin = True
if not cargo.get("dependencies"):
return
for bdep in cargo["dependencies"]:
add_buildreq(bdep)
for cdep in cargo["dependencies"]:
if add_buildreq(cdep):
add_requires(cdep)
def set_build_req():
@@ -471,6 +473,38 @@ def add_setup_py_requires(filename):
pass
def parse_catkin_deps(cmakelists_file):
f = open(cmakelists_file, "r", encoding="latin-1")
lines = f.readlines()
pat = re.compile(r"^find_package.*\(.*(catkin)(?: REQUIRED *)?(?:COMPONENTS (?P<comp>.*))?\)$")
catkin = False
for line in lines:
match = pat.search(line)
if not match:
continue
# include catkin's required components
comp = match.group("comp")
if comp:
for curr in comp.split(" "):
add_pkgconfig_buildreq(curr)
catkin = True
# catkin find_package() function will always rely on CMAKE_PREFIX_PATH
# make sure we keep it consistent with CMAKE_INSTALL_PREFIX otherwise
# it'll never be able to find its modules
if catkin:
for curr in ["catkin", "catkin_pkg", "empy", "googletest"]:
add_buildreq(curr)
extra_cmake.add("-DCMAKE_PREFIX_PATH=/usr")
extra_cmake.add("-DCATKIN_BUILD_BINARY_PACKAGE=ON")
extra_cmake.add("-DSETUPTOOLS_DEB_LAYOUT=OFF")
def scan_for_configure(dirn):
"""
Scan the package directory for build files to determine build pattern
@@ -487,29 +521,9 @@ def scan_for_configure(dirn):
add_buildreq("cmake")
buildpattern.set_build_pattern("cmake", default_score)
with open(os.path.join(dirpath, "CMakeLists.txt"), "r", encoding="latin-1") as f:
lines = f.readlines()
pat = re.compile(r"^find_package.*\(.*(catkin)(?: REQUIRED *)?(?:COMPONENTS (?P<comp>.*))?\)$")
for line in lines:
match = pat.search(line)
if match:
# include catkin's required components
comp = match.group("comp")
if comp:
for curr in comp.split(" "):
add_pkgconfig_buildreq(curr)
for curr in ["catkin", "catkin_pkg", "empy", "googletest"]:
add_buildreq(curr)
# catkin find_package() function will always rely on CMAKE_PREFIX_PATH
# make sure we keep it consistent with CMAKE_INSTALL_PREFIX otherwise
# it'll never be able to find its modules
extra_cmake.add("-DCMAKE_PREFIX_PATH=/usr")
extra_cmake.add("-DCATKIN_BUILD_BINARY_PACKAGE=ON")
extra_cmake.add("-DSETUPTOOLS_DEB_LAYOUT=OFF")
break
srcdir = os.path.abspath(os.path.join(dirn, "clr-build", config.cmake_srcdir or ".."))
if os.path.samefile(dirpath, srcdir):
parse_catkin_deps(os.path.join(srcdir, "CMakeLists.txt"))
if "configure" in files and os.access(dirpath + '/configure', os.X_OK):
buildpattern.set_build_pattern("configure", default_score)
@@ -544,7 +558,7 @@ def scan_for_configure(dirn):
buildpattern.set_build_pattern("meson", default_score)
for name in files:
if name.lower() == "cargo.toml":
if name.lower() == "cargo.toml" and dirpath == dirn:
parse_cargo_toml(os.path.join(dirpath, name))
if name.lower().startswith("configure."):
parse_configure_ac(os.path.join(dirpath, name))
+5 -2
View File
@@ -218,7 +218,7 @@ def process_git(giturl, oldversion, newversion):
return shortlog
def guess_commit_message():
def guess_commit_message(keyinfo):
"""
guess_commit_message() parses newsfiles and determines a sane commit
message. The commit message defaults to the following for an updated
@@ -277,11 +277,14 @@ def guess_commit_message():
commitmessage.extend(sorted(list(cves)))
commitmessage.append("")
if keyinfo:
commitmessage.append("Key imported:\n{}".format(keyinfo))
util.write_out(os.path.join(build.download_path, "commitmsg"),
"\n".join(commitmessage) + "\n")
print("Guessed commit message:")
try:
print(commitmessage)
print("\n".join(commitmessage))
except:
print("Can't print")
+26 -5
View File
@@ -40,7 +40,9 @@ config_files = set()
parallel_build = " %{?_smp_mflags} "
urlban = ""
extra_make = ""
extra32_make = ""
extra_make_install = ""
extra_make32_install = ""
extra_cmake = ""
cmake_srcdir = ""
prep_append = []
@@ -50,6 +52,7 @@ disable_static = "--disable-static"
make_install_append = []
patches = []
autoreconf = False
custom_desc = ""
license_fetch = None
license_show = None
@@ -271,7 +274,9 @@ failed_pats = [
r".*:(.*):[jar|pom]+:.* has not been downloaded from it before.*", 0, 'maven'),
(r"\[WARNING\] The POM for .*:(.*):[jar|pom]+:.* is missing, no dependency information "
r"available", 0, 'maven'),
(r"^.*Could not find a package configuration file provided by \"(.*)\" with.*$", 0, 'catkin')]
(r"^.*Could not find a package configuration file provided by \"(.*)\".*$", 0, 'catkin'),
(r"^.*By not providing \"Find(.*).cmake\" in CMAKE_MODULE_PATH this.*$", 0, 'catkin'),
(r"^.*\"(.*)\" with any of the following names.*$", 0, 'catkin')]
def get_metadata_conf():
@@ -282,10 +287,11 @@ def get_metadata_conf():
metadata['name'] = tarball.name
if urlban:
metadata['url'] = re.sub(urlban, "localhost", tarball.url)
metadata['archives'] = re.sub(urlban, "localhost", " ".join(tarball.archives))
else:
metadata['url'] = tarball.url
metadata['archives'] = " ".join(tarball.archives)
metadata['archives'] = ' '.join(tarball.archives)
metadata['giturl'] = tarball.giturl
return metadata
@@ -294,7 +300,7 @@ def create_conf(path):
"""
Create options.conf file. Use deprecated configuration files or defaults to populate
"""
config_f = configparser.ConfigParser(allow_no_value=True)
config_f = configparser.ConfigParser(interpolation=None, allow_no_value=True)
# first the metadata
config_f['package'] = get_metadata_conf()
@@ -333,7 +339,7 @@ def read_config_opts(path):
if not os.path.exists(opts_path):
create_conf(path)
config_f = configparser.ConfigParser()
config_f = configparser.ConfigParser(interpolation=None)
config_f.read(opts_path)
if "autospec" not in config_f.sections():
print("Missing autospec section in options.conf")
@@ -352,7 +358,7 @@ def rewrite_config_opts(path):
"""
Rewrite options.conf file when an option has changed (verify_required for example)
"""
config_f = configparser.ConfigParser(allow_no_value=True)
config_f = configparser.ConfigParser(interpolation=None, allow_no_value=True)
config_f['package'] = get_metadata_conf()
config_f['autospec'] = {}
@@ -481,7 +487,9 @@ def parse_config_files(path, bump, filemanager):
global profile_payload
global config_opts
global extra_make
global extra32_make
global extra_make_install
global extra_make32_install
global extra_cmake
global cmake_srcdir
global prep_append
@@ -492,6 +500,7 @@ def parse_config_files(path, bump, filemanager):
global patches
global autoreconf
global yum_conf
global custom_desc
packages_file = None
@@ -664,10 +673,18 @@ def parse_config_files(path, bump, filemanager):
if content and content[0]:
extra_make = content[0]
content = read_conf_file(os.path.join(path, "make32_args"))
if content and content[0]:
extra32_make = content[0]
content = read_conf_file(os.path.join(path, "make_install_args"))
if content and content[0]:
extra_make_install = content[0]
content = read_conf_file(os.path.join(path, "make32_install_args"))
if content and content[0]:
extra_make32_install = content[0]
content = read_conf_file(os.path.join(path, "install_macro"))
if content and content[0]:
install_macro = content[0]
@@ -721,6 +738,8 @@ def parse_config_files(path, bump, filemanager):
profile_payload = read_conf_file(os.path.join(path, "profile_payload"))
custom_desc = read_conf_file(os.path.join(path, "description"))
def load_specfile(specfile):
"""
@@ -730,7 +749,9 @@ def load_specfile(specfile):
specfile.keepstatic = config_opts['keepstatic']
specfile.no_autostart = config_opts['no_autostart']
specfile.extra_make = extra_make
specfile.extra32_make = extra32_make
specfile.extra_make_install = extra_make_install
specfile.extra_make32_install = extra_make32_install
specfile.extra_cmake = extra_cmake
specfile.cmake_srcdir = cmake_srcdir or specfile.cmake_srcdir
specfile.prep_append = prep_append
+50
View File
@@ -628,3 +628,53 @@ sem_init
whether we can link with -static
if building for some Win32 platform
more warnings
x86_64-generic-linux-gnu-makeindex
x86_64-generic-linux-gnu-pdflatex
x86_64-generic-linux-gnu-egrep
x86_64-generic-linux-gnu-dvips
x86_64-generic-linux-gnu-latex
x86_64-generic-linux-gnu-dot
x86_64-generic-linux-gnu-perl
x86_64-generic-linux-gnu-doxygen
latex
dvips
whether more special flags are required for pthreads
Configure miss: whether to build with gcov testing
if compiler needs -Werror to reject unknown flags
pow
struct stat.st_mtimensec
struct statvfs.f_basetype
struct statvfs.f_fstypename
sys/audioio.h presence
valgrind/valgrind.h presence
valgrind/valgrind.h usability
whether C compiler handles -Werror -Wunknown-warning-option
whether self tests are run under valgrind
arc4random_buf
sys/ucred.h
sys/utime.h
valgrind/valgrind.h
struct statfs.f_fstypename
whether __argv is declared
whether <limits.h> defines MIN and MAX
whether C compiler accepts -Werror=unknown-warning-option
whether gcc is Clang
whether more special flags are required for pthreads
whether the C locale is free of encoding errors
winsock2.h
getpeereid
getpeerucred
whether wint_t is too small
xlocale.h usability
whether the linker accepts -Wl,-fatal_warnings
whether to build with code coverage support
xlocale.h presence
getexecname
getprogname
whether stdint.h predates C++11
xlocale.h
i686-generic-linux-gnu-pkg-config
i686-generic-linux-gnu-objdump
i686-generic-linux-gnu-dlltool
i686-generic-linux-gnu-mt
i686-generic-linux-gnu-strip
+6
View File
@@ -506,3 +506,9 @@ g-ir-scanner, gobject-introspection
get_mempolicy, numactl-dev
pcap_dump, libpcap-dev
ldap.h, openldap-dev
cargo, cargo
libaio.h, libaio-dev
boost/bind.hpp, boost-dev
sox.h, sox-dev
asciidoc, asciidoc
gpgconf, gnupg
+2
View File
@@ -56,6 +56,7 @@ def commit_to_git(path):
call("bash -c 'shopt -s failglob; git add -f *.sig'", check=False, stderr=subprocess.DEVNULL, cwd=path)
call("bash -c 'shopt -s failglob; git add -f *.sha256'", check=False, stderr=subprocess.DEVNULL, cwd=path)
call("bash -c 'shopt -s failglob; git add -f *.sign'", check=False, stderr=subprocess.DEVNULL, cwd=path)
call("bash -c 'shopt -s failglob; git add -f *.pkey'", check=False, stderr=subprocess.DEVNULL, cwd=path)
call("git add configure", check=False, stderr=subprocess.DEVNULL, cwd=path)
call("git add configure32", check=False, stderr=subprocess.DEVNULL, cwd=path)
call("git add configure64", check=False, stderr=subprocess.DEVNULL, cwd=path)
@@ -74,6 +75,7 @@ def commit_to_git(path):
call("git add options.conf", check=False, stderr=subprocess.DEVNULL, cwd=path)
call("git add configure_misses", check=False, stderr=subprocess.DEVNULL, cwd=path)
call("git add whatrequires", check=False, stderr=subprocess.DEVNULL, cwd=path)
call("git add description", check=False, stderr=subprocess.DEVNULL, cwd=path)
# remove deprecated config files
call("git rm use_clang", check=False, stderr=subprocess.DEVNULL, cwd=path)
+266
View File
@@ -0,0 +1,266 @@
#!/usr/bin/true
#
# infile_parser.py - part of autospec
# Copyright (C) 2017 Intel Corporation
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
import re
# TODO: VAR_append = "" _append same functionality as +=
operators_dict = {
"=": "{1}",
"=.": "{1}{0}",
".=": "{0}{1}",
":=": "{1}",
"=+": "{1} {0}",
"+=": "{0} {1}",
"??=": "{1}",
"?=": "{1}"
}
def scrape_version(bb_dict):
"""
Get the package version from the bb filename.
Return None if filename doesn't exist, or there is no version
within the filename. Otherwise, return the version.
"""
try:
return bb_dict.get('filename')[-1].split('_', 1,)[1].rsplit('.', 1)[0]
except:
return None
def replace_bb_variable_names(bb_dict):
"""
Replace bitbake variable name with values.
Bitbake files use various variable names defined by a string
surrounded by ${}.
Variables able for replacement:
- ${PV} with version
- ${ROS_SPN} with name, or actual value if defined in .bb
"""
def replace_var(bb_dict, val):
if bb_dict.get("VERSION"):
val = val.replace("${PV}", bb_dict.get('VERSION'))
if "ROS_SPN" in bb_dict:
val = val.replace("${ROS_SPN}", bb_dict.get("ROS_SPN"))
elif "NAME" in bb_dict:
val = val.replace("${ROS_SPN}", bb_dict.get('NAME'))
return val
for k, v in bb_dict.items():
if isinstance(v, list):
for i, j in enumerate(v):
v[i] = replace_var(bb_dict, j)
elif isinstance(v, str):
v = replace_var(bb_dict, v)
bb_dict[k] = v
def get_src_url(bb_dict):
"""
return the tarball url of the package source from the bb file
"""
if bb_dict.get('SRC_URI'):
bb_dict["URL"] = bb_dict.get("SRC_URI").split('\\')[0].split(';')[0]
def clean_values(value):
"""
Remove quotations and line continuations from values
"""
# remove beginning and end quote
value = value.strip('"')
# remove line continuations
value = value.replace("\\", "")
return value
def read_in_command(line, depth):
"""
Determines if a line is a part of a command.
If it returns a depth of 0, then the command has been read completely
from the file.
"""
for c in line:
if c == '{':
depth += 1
if c == '}' and depth > 0:
depth -= 1
if c != "\n":
continue
return depth
def pattern_match_regex():
"""
Compile the regular expression to determine the operation being used by
the line to perform the correct task on the variable.
Returns the match object from searching a string
for the correct pattern as: [key, operator, value].
"""
# escape operators for regex handling
operators = ["\\??\\=", "\\?\\=", "\\:\\=",
"\\+\\=", "\\=\\+", "\\.\\=",
"\\=\\.", "\\="]
# Split line to be [Key, operator, value] if in operators list
oper_pattern = r"(^[A-Z]+[_\-${}\[\]A-Za-z0-9]*)\s(" + '|'.join(
operators) + r")\s(\".*\")"
return re.compile(oper_pattern)
def evaluate_expr(op, cur_val, assignment):
"""
Using the operators_dict. get the correct value from the expression. This
function returns the syntactically correct value for the bb_dict key. For
example, if the op is "=", and the assignment is "value", the return will
be "value". However, if the op is "+=" and the cur_value is "first", and
the assignment is "second" this function will return the appending of
second to first: "first second".
:param op: The operation (The key from the operators_dict)
:param cur_val: The current value of the key within in the bb_dict
:param assignment: The new value from the line that will be assigned to the
bb_dict key.
"""
if not cur_val:
return assignment
return operators_dict.get(op).format(cur_val, assignment)
def write_to_dict(bb_dict, m):
"""
Store the correct information to the bb_dict that is correctly parsed from
the bitbake file. This function uses the "evaluate_expr" function heavily
to ensure that the values are correctly parsed.
"""
if len(m.groups()) == 3:
key = m.group(1)
value = clean_values(m.group(3))
op = m.group(2)
#
# ??= is the weakest variable assignment, so if that variable already
# has an assignment, do not overwrite it. = has the highest precedence
# and ?= is between the two.
#
if key in bb_dict and op == "??=":
return bb_dict
elif key in bb_dict and op == "?=":
if not isinstance(bb_dict[key], list):
return bb_dict
if key in bb_dict and isinstance(bb_dict[key], list):
v = bb_dict[key]
del [v[1]]
bb_dict[key] = "".join(v)
try:
bb_dict[key] = evaluate_expr(op, bb_dict.get(key), value)
if op == "??=":
bb_dict[key] = [bb_dict[key], 1]
except AttributeError as error:
print("Missing operation functionality: {}".format(error))
return bb_dict
def bb_scraper(bb_fp, bb_dict):
"""
Scrapes data from a filepointer (to a bitbake or .inc file) and stores
the values in a dictionary.
"""
bb_dict["VERSION"] = scrape_version(bb_dict)
bb_dict["inherits"] = []
# compile the regex once, prior to the line parsing for faster searching
line_regex = pattern_match_regex()
for line in bb_fp:
line = line.strip()
if not line or line.startswith('#'):
continue
# If line is a command, create array of command lines
# TODO: command could be python code
if line.startswith('do_'):
cmd_name = line.split('()')[0].strip()
cmd = []
depth = 0
while 1:
depth = read_in_command(line, depth)
if line:
cmd.append("# " + line)
if depth == 0:
break
else:
line = next(bb_fp).strip()
# Remove the 'do_command {' and '}' from the list, so that
# the dict value is a list of the commands.
if cmd[0].startswith("# " + cmd_name) and cmd[-1] == '# }':
cmd = cmd[1:-1]
# Some bitbake files have tasks with prepend or append operations.
# Perform the logic to store all tasks with the same 'core' command
# name in the dictionary.
if not bb_dict.get(cmd_name):
bb_dict[cmd_name] = cmd
elif cmd_name.rsplit('_') == 'prepend':
cmd.extend(bb_dict.get(cmd_name))
bb_dict[cmd_name] = cmd
else:
bb_dict.get(cmd_name).extend(cmd)
continue
# If a line continuation, create a string that can easily be split
# by '\' for src_uri and other variables.
elif line[-1] == '\\':
lines = []
while 1:
lines.append(line)
line = next(bb_fp).strip()
if line[-1] != '\\':
lines.append(line)
break
line = " ".join(lines)
if line.startswith('inherit'):
bb_dict['inherits'].append(line.split(maxsplit=1)[1])
continue
match = line_regex.search(line)
if match:
bb_dict = write_to_dict(bb_dict, match)
get_src_url(bb_dict)
replace_bb_variable_names(bb_dict)
return bb_dict
+149
View File
@@ -0,0 +1,149 @@
#!/usr/bin/true
#
# infile_parser.py - part of autospec
# Copyright (C) 2017 Intel Corporation
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
import os
import re
import requests
import tempfile
from urllib.request import urlretrieve
import util
import infile_bb_parser
# filetypes and their parse order (lower parsed first)
parsable_filetypes = {'.inc': 1, '.bb': 2}
def parse_ext(path):
"""
Gets the extension of a file and determines if the filetype can be handled
by the infile_parser. If so, it returns the extension. If not, it returns
nothing, which will cause the file_handler to return and infile parsing
will NOT be used on that file.
"""
ext = os.path.splitext(path)[1]
if ext not in parsable_filetypes:
util.print_warning("Cannot parse infile \"{}\" type. From input: {}."
" \nContinuing with the execution of "
"autospec".format(ext, path))
return None
return ext.lstrip('.')
def check_url_content(url):
"""
Check that the url to the infile file is raw or in plaintext.
This function checks the header content-type for a request to the infile
url. If it is html it converts eith a github url to point to the raw file,
a git url to point to the plaintext file, or returns None with a statement
that the file must be in plaintext or raw.
"""
if "text/html" in requests.head(url).headers['content-type']:
if re.match(r'^(http)s?://github.com(.*)', url):
url = url.replace("github", "raw.githubusercontent").replace("blob/", "")
elif 'git' in url and "/tree/" in url:
url = url.replace("/tree/", "/plain/", 1)
else:
util.print_fatal("infile url has an html content-type, "
"please use plaintext.")
return None
return url
def sort_files(x):
"""
Sorts files depending on their priority in the parsable_filetypes dict.
"""
return parsable_filetypes.get(os.path.splitext(x)[1])
def parse_infile(bb_fp, output_dict, parse_type):
"""
Depending on the type of file, scrape and parse the infile file returning
the dictionary of collected data.
"""
if parse_type == "bb":
return infile_bb_parser.bb_scraper(bb_fp, output_dict)
elif parse_type == "inc":
return infile_bb_parser.bb_scraper(bb_fp, output_dict)
def file_handler(indata, output_dict):
"""
This function determines whether the input is a file or a url. If it is a
url it checks that it is in the correct format (plaintext), downloads the
url to a temporary file and passes the file handler to be scraped.
If the input is a file, then it opens the file and passes the handler to
be scraped.
The type of parsing bitbake, inc, deb, etc is based on the file extension.
"""
# If ext is not parsable, return from using infile parser on that file.
parse_type = parse_ext(indata)
if not parse_type:
return
if output_dict.get('filename'):
output_dict['filename'].append(indata)
else:
output_dict['filename'] = [indata]
if not os.path.isfile(indata):
# check that input is plain or raw text and not html
indata = check_url_content(indata)
with tempfile.NamedTemporaryFile() as tmpfile:
try:
tmp, _ = urlretrieve(indata, tmpfile.name)
with open(tmp, 'r') as bb_fp:
output_dict = parse_infile(bb_fp, output_dict, parse_type)
except Exception as e:
util.print_warning("Infile was unable to be parsed with the "
"error: \"{}\". \nContinuing with the "
"execution of autospec.".format(e))
else:
with open(indata, 'r') as bb_fp:
output_dict = parse_infile(bb_fp, output_dict, parse_type)
return output_dict
def infile_reader(indata, name):
"""
The infile parser can take 3 different inputs:
A url to a file
A directory with multiple files or urls
A path or filename
Each file in the directory should scraped to the same dictionary instance.
"""
output_dict = {"NAME": name}
if os.path.isdir(indata):
files = [f for f in os.listdir(indata) if os.path.isfile(
os.path.join(indata, f)) and not f.startswith('.')]
for f in sorted(files, key=sort_files):
output_dict = file_handler(os.path.join(indata, f), output_dict)
else:
output_dict = file_handler(indata, output_dict)
return output_dict
+101
View File
@@ -0,0 +1,101 @@
#!/usr/bin/true
#
# infile_parser.py - part of autospec
# Copyright (C) 2017 Intel Corporation
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
import re
import os
from util import print_infile
cmd_mappings = {
"do_configure": "configure",
"do_configure_prepend": "configure",
"do_configure_append": "configure",
"EXTRA_OECONF": "configure",
"do_install": "make_install_append",
"do_install_append": "make_install_append",
"do_install_prepend": "make_install_append"
}
def update_summary(bb_dict, specfile):
"""
Updates the default summary to the summary or description scraped from
the bitbake file. The bitbake "SUMMARY" variable is first priority,
then the "DESCRIPTION" variable. If neither exist, set set it back to the
specfile value.
"""
specfile.default_sum = bb_dict.get("SUMMARY") or \
bb_dict.get("DESCRIPTION") or specfile.default_sum
if specfile.default_sum == bb_dict.get("SUMMARY") or \
specfile.default_sum == bb_dict.get("DESCRIPTION"):
print_infile("Summary updated: {}".format(specfile.default_sum))
def update_licenses(bb_dict, specfile):
"""
The specfile contains a list of licenses for a package, if the bitbake
license is not included in that list, add it.
"""
if "LICENSE" in bb_dict:
if bb_dict.get("LICENSE").lower() not in [l.lower() for l in specfile.licenses]:
specfile.licenses.append(bb_dict.get("LICENSE"))
print_infile("License added: {}".format(bb_dict.get("LICENSE")))
def update_build_deps(bb_dict, specfile):
"""
Add build dependencies to the buildreq set, if the bb_dict scraped build
time dependencies.
"""
if bb_dict.get('DEPENDS'):
for dep in bb_dict.get('DEPENDS').split():
dep = re.match(r"(\$\{PYTHON_PN\}\-)?([a-zA-Z0-9\-]+)", dep).group(2)
if dep.endswith('-native'):
dep = dep[:-7]
specfile.buildreqs.add(dep)
print_infile("Build dependency added: {}".format(dep))
def write_cmd_files(bb_dict, dirname):
"""
Append "do_" task commands that are scraped from the bitbake file(s). Some
of these commands have append/prepend. These operations are performed
prior to being added to the dict. This function appends all commands to
as comments to their mapped file within the target directory.
"""
for cmd_name, cmd in bb_dict.items():
if cmd_name.startswith("do_"):
filename = os.path.join(dirname, cmd_mappings.get(cmd_name))
with open(filename, 'a') as cmdfp:
cmdfp.write("# Infile parser added the following lines:\n")
cmdfp.write("\n".join(cmd) + "\n")
print_infile("Suggestions added to the {} file".format(
cmd_mappings.get(cmd_name)))
def update_specfile(specfile, bb_dict, dirname):
update_summary(bb_dict, specfile)
update_licenses(bb_dict, specfile)
update_build_deps(bb_dict, specfile)
write_cmd_files(bb_dict, dirname)
return specfile
+122
View File
@@ -0,0 +1,122 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
=si8t
-----END PGP PUBLIC KEY BLOCK-----
+58
View File
@@ -0,0 +1,58 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
NjgXDBwVxd03KA==
=mpsA
-----END PGP PUBLIC KEY BLOCK-----
+30
View File
@@ -0,0 +1,30 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQENBFoEpHwBCACtBZaIiL+t7OdYJPMBjgOpfEA275KujTwJwriC3HI7h+mdgR+i
zDf95SeJjvMDj0E14yj+wEDEwdsCxwf37l7Giu4ni5ZMrubj9zJ+/vMBo7aD7oZz
dfbFGn1dj6opOFi4HbyraXtDN+5pfLgYP+yXu4opcV73lIeIG8KiGmEspei6XF6Q
NByH53SKD72EqQCA4OgZjOu26TE2qS10owyqsWxY02z/onIM8g+ejJ8feCqbQlVy
k8X1lk8bzg8IaWKlhn0PTlLUakcQo6YGMloYatq3abTDMhSwtQgy6iX7kvZtcH6e
wD1HpwsTNNsmn3U+mHNpXkIJ/dz41vvDId2zABEBAAG0LVdpbGxpYW0gRG91Z2xh
cyA8d2lsbGlhbS5yLmRvdWdsYXNAZ21haWwuY29tPokBPwQTAQgAKRYhBIk6+9Bc
CBSgLFcnSWRrTDdJ0gjyBQJaBKR8AhsDBQkDwmcAAheAAAoJEGRrTDdJ0gjyV4kI
AJ2qInQXQYcJ+nWkRWDwHf0RYaIGOWqrHC2WK948M3Whldgzpa4e+ubsjKmsBPQ7
2PduJ+BjUjlBwrdgLsTJO3I1w9cMKUZcgKkm6FY/goKdqpjG9i/LeBpCLNnwlNgb
Eql1m6urpMRwcHP2ndWEWdUz5CTRB3Cnvj6yVXJPxxa8GDzES6UDzufzFPkFmEbV
fs9PzYLELBkXqFJLdXJaYI8f46tkuFdQ0+Z4/a2VljVSSWgNzMU2I/N6cThxR9Qs
KfNAnasGqi2o3CJzBRFKEa7tNsOMlP+ffuZJ5+IuhMEsF1CVl6Owa8LkR2B+dg5m
dwVUdvZxchj5Sb8x1KtJ6cy5AQ0EWgSkfAEIAPB8ZilP3/DgoQL0EA+bfgUXqdkv
LHnAPv4TILVw6BmBBgfyV/BTEXygRQL1DurTQv32O3hs2cdXZ+6VYBoW+fFm61ZC
dRT7mMpVdMki00hDJfVVIfYOKqmGW+BVH+S5200dI+WVqt1D0tDHPO+9iz662F1v
8UVK0i2nn/N066nKxA6fOhOF8d4FTel7ksllDKM418ZZUuxuIk9H9Pi6Y4NhfTLP
KQdcqG75zyfqPNmOmFlSk7U7NQaR/eQHpCVHORKBQN3brrG/EPp5yp8B04weRbmE
wKX53N50b823oD1EYdxt9b3YGaJzEdcf6c2j0Vm385eN/sTbaRbfNK75kJEAEQEA
AYkBPAQYAQgAJhYhBIk6+9BcCBSgLFcnSWRrTDdJ0gjyBQJaBKR8AhsMBQkDwmcA
AAoJEGRrTDdJ0gjywIQH/2kdIO3ncszs6Pn3RJJ69xuP8ApUJEhHZL7KDRnnNP9I
rXfMS99o77cRfpEWLt3Bv18UFED4wRKfz2wfaSZq8idyBfgg7BnHjSmsdBxT5YsR
FYVMGYQN+Y19h6xu30Da4n5OCyouatnuuY1MDa4VfYQQy4WXVal/EMeWhIcjTl8Z
7H/bl3FSEMpUAF0aHvHjLNm58aay3C92YutPTWL21OB9ugwacphfl3BJ03Z2yF6x
thlMwZCr1Cub8bfomTNsoqLHS2Ou6NLplqeCnT7wt07mGTNR847J4caATwmLfAVq
8fQ93zpI0a66aR1Kx3zNF5gftkM+TcnWzQ4yg2QYTuI=
=aQ8U
-----END PGP PUBLIC KEY BLOCK-----
+84
View File
@@ -0,0 +1,84 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
S17sbZHmc5T5UpnEcKg=
=o7cj
-----END PGP PUBLIC KEY BLOCK-----
+38
View File
@@ -0,0 +1,38 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
xi8zPaYysXKMXAg4WyKoAKeZgQPQV9TNYg==
=Os1/
-----END PGP PUBLIC KEY BLOCK-----
+30
View File
@@ -0,0 +1,30 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQENBFnWnPwBCADaOcYK2oersBkoe0MxahLagZk7tZzMUHeFjHDz42uaiUINJAsq
dFdt1KlRPvGLyuUY7s6oY7YQ1Sxyijihfqett4dkQKkWcToHM9BJuq2Gte0ewzj9
imhyZm96dItytsh7tp1jk3FbMPNqlbKOHe9Sk9S+iQPdStfYIApdYwBUBNq+tQj1
+n3yWtAAKtvv+/AjlzKSWVr4ei5RxJwgFXVYtMyM18VblEbvB4ZEZZ0pjQhGgZXJ
msVtk+B9YpXkU5GJrVb0s9T1dx0f0OD3/HtWjjKHvrhOIKTmLVsjWsiraKrUWmcC
7ojclDLnqxetfETd0XEs+HUQ2wuSRI7y+iyRABEBAAG0K01hdHRoZXcgSm9obnNv
biA8bWF0dGhldy5qb2huc29uQGludGVsLmNvbT6JAT8EEwEIACkWIQQSLdi6pNRS
OcgqXITU0PX06UgvvgUCWdac/AIbAwUJA8JnAAIXgAAKCRDU0PX06UgvvrK+B/9h
4/1X1yku5Rhboj6xiJaWjqwlTBdp2gN09QygY9BNYSINUzUl0qKSxPJizhs5HNmT
B6Fn5pkcre9tG/uRQ5hsgYfAZJw/ckrtC/lfZc8PbrPFjd5d6fFp3RceyB97sgR0
CIhKWkhNgwpCkM72DPJxSe2RmED1sK3tVGDaZuuL9cz8JpEr5QpXDivq9ZSQn0hf
arDciM/83xuZzLLrXF0SPQgVx0W9ofo+piR8t0a5IvX0NC4eH0LqqNSsmSgypHMY
xqGjK+4pa3AuiDkhZ8/CX9dNX0lXAJinnOZNPLq92dMo1wzktiJ5C3UZN30E7hV2
ny8SQG2C6tlWwkf0bon3uQENBFnWnPwBCADbee/g7x7hxkYE0CWVHI77bkHkIotp
Snxe/O7Wszc5hU5LjI72FD4wLAodmKGl1tvY/G7YiLQPzE71/u7x8RbemIpMbKsv
ZpNYGp/SE3gpG0rbVI4RnTE25a5nXzV4NxxBwqX5J0bMrwjAgvRLpencUupWTVFB
G1N9fbU8WGbdpNMJqG529v3Y8lE7fbMD68C9ILVG0C32M2Eo3ZJ1W3oiyQe7ROAD
ZJ6A4yj4WFtVpoYdDVguotz+3LQk17hmpcJe6QH4nELsQq9Yqsc3/WIhTf+gmgJ/
PiwD9UiQk5AngJX9UvLWwTFrbXJL3wwcOUKOoBVu2W677otacfy/fXbxABEBAAGJ
ATwEGAEIACYWIQQSLdi6pNRSOcgqXITU0PX06UgvvgUCWdac/AIbDAUJA8JnAAAK
CRDU0PX06UgvvmvHB/wLgqkm1EOGsYRWg1hHDFmKMP4Q59NPhnZWI7oxgWxXmkxK
xYjwHL6JHiSbYRzBobselKOatnOdcCYdqv7ezgmo7f5zVnU66r8DcOZgAzBu3SPm
Mhc2cx3GQThMToJT2fB2P8Dy2LO1LUHLtMCO2tv32433L3pp7N/h3HUcWlSMSjCe
kYPCDo/ImyJJ9eu4kw8Cv3QptBlLRo9yKOnwzXqlpV3cnm4R0+3tviRsuKE8R/sv
925xkdvX4UAtN0ijdTfeOn46Wn9eFfoT/LJ5V+zf9DGn0fxRxCkGaj26dnkbW5Cy
nI+IjoGoK+JTOE2LwxqP97UFPekDC9+Y+f7DVuqM
=VB1i
-----END PGP PUBLIC KEY BLOCK-----
+1
View File
@@ -72,6 +72,7 @@ def license_from_copying_hash(copying):
c.setopt(c.URL, config.license_fetch)
c.setopt(c.WRITEDATA, buffer)
c.setopt(c.POSTFIELDS, data)
c.setopt(c.FOLLOWLOCATION, 1)
try:
c.perform()
except Exception as excep:
+46 -25
View File
@@ -45,9 +45,9 @@ RUBYORG_API = "https://rubygems.org/api/v1/versions/{}.json"
PYPIORG_API = "https://pypi.python.org/pypi/{}/json"
KEYID_TRY = ""
KEYID = ""
IMPORTED = ""
EMAIL = ""
GNUPGCONF = """keyserver keys.gnupg.net"""
PUBKEY_PATH = '/'.join([os.path.dirname(os.path.abspath(__file__)), "keyring", "{}.pkey"])
CMD_TIMEOUT = 20
ENV = os.environ
INPUT_GETTER_TIMEOUT = 60
@@ -130,10 +130,20 @@ class GPGCli(object):
def display_keyinfo(self, keyfile):
args = self.args + ['--list-packet', keyfile]
output, err, code = self.exec_cmd(args)
if code == 0:
return None, output.decode('utf-8')
return GPGCliStatus(err.decode('utf-8')), None
lp, err, code = self.exec_cmd(args)
if code != 0:
return GPGCliStatus(err.decode('utf-8')), None
# trim list-packet output to 10 lines
lp = "--list-packet:\n" + "\n".join(lp.decode("utf-8").split("\n")[:10])
args = self.args + ['--fingerprint', os.path.basename(keyfile.replace(".pkey", ""))]
fp, err, code = self.exec_cmd(args)
if code != 0:
return GPGCliStatus(err.decode('utf-8')), None
fp = "--fingerprint:\n" + fp.decode("utf-8")
return None, "{}\n\n{}".format(lp, fp)
@contextmanager
@@ -205,7 +215,6 @@ def head_request(url):
curl.setopt(curl.URL, url)
curl.setopt(curl.CUSTOMREQUEST, "HEAD")
curl.setopt(curl.NOBODY, True)
curl.setopt(curl.FOLLOWLOCATION, True)
curl.setopt(curl.TIMEOUT, 5)
curl.perform()
http_code = curl.getinfo(pycurl.HTTP_CODE)
@@ -431,11 +440,12 @@ class GPGVerifier(Verifier):
# <package directory>/<key url basename>
self.package_sign_path = os.path.join(os.path.dirname(self.package_path),
os.path.basename(self.key_url))
def get_pubkey_path(self):
keyid = get_keyid(self.package_sign_path)
if keyid:
return PUBKEY_PATH.format(keyid)
# default pubkey path is the package directory - this is where imports
# will go
self.pubkey_path = os.path.join(os.path.dirname(self.package_path), "{}.pkey")
# fallback to autospec repo for global keyring
self.fallback_pubkey_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),
"keyring", "{}.pkey")
def get_sign(self):
code = self.download_file(self.key_url, self.package_sign_path)
@@ -459,17 +469,27 @@ class GPGVerifier(Verifier):
self.print_result(False, err_msg='{} is not a GPG signature'.format(self.package_sign_path))
os.unlink(self.package_sign_path)
return None
pub_key = self.get_pubkey_path()
EMAIL = parse_key(pub_key, r':user ID packet: ".* <(.+?)>"\n')
if not pub_key or os.path.exists(pub_key) is False:
key_id = get_keyid(self.package_sign_path)
self.print_result(False, 'Public key {} not found in keyring'.format(key_id))
if self.interactive is True and recursion is False and attempt_key_import(key_id):
print(SEPT)
return self.verify(recursion=True)
return None
sign_status = verify_cli(pub_key, self.package_path, self.package_sign_path)
if sign_status is None:
# valid signature exists at package_sign_path, operate on it now
keyid = get_keyid(self.package_sign_path)
# default location first
pubkey_loc = self.pubkey_path.format(keyid)
if not os.path.exists(pubkey_loc):
print_info("public key not in default keyring, checking fallback keyring")
# no pubkey at default location, fallback to global
pubkey_loc = self.fallback_pubkey_path.format(keyid)
if not os.path.exists(pubkey_loc):
# still nothing, attempt interactive if set to do so
self.print_result(False, 'Public key {} not found in keyring'.format(keyid))
if not self.interactive or recursion:
return None
if attempt_key_import(keyid, self.pubkey_path.format(keyid)):
print(SEPT)
return self.verify(recursion=True)
return None
# public key exists or is imported, verify
EMAIL = parse_key(pubkey_loc, r':user ID packet: ".* <(.+?)>"\n')
sign_status = verify_cli(pubkey_loc, self.package_path, self.package_sign_path)
if not sign_status:
if config.old_keyid:
compare_keys(KEYID_TRY, config.old_keyid)
self.print_result(self.package_path)
@@ -586,7 +606,8 @@ class InputGetter(object):
return inpt
def attempt_key_import(keyid):
def attempt_key_import(keyid, key_fullpath):
global IMPORTED
print(SEPT)
ig = InputGetter('\nDo you want to attempt to import keyid {}: (y/N) '.format(keyid))
import_key_answer = ig.get_answer()
@@ -600,7 +621,6 @@ def attempt_key_import(keyid):
err, key_content = ctx.export_key(keyid)
if err is not None:
print_error(err.strerror)
key_fullpath = PUBKEY_PATH.format(keyid)
util.write_out(key_fullpath, key_content)
print('\n')
print_success('Public key id: {} was imported'.format(keyid))
@@ -609,9 +629,10 @@ def attempt_key_import(keyid):
print_error('Unable to parse {}, will be removed'.format(key_fullpath))
os.unlink(key_fullpath)
return False
print('\n', '\n'.join(content.split('\n')[:10]))
print("\n", content)
ig = InputGetter(message='\nDo you want to keep this key: (Y/n) ', default='y')
if ig.get_answer() is True:
IMPORTED = content
return True
else:
os.unlink(key_fullpath)
+4 -1
View File
@@ -295,4 +295,7 @@ def load_specfile(specfile):
Load specfile with parse results
"""
specfile.default_sum = default_summary
specfile.default_desc = default_description
if config.custom_desc:
specfile.default_desc = "\n".join(config.custom_desc)
else:
specfile.default_desc = default_description
+23 -14
View File
@@ -57,7 +57,9 @@ class Specfile(object):
self.default_pattern = ""
self.autoreconf = False
self.extra_make = ""
self.extra32_make = ""
self.extra_make_install = ""
self.extra_make32_install = ""
self.tarball_prefix = ""
self.gcov_file = ""
self.rawname = ""
@@ -158,6 +160,8 @@ class Specfile(object):
self.sources["tmpfile"] +
self.sources["gcov"])):
self.source_index[source] = count + 1
if self.urlban:
source = re.sub(self.urlban, "localhost", source)
self._write("Source{0} : {1}\n".format(count + 1, source))
# if package is verified, include the signature in the source tarball
@@ -357,13 +361,16 @@ class Specfile(object):
self._write_strip("export https_proxy=http://127.0.0.1:9/")
self._write_strip("export no_proxy=localhost,127.0.0.1,0.0.0.0")
def write_make_line(self):
def write_make_line(self, build32=False):
"""
Write make line to spec file
make V=1 <config.parallel_build> <extra_make>
make <config.parallel_build> <extra_make>
"""
self._write_strip("make V=1 {}{}".format(config.parallel_build, self.extra_make))
if build32:
self._write_strip("make {}{}{}".format(config.parallel_build, self.extra_make, self.extra32_make))
else:
self._write_strip("make {}{}".format(config.parallel_build, self.extra_make))
def write_prep(self, ruby_pattern=False):
"""Write prep section to spec file"""
@@ -503,7 +510,8 @@ class Specfile(object):
if config.config_opts['32bit']:
self._write_strip("pushd ../build32/" + self.subdir)
self._write_strip("%make_install32 " + self.extra_make_install)
self._write_strip("%make_install32 {} {}".format(self.extra_make_install,
self.extra_make32_install))
self._write_strip("if [ -d %{buildroot}/usr/lib32/pkgconfig ]")
self._write_strip("then")
self._write_strip(" pushd %{buildroot}/usr/lib32/pkgconfig")
@@ -555,7 +563,8 @@ class Specfile(object):
if config.config_opts['32bit']:
self._write_strip("pushd clr-build32")
self._write_strip("%make_install32 " + self.extra_make_install)
self._write_strip("%make_install32 {} {}".format(self.extra_make_install,
self.extra_make32_install))
self._write_strip("if [ -d %{buildroot}/usr/lib32/pkgconfig ]")
self._write_strip("then")
self._write_strip(" pushd %{buildroot}/usr/lib32/pkgconfig")
@@ -690,7 +699,7 @@ class Specfile(object):
.format(self.disable_static,
config.extra_configure,
config.extra_configure32))
self.write_make_line()
self.write_make_line(True)
self._write_strip("popd")
if config.config_opts['use_avx2']:
@@ -755,7 +764,7 @@ class Specfile(object):
.format(self.disable_static,
config.extra_configure,
config.extra_configure32))
self.write_make_line()
self.write_make_line(True)
self._write_strip("popd")
if config.config_opts['use_avx2']:
@@ -827,7 +836,7 @@ class Specfile(object):
.format(self.disable_static,
config.extra_configure,
config.extra_configure32))
self.write_make_line()
self.write_make_line(True)
self._write_strip("popd")
self.write_check()
self.write_make_install()
@@ -1000,7 +1009,7 @@ class Specfile(object):
self._write_strip("\nmake clean\n")
self._write_strip("{0}".format(self.get_profile_use_flags()))
self._write_strip("make VERBOSE=1 {}{}".format(config.parallel_build, self.extra_make))
self._write_strip("make {}{}".format(config.parallel_build, self.extra_make))
self._write_strip("popd")
if config.config_opts['32bit']:
@@ -1010,13 +1019,13 @@ class Specfile(object):
self._write_strip('export PKG_CONFIG_PATH="/usr/lib32/pkgconfig"')
self._write_strip('export CFLAGS="$CFLAGS -m32"')
self._write_strip('export CXXFLAGS="$CXXFLAGS -m32"')
self._write_strip('cmake " + self.cmake_srcdir + " -G "Unix Makefiles" '
self._write_strip('cmake ' + self.cmake_srcdir + ' -G "Unix Makefiles" '
"-DCMAKE_INSTALL_PREFIX=/usr -DBUILD_SHARED_LIBS:BOOL=ON "
"-DLIB_INSTALL_DIR:PATH=/usr/lib32 "
"-DCMAKE_AR=/usr/bin/gcc-ar "
"-DLIB_SUFFIX=32 "
"-DCMAKE_RANLIB=/usr/bin/gcc-ranlib " + self.extra_cmake)
self._write_strip("make VERBOSE=1 {}{}".format(config.parallel_build, self.extra_make))
self._write_strip("make {}{}".format(config.parallel_build, self.extra_make))
self._write_strip("popd")
if config.config_opts['use_avx2']:
@@ -1028,12 +1037,12 @@ class Specfile(object):
self.need_avx2_flags = saved_avx2flags
self._write_strip('export CFLAGS="$CFLAGS -march=haswell"')
self._write_strip('export CXXFLAGS="$CXXFLAGS -march=haswell"')
self._write_strip('cmake " + self.cmake_srcdir + " -G "Unix Makefiles" '
self._write_strip('cmake ' + self.cmake_srcdir + ' -G "Unix Makefiles" '
"-DCMAKE_INSTALL_PREFIX=/usr -DBUILD_SHARED_LIBS:BOOL=ON "
"-DLIB_INSTALL_DIR:PATH=/usr/lib/haswell "
"-DCMAKE_AR=/usr/bin/gcc-ar "
"-DCMAKE_RANLIB=/usr/bin/gcc-ranlib " + self.extra_cmake)
self._write_strip("make VERBOSE=1 {}{} || :".format(config.parallel_build, self.extra_make))
self._write_strip("make {}{} || :".format(config.parallel_build, self.extra_make))
self._write_strip("popd")
self._write_strip("\n")
@@ -1043,7 +1052,7 @@ class Specfile(object):
def write_cargo_pattern(self):
"""Write cargo build pattern to spec file"""
self.write_prep()
src_dir = "/usr/share/rust/src/{0}-{1}".format(self.name, self.version)
src_dir = "/usr/share/rust/src/{0}".format(self.name)
self._write_strip("%build")
self.write_proxy_exports()
self._write_strip("mkdir .cargo")
+19 -4
View File
@@ -190,7 +190,7 @@ def download_tarball(target_dir):
tarfile = os.path.basename(url)
target = os.path.join(os.getcwd(), name)
if os.path.exists(os.path.join(os.getcwd(), 'options.conf')):
config_f = configparser.ConfigParser()
config_f = configparser.ConfigParser(interpolation=None)
config_f.read('options.conf')
if "package" in config_f.sections():
if (config_f["package"].get("name") == name or
@@ -259,9 +259,8 @@ def detect_build_from_url(url):
# python
if "pypi.python.org" in url or "pypi.debian.net" in url:
buildpattern.set_build_pattern("distutils23", 10)
buildpattern.set_build_pattern("distutils3", 10)
buildreq.add_buildreq("python3-dev")
buildreq.add_buildreq("python-dev")
# cpan
if ".cpan.org/" in url or ".metacpan.org/" in url:
@@ -275,6 +274,10 @@ def detect_build_from_url(url):
if ".maven." in url:
buildpattern.set_build_pattern("maven", 10)
# rust crate
if "crates.io" in url:
buildpattern.set_build_pattern("cargo", 10)
def name_and_version(name_arg, version_arg, filemanager):
"""
@@ -332,8 +335,9 @@ def name_and_version(name_arg, version_arg, filemanager):
# define regex accepted for valid packages, important for specific
# patterns to come before general ones
github_patterns = [r"https?://github.com/(.*)/(.*?)/archive/[v|r]?.*/(.*).tar",
r"https?://github.com/(.*)/(.*?)/archive/[-a-zA-Z]*-(.*).tar",
r"https?://github.com/(.*)/(.*?)/archive/[-a-zA-Z-_]*-(.*).tar",
r"https?://github.com/(.*)/(.*?)/archive/[vVrR]?(.*).tar",
r"https?://github.com/(.*)/.*-downloads/releases/download/.*?/(.*)-(.*).tar",
r"https?://github.com/(.*)/(.*?)/releases/download/.*?/(.*).tar",
r"https?://github.com/(.*)/(.*?)/files/.*?/(.*).tar"]
@@ -352,6 +356,10 @@ def name_and_version(name_arg, version_arg, filemanager):
giturl = "https://github.com/" + m.group(1).strip() + "/" + repo + ".git"
break
# construct github giturl from gnome projects
if not giturl and "download.gnome.org" in url:
giturl = "https://github.com/GNOME/{}.git".format(name)
if "mirrors.kernel.org" in url:
m = re.search(r".*/sourceware/(.*?)/releases/(.*?).tgz", url)
if m:
@@ -399,6 +407,13 @@ def name_and_version(name_arg, version_arg, filemanager):
name = m.group(1).strip()
version = convert_version(m.group(2))
# rust crate
if "crates.io" in url:
m = re.search(r"/crates.io/api/v[0-9]+/crates/(.*)/(.*)/download.*\.crate", url)
if m:
name = m.group(1).strip()
version = convert_version(m.group(2))
# override name and version from commandline
name = name_arg if name_arg else name
version = version_arg if version_arg else version
+4
View File
@@ -71,6 +71,10 @@ def print_warning(message):
print("[\033[31;1mWARNING\033[0m] {}".format(message))
def print_infile(message):
print("[\033[1;34mINFILE\033[0m] {}".format(message))
def binary_in_path(binary):
""" Determine if the given binary exists in the provided filesystem paths """
global os_paths
+1
View File
@@ -3,3 +3,4 @@ pycurl>=7.43.0
toml>=0.9.0
mock>=2.0.0
coverage>=4.4.1
requests>=2.18.4
+1 -1
View File
@@ -1,7 +1,7 @@
from setuptools import setup, find_packages
import sys, os
version = "1.1.8"
version = "1.2.0"
def readme():
with open("README.rst") as f:
+2
View File
@@ -320,6 +320,7 @@ https://download.gnome.org/sources/geocode-glib/3.24/geocode-glib-3.24.0.tar.xz,
http://mirrors.kernel.org/gnu/gettext/gettext-0.19.8.1.tar.xz,gettext,0.19.8.1
https://pypi.debian.net/gevent/gevent-1.2.2.tar.gz,gevent,1.2.2
https://github.com/gflags/gflags/archive/v2.2.1.tar.gz,gflags,2.2.1
https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs922/ghostscript-9.22.tar.gz,ghostscript,9.22
https://download.gimp.org/mirror/pub/gimp/v2.8/gimp-2.8.22.tar.bz2,gimp,2.8.22
https://www.kernel.org/pub/software/scm/git/git-2.14.2.tar.gz,git,2.14.2
https://github.com/sitaramc/gitolite/archive/v3.6.7.tar.gz,gitolite,3.6.7
@@ -1765,6 +1766,7 @@ http://ftp.gnome.org/pub/gnome/sources/vinagre/3.22/vinagre-3.22.0.tar.xz,vinagr
http://pypi.debian.net/vine/vine-1.1.4.tar.gz,vine,1.1.4
http://pypi.debian.net/virtualenv/virtualenv-15.1.0.tar.gz,virtualenv,15.1.0
https://virt-manager.org/download/sources/virt-viewer/virt-viewer-6.0.tar.gz,virt-viewer,6.0
https://github.com/felixonmars/volume_key/archive/volume_key-0.3.9.tar.gz,volume_key,0.3.9
https://pypi.debian.net/voluptuous/voluptuous-0.10.5.tar.gz,voluptuous,0.10.5
https://github.com/GNOME/vte/archive/0.50.1.tar.gz,vte,0.50.1
https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/archive/sdk-1.0.39.0.tar.gz,Vulkan-LoaderAndValidationLayers,1.0.39.0
-308
View File
@@ -1,308 +0,0 @@
"""
autospec test suite
"""
import tarfile
import os
import re
import shutil
import subprocess
import importlib
import multiprocessing
import getpass
import errno
import argparse
from difflib import unified_diff
IGNORES = set(['expectations.py',
'spec-expectations',
'__pychache__',
'autospecdir'])
NOT_PACKAGE = ['.tar', 'test', 'autospec.conf', 'results']
BASEDIR = os.getcwd()
TESTDIR = BASEDIR + '/tests/testfiles'
PCOLOR = '\033[92m'
FCOLOR = '\033[91m'
ENDCOLOR = '\033[0m'
def fmt_fail(msg):
"""returns colored and formatted failure message"""
return '{}FAIL:{} {}'.format(FCOLOR, ENDCOLOR, msg)
def fmt_pass(msg):
"""returns colored and formatted pass message"""
return '{}PASS:{} {}'.format(PCOLOR, ENDCOLOR, msg)
def tar_source(srcfiles):
"""tar the files in the testfiles directory"""
os.chdir(TESTDIR)
tar = tarfile.open('{}.tar.gz'.format(srcfiles), 'w:gz')
files = set(os.listdir(srcfiles)).difference(IGNORES)
for file in files:
tar.add('{}/{}'.format(srcfiles, file))
tar.close()
os.chdir(BASEDIR)
def build_and_run(srctar, expectations, entry, test_results):
"""run make autospec against the tarball, then run the tests"""
dest = '{}/test-{}'.format(TESTDIR, entry)
add_files(entry, dest)
os.chdir(dest)
output = "".encode('utf-8')
if os.path.exists('test.conf'):
config = ['-c', 'test.conf']
else:
config = []
# pylint: disable=broad-except
# pass on any exception because the build failure will be reported later
try:
output = subprocess.check_output(
['python3', '{}/autospec/autospec.py'.format(BASEDIR),
'-n', entry, '-t', '.',
'file://{}/{}'.format(TESTDIR, srctar)] + config)
except Exception:
pass
finally:
output = output.decode('utf-8')
print('Testing output for {}'.format(entry))
failures = check_output(output, expectations, entry, test_results)
if not failures:
with open('{}.spec'.format(entry), 'r') as spec_file:
spc = spec_file.read()
failures += check_spec(spc, expectations, entry, test_results)
with open('options.conf', 'r') as conf_file:
conf = conf_file.read()
failures += check_conf(conf, expectations, entry, test_results)
if failures:
# only copy logs and output over if a failure or error occurred
print('{} test failures detected'.format(entry))
copy_logs(entry, output)
os.chdir(BASEDIR)
def add_files(entry, dest):
"""add necessary files to the autospec test directory"""
os.makedirs(dest, exist_ok=True)
for file in os.listdir('{}/{}/autospecdir'.format(TESTDIR, entry)):
shutil.copy2('{}/{}/autospecdir/{}'.format(TESTDIR, entry, file), dest)
def check_output(output, expectations, entry, test_results):
"""
test the output of the autospec run against the expectations defined in
expectations.py
Returns number of failures (1 for a failure, 0 for success)
"""
if 'build successful' in output:
test_results[entry].append(fmt_pass('Build status - successful'))
print('{} build successful'.format(entry))
else:
test_results[entry].append(fmt_fail('Build status - failed, '
'skipping remaining tests'))
print('{} build failed'.format(entry))
return 1
for item in expectations.output_strings:
if item not in output:
test_results[entry].append(fmt_fail('"{}" expected in output, but '
'not present'.format(item)))
else:
test_results[entry].append(fmt_pass('"{}" found in output'
.format(item)))
return 0
def check_spec(spec_contents, expectations, entry, test_results):
"""
test the specfile against the expected specfile in spec-expectations
Returns the number of failures identified
"""
failures = 0
# replace the epoch time with a 1 so it can be tested for
spec_contents = re.sub(r'SOURCE_DATE_EPOCH=[0-9]+\n',
'SOURCE_DATE_EPOCH=1\n',
spec_contents)
diff = list(unified_diff(expectations.specfile,
spec_contents.split('\n'),
fromfile='expected_specfile',
tofile='generated_specfile'))
if len(diff):
test_results[entry].append(fmt_fail('generated specfile different from '
'expected\n'))
failures += 1
for line in diff:
test_results[entry][-1] += '\n{}'.format(line)
test_results[entry][-1] += '\n'
else:
test_results[entry].append(fmt_pass('generated specfile matches expected'))
# the following checks are superflous, but can give more granular
# indications of what has gone wrong
if expectations.license not in spec_contents:
test_results[entry].append(fmt_fail('license not detected as "{}"'
.format(expectations.license)))
failures += 1
else:
test_results[entry].append(fmt_pass('license correctly detected as "{}"'
.format(expectations.license)))
for item in expectations.buildreqs:
if item not in spec_contents:
test_results[entry].append(fmt_fail('expected "{}" to be a build '
'requirement, but was not found'
.format(item)))
failures += 1
else:
test_results[entry].append(fmt_pass('build requirement "{}" '
'successfully detected'
.format(item)))
return failures
def check_conf(conf_contents, expectations, entry, test_results):
"""
test the specfile against the expected specfile in spec-expectations
Returns the number of failures identified.
"""
failures = 0
diff = list(unified_diff(expectations.conffile,
conf_contents.split('\n'),
fromfile='expected_conffile',
tofile='generated_conffile'))
if len(diff):
test_results[entry].append(fmt_fail('generated conf file different '
'from expected\n'))
failures += 1
for line in diff:
test_results[entry][-1] += '\n{}'.format(line)
test_results[entry][-1] += '\n'
else:
test_results[entry].append(fmt_pass('generated configuration file '
'matches expected'))
return failures
def copy_logs(entry, output):
"""
Copies output and build and mock logs from the autospec build into
TESTDIR/results/
"""
os.makedirs('{}/results'.format(TESTDIR), exist_ok=True)
try:
shutil.copy2('{}/test-{}/results/build.log'.format(TESTDIR, entry),
'{}/results/{}-build.log'.format(TESTDIR, entry))
shutil.copy2('{}/test-{}/mock_srpm.log'.format(TESTDIR, entry),
'{}/results/{}-mock_srpm.log'.format(TESTDIR, entry))
shutil.copy2('{}/test-{}/mock_build.log'.format(TESTDIR, entry),
'{}/results/{}-mock_build.log'.format(TESTDIR, entry))
print('check {}/results/ for more logfiles and output'
.format(TESTDIR, entry))
except Exception:
print('no build log found')
with open('{}/results/{}.out'.format(TESTDIR, entry), 'w') as outf:
outf.write(output)
def clean_up(entry):
"""clean up generated files and directories"""
# try to remove each directory/file in turn
shutil.rmtree('/tmp/{}'.format(getpass.getuser()), ignore_errors=True)
shutil.rmtree('{}/{}/__pycache__'.format(TESTDIR, entry), ignore_errors=True)
shutil.rmtree('{}/test-{}'.format(TESTDIR, entry), ignore_errors=True)
try:
os.remove('{}/{}.tar.gz'.format(TESTDIR, entry))
except OSError as excep:
if excep.errno != errno.ENOENT:
raise
def print_results(entry, test_results):
"""pretty-print the results of the tests"""
title = 'Test results for {}'.format(entry)
line = ''
for _ in range(len(title)):
line += '-'
print(line)
print(title)
print(line)
print('\n')
failures = 0
passes = 0
fcolor = ''
pcolor = ''
for result in test_results[entry]:
print(result)
if 'PASS' in result:
passes += 1
pcolor = PCOLOR
else:
failures += 1
fcolor = FCOLOR
print('\nFailed tests: {}{}{}'.format(fcolor, failures, ENDCOLOR))
print('Passed tests: {}{}{}'.format(pcolor, passes, ENDCOLOR))
print(line)
print('\n')
def process_source(entry, test_results):
"""run autospec against entry and store the test results in test_results"""
# Remove previous run failure logs
shutil.rmtree('{}/results'.format(TESTDIR), ignore_errors=True)
expectations = importlib.import_module('testfiles.{}.expectations'
.format(entry))
tar_source(entry)
print('Building {}'.format(entry))
build_and_run('{}.tar.gz'.format(entry), expectations, entry, test_results)
print_results(entry, test_results)
clean_up(entry)
def main():
"""split off threads to run autospec and test the specfile and output"""
test_results = {}
results_list = []
parser = argparse.ArgumentParser()
parser.add_argument("-c", "--test-cases", dest="cases", nargs='*',
help="List of test cases to run (by package name) "
"separated by whitespace")
args = parser.parse_args()
pool = multiprocessing.Pool()
for entry in os.listdir(TESTDIR):
if any(x in entry for x in NOT_PACKAGE):
continue
clean_up(entry)
if args.cases and entry not in args.cases:
continue
test_results[entry] = []
res = pool.apply_async(process_source, (entry, test_results))
results_list.append(res)
pool.close()
pool.join()
for result in results_list:
result.get()
if __name__ == '__main__':
main()
+1 -1
View File
@@ -177,7 +177,7 @@ class TestBuildreq(unittest.TestCase):
buildreq.toml.loads = loads_backup
self.assertEqual(buildreq.buildreqs,
set(['rustc', 'dep1', 'dep2', 'dep3']))
set(['cargo', 'rustc', 'dep1', 'dep2', 'dep3']))
self.assertTrue(buildreq.cargo_bin)
self.assertEqual(buildreq.buildpattern.default_pattern, 'cargo')
+34 -2
View File
@@ -129,7 +129,7 @@ class TestCommitmessage(unittest.TestCase):
open_name = 'util.open'
with mock.patch(open_name, create=True) as mock_open:
mock_open.return_value = mock.MagicMock()
commitmessage.guess_commit_message()
commitmessage.guess_commit_message("")
# reset mocks before asserting so a failure doesn't cascade to
# other tests
commitmessage.process_NEWS = process_NEWS_backup
@@ -159,7 +159,7 @@ class TestCommitmessage(unittest.TestCase):
open_name = 'util.open'
with mock.patch(open_name, create=True) as mock_open:
mock_open.return_value = mock.MagicMock()
commitmessage.guess_commit_message()
commitmessage.guess_commit_message("")
# reset mocks before asserting so a failure doesn't cascade to
# other tests
commitmessage.process_NEWS = process_NEWS_backup
@@ -170,6 +170,38 @@ class TestCommitmessage(unittest.TestCase):
'cves\n\n\ncommit\nmessage\nwith\ncves\n\nCVEs fixed in this '
'build:\nCVE-1234-5678\ncve1\ncve2\n\n')
def test_guess_commit_message_imported_key(self):
"""
Test guess_commit_message() with mocked internal functions and both
commitmessage information and cves available from newsfile. A cve is
also available from config, which changes the first line of the commmit
message. Additionally there is imported key info that will be displayed
at the end of the message.
"""
process_NEWS_backup = commitmessage.process_NEWS
def mock_process_NEWS(newsfile):
return (['', 'commit', 'message', 'with', 'cves', ''],
set(['cve1', 'cve2']))
commitmessage.process_NEWS = mock_process_NEWS
commitmessage.config.cves = set(['CVE-1234-5678'])
commitmessage.config.old_version = None # Allow cve title to be set
open_name = 'util.open'
with mock.patch(open_name, create=True) as mock_open:
mock_open.return_value = mock.MagicMock()
commitmessage.guess_commit_message("keyinfo content")
# reset mocks before asserting so a failure doesn't cascade to
# other tests
commitmessage.process_NEWS = process_NEWS_backup
commitmessage.config.cves = set()
fh = mock_open.return_value.__enter__.return_value
fh.write.assert_called_with(
'testball: Fix for CVE-1234-5678\n\n\ncommit\nmessage\nwith\n'
'cves\n\n\ncommit\nmessage\nwith\ncves\n\nCVEs fixed in this '
'build:\nCVE-1234-5678\ncve1\ncve2\n\nKey imported:\nkeyinfo '
'content\n')
def test_scan_for_changes(self):
"""
Tests scan_for_changes using temporary directories
+24
View File
@@ -0,0 +1,24 @@
import subprocess
import unittest
class TestGeneral(unittest.TestCase):
def test_ConfigParser_regressions(self):
"""
Make sure ConfigParser is always called with the required
interpolation=None argument
"""
grep_cmd = ["grep", "-re",
"ConfigParser(.*\(^interpolation=None\).*)",
"autospec"]
try:
output = subprocess.check_output(grep_cmd).decode('utf-8')
except subprocess.CalledProcessError as e:
output = e.output.decode('utf-8')
self.assertEqual(output.strip(), "")
if __name__ == "__main__":
unittest.main(buffer=True)
+288
View File
@@ -0,0 +1,288 @@
import unittest
import os
import infile_handler
class TestParseBitBakeFile(unittest.TestCase):
def test_scrape_version_htop(self):
""""
Test that the version is correctly scraped from the file name
"""
bb_file = os.path.join('tests', 'testfiles', 'bb', 'htop_1.0.3.bb')
bb_dict = infile_handler.file_handler(bb_file, {})
expect = "1.0.3"
self.assertEqual(expect, bb_dict.get('VERSION'))
def test_scrape_version_vim(self):
""""
Test that the version is correctly scraped from the file name
"""
bb_file = os.path.join('tests', 'testfiles', 'bb', 'vim_8.0.0983.bb')
bb_dict = infile_handler.file_handler(bb_file, {})
expect = "8.0.0983"
self.assertEqual(expect, bb_dict.get('VERSION'))
def test_scrape_version_catkin_runtime(self):
""""
Test that the version is correctly scraped from the file name
"""
bb_file = os.path.join('tests', 'testfiles', 'bb', 'catkin-runtime_0.6.19.bb')
bb_dict = infile_handler.file_handler(bb_file, {})
expect = "0.6.19"
self.assertEqual(expect, bb_dict.get('VERSION'))
def test_scrape_url_catkin(self):
bb_file = os.path.join('tests', 'testfiles', 'bb', 'catkin.inc')
bb_dict = infile_handler.file_handler(bb_file, {"NAME": "catkin"})
expect = "https://github.com/ros/catkin/archive/${PV}.tar.gz"
self.assertEqual(expect, bb_dict.get('URL'))
def test_scrape_src_uri_htop(self):
"""
Test that the occurance of ${PV} is replaced by the scraped version.
"""
bb_file = os.path.join('tests', 'testfiles', 'bb', 'htop_1.0.3.bb')
bb_dict = infile_handler.file_handler(bb_file, {})
expect = "http://hisham.hm/htop/releases/1.0.3/htop-1.0.3.tar.gz"
self.assertEqual(expect, bb_dict.get('SRC_URI'))
def test_scrape_inherits_htop(self):
"""
Test that the package inherits are correctly scraped as a list with
only one line/inherit
"""
bb_file = os.path.join('tests', 'testfiles', 'bb', 'htop_1.0.3.bb')
bb_dict = infile_handler.file_handler(bb_file, {})
expect = ["autotools"]
self.assertEqual(expect, bb_dict.get('inherits'))
def test_scrape_inherits_vim(self):
"""
Test that the package inherits are correctly scraped as a list with
multiple lines/inherits
"""
bb_file = os.path.join('tests', 'testfiles', 'bb', 'vim_8.0.0983.bb')
bb_dict = infile_handler.file_handler(bb_file, {})
expect = ["autotools update-alternatives", "autotools-brokensep"]
self.assertEqual(expect, bb_dict.get('inherits'))
def test_scrape_summary_htop(self):
"""
Test that the package summary is correctly scraped
from the bitbake file.
"""
bb_file = os.path.join('tests', 'testfiles', 'bb', 'htop_1.0.3.bb')
bb_dict = infile_handler.file_handler(bb_file, {})
expect = "htop process monitor"
self.assertEqual(expect, bb_dict.get('SUMMARY'))
def test_scrape_section_htop(self):
"""
Test that the package section is correctly scraped
from the bitbake file.
"""
bb_file = os.path.join('tests', 'testfiles', 'bb', 'htop_1.0.3.bb')
bb_dict = infile_handler.file_handler(bb_file, {})
expect = "console/utils"
self.assertEqual(expect, bb_dict.get('SECTION'))
def test_scrape_license_htop(self):
"""
Test that the package license is correctly scraped
from the bitbake file.
"""
bb_file = os.path.join('tests', 'testfiles', 'bb', 'htop_1.0.3.bb')
bb_dict = infile_handler.file_handler(bb_file, {})
expect = "GPLv2"
self.assertEqual(expect, bb_dict.get('LICENSE'))
def test_scrape_depends_htop(self):
"""
Test that the package depends is correctly scraped
from the bitbake file.
"""
bb_file = os.path.join('tests', 'testfiles', 'bb', 'htop_1.0.3.bb')
bb_dict = infile_handler.file_handler(bb_file, {})
expect = "ncurses"
self.assertEqual(expect, bb_dict.get('DEPENDS'))
def test_scrape_rdepends_htop(self):
"""
Test that the package rsuggests_${PN} is correctly scraped
from the bitbake file.
"""
bb_file = os.path.join('tests', 'testfiles', 'bb', 'htop_1.0.3.bb')
bb_dict = infile_handler.file_handler(bb_file, {})
expect = "ncurses-terminfo"
self.assertEqual(expect, bb_dict.get('RDEPENDS_${PN}'))
def test_scrape_lic_files_chksum_htop_double_eq(self):
"""
Test that the package license file checksum is correctly scraped
from the bitbake file. This line contains two equal signs - which
will test pattern matching identifies the correct one.
"""
bb_file = os.path.join('tests', 'testfiles', 'bb', 'htop_1.0.3.bb')
bb_dict = infile_handler.file_handler(bb_file, {})
expect = "file://COPYING;md5=c312653532e8e669f30e5ec8bdc23be3"
self.assertEqual(expect, bb_dict.get('LIC_FILES_CHKSUM'))
def test_scrape_s_variable_vim(self):
"""
Test that the s variable is correctly scraped from the bitbake file.
"""
bb_file = os.path.join('tests', 'testfiles', 'bb', 'vim_8.0.0983.bb')
bb_dict = infile_handler.file_handler(bb_file, {})
expect = "${WORKDIR}/git/src"
self.assertEqual(expect, bb_dict.get('S'))
def test_scrape_vimdir_vim(self):
"""
Test that the vimdir variable is correctly scraped from the bitbake
file. This value contains multile 'PV' variables.
"""
bb_file = os.path.join('tests', 'testfiles', 'bb', 'vim_8.0.0983.bb')
bb_dict = infile_handler.file_handler(bb_file, {})
expect = "vim${@d.getVar('PV').split('.')[0]}${@d.getVar('PV').split('.')[1]}"
self.assertEqual(expect, bb_dict.get('VIMDIR'))
def test_scrape_packageconfig_gtkgui_vim(self):
"""
Test that packageconfig[gtkgui] returns the correct value scraped with
the parser.
"""
bb_file = os.path.join('tests', 'testfiles', 'bb', 'vim_8.0.0983.bb')
bb_dict = infile_handler.file_handler(bb_file, {})
expect = "--enable-gtk2-test --enable-gui=gtk2,--enable-gui=no,gtk+,"
self.assertEqual(expect, bb_dict.get('PACKAGECONFIG[gtkgui]'))
def test_scrape_packageconfig_tiny_vim(self):
"""
Test that packageconfig[tiny] returns the correct value scraped with
the parser.
"""
bb_file = os.path.join('tests', 'testfiles', 'bb', 'vim_8.0.0983.bb')
bb_dict = infile_handler.file_handler(bb_file, {})
expect = "--with-features=tiny,--with-features=big,,"
self.assertEqual(expect, bb_dict.get('PACKAGECONFIG[tiny]'))
def test_scrape_alternative_link_name_vim(self):
"""
Test that ALTERNATIVE_LINK_NAME[vim] is correctly scraped from the
bitbake file.
"""
bb_file = os.path.join('tests', 'testfiles', 'bb', 'vim_8.0.0983.bb')
bb_dict = infile_handler.file_handler(bb_file, {})
expect = "${bindir}/vim"
self.assertEqual(expect, bb_dict.get('ALTERNATIVE_LINK_NAME[vim]'))
def test_scrape_files_tutor_has_hyphen_vim(self):
"""
Test that FILES_${PN}-tutor is correctly scraped. It contains a hyphen
in the variable name.
"""
bb_file = os.path.join('tests', 'testfiles', 'bb', 'vim_8.0.0983.bb')
bb_dict = infile_handler.file_handler(bb_file, {})
expect = "${datadir}/${BPN}/${VIMDIR}/tutor ${bindir}/${BPN}tutor"
self.assertEqual(expect, bb_dict.get('FILES_${PN}-tutor'))
def test_scrape_packageconfig_x11_has_digits_vim(self):
"""
Test that PACKAGECONFIG[x11] is correctly scraped. It contains digits
in the variable name.
"""
bb_file = os.path.join('tests', 'testfiles', 'bb', 'vim_8.0.0983.bb')
bb_dict = infile_handler.file_handler(bb_file, {})
expect = "--with-x,--without-x,xt,"
self.assertEqual(expect, bb_dict.get('PACKAGECONFIG[x11]'))
def test_concatenation_op_packageconfig_vim(self):
"""
Test that the resulting value for the PACKAGECONFIG variable, is
the += of the initialization with ??= "".
"""
bb_file = os.path.join('tests', 'testfiles', 'bb', 'vim_8.0.0983.bb')
bb_dict = infile_handler.file_handler(bb_file, {})
expect = "${@bb.utils.filter('DISTRO_FEATURES', 'acl selinux', d)}"
self.assertEqual(expect, bb_dict.get('PACKAGECONFIG'))
def test_operations_one(self):
"""
Test that the operations result in the correct assignments in the
bb_dict
"""
bb_file = os.path.join('tests', 'testfiles', 'bb', 'op_tests.bb')
bb_dict = infile_handler.file_handler(bb_file, {})
expect = "second value"
self.assertEqual(expect, bb_dict.get('ONE'))
def test_operations_two(self):
"""
Test that the operations result in the correct assignments in the
bb_dict
"""
bb_file = os.path.join('tests', 'testfiles', 'bb', 'op_tests.bb')
bb_dict = infile_handler.file_handler(bb_file, {})
expect = "first value"
self.assertEqual(expect, bb_dict.get('TWO'))
def test_operations_three(self):
"""
Test that the operations result in the correct assignments in the
bb_dict
"""
bb_file = os.path.join('tests', 'testfiles', 'bb', 'op_tests.bb')
bb_dict = infile_handler.file_handler(bb_file, {})
expect = "third value"
self.assertEqual(expect, bb_dict.get('THREE'))
def test_operations_four(self):
"""
Test that the operations result in the correct assignments in the
bb_dict
"""
bb_file = os.path.join('tests', 'testfiles', 'bb', 'op_tests.bb')
bb_dict = infile_handler.file_handler(bb_file, {})
expect = "third value first value second value"
self.assertEqual(expect, bb_dict.get('FOUR'))
def test_operations_five(self):
"""
Test that the operations result in the correct assignments in the
bb_dict
"""
bb_file = os.path.join('tests', 'testfiles', 'bb', 'op_tests.bb')
bb_dict = infile_handler.file_handler(bb_file, {})
expect = "third valuefirst valuesecond value"
self.assertEqual(expect, bb_dict.get('FIVE'))
def test_line_continuation_src_uri_vim(self):
"""
Test that when there is a line continuation, the entire line is
appended to a single string value.
"""
bb_file = os.path.join('tests', 'testfiles', 'bb', 'vim_8.0.0983.bb')
bb_dict = infile_handler.file_handler(bb_file, {})
expect = 'git://github.com/vim/vim.git ' \
' file://disable_acl_header_check.patch;patchdir=.. ' \
' file://vim-add-knob-whether-elf.h-are-checked.patch;patchdir=.. '
self.assertEqual(expect, bb_dict.get('SRC_URI'))
def test_command_scraping_do_configure_vim(self):
"""
Test that when a line starts with do_ it is scraped as a command and
stored as a string.
"""
bb_file = os.path.join('tests', 'testfiles', 'bb', 'vim_8.0.0983.bb')
bb_dict = infile_handler.file_handler(bb_file, {})
expect = ["# rm -f auto/*", "# touch auto/config.mk", "# aclocal",
"# autoconf", "# oe_runconf", "# touch auto/configure",
"# touch auto/config.mk auto/config.h" ]
self.assertEqual(expect, bb_dict.get('do_configure'))
if __name__ == '__main__':
unittest.main(buffer=True)
+46
View File
@@ -0,0 +1,46 @@
import unittest
import infile_handler
class TestInputReader(unittest.TestCase):
def test_sort_files_with_inc_and_bb(self):
"""
Test that the sort_files key to the sorted function, returns the
correct order when multiple bb files and an inc file are passed.
The correct output should be the .inc file first, and then the .bb
files.
"""
files = ['catkin-runtime_0.6.19.bb', 'catkin.inc', 'catkin_0.6.19.bb']
sorted_files = sorted(files, key=infile_handler.sort_files)
expect = ['catkin.inc', 'catkin-runtime_0.6.19.bb', 'catkin_0.6.19.bb']
self.assertEqual(expect, sorted_files)
def test_parse_ext_bb(self):
path = "cython_7.8.1.bb"
ext = infile_handler.parse_ext(path)
expect = "bb"
self.assertEqual(expect, ext)
def test_parse_ext_inc(self):
path = "cython.inc"
ext = infile_handler.parse_ext(path)
expect = "inc"
self.assertEqual(expect, ext)
def test_parse_ext_none(self):
path = "cython.deb"
ext = infile_handler.parse_ext(path)
expect = None
self.assertEqual(expect, ext)
if __name__ == '__main__':
unittest.main(buffer=True)
+94
View File
@@ -0,0 +1,94 @@
import unittest
import infile_update_spec
import specfiles
class TestUpdateSpecfile(unittest.TestCase):
def setUp(self):
# url, version, name, release
url = "http://www.testpkg.com/testpkg/pkg-1.0.tar.gz"
self.specfile = specfiles.Specfile(url, '1.1.1', 'test_pkg', '1')
self.bb_dict = {
"DEPENDS": "ncurses gettext-native",
"LICENSE": "new"
}
def test_update_summary_if_bb_summary(self):
"""
Test that if a bitbake file has a summary variable it overwrites
the specfile - even if there is a description too.
"""
self.specfile.default_sum = "No detailed summary available"
self.bb_dict["SUMMARY"] = "Vi IMproved - enhanced vi editor"
self.bb_dict["DESCRIPTION"] = "Super awesome VIM description"
infile_update_spec.update_summary(self.bb_dict, self.specfile)
self.assertEqual(self.specfile.default_sum,
"Vi IMproved - enhanced vi editor")
def test_update_summary_if_not_default(self):
"""
Test that if a bitbake file does NOT have a summary variable, but
instead has a description variable, that overwrites the specfile"
"""
self.specfile.default_sum = "No detailed summary available"
self.bb_dict["DESCRIPTION"] = "Super awesome VIM description"
infile_update_spec.update_summary(self.bb_dict, self.specfile)
self.assertEqual(self.specfile.default_sum,
"Super awesome VIM description")
def test_update_summary_if_no_bb_summary_or_description(self):
"""
Test that if a bitbake file has neither a summary or description
that the default specfile summary is written
"""
self.specfile.default_sum = "No detailed summary available"
infile_update_spec.update_summary(self.bb_dict, self.specfile)
self.assertEqual(self.specfile.default_sum,
"No detailed summary available")
def test_update_license_if_not_in_licenses_list(self):
"""
Test that if a license is scraped from the bb file, and not in the
licenses specfile list, that it should be added to the list.
"""
self.specfile.licenses = ['random', 'license']
infile_update_spec.update_licenses(self.bb_dict, self.specfile)
self.assertEqual(self.specfile.licenses, ['random', 'license', 'new'])
def test_update_license_if_in_license_list_case(self):
"""
Test that if a license is already in the specfile licenses list, not
case sensitive, then it should not be duplicated.
"""
self.specfile.licenses = ['random', 'New']
infile_update_spec.update_licenses(self.bb_dict, self.specfile)
self.assertEqual(self.specfile.licenses, ['random', 'New'])
def test_update_build_deps_append_normal(self):
"""
Test that if a set if multiple items are scraped from the bb file, and
they are not already in the specfile, they will be added to the set of
buildreqs. If the bb depends ends in '-native' that should be removed
as well.
"""
self.specfile.buildreqs = {'gmp-dev', 'lua-dev'}
infile_update_spec.update_build_deps(self.bb_dict, self.specfile)
self.assertEqual(self.specfile.buildreqs, {'gmp-dev', 'lua-dev',
'ncurses', 'gettext'})
def test_update_build_deps_append_duplicates(self):
"""
Test that if a set if multiple items are scraped from the bb file, and
they are already in the specfile, the resulting set with be the union
of set 1 and set 2.
"""
self.specfile.buildreqs = {'gmp-dev', 'ncurses'}
infile_update_spec.update_build_deps(self.bb_dict, self.specfile)
self.assertEqual(self.specfile.buildreqs, {'gmp-dev', 'ncurses',
'gettext'})
if __name__ == '__main__':
unittest.main(buffer=True)
+1
View File
@@ -117,6 +117,7 @@ class TestLicense(unittest.TestCase):
URL = None
WRITEDATA = None
POSTFIELDS = None
FOLLOWLOCATION = 0
def setopt(_, __, ___):
pass
@@ -0,0 +1,30 @@
ROS_SPN = "catkin"
require catkin.inc
SRC_URI += "\
file://0001-ignore-LD_LIBRARY_PATH-set-in-environment_cache.py.patch \
"
S = "${WORKDIR}/catkin-${PV}"
# This package includes ONLY the python packages AND catkin_find
# The catkin_${PV} package includes all other files
# from the catkin tool.
FILES_${PN} = "${PYTHON_SITEPACKAGES_DIR} ${ros_bindir}/catkin_find"
RDEPENDS_${PN}_class-native = ""
RDEPENDS_${PN} = "\
${PYTHON_PN}-catkin-pkg ${PYTHON_PN}-argparse ${PYTHON_PN}-misc ${PYTHON_PN}-multiprocessing \
${PYTHON_PN}-shell ${PYTHON_PN}-subprocess ${PYTHON_PN}-xml ${PYTHON_PN}-pkgutil"
# Delete everything but the python packages in order to avoid
# that the QA error [installed-vs-shipped] hits on us.
do_install_append() {
rm ${D}${ros_bindir}/catkin_*_*
rm ${D}${ros_bindir}/catkin_make
rm -rf ${D}${ros_datadir}
rm -rf ${D}${ros_libdir}/pkgconfig
}
BBCLASSEXTEND += "native"
+32
View File
@@ -0,0 +1,32 @@
DESCRIPTION = "Low-level build system macros and infrastructure for ROS"
SECTION = "devel"
LICENSE = "BSD"
LIC_FILES_CHKSUM = "file://package.xml;beginline=7;endline=7;md5=d566ef916e9dedc494f5f793a6690ba5"
DEPENDS = "cmake ${PYTHON_PN}-empy-native ${PYTHON_PN}-catkin-pkg-native"
SRC_URI = "https://github.com/ros/${ROS_SPN}/archive/${PV}.tar.gz;downloadfilename=${ROS_SP}.tar.gz"
SRC_URI[md5sum] = "d58460cc9112812d8c4e6ecf98bbcc85"
SRC_URI[sha256sum] = "90a639d67db7f9039487af555e432a5b4b6e339f22892d75d03b823b3f38c947"
SRC_URI += "\
file://0001-CATKIN_WORKSPACES-Don-t-require-.catkin-file.patch \
file://0001-use-python-provided-by-environment-instead-of-the-ge.patch \
file://0001-avoid-using-host-s-paths-when-cross-compiling.patch \
file://0001-relocate-dependency-s-headers-to-current-sysroot.patch \
${@'file://0001-python.cmake-look-for-python3-first.patch' if d.getVar('PYTHON_PN', True) == 'python3' else ''} \
"
inherit catkin
FILES_${PN}-dev += "\
${ros_datadir}/eigen/cmake \
${ros_datadir}/ros/cmake \
${ros_datadir}/.catkin \
${ros_prefix}/.catkin \
${ros_prefix}/.rosinstall \
${ros_prefix}/_setup_util.py \
${ros_prefix}/env.sh \
${ros_prefix}/setup.* \
"
+20
View File
@@ -0,0 +1,20 @@
require catkin.inc
DEPENDS_class-native += "catkin-runtime"
RDEPENDS_${PN}_class-native = "${PYTHON_PN}-catkin-pkg"
RDEPENDS_${PN} = "cmake make binutils binutils-symlinks gcc gcc-symlinks g++ g++-symlinks \
catkin-runtime"
# The files in ${PYTHON_SITEPACKAGES_DIR} and catkin_find are
# installed by the catkin-runtime package. Therefore, we remove
# them here so that they are not installed.
# Moreover: the ${ros_libdir}/python2.7 is empty. We need to
# remove it, otherwise the QA error [installed-vs-shipped] will hit on us.
do_install_append() {
rm ${D}${ros_bindir}/catkin_find
rm -rf ${D}${PYTHON_SITEPACKAGES_DIR}
rmdir ${D}${ros_libdir}/${PYTHON_DIR}
}
BBCLASSEXTEND += "native"
+22
View File
@@ -0,0 +1,22 @@
SUMMARY = "htop process monitor"
HOMEPAGE = "http://htop.sf.net"
SECTION = "console/utils"
LICENSE = "GPLv2"
LIC_FILES_CHKSUM = "file://COPYING;md5=c312653532e8e669f30e5ec8bdc23be3"
DEPENDS = "ncurses"
RDEPENDS_${PN} = "ncurses-terminfo"
SRC_URI = "http://hisham.hm/htop/releases/${PV}/htop-${PV}.tar.gz"
SRC_URI[md5sum] = "e768b9b55c033d9c1dffda72db3a6ac7"
SRC_URI[sha256sum] = "055c57927f75847fdc222b5258b079a9542811a9dcf5421c615c7e17f55d1829"
LDFLAGS_append_libc-uclibc = " -lubacktrace"
do_configure_prepend () {
rm -rf ${S}/config.h
}
inherit autotools
+17
View File
@@ -0,0 +1,17 @@
ONE ??= "first value"
ONE ?= "second value"
TWO ?= "first value"
TWO ??= "second value"
THREE ??= "first value"
THREE ?= "second value"
THREE = "third value"
FOUR = "first value"
FOUR += "second value"
FOUR =+ "third value"
FIVE = "first value"
FIVE .= "second value"
FIVE =. "third value"
+112
View File
@@ -0,0 +1,112 @@
SUMMARY = "Vi IMproved - enhanced vi editor"
SECTION = "console/utils"
DEPENDS = "ncurses gettext-native"
# vimdiff doesn't like busybox diff
RSUGGESTS_${PN} = "diffutils"
LICENSE = "vim"
LIC_FILES_CHKSUM = "file://../runtime/doc/uganda.txt;md5=eea32ac1424bba14096736a494ae9045"
SRC_URI = "git://github.com/vim/vim.git \
file://disable_acl_header_check.patch;patchdir=.. \
file://vim-add-knob-whether-elf.h-are-checked.patch;patchdir=.. \
"
SRCREV = "3f9a1ff141412e9e85f7dff47d02946cb9be9228"
S = "${WORKDIR}/git/src"
VIMDIR = "vim${@d.getVar('PV').split('.')[0]}${@d.getVar('PV').split('.')[1]}"
inherit autotools update-alternatives
inherit autotools-brokensep
# vim configure.in contains functions which got 'dropped' by autotools.bbclass
do_configure () {
rm -f auto/*
touch auto/config.mk
aclocal
autoconf
oe_runconf
touch auto/configure
touch auto/config.mk auto/config.h
}
#Available PACKAGECONFIG options are gtkgui, acl, x11, tiny
PACKAGECONFIG ??= ""
PACKAGECONFIG += "${@bb.utils.filter('DISTRO_FEATURES', 'acl selinux', d)}"
PACKAGECONFIG[gtkgui] = "--enable-gtk2-test --enable-gui=gtk2,--enable-gui=no,gtk+,"
PACKAGECONFIG[acl] = "--enable-acl,--disable-acl,acl,"
PACKAGECONFIG[x11] = "--with-x,--without-x,xt,"
PACKAGECONFIG[tiny] = "--with-features=tiny,--with-features=big,,"
PACKAGECONFIG[selinux] = "--enable-selinux,--disable-selinux,libselinux,"
PACKAGECONFIG[elfutils] = "--enable-elf-check,,elfutils,"
EXTRA_OECONF = " \
--disable-gpm \
--disable-gtktest \
--disable-xim \
--disable-netbeans \
--with-tlib=ncurses \
ac_cv_small_wchar_t=no \
vim_cv_getcwd_broken=no \
vim_cv_memmove_handles_overlap=yes \
vim_cv_stat_ignores_slash=no \
vim_cv_terminfo=yes \
vim_cv_tgent=non-zero \
vim_cv_toupper_broken=no \
vim_cv_tty_group=world \
STRIP=/bin/true \
"
do_install() {
autotools_do_install
# Work around file-rdeps picking up csh, awk, perl or python as a dep
chmod -x ${D}${datadir}/${BPN}/${VIMDIR}/tools/vim132
chmod -x ${D}${datadir}/${BPN}/${VIMDIR}/tools/mve.awk
chmod -x ${D}${datadir}/${BPN}/${VIMDIR}/tools/*.pl
chmod -x ${D}${datadir}/${BPN}/${VIMDIR}/tools/*.py
# Install example vimrc from runtime files
install -m 0644 ../runtime/vimrc_example.vim ${D}/${datadir}/${BPN}/vimrc
# we use --with-features=big as default
mv ${D}${bindir}/${BPN} ${D}${bindir}/${BPN}.${BPN}
}
PARALLEL_MAKEINST = ""
PACKAGES =+ "${PN}-common ${PN}-syntax ${PN}-help ${PN}-tutor ${PN}-vimrc ${PN}-tools"
FILES_${PN}-syntax = "${datadir}/${BPN}/${VIMDIR}/syntax"
FILES_${PN}-help = "${datadir}/${BPN}/${VIMDIR}/doc"
FILES_${PN}-tutor = "${datadir}/${BPN}/${VIMDIR}/tutor ${bindir}/${BPN}tutor"
FILES_${PN}-vimrc = "${datadir}/${BPN}/vimrc"
FILES_${PN}-data = "${datadir}/${BPN}"
FILES_${PN}-tools = "${datadir}/${BPN}/${VIMDIR}/tools"
FILES_${PN}-common = " \
${datadir}/${BPN}/${VIMDIR}/*.vim \
${datadir}/${BPN}/${VIMDIR}/autoload \
${datadir}/${BPN}/${VIMDIR}/colors \
${datadir}/${BPN}/${VIMDIR}/compiler \
${datadir}/${BPN}/${VIMDIR}/ftplugin \
${datadir}/${BPN}/${VIMDIR}/indent \
${datadir}/${BPN}/${VIMDIR}/keymap \
${datadir}/${BPN}/${VIMDIR}/lang \
${datadir}/${BPN}/${VIMDIR}/macros \
${datadir}/${BPN}/${VIMDIR}/plugin \
${datadir}/${BPN}/${VIMDIR}/print \
${datadir}/${BPN}/${VIMDIR}/spell \
${datadir}/icons \
"
RDEPENDS_${BPN} = "ncurses-terminfo-base"
# Recommend that runtime data is installed along with vim
RRECOMMENDS_${BPN} = "${PN}-syntax ${PN}-help ${PN}-tutor ${PN}-vimrc ${PN}-common"
ALTERNATIVE_${PN} = "vi vim"
ALTERNATIVE_TARGET = "${bindir}/${BPN}.${BPN}"
ALTERNATIVE_LINK_NAME[vi] = "${base_bindir}/vi"
ALTERNATIVE_LINK_NAME[vim] = "${bindir}/vim"
ALTERNATIVE_PRIORITY = "100"
BBCLASSEXTEND = "native"
-9
View File
@@ -1,9 +0,0 @@
DESTDIR ?=
PREFIX ?= /usr/local
helloworld:
gcc main.c -o helloworld
install: helloworld
install -m 0755 -d $(DESTDIR)$(PREFIX)/bin
install -m 0755 helloworld $(DESTDIR)$(PREFIX)/bin
@@ -1,3 +0,0 @@
# This file contains additional build requirements that did not get
# picked up automatically. One name per line, no whitespace.
xz
@@ -1,2 +0,0 @@
# This file contains build requirements that get picked up but are
# undesirable. One entry per line, no whitespace.
@@ -1 +0,0 @@
GPL-3.0
@@ -1,11 +0,0 @@
[autospec]
32bit = true
allow_test_failures = false
asneeded = false
broken_c++ = false
broken_parallel_build = false
conservative_flags = false
fast-math = false
funroll-loops = false
insecure_build = false
@@ -1,2 +0,0 @@
# This file contains additional pkgconfig build requirements that did
# not get picked up automatically. One name per line, no whitespace.
@@ -1,2 +0,0 @@
# This file contains pkgconfig build requirements that get picked up
# but are undesirable. One entry per line, no whitespace.
@@ -1,44 +0,0 @@
[autospec]
# build 32 bit libraries
32bit = true
# allow package to build with test failures
allow_test_failures = false
# unset %build ld_as_needed variable
asneeded = false
# extend flags with '-std=gnu++98
broken_c++ = false
# disable parallelization during build
broken_parallel_build = false
# set conservative build flags
conservative_flags = false
# pass -ffast-math to compiler
fast-math = false
# optimize build for speed over size
funroll-loops = false
# set flags to smallest -02 flags possible
insecure_build = false
# do not remove static libraries
keepstatic = false
# do not require autostart subpackage
no_autostart = false
# disable stripping binaries
nostrip = false
# optimize build for size over speed
optimize_size = false
# set profile for pgo
pgo = false
# set flags for security-sensitive builds
security_sensitive = false
# do not run test suite
skip_tests = false
# add .so files to the lib package instead of dev
so_to_lib = false
# configure build for avx2
use_avx2 = false
# add clang flags
use_clang = false
# configure build for lto
use_lto = false
# require package verification for build
verify_required = false
@@ -1,23 +0,0 @@
"""
This file, expectations.py, defines expected test results and is not added to
the test source tarball.
"""
import os
buildreqs = ['xz',
'gcc-dev32',
'gcc-libgcc32',
'gcc-libstdc++32',
'glibc-dev32',
'glibc-libc32']
license = 'GPL-3.0'
with open('tests/testfiles/c-helloworld-32/spec-expectations', 'r') as spec:
specfile = spec.read()
specfile = specfile.replace('{}', os.getcwd()).split('\n')
with open('tests/testfiles/c-helloworld-32/conf-expectations', 'r') as conf:
conffile = conf.read()
conffile = conffile.split('\n')
output_strings = []
-3
View File
@@ -1,3 +0,0 @@
#include<stdio.h>
int main(){printf("Hello World\n");}
@@ -1,53 +0,0 @@
#
# This file is auto-generated. DO NOT EDIT
# Generated by: autospec.py
#
Name : c-helloworld-32
Version : 32
Release : 1
URL : file://{}/tests/testfiles/c-helloworld-32.tar.gz
Source0 : file://{}/tests/testfiles/c-helloworld-32.tar.gz
Summary : No detailed summary available
Group : Development/Tools
License : GPL-3.0
BuildRequires : gcc-dev32
BuildRequires : gcc-libgcc32
BuildRequires : gcc-libstdc++32
BuildRequires : glibc-dev32
BuildRequires : glibc-libc32
BuildRequires : xz
%description
No detailed description available
%prep
%setup -q -n c-helloworld-32
pushd ..
cp -a c-helloworld-32 build32
popd
%build
export http_proxy=http://127.0.0.1:9/
export https_proxy=http://127.0.0.1:9/
export no_proxy=localhost,127.0.0.1,0.0.0.0
export LANG=C
export SOURCE_DATE_EPOCH=1
make V=1 %{?_smp_mflags}
%install
export SOURCE_DATE_EPOCH=1
rm -rf %{buildroot}
pushd ../build32/
%make_install32
if [ -d %{buildroot}/usr/lib32/pkgconfig ]
then
pushd %{buildroot}/usr/lib32/pkgconfig
for i in *.pc ; do ln -s $i 32$i ; done
popd
fi
popd
%make_install
%files
%defattr(-,root,root,-)
/usr/local/bin/helloworld
@@ -1,12 +0,0 @@
DESTDIR ?=
PREFIX ?= /usr/local
helloworld:
gcc main.c -o helloworld
clean:
rm helloworld
install: helloworld
install -m 0755 -d $(DESTDIR)$(PREFIX)/bin
install -m 0755 helloworld $(DESTDIR)$(PREFIX)/bin
@@ -1 +0,0 @@
These README.clear contents should be printed on a successful autospec run.
@@ -1,3 +0,0 @@
# This file contains additional build requirements that did not get
# picked up automatically. One name per line, no whitespace.
xz
@@ -1,2 +0,0 @@
# This file contains build requirements that get picked up but are
# undesirable. One entry per line, no whitespace.
@@ -1 +0,0 @@
GPL-3.0
@@ -1,2 +0,0 @@
# This file contains additional pkgconfig build requirements that did
# not get picked up automatically. One name per line, no whitespace.
@@ -1,2 +0,0 @@
# This file contains pkgconfig build requirements that get picked up
# but are undesirable. One entry per line, no whitespace.
@@ -1,44 +0,0 @@
[autospec]
# build 32 bit libraries
32bit = false
# allow package to build with test failures
allow_test_failures = true
# unset %build ld_as_needed variable
asneeded = true
# extend flags with '-std=gnu++98
broken_c++ = true
# disable parallelization during build
broken_parallel_build = false
# set conservative build flags
conservative_flags = false
# pass -ffast-math to compiler
fast-math = true
# optimize build for speed over size
funroll-loops = true
# set flags to smallest -02 flags possible
insecure_build = false
# do not remove static libraries
keepstatic = true
# do not require autostart subpackage
no_autostart = true
# disable stripping binaries
nostrip = false
# optimize build for size over speed
optimize_size = true
# set profile for pgo
pgo = false
# set flags for security-sensitive builds
security_sensitive = true
# do not run test suite
skip_tests = true
# add .so files to the lib package instead of dev
so_to_lib = false
# configure build for avx2
use_avx2 = false
# add clang flags
use_clang = false
# configure build for lto
use_lto = true
# require package verification for build
verify_required = false
@@ -1,17 +0,0 @@
"""
This file, expectations.py, defines expected test results and is not added to
the test source tarball.
"""
import os
buildreqs = ['xz']
license = 'GPL-3.0'
with open('tests/testfiles/c-helloworld-opts/spec-expectations', 'r') as spec:
specfile = spec.read()
specfile = specfile.replace('{}', os.getcwd()).split('\n')
with open('tests/testfiles/c-helloworld-opts/conf-expectations', 'r') as conf:
conffile = conf.read()
conffile = conffile.split('\n')
output_strings = ['These README.clear contents should be printed on a successful autospec run.']
-3
View File
@@ -1,3 +0,0 @@
#include<stdio.h>
int main(){printf("Hello World\n");}
@@ -1,45 +0,0 @@
#
# This file is auto-generated. DO NOT EDIT
# Generated by: autospec.py
#
%define keepstatic 1
Name : c-helloworld-opts
Version : 1
Release : 1
URL : file://{}/tests/testfiles/c-helloworld-opts.tar.gz
Source0 : file://{}/tests/testfiles/c-helloworld-opts.tar.gz
Summary : No detailed summary available
Group : Development/Tools
License : GPL-3.0
BuildRequires : xz
%description
No detailed description available
%prep
%setup -q -n c-helloworld-opts
%build
export http_proxy=http://127.0.0.1:9/
export https_proxy=http://127.0.0.1:9/
export no_proxy=localhost,127.0.0.1,0.0.0.0
export LANG=C
export SOURCE_DATE_EPOCH=1
unset LD_AS_NEEDED
export AR=gcc-ar
export RANLIB=gcc-ranlib
export NM=gcc-nm
export CFLAGS="$CFLAGS -O3 -Os -falign-functions=32 -fdata-sections -ffast-math -ffat-lto-objects -ffunction-sections -flto -fno-semantic-interposition -fstack-protector-strong -ftree-loop-vectorize "
export FCFLAGS="$CFLAGS -O3 -Os -falign-functions=32 -fdata-sections -ffast-math -ffat-lto-objects -ffunction-sections -flto -fno-semantic-interposition -fstack-protector-strong -ftree-loop-vectorize "
export FFLAGS="$CFLAGS -O3 -Os -falign-functions=32 -fdata-sections -ffast-math -ffat-lto-objects -ffunction-sections -flto -fno-semantic-interposition -fstack-protector-strong -ftree-loop-vectorize "
export CXXFLAGS="$CXXFLAGS -O3 -Os -falign-functions=32 -fdata-sections -ffast-math -ffat-lto-objects -ffunction-sections -flto -fno-semantic-interposition -fstack-protector-strong -ftree-loop-vectorize -std=gnu++98"
make V=1 %{?_smp_mflags}
%install
export SOURCE_DATE_EPOCH=1
rm -rf %{buildroot}
%make_install
%files
%defattr(-,root,root,-)
/usr/local/bin/helloworld
-9
View File
@@ -1,9 +0,0 @@
DESTDIR ?=
PREFIX ?= /usr/local
helloworld:
gcc main.c -o helloworld
install: helloworld
install -m 0755 -d $(DESTDIR)$(PREFIX)/bin
install -m 0755 helloworld $(DESTDIR)$(PREFIX)/bin
@@ -1,3 +0,0 @@
# This file contains additional build requirements that did not get
# picked up automatically. One name per line, no whitespace.
xz
@@ -1,2 +0,0 @@
# This file contains build requirements that get picked up but are
# undesirable. One entry per line, no whitespace.
@@ -1 +0,0 @@
GPL-3.0
@@ -1,10 +0,0 @@
[autospec]
allow_test_failures = false
asneeded = false
broken_c++ = false
broken_parallel_build = false
conservative_flags = false
fast-math = false
funroll-loops = false
insecure_build = false
@@ -1,2 +0,0 @@
# This file contains additional pkgconfig build requirements that did
# not get picked up automatically. One name per line, no whitespace.
@@ -1,2 +0,0 @@
# This file contains pkgconfig build requirements that get picked up
# but are undesirable. One entry per line, no whitespace.
@@ -1,44 +0,0 @@
[autospec]
# build 32 bit libraries
32bit = false
# allow package to build with test failures
allow_test_failures = false
# unset %build ld_as_needed variable
asneeded = false
# extend flags with '-std=gnu++98
broken_c++ = false
# disable parallelization during build
broken_parallel_build = false
# set conservative build flags
conservative_flags = false
# pass -ffast-math to compiler
fast-math = false
# optimize build for speed over size
funroll-loops = false
# set flags to smallest -02 flags possible
insecure_build = false
# do not remove static libraries
keepstatic = false
# do not require autostart subpackage
no_autostart = false
# disable stripping binaries
nostrip = false
# optimize build for size over speed
optimize_size = false
# set profile for pgo
pgo = false
# set flags for security-sensitive builds
security_sensitive = false
# do not run test suite
skip_tests = false
# add .so files to the lib package instead of dev
so_to_lib = false
# configure build for avx2
use_avx2 = false
# add clang flags
use_clang = false
# configure build for lto
use_lto = false
# require package verification for build
verify_required = false
@@ -1,17 +0,0 @@
"""
This file, expectations.py, defines expected test results and is not added to
the test source tarball.
"""
import os
buildreqs = ['xz']
license = 'GPL-3.0'
with open('tests/testfiles/c-helloworld/spec-expectations', 'r') as spec:
specfile = spec.read()
specfile = specfile.replace('{}', os.getcwd()).split('\n')
with open('tests/testfiles/c-helloworld/conf-expectations', 'r') as conf:
conffile = conf.read()
conffile = conffile.split('\n')
output_strings = []
-3
View File
@@ -1,3 +0,0 @@
#include<stdio.h>
int main(){printf("Hello World\n");}
@@ -1,36 +0,0 @@
#
# This file is auto-generated. DO NOT EDIT
# Generated by: autospec.py
#
Name : c-helloworld
Version : 1
Release : 1
URL : file://{}/tests/testfiles/c-helloworld.tar.gz
Source0 : file://{}/tests/testfiles/c-helloworld.tar.gz
Summary : No detailed summary available
Group : Development/Tools
License : GPL-3.0
BuildRequires : xz
%description
No detailed description available
%prep
%setup -q -n c-helloworld
%build
export http_proxy=http://127.0.0.1:9/
export https_proxy=http://127.0.0.1:9/
export no_proxy=localhost,127.0.0.1,0.0.0.0
export LANG=C
export SOURCE_DATE_EPOCH=1
make V=1 %{?_smp_mflags}
%install
export SOURCE_DATE_EPOCH=1
rm -rf %{buildroot}
%make_install
%files
%defattr(-,root,root,-)
/usr/local/bin/helloworld
-857
View File
@@ -1,857 +0,0 @@
Building on Un*x Platforms (including Cygwin and OS X)
=======================================================
Build Requirements
------------------
- autoconf 2.56 or later
- automake 1.7 or later
- libtool 1.4 or later
* If using Xcode 4.3 or later on OS X, autoconf and automake are no longer
provided. The easiest way to obtain them is from
[MacPorts](http://www.MacPorts.org).
- NASM or YASM (if building x86 or x86-64 SIMD extensions)
* If using NASM, 0.98, or 2.01 or later is required for an x86 build (0.99
and 2.00 do not work properly with libjpeg-turbo's x86 SIMD code.)
* If using NASM, 2.00 or later is required for an x86-64 build.
* If using NASM, 2.07 or later (except 2.11.08) is required for an x86-64
Mac build (2.11.08 does not work properly with libjpeg-turbo's x86-64 SIMD
code when building macho64 objects.) NASM or YASM can be obtained from
[MacPorts](http://www.macports.org/).
The binary RPMs released by the NASM project do not work on older Linux
systems, such as Red Hat Enterprise Linux 4. On such systems, you can
easily build and install NASM from a source RPM by downloading one of the
SRPMs from
<http://www.nasm.us/pub/nasm/releasebuilds>
and executing the following as root:
ARCH=`uname -m`
rpmbuild --rebuild nasm-{version}.src.rpm
rpm -Uvh /usr/src/redhat/RPMS/$ARCH/nasm-{version}.$ARCH.rpm
NOTE: the NASM build will fail if texinfo is not installed.
- GCC v4.1 (or later) or clang recommended for best performance
- If building the TurboJPEG Java wrapper, JDK or OpenJDK 1.5 or later is
required. Some systems, such as Solaris 10 and later and Red Hat Enterprise
Linux 5 and later, have this pre-installed. On OS X 10.5 and 10.6, it will
be necessary to install the Java Developer Package, which can be downloaded
from <http://developer.apple.com/downloads> (Apple ID required.) For other
systems, you can obtain the Oracle Java Development Kit from
<http://www.java.com>.
Out-of-Tree Builds
------------------
Binary objects, libraries, and executables are generated in the same directory
from which `configure` was executed (the "binary directory"), and this
directory need not necessarily be the same as the libjpeg-turbo source
directory. You can create multiple independent binary directories, in which
different versions of libjpeg-turbo can be built from the same source tree
using different compilers or settings. In the sections below,
*{build_directory}* refers to the binary directory, whereas
*{source_directory}* refers to the libjpeg-turbo source directory. For in-tree
builds, these directories are the same.
Building libjpeg-turbo
----------------------
The following procedure will build libjpeg-turbo on Linux, FreeBSD, Cygwin, and
Solaris/x86 systems (on Solaris, this generates a 32-bit library. See below
for 64-bit build instructions.)
cd {source_directory}
autoreconf -fiv
cd {build_directory}
sh {source_directory}/configure [additional configure flags]
make
NOTE: Running autoreconf in the source directory is not necessary if building
libjpeg-turbo from one of the official release tarballs.
This will generate the following files under .libs/:
**libjpeg.a**
Static link library for the libjpeg API
**libjpeg.so.{version}** (Linux, Unix)
**libjpeg.{version}.dylib** (OS X)
**cygjpeg-{version}.dll** (Cygwin)
Shared library for the libjpeg API
By default, *{version}* is 62.1.0, 7.1.0, or 8.0.2, depending on whether
libjpeg v6b (default), v7, or v8 emulation is enabled. If using Cygwin,
*{version}* is 62, 7, or 8.
**libjpeg.so** (Linux, Unix)
**libjpeg.dylib** (OS X)
Development symlink for the libjpeg API
**libjpeg.dll.a** (Cygwin)
Import library for the libjpeg API
**libturbojpeg.a**
Static link library for the TurboJPEG API
**libturbojpeg.so.0.1.0** (Linux, Unix)
**libturbojpeg.0.1.0.dylib** (OS X)
**cygturbojpeg-0.dll** (Cygwin)
Shared library for the TurboJPEG API
**libturbojpeg.so** (Linux, Unix)
**libturbojpeg.dylib** (OS X)
Development symlink for the TurboJPEG API
**libturbojpeg.dll.a** (Cygwin)
Import library for the TurboJPEG API
### libjpeg v7 or v8 API/ABI Emulation
Add `--with-jpeg7` to the `configure` command line to build a version of
libjpeg-turbo that is API/ABI-compatible with libjpeg v7. Add `--with-jpeg8`
to the `configure` command to build a version of libjpeg-turbo that is
API/ABI-compatible with libjpeg v8. See [README.md](README.md) for more
information on libjpeg v7 and v8 emulation.
### In-Memory Source/Destination Managers
When using libjpeg v6b or v7 API/ABI emulation, add `--without-mem-srcdst` to
the `configure` command line to build a version of libjpeg-turbo that lacks the
`jpeg_mem_src()` and `jpeg_mem_dest()` functions. These functions were not
part of the original libjpeg v6b and v7 APIs, so removing them ensures strict
conformance with those APIs. See [README.md](README.md) for more information.
### Arithmetic Coding Support
Since the patent on arithmetic coding has expired, this functionality has been
included in this release of libjpeg-turbo. libjpeg-turbo's implementation is
based on the implementation in libjpeg v8, but it works when emulating libjpeg
v7 or v6b as well. The default is to enable both arithmetic encoding and
decoding, but those who have philosophical objections to arithmetic coding can
add `--without-arith-enc` or `--without-arith-dec` to the `configure` command
line to disable encoding or decoding (respectively.)
### TurboJPEG Java Wrapper
Add `--with-java` to the `configure` command line to incorporate an optional
Java Native Interface wrapper into the TurboJPEG shared library and build the
Java front-end classes to support it. This allows the TurboJPEG shared library
to be used directly from Java applications. See [java/README](java/README) for
more details.
You can set the `JAVAC`, `JAR`, and `JAVA` configure variables to specify
alternate commands for javac, jar, and java (respectively.) You can also
set the `JAVACFLAGS` configure variable to specify arguments that should be
passed to the Java compiler when building the front-end classes, and
`JNI_CFLAGS` to specify arguments that should be passed to the C compiler when
building the JNI wrapper. Run `configure --help` for more details.
Installing libjpeg-turbo
------------------------
If you intend to install these libraries and the associated header files, then
replace 'make' in the instructions above with
make install prefix={base dir} libdir={library directory}
For example,
make install prefix=/usr/local libdir=/usr/local/lib64
will install the header files in /usr/local/include and the library files in
/usr/local/lib64. If `prefix` and `libdir` are not specified, then the default
is to install the header files in /opt/libjpeg-turbo/include and the library
files in /opt/libjpeg-turbo/lib32 (32-bit) or /opt/libjpeg-turbo/lib64
(64-bit.)
NOTE: You can specify a prefix of /usr and a libdir of, for instance,
/usr/lib64 to overwrite the system's version of libjpeg. If you do this,
however, then be sure to BACK UP YOUR SYSTEM'S INSTALLATION OF LIBJPEG before
overwriting it. It is recommended that you instead install libjpeg-turbo into
a non-system directory and manipulate the `LD_LIBRARY_PATH` or create symlinks
to force applications to use libjpeg-turbo instead of libjpeg. See
[README.md](README.md) for more information.
Build Recipes
-------------
### 32-bit Build on 64-bit Linux
Add
--host i686-pc-linux-gnu CFLAGS='-O3 -m32' LDFLAGS=-m32
to the `configure` command line.
### 64-bit Build on 64-bit OS X
Add
--host x86_64-apple-darwin NASM=/opt/local/bin/nasm
to the `configure` command line. NASM 2.07 or later from MacPorts must be
installed.
### 32-bit Build on 64-bit OS X
Add
--host i686-apple-darwin CFLAGS='-O3 -m32' LDFLAGS=-m32
to the `configure` command line.
### 64-bit Backward-Compatible Build on 64-bit OS X
Add
--host x86_64-apple-darwin NASM=/opt/local/bin/nasm \
CFLAGS='-mmacosx-version-min=10.5 -O3' \
LDFLAGS='-mmacosx-version-min=10.5'
to the `configure` command line. NASM 2.07 or later from MacPorts must be
installed.
### 32-bit Backward-Compatible Build on OS X
Add
--host i686-apple-darwin \
CFLAGS='-mmacosx-version-min=10.5 -O3 -m32' \
LDFLAGS='-mmacosx-version-min=10.5 -m32'
to the `configure` command line.
### 64-bit Build on 64-bit Solaris
Add
--host x86_64-pc-solaris CFLAGS='-O3 -m64' LDFLAGS=-m64
to the `configure` command line.
### 32-bit Build on 64-bit FreeBSD
Add
--host i386-unknown-freebsd CC='gcc -B /usr/lib32' CFLAGS='-O3 -m32' \
LDFLAGS='-B/usr/lib32'
to the `configure` command line. NASM 2.07 or later from FreeBSD ports must be
installed.
### Oracle Solaris Studio
Add
CC=cc
to the `configure` command line. libjpeg-turbo will automatically be built
with the maximum optimization level (-xO5) unless you override `CFLAGS`.
To build a 64-bit version of libjpeg-turbo using Oracle Solaris Studio, add
--host x86_64-pc-solaris CC=cc CFLAGS='-xO5 -m64' LDFLAGS=-m64
to the `configure` command line.
### MinGW Build on Cygwin
Use CMake (see recipes below)
ARM Support
-----------
This release of libjpeg-turbo can use ARM NEON SIMD instructions to accelerate
JPEG compression/decompression by approximately 2-4x on ARMv7 and later
platforms. If libjpeg-turbo is configured on an ARM Linux platform, then the
build system will automatically include the NEON SIMD routines, if they are
supported. Build instructions for other ARM-based platforms follow.
### Building libjpeg-turbo for iOS
iOS platforms, such as the iPhone and iPad, use ARM processors, some of which
support NEON instructions. Additional steps are required in order to build
libjpeg-turbo for these platforms.
#### Additional build requirements
- [gas-preprocessor.pl]
(https://raw.githubusercontent.com/libjpeg-turbo/gas-preprocessor/master/gas-preprocessor.pl)
should be installed in your `PATH`.
#### ARM 32-bit Build (Xcode 4.6.x and earlier, LLVM-GCC)
Set the following shell variables for simplicity:
*Xcode 4.2 and earlier*
IOS_PLATFORMDIR=/Developer/Platforms/iPhoneOS.platform`
*Xcode 4.3 and later*
IOS_PLATFORMDIR=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform
*All Xcode versions*
IOS_SYSROOT=$IOS_PLATFORMDIR/Developer/SDKs/iPhoneOS*.sdk
IOS_GCC=$IOS_PLATFORMDIR/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2
*ARMv7 (code will run on iPhone 3GS-4S/iPad 1st-3rd Generation and newer)*
IOS_CFLAGS="-march=armv7 -mcpu=cortex-a8 -mtune=cortex-a8 -mfpu=neon"
*ARMv7s (code will run on iPhone 5/iPad 4th Generation and newer)*
[NOTE: Requires Xcode 4.5 or later]
IOS_CFLAGS="-march=armv7s -mcpu=swift -mtune=swift -mfpu=neon"
Follow the procedure under "Building libjpeg-turbo" above, adding
--host arm-apple-darwin10 \
CC="$IOS_GCC" LD="$IOS_GCC" \
CFLAGS="-mfloat-abi=softfp -isysroot $IOS_SYSROOT -O3 $IOS_CFLAGS" \
LDFLAGS="-mfloat-abi=softfp -isysroot $IOS_SYSROOT $IOS_CFLAGS"
to the `configure` command line.
#### ARM 32-bit Build (Xcode 5.0.x and later, Clang)
Set the following shell variables for simplicity:
IOS_PLATFORMDIR=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform
IOS_SYSROOT=$IOS_PLATFORMDIR/Developer/SDKs/iPhoneOS*.sdk
IOS_GCC=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
*ARMv7 (code will run on iPhone 3GS-4S/iPad 1st-3rd Generation and newer)*
IOS_CFLAGS="-arch armv7"
*ARMv7s (code will run on iPhone 5/iPad 4th Generation and newer)*
IOS_CFLAGS="-arch armv7s"
Follow the procedure under "Building libjpeg-turbo" above, adding
--host arm-apple-darwin10 \
CC="$IOS_GCC" LD="$IOS_GCC" \
CFLAGS="-mfloat-abi=softfp -isysroot $IOS_SYSROOT -O3 $IOS_CFLAGS" \
LDFLAGS="-mfloat-abi=softfp -isysroot $IOS_SYSROOT $IOS_CFLAGS" \
CCASFLAGS="-no-integrated-as $IOS_CFLAGS"
to the `configure` command line.
#### ARMv8 64-bit Build (Xcode 5.0.x and later, Clang)
Code will run on iPhone 5S/iPad Mini 2/iPad Air and newer.
Set the following shell variables for simplicity:
IOS_PLATFORMDIR=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform
IOS_SYSROOT=$IOS_PLATFORMDIR/Developer/SDKs/iPhoneOS*.sdk
IOS_GCC=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
IOS_CFLAGS="-arch arm64"
Follow the procedure under "Building libjpeg-turbo" above, adding
--host aarch64-apple-darwin \
CC="$IOS_GCC" LD="$IOS_GCC" \
CFLAGS="-isysroot $IOS_SYSROOT -O3 $IOS_CFLAGS" \
LDFLAGS="-isysroot $IOS_SYSROOT $IOS_CFLAGS"
to the `configure` command line.
NOTE: You can also add `-miphoneos-version-min={version}` to `$IOS_CFLAGS`
above in order to support older versions of iOS than the default version
supported by the SDK.
Once built, lipo can be used to combine the ARMv7, v7s, and/or v8 variants into
a universal library.
### Building libjpeg-turbo for Android
Building libjpeg-turbo for Android platforms requires the
{Android NDK}(https://developer.android.com/tools/sdk/ndk)
and autotools. The following is a general recipe script that can be modified for your specific needs.
# Set these variables to suit your needs
NDK_PATH={full path to the "ndk" directory-- for example, /opt/android/ndk}
BUILD_PLATFORM={the platform name for the NDK package you installed--
for example, "windows-x86" or "linux-x86_64" or "darwin-x86_64"}
TOOLCHAIN_VERSION={"4.8", "4.9", "clang3.5", etc. This corresponds to a
toolchain directory under ${NDK_PATH}/toolchains/.}
ANDROID_VERSION={The minimum version of Android to support-- for example,
"16", "19", etc. "21" or later is required for a 64-bit build.}
# 32-bit ARMv7 build
HOST=arm-linux-androideabi
SYSROOT=${NDK_PATH}/platforms/android-${ANDROID_VERSION}/arch-arm
ANDROID_CFLAGS="-march=armv7-a -mfloat-abi=softfp -fprefetch-loop-arrays \
--sysroot=${SYSROOT}"
# 64-bit ARMv8 build
HOST=aarch64-linux-android
SYSROOT=${NDK_PATH}/platforms/android-${ANDROID_VERSION}/arch-arm64
ANDROID_CFLAGS="--sysroot=${SYSROOT}"
TOOLCHAIN=${NDK_PATH}/toolchains/${HOST}-${TOOLCHAIN_VERSION}/prebuilt/${BUILD_PLATFORM}
ANDROID_INCLUDES="-I${SYSROOT}/usr/include -I${TOOLCHAIN}/include"
export CPP=${TOOLCHAIN}/bin/${HOST}-cpp
export AR=${TOOLCHAIN}/bin/${HOST}-ar
export AS=${TOOLCHAIN}/bin/${HOST}-as
export NM=${TOOLCHAIN}/bin/${HOST}-nm
export CC=${TOOLCHAIN}/bin/${HOST}-gcc
export LD=${TOOLCHAIN}/bin/${HOST}-ld
export RANLIB=${TOOLCHAIN}/bin/${HOST}-ranlib
export OBJDUMP=${TOOLCHAIN}/bin/${HOST}-objdump
export STRIP=${TOOLCHAIN}/bin/${HOST}-strip
cd {build_directory}
sh {source_directory}/configure --host=${HOST} \
CFLAGS="${ANDROID_INCLUDES} ${ANDROID_CFLAGS} -O3 -fPIE" \
CPPFLAGS="${ANDROID_INCLUDES} ${ANDROID_CFLAGS}" \
LDFLAGS="${ANDROID_CFLAGS} -pie" --with-simd ${1+"$@"}
make
If building for Android 4.0.x (API level < 16) or earlier, remove `-fPIE` from
`CFLAGS` and `-pie` from `LDFLAGS`.
Building on Windows (Visual C++ or MinGW)
=========================================
Build Requirements
------------------
- [CMake](http://www.cmake.org) v2.8.11 or later
- [NASM](http://www.nasm.us) or [YASM](http://yasm.tortall.net)
* If using NASM, 0.98 or later is required for an x86 build.
* If using NASM, 2.05 or later is required for an x86-64 build.
* nasm.exe/yasm.exe should be in your `PATH`.
- Microsoft Visual C++ 2005 or later
If you don't already have Visual C++, then the easiest way to get it is by
installing the
[Windows SDK](http://msdn.microsoft.com/en-us/windows/bb980924.aspx).
The Windows SDK includes both 32-bit and 64-bit Visual C++ compilers and
everything necessary to build libjpeg-turbo.
* You can also use Microsoft Visual Studio Express/Community Edition, which
is a free download. (NOTE: versions prior to 2012 can only be used to
build 32-bit code.)
* If you intend to build libjpeg-turbo from the command line, then add the
appropriate compiler and SDK directories to the `INCLUDE`, `LIB`, and
`PATH` environment variables. This is generally accomplished by
executing `vcvars32.bat` or `vcvars64.bat` and `SetEnv.cmd`.
`vcvars32.bat` and `vcvars64.bat` are part of Visual C++ and are located in
the same directory as the compiler. `SetEnv.cmd` is part of the Windows
SDK. You can pass optional arguments to `SetEnv.cmd` to specify a 32-bit
or 64-bit build environment.
... OR ...
- MinGW
[MinGW-builds](http://sourceforge.net/projects/mingwbuilds/) or
[tdm-gcc](http://tdm-gcc.tdragon.net/) recommended if building on a Windows
machine. Both distributions install a Start Menu link that can be used to
launch a command prompt with the appropriate compiler paths automatically
set.
- If building the TurboJPEG Java wrapper, JDK 1.5 or later is required. This
can be downloaded from <http://www.java.com>.
Out-of-Tree Builds
------------------
Binary objects, libraries, and executables are generated in the same directory
from which `cmake` was executed (the "binary directory"), and this directory
need not necessarily be the same as the libjpeg-turbo source directory. You
can create multiple independent binary directories, in which different versions
of libjpeg-turbo can be built from the same source tree using different
compilers or settings. In the sections below, *{build_directory}* refers to
the binary directory, whereas *{source_directory}* refers to the libjpeg-turbo
source directory. For in-tree builds, these directories are the same.
Building libjpeg-turbo
----------------------
### Visual C++ (Command Line)
cd {build_directory}
cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release {source_directory}
nmake
This will build either a 32-bit or a 64-bit version of libjpeg-turbo, depending
on which version of cl.exe is in the `PATH`.
The following files will be generated under *{build_directory}*:
**jpeg-static.lib**
Static link library for the libjpeg API
**sharedlib/jpeg{version}.dll**
DLL for the libjpeg API
**sharedlib/jpeg.lib**
Import library for the libjpeg API
**turbojpeg-static.lib**
Static link library for the TurboJPEG API
**turbojpeg.dll**
DLL for the TurboJPEG API
**turbojpeg.lib**
Import library for the TurboJPEG API
*{version}* is 62, 7, or 8, depending on whether libjpeg v6b (default), v7, or
v8 emulation is enabled.
### Visual C++ (IDE)
Choose the appropriate CMake generator option for your version of Visual Studio
(run `cmake` with no arguments for a list of available generators.) For
instance:
cd {build_directory}
cmake -G "Visual Studio 10" {source_directory}
NOTE: Add "Win64" to the generator name (for example, "Visual Studio 10
Win64") to build a 64-bit version of libjpeg-turbo. Recent versions of CMake
no longer document that. A separate build directory must be used for 32-bit
and 64-bit builds.
You can then open ALL_BUILD.vcproj in Visual Studio and build one of the
configurations in that project ("Debug", "Release", etc.) to generate a full
build of libjpeg-turbo.
This will generate the following files under *{build_directory}*:
**{configuration}/jpeg-static.lib**
Static link library for the libjpeg API
**sharedlib/{configuration}/jpeg{version}.dll**
DLL for the libjpeg API
**sharedlib/{configuration}/jpeg.lib**
Import library for the libjpeg API
**{configuration}/turbojpeg-static.lib**
Static link library for the TurboJPEG API
**{configuration}/turbojpeg.dll**
DLL for the TurboJPEG API
**{configuration}/turbojpeg.lib**
Import library for the TurboJPEG API
*{configuration}* is Debug, Release, RelWithDebInfo, or MinSizeRel, depending
on the configuration you built in the IDE, and *{version}* is 62, 7, or 8,
depending on whether libjpeg v6b (default), v7, or v8 emulation is enabled.
### MinGW
NOTE: This assumes that you are building on a Windows machine. If you are
cross-compiling on a Linux/Unix machine, then see "Build Recipes" below.
cd {build_directory}
cmake -G "MinGW Makefiles" {source_directory}
mingw32-make
This will generate the following files under *{build_directory}*:
**libjpeg.a**
Static link library for the libjpeg API
**sharedlib/libjpeg-{version}.dll**
DLL for the libjpeg API
**sharedlib/libjpeg.dll.a**
Import library for the libjpeg API
**libturbojpeg.a**
Static link library for the TurboJPEG API
**libturbojpeg.dll**
DLL for the TurboJPEG API
**libturbojpeg.dll.a**
Import library for the TurboJPEG API
*{version}* is 62, 7, or 8, depending on whether libjpeg v6b (default), v7, or
v8 emulation is enabled.
### Debug Build
Add `-DCMAKE_BUILD_TYPE=Debug` to the `cmake` command line. Or, if building
with NMake, remove `-DCMAKE_BUILD_TYPE=Release` (Debug builds are the default
with NMake.)
### libjpeg v7 or v8 API/ABI Emulation
Add `-DWITH_JPEG7=1` to the `cmake` command line to build a version of
libjpeg-turbo that is API/ABI-compatible with libjpeg v7. Add `-DWITH_JPEG8=1`
to the `cmake` command line to build a version of libjpeg-turbo that is
API/ABI-compatible with libjpeg v8. See [README.md](README.md) for more
information on libjpeg v7 and v8 emulation.
### In-Memory Source/Destination Managers
When using libjpeg v6b or v7 API/ABI emulation, add `-DWITH_MEM_SRCDST=0` to
the `cmake` command line to build a version of libjpeg-turbo that lacks the
`jpeg_mem_src()` and `jpeg_mem_dest()` functions. These functions were not
part of the original libjpeg v6b and v7 APIs, so removing them ensures strict
conformance with those APIs. See [README.md](README.md) for more information.
### Arithmetic Coding Support
Since the patent on arithmetic coding has expired, this functionality has been
included in this release of libjpeg-turbo. libjpeg-turbo's implementation is
based on the implementation in libjpeg v8, but it works when emulating libjpeg
v7 or v6b as well. The default is to enable both arithmetic encoding and
decoding, but those who have philosophical objections to arithmetic coding can
add `-DWITH_ARITH_ENC=0` or `-DWITH_ARITH_DEC=0` to the `cmake` command line to
disable encoding or decoding (respectively.)
### TurboJPEG Java Wrapper
Add `-DWITH_JAVA=1` to the `cmake` command line to incorporate an optional Java
Native Interface wrapper into the TurboJPEG shared library and build the Java
front-end classes to support it. This allows the TurboJPEG shared library to
be used directly from Java applications. See [java/README](java/README) for
more details.
You can set the `Java_JAVAC_EXECUTABLE`, `Java_JAVA_EXECUTABLE`, and
`Java_JAR_EXECUTABLE` CMake variables to specify alternate commands or
locations for javac, jar, and java (respectively.) You can also set the
`JAVACFLAGS` CMake variable to specify arguments that should be passed to the
Java compiler when building the front-end classes.
Installing libjpeg-turbo
------------------------
You can use the build system to install libjpeg-turbo into a directory of your
choosing (as opposed to creating an installer.) To do this, add:
-DCMAKE_INSTALL_PREFIX={install_directory}
to the cmake command line.
For example,
cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=c:\libjpeg-turbo {source_directory}
nmake install
will install the header files in c:\libjpeg-turbo\include, the library files
in c:\libjpeg-turbo\lib, the DLL's in c:\libjpeg-turbo\bin, and the
documentation in c:\libjpeg-turbo\doc.
Build Recipes
-------------
### 64-bit MinGW Build on Cygwin
cd {build_directory}
CC=/usr/bin/x86_64-w64-mingw32-gcc \
cmake -G "Unix Makefiles" -DCMAKE_SYSTEM_NAME=Windows \
-DCMAKE_RC_COMPILER=/usr/bin/x86_64-w64-mingw32-windres.exe \
{source_directory}
make
This produces a 64-bit build of libjpeg-turbo that does not depend on
cygwin1.dll or other Cygwin DLL's. The mingw64-x86\_64-gcc-core and
mingw64-x86\_64-gcc-g++ packages (and their dependencies) must be installed.
### 32-bit MinGW Build on Cygwin
cd {build_directory}
CC=/usr/bin/i686-w64-mingw32-gcc \
cmake -G "Unix Makefiles" -DCMAKE_SYSTEM_NAME=Windows \
-DCMAKE_RC_COMPILER=/usr/bin/i686-w64-mingw32-windres.exe \
{source_directory}
make
This produces a 32-bit build of libjpeg-turbo that does not depend on
cygwin1.dll or other Cygwin DLL's. The mingw64-i686-gcc-core and
mingw64-i686-gcc-g++ packages (and their dependencies) must be installed.
### MinGW Build on Linux
cd {build_directory}
CC={mingw_binary_path}/i686-pc-mingw32-gcc \
cmake -G "Unix Makefiles" -DCMAKE_SYSTEM_NAME=Windows \
-DCMAKE_RC_COMPILER={mingw_binary_path}/i686-pc-mingw32-windres \
-DCMAKE_AR={mingw_binary_path}/i686-pc-mingw32-ar \
-DCMAKE_RANLIB={mingw_binary_path}/i686-pc-mingw32-ranlib \
{source_directory}
make
Creating Release Packages
=========================
The following commands can be used to create various types of release packages:
Unix/Linux
----------
make rpm
Create Red Hat-style binary RPM package. Requires RPM v4 or later.
make srpm
This runs `make dist` to create a pristine source tarball, then creates a
Red Hat-style source RPM package from the tarball. Requires RPM v4 or later.
make deb
Create Debian-style binary package. Requires dpkg.
make dmg
Create Macintosh package/disk image. This requires pkgbuild and
productbuild, which are installed by default on OS X 10.7 and later and which
can be obtained by installing Xcode 3.2.6 (with the "Unix Development"
option) on OS X 10.6. Packages built in this manner can be installed on OS X
10.5 and later, but they must be built on OS X 10.6 or later.
make udmg [BUILDDIR32={32-bit build directory}]
On 64-bit OS X systems, this creates a Macintosh package and disk image that
contains universal i386/x86-64 binaries. You should first configure a 32-bit
out-of-tree build of libjpeg-turbo, then configure a 64-bit out-of-tree
build, then run `make udmg` from the 64-bit build directory. The build
system will look for the 32-bit build under *{source_directory}*/osxx86 by
default, but you can override this by setting the `BUILDDIR32` variable on the
make command line as shown above.
make iosdmg [BUILDDIR32={32-bit build directory}] \
[BUILDDIRARMV7={ARMv7 build directory}] \
[BUILDDIRARMV7S={ARMv7s build directory}] \
[BUILDDIRARMV8={ARMv8 build directory}]
On OS X systems, this creates a Macintosh package and disk image in which the
libjpeg-turbo static libraries contain ARM architectures necessary to build
iOS applications. If building on an x86-64 system, the binaries will also
contain the i386 architecture, as with `make udmg` above. You should first
configure ARMv7, ARMv7s, and/or ARMv8 out-of-tree builds of libjpeg-turbo (see
"Building libjpeg-turbo for iOS" above.) If you are building an x86-64 version
of libjpeg-turbo, you should configure a 32-bit out-of-tree build as well.
Next, build libjpeg-turbo as you would normally, using an out-of-tree build.
When it is built, run `make iosdmg` from the build directory. The build system
will look for the ARMv7 build under *{source_directory}*/iosarmv7 by default,
the ARMv7s build under *{source_directory}*/iosarmv7s by default, the ARMv8
build under *{source_directory}*/iosarmv8 by default, and (if applicable) the
32-bit build under *{source_directory}*/osxx86 by default, but you can override
this by setting the `BUILDDIR32`, `BUILDDIRARMV7`, `BUILDDIRARMV7S`, and/or
`BUILDDIRARMV8` variables on the `make` command line as shown above.
NOTE: If including an ARMv8 build in the package, then you may need to use
Xcode's version of lipo instead of the operating system's. To do this, pass
an argument of `LIPO="xcrun lipo"` on the make command line.
make cygwinpkg
Build a Cygwin binary package.
Windows
-------
If using NMake:
cd {build_directory}
nmake installer
If using MinGW:
cd {build_directory}
make installer
If using the Visual Studio IDE, build the "installer" project.
The installer package (libjpeg-turbo[-gcc][64].exe) will be located under
*{build_directory}*. If building using the Visual Studio IDE, then the
installer package will be located in a subdirectory with the same name as the
configuration you built (such as *{build_directory}*\Debug\ or
*{build_directory}*\Release\).
Building a Windows installer requires the Nullsoft Install System
(http://nsis.sourceforge.net/.) makensis.exe should be in your `PATH`.
Regression testing
==================
The most common way to test libjpeg-turbo is by invoking `make test` on
Unix/Linux platforms or `ctest` on Windows platforms, once the build has
completed. This runs a series of tests to ensure that mathematical
compatibility has been maintained between libjpeg-turbo and libjpeg v6b. This
also invokes the TurboJPEG unit tests, which ensure that the colorspace
extensions, YUV encoding, decompression scaling, and other features of the
TurboJPEG C and Java APIs are working properly (and, by extension, that the
equivalent features of the underlying libjpeg API are also working.)
Invoking `make testclean` or `nmake testclean` (if using NMake) or building
the 'testclean' target (if using the Visual Studio IDE) will clean up the
output images generated by `make test`.
On Unix/Linux platforms, more extensive tests of the TurboJPEG C and Java
wrappers can be run by invoking `make tjtest`. These extended TurboJPEG tests
essentially iterate through all of the available features of the TurboJPEG APIs
that are not covered by the TurboJPEG unit tests (this includes the lossless
transform options) and compare the images generated by each feature to images
generated using the equivalent feature in the libjpeg API. The extended
TurboJPEG tests are meant to test for regressions in the TurboJPEG wrappers,
not in the underlying libjpeg API library.
@@ -1,935 +0,0 @@
#
# Setup
#
cmake_minimum_required(VERSION 2.8.11)
# Use LINK_INTERFACE_LIBRARIES instead of INTERFACE_LINK_LIBRARIES
if(POLICY CMP0022)
cmake_policy(SET CMP0022 OLD)
endif()
project(libjpeg-turbo C)
set(VERSION 1.5.1)
string(REPLACE "." ";" VERSION_TRIPLET ${VERSION})
list(GET VERSION_TRIPLET 0 VERSION_MAJOR)
list(GET VERSION_TRIPLET 1 VERSION_MINOR)
list(GET VERSION_TRIPLET 2 VERSION_REVISION)
function(pad_number NUMBER OUTPUT_LEN)
string(LENGTH "${${NUMBER}}" INPUT_LEN)
if(INPUT_LEN LESS OUTPUT_LEN)
math(EXPR ZEROES "${OUTPUT_LEN} - ${INPUT_LEN} - 1")
set(NUM ${${NUMBER}})
foreach(C RANGE ${ZEROES})
set(NUM "0${NUM}")
endforeach()
set(${NUMBER} ${NUM} PARENT_SCOPE)
endif()
endfunction()
pad_number(VERSION_MINOR 3)
pad_number(VERSION_REVISION 3)
set(LIBJPEG_TURBO_VERSION_NUMBER ${VERSION_MAJOR}${VERSION_MINOR}${VERSION_REVISION})
if(NOT WIN32)
message(FATAL_ERROR "Platform not supported by this build system. Use autotools instead.")
endif()
string(TIMESTAMP BUILD "%Y%m%d")
# This does nothing except when using MinGW. CMAKE_BUILD_TYPE has no meaning
# in Visual Studio, and it always defaults to Debug when using NMake.
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()
message(STATUS "CMAKE_BUILD_TYPE = ${CMAKE_BUILD_TYPE}")
# This only works if building from the command line. There is currently no way
# to set a variable's value based on the build type when using Visual Studio.
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
set(BUILD "${BUILD}d")
endif()
message(STATUS "VERSION = ${VERSION}, BUILD = ${BUILD}")
option(WITH_SIMD "Include SIMD extensions" TRUE)
option(WITH_ARITH_ENC "Include arithmetic encoding support when emulating the libjpeg v6b API/ABI" TRUE)
option(WITH_ARITH_DEC "Include arithmetic decoding support when emulating the libjpeg v6b API/ABI" TRUE)
option(WITH_JPEG7 "Emulate libjpeg v7 API/ABI (this makes libjpeg-turbo backward incompatible with libjpeg v6b)" FALSE)
option(WITH_JPEG8 "Emulate libjpeg v8 API/ABI (this makes libjpeg-turbo backward incompatible with libjpeg v6b)" FALSE)
option(WITH_MEM_SRCDST "Include in-memory source/destination manager functions when emulating the libjpeg v6b or v7 API/ABI" TRUE)
option(WITH_TURBOJPEG "Include the TurboJPEG wrapper library and associated test programs" TRUE)
option(WITH_JAVA "Build Java wrapper for the TurboJPEG library" FALSE)
option(WITH_12BIT "Encode/decode JPEG images with 12-bit samples (implies WITH_SIMD=0 WITH_TURBOJPEG=0 WITH_ARITH_ENC=0 WITH_ARITH_DEC=0)" FALSE)
option(ENABLE_STATIC "Build static libraries" TRUE)
option(ENABLE_SHARED "Build shared libraries" TRUE)
if(WITH_12BIT)
set(WITH_SIMD FALSE)
set(WITH_TURBOJPEG FALSE)
set(WITH_JAVA FALSE)
set(WITH_ARITH_ENC FALSE)
set(WITH_ARITH_DEC FALSE)
set(BITS_IN_JSAMPLE 12)
message(STATUS "12-bit JPEG support enabled")
else()
set(BITS_IN_JSAMPLE 8)
endif()
if(WITH_JPEG8 OR WITH_JPEG7)
set(WITH_ARITH_ENC 1)
set(WITH_ARITH_DEC 1)
endif()
if(WITH_JPEG8)
set(WITH_MEM_SRCDST 1)
endif()
if(WITH_ARITH_ENC)
set(C_ARITH_CODING_SUPPORTED 1)
message(STATUS "Arithmetic encoding support enabled")
else()
message(STATUS "Arithmetic encoding support disabled")
endif()
if(WITH_ARITH_DEC)
set(D_ARITH_CODING_SUPPORTED 1)
message(STATUS "Arithmetic decoding support enabled")
else()
message(STATUS "Arithmetic decoding support disabled")
endif()
if(WITH_TURBOJPEG)
message(STATUS "TurboJPEG C wrapper enabled")
else()
message(STATUS "TurboJPEG C wrapper disabled")
endif()
if(WITH_JAVA)
message(STATUS "TurboJPEG Java wrapper enabled")
else()
message(STATUS "TurboJPEG Java wrapper disabled")
endif()
set(SO_AGE 0)
if(WITH_MEM_SRCDST)
set(SO_AGE 1)
endif()
set(JPEG_LIB_VERSION 62)
set(DLL_VERSION ${JPEG_LIB_VERSION})
set(FULLVERSION ${DLL_VERSION}.${SO_AGE}.0)
if(WITH_JPEG8)
set(JPEG_LIB_VERSION 80)
set(DLL_VERSION 8)
set(FULLVERSION ${DLL_VERSION}.0.2)
message(STATUS "Emulating libjpeg v8 API/ABI")
elseif(WITH_JPEG7)
set(JPEG_LIB_VERSION 70)
set(DLL_VERSION 7)
set(FULLVERSION ${DLL_VERSION}.${SO_AGE}.0)
message(STATUS "Emulating libjpeg v7 API/ABI")
endif(WITH_JPEG8)
if(WITH_MEM_SRCDST)
set(MEM_SRCDST_SUPPORTED 1)
message(STATUS "In-memory source/destination managers enabled")
else()
message(STATUS "In-memory source/destination managers disabled")
endif()
if(MSVC)
option(WITH_CRT_DLL
"Link all libjpeg-turbo libraries and executables with the C run-time DLL (msvcr*.dll) instead of the static C run-time library (libcmt*.lib.) The default is to use the C run-time DLL only with the libraries and executables that need it."
FALSE)
if(NOT WITH_CRT_DLL)
# Use the static C library for all build types
foreach(var CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
if(${var} MATCHES "/MD")
string(REGEX REPLACE "/MD" "/MT" ${var} "${${var}}")
endif()
endforeach()
endif()
add_definitions(-W3 -wd4996)
endif()
# Detect whether compiler is 64-bit
if(MSVC AND CMAKE_CL_64)
set(SIMD_X86_64 1)
set(64BIT 1)
elseif(CMAKE_SIZEOF_VOID_P MATCHES 8)
set(SIMD_X86_64 1)
set(64BIT 1)
endif()
if(64BIT)
message(STATUS "64-bit build")
else()
message(STATUS "32-bit build")
endif()
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
if(MSVC)
set(CMAKE_INSTALL_PREFIX_DEFAULT ${CMAKE_PROJECT_NAME})
else()
set(CMAKE_INSTALL_PREFIX_DEFAULT ${CMAKE_PROJECT_NAME}-gcc)
endif()
if(64BIT)
set(CMAKE_INSTALL_PREFIX_DEFAULT ${CMAKE_INSTALL_PREFIX_DEFAULT}64)
endif()
set(CMAKE_INSTALL_PREFIX "c:/${CMAKE_INSTALL_PREFIX_DEFAULT}" CACHE PATH
"Directory into which to install libjpeg-turbo (default: c:/${CMAKE_INSTALL_PREFIX_DEFAULT})"
FORCE)
endif()
message(STATUS "Install directory = ${CMAKE_INSTALL_PREFIX}")
configure_file(win/jconfig.h.in jconfig.h)
configure_file(win/jconfigint.h.in jconfigint.h)
include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR})
string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_UC)
set(EFFECTIVE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE_UC}}")
message(STATUS "Compiler flags = ${EFFECTIVE_C_FLAGS}")
set(EFFECTIVE_LD_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS_${CMAKE_BUILD_TYPE_UC}}")
message(STATUS "Linker flags = ${EFFECTIVE_LD_FLAGS}")
if(WITH_JAVA)
find_package(Java)
find_package(JNI)
if(DEFINED JAVACFLAGS)
message(STATUS "Java compiler flags = ${JAVACFLAGS}")
endif()
endif()
#
# Targets
#
set(JPEG_SOURCES jcapimin.c jcapistd.c jccoefct.c jccolor.c jcdctmgr.c jchuff.c
jcinit.c jcmainct.c jcmarker.c jcmaster.c jcomapi.c jcparam.c jcphuff.c
jcprepct.c jcsample.c jctrans.c jdapimin.c jdapistd.c jdatadst.c jdatasrc.c
jdcoefct.c jdcolor.c jddctmgr.c jdhuff.c jdinput.c jdmainct.c jdmarker.c
jdmaster.c jdmerge.c jdphuff.c jdpostct.c jdsample.c jdtrans.c jerror.c
jfdctflt.c jfdctfst.c jfdctint.c jidctflt.c jidctfst.c jidctint.c jidctred.c
jquant1.c jquant2.c jutils.c jmemmgr.c jmemnobs.c)
if(WITH_ARITH_ENC OR WITH_ARITH_DEC)
set(JPEG_SOURCES ${JPEG_SOURCES} jaricom.c)
endif()
if(WITH_ARITH_ENC)
set(JPEG_SOURCES ${JPEG_SOURCES} jcarith.c)
endif()
if(WITH_ARITH_DEC)
set(JPEG_SOURCES ${JPEG_SOURCES} jdarith.c)
endif()
if(WITH_SIMD)
add_definitions(-DWITH_SIMD)
add_subdirectory(simd)
if(SIMD_X86_64)
set(JPEG_SOURCES ${JPEG_SOURCES} simd/jsimd_x86_64.c)
else()
set(JPEG_SOURCES ${JPEG_SOURCES} simd/jsimd_i386.c)
endif()
# This tells CMake that the "source" files haven't been generated yet
set_source_files_properties(${SIMD_OBJS} PROPERTIES GENERATED 1)
else()
set(JPEG_SOURCES ${JPEG_SOURCES} jsimd_none.c)
message(STATUS "Not using SIMD acceleration")
endif()
if(WITH_JAVA)
add_subdirectory(java)
set(ENABLE_SHARED TRUE)
endif()
if(ENABLE_SHARED)
add_subdirectory(sharedlib)
endif()
if(ENABLE_STATIC OR WITH_TURBOJPEG)
add_library(jpeg-static STATIC ${JPEG_SOURCES} ${SIMD_OBJS})
if(NOT MSVC)
set_target_properties(jpeg-static PROPERTIES OUTPUT_NAME jpeg)
endif()
if(WITH_SIMD)
add_dependencies(jpeg-static simd)
endif()
endif()
if(WITH_TURBOJPEG)
set(TURBOJPEG_SOURCES turbojpeg.c transupp.c jdatadst-tj.c jdatasrc-tj.c)
if(WITH_JAVA)
set(TURBOJPEG_SOURCES ${TURBOJPEG_SOURCES} turbojpeg-jni.c)
include_directories(${JAVA_INCLUDE_PATH} ${JAVA_INCLUDE_PATH2})
endif()
if(ENABLE_SHARED)
add_library(turbojpeg SHARED ${TURBOJPEG_SOURCES})
set_target_properties(turbojpeg PROPERTIES DEFINE_SYMBOL DLLDEFINE)
if(MINGW)
set_target_properties(turbojpeg PROPERTIES LINK_FLAGS -Wl,--kill-at)
endif()
target_link_libraries(turbojpeg jpeg-static)
set_target_properties(turbojpeg PROPERTIES LINK_INTERFACE_LIBRARIES "")
add_executable(tjunittest tjunittest.c tjutil.c)
target_link_libraries(tjunittest turbojpeg)
add_executable(tjbench tjbench.c bmp.c tjutil.c rdbmp.c rdppm.c wrbmp.c
wrppm.c)
target_link_libraries(tjbench turbojpeg jpeg-static)
set_property(TARGET tjbench PROPERTY COMPILE_FLAGS
"-DBMP_SUPPORTED -DPPM_SUPPORTED")
endif()
if(ENABLE_STATIC)
add_library(turbojpeg-static STATIC ${JPEG_SOURCES} ${SIMD_OBJS}
turbojpeg.c transupp.c jdatadst-tj.c jdatasrc-tj.c)
if(NOT MSVC)
set_target_properties(turbojpeg-static PROPERTIES OUTPUT_NAME turbojpeg)
endif()
if(WITH_SIMD)
add_dependencies(turbojpeg-static simd)
endif()
add_executable(tjunittest-static tjunittest.c tjutil.c)
target_link_libraries(tjunittest-static turbojpeg-static)
add_executable(tjbench-static tjbench.c bmp.c tjutil.c rdbmp.c rdppm.c
wrbmp.c wrppm.c)
target_link_libraries(tjbench-static turbojpeg-static jpeg-static)
set_property(TARGET tjbench-static PROPERTY COMPILE_FLAGS
"-DBMP_SUPPORTED -DPPM_SUPPORTED")
endif()
endif()
if(WITH_12BIT)
set(COMPILE_FLAGS "-DGIF_SUPPORTED -DPPM_SUPPORTED -DUSE_SETMODE")
else()
set(COMPILE_FLAGS "-DBMP_SUPPORTED -DGIF_SUPPORTED -DPPM_SUPPORTED -DTARGA_SUPPORTED -DUSE_SETMODE")
set(CJPEG_BMP_SOURCES rdbmp.c rdtarga.c)
set(DJPEG_BMP_SOURCES wrbmp.c wrtarga.c)
endif()
if(ENABLE_STATIC)
add_executable(cjpeg-static cjpeg.c cdjpeg.c rdgif.c rdppm.c rdswitch.c
${CJPEG_BMP_SOURCES})
set_property(TARGET cjpeg-static PROPERTY COMPILE_FLAGS ${COMPILE_FLAGS})
target_link_libraries(cjpeg-static jpeg-static)
add_executable(djpeg-static djpeg.c cdjpeg.c rdcolmap.c rdswitch.c wrgif.c
wrppm.c ${DJPEG_BMP_SOURCES})
set_property(TARGET djpeg-static PROPERTY COMPILE_FLAGS ${COMPILE_FLAGS})
target_link_libraries(djpeg-static jpeg-static)
add_executable(jpegtran-static jpegtran.c cdjpeg.c rdswitch.c transupp.c)
target_link_libraries(jpegtran-static jpeg-static)
set_property(TARGET jpegtran-static PROPERTY COMPILE_FLAGS "-DUSE_SETMODE")
endif()
add_executable(rdjpgcom rdjpgcom.c)
add_executable(wrjpgcom wrjpgcom.c)
#
# Tests
#
add_subdirectory(md5)
if(MSVC_IDE)
set(OBJDIR "\${CTEST_CONFIGURATION_TYPE}/")
else()
set(OBJDIR "")
endif()
enable_testing()
if(WITH_12BIT)
set(TESTORIG testorig12.jpg)
set(MD5_JPEG_RGB_ISLOW 9620f424569594bb9242b48498ad801f)
set(MD5_PPM_RGB_ISLOW f3301d2219783b8b3d942b7239fa50c0)
set(MD5_JPEG_422_IFAST_OPT 7322e3bd2f127f7de4b40d4480ce60e4)
set(MD5_PPM_422_IFAST 79807fa552899e66a04708f533e16950)
set(MD5_PPM_422M_IFAST 07737bfe8a7c1c87aaa393a0098d16b0)
set(MD5_JPEG_420_IFAST_Q100_PROG a1da220b5604081863a504297ed59e55)
set(MD5_PPM_420_Q100_IFAST 1b3730122709f53d007255e8dfd3305e)
set(MD5_PPM_420M_Q100_IFAST 980a1a3c5bf9510022869d30b7d26566)
set(MD5_JPEG_GRAY_ISLOW 235c90707b16e2e069f37c888b2636d9)
set(MD5_PPM_GRAY_ISLOW 7213c10af507ad467da5578ca5ee1fca)
set(MD5_PPM_GRAY_ISLOW_RGB e96ee81c30a6ed422d466338bd3de65d)
set(MD5_JPEG_420S_IFAST_OPT 7af8e60be4d9c227ec63ac9b6630855e)
set(MD5_JPEG_3x2_FLOAT_PROG a8c17daf77b457725ec929e215b603f8)
set(MD5_PPM_3x2_FLOAT 42876ab9e5c2f76a87d08db5fbd57956)
set(MD5_PPM_420M_ISLOW_2_1 4ca6be2a6f326ff9eaab63e70a8259c0)
set(MD5_PPM_420M_ISLOW_15_8 12aa9f9534c1b3d7ba047322226365eb)
set(MD5_PPM_420M_ISLOW_13_8 f7e22817c7b25e1393e4ec101e9d4e96)
set(MD5_PPM_420M_ISLOW_11_8 800a16f9f4dc9b293197bfe11be10a82)
set(MD5_PPM_420M_ISLOW_9_8 06b7a92a9bc69f4dc36ec40f1937d55c)
set(MD5_PPM_420M_ISLOW_7_8 3ec444a14a4ab4eab88ffc49c48eca43)
set(MD5_PPM_420M_ISLOW_3_4 3e726b7ea872445b19437d1c1d4f0d93)
set(MD5_PPM_420M_ISLOW_5_8 a8a771abdc94301d20ffac119b2caccd)
set(MD5_PPM_420M_ISLOW_1_2 b419124dd5568b085787234866102866)
set(MD5_PPM_420M_ISLOW_3_8 343d19015531b7bbe746124127244fa8)
set(MD5_PPM_420M_ISLOW_1_4 35fd59d866e44659edfa3c18db2a3edb)
set(MD5_PPM_420M_ISLOW_1_8 ccaed48ac0aedefda5d4abe4013f4ad7)
set(MD5_PPM_420_ISLOW_SKIP15_31 86664cd9dc956536409e44e244d20a97)
set(MD5_PPM_420_ISLOW_PROG_CROP62x62_71_71 452a21656115a163029cfba5c04fa76a)
set(MD5_PPM_444_ISLOW_SKIP1_6 ef63901f71ef7a75cd78253fc0914f84)
set(MD5_PPM_444_ISLOW_PROG_CROP98x98_13_13 15b173fb5872d9575572fbcc1b05956f)
set(MD5_JPEG_CROP cdb35ff4b4519392690ea040c56ea99c)
else()
set(TESTORIG testorig.jpg)
set(MD5_JPEG_RGB_ISLOW 768e970dd57b340ff1b83c9d3d47c77b)
set(MD5_PPM_RGB_ISLOW 00a257f5393fef8821f2b88ac7421291)
set(MD5_BMP_RGB_ISLOW_565 f07d2e75073e4bb10f6c6f4d36e2e3be)
set(MD5_BMP_RGB_ISLOW_565D 4cfa0928ef3e6bb626d7728c924cfda4)
set(MD5_JPEG_422_IFAST_OPT 2540287b79d913f91665e660303ab2c8)
set(MD5_PPM_422_IFAST 35bd6b3f833bad23de82acea847129fa)
set(MD5_PPM_422M_IFAST 8dbc65323d62cca7c91ba02dd1cfa81d)
set(MD5_BMP_422M_IFAST_565 3294bd4d9a1f2b3d08ea6020d0db7065)
set(MD5_BMP_422M_IFAST_565D da98c9c7b6039511be4a79a878a9abc1)
set(MD5_JPEG_420_IFAST_Q100_PROG 990cbe0329c882420a2094da7e5adade)
set(MD5_PPM_420_Q100_IFAST 5a732542015c278ff43635e473a8a294)
set(MD5_PPM_420M_Q100_IFAST ff692ee9323a3b424894862557c092f1)
set(MD5_JPEG_GRAY_ISLOW 72b51f894b8f4a10b3ee3066770aa38d)
set(MD5_PPM_GRAY_ISLOW 8d3596c56eace32f205deccc229aa5ed)
set(MD5_PPM_GRAY_ISLOW_RGB 116424ac07b79e5e801f00508eab48ec)
set(MD5_BMP_GRAY_ISLOW_565 12f78118e56a2f48b966f792fedf23cc)
set(MD5_BMP_GRAY_ISLOW_565D bdbbd616441a24354c98553df5dc82db)
set(MD5_JPEG_420S_IFAST_OPT 388708217ac46273ca33086b22827ed8)
if(WITH_SIMD)
set(MD5_JPEG_3x2_FLOAT_PROG 343e3f8caf8af5986ebaf0bdc13b5c71)
set(MD5_PPM_3x2_FLOAT 1a75f36e5904d6fc3a85a43da9ad89bb)
else()
set(MD5_JPEG_3x2_FLOAT_PROG 9bca803d2042bd1eb03819e2bf92b3e5)
set(MD5_PPM_3x2_FLOAT f6bfab038438ed8f5522fbd33595dcdc)
endif()
set(MD5_JPEG_420_ISLOW_ARI e986fb0a637a8d833d96e8a6d6d84ea1)
set(MD5_JPEG_444_ISLOW_PROGARI 0a8f1c8f66e113c3cf635df0a475a617)
set(MD5_PPM_420M_IFAST_ARI 72b59a99bcf1de24c5b27d151bde2437)
set(MD5_JPEG_420_ISLOW 9a68f56bc76e466aa7e52f415d0f4a5f)
set(MD5_PPM_420M_ISLOW_2_1 9f9de8c0612f8d06869b960b05abf9c9)
set(MD5_PPM_420M_ISLOW_15_8 b6875bc070720b899566cc06459b63b7)
set(MD5_PPM_420M_ISLOW_13_8 bc3452573c8152f6ae552939ee19f82f)
set(MD5_PPM_420M_ISLOW_11_8 d8cc73c0aaacd4556569b59437ba00a5)
set(MD5_PPM_420M_ISLOW_9_8 d25e61bc7eac0002f5b393aa223747b6)
set(MD5_PPM_420M_ISLOW_7_8 ddb564b7c74a09494016d6cd7502a946)
set(MD5_PPM_420M_ISLOW_3_4 8ed8e68808c3fbc4ea764fc9d2968646)
set(MD5_PPM_420M_ISLOW_5_8 a3363274999da2366a024efae6d16c9b)
set(MD5_PPM_420M_ISLOW_1_2 e692a315cea26b988c8e8b29a5dbcd81)
set(MD5_PPM_420M_ISLOW_3_8 79eca9175652ced755155c90e785a996)
set(MD5_PPM_420M_ISLOW_1_4 79cd778f8bf1a117690052cacdd54eca)
set(MD5_PPM_420M_ISLOW_1_8 391b3d4aca640c8567d6f8745eb2142f)
set(MD5_BMP_420_ISLOW_256 4980185e3776e89bd931736e1cddeee6)
set(MD5_BMP_420_ISLOW_565 bf9d13e16c4923b92e1faa604d7922cb)
set(MD5_BMP_420_ISLOW_565D 6bde71526acc44bcff76f696df8638d2)
set(MD5_BMP_420M_ISLOW_565 8dc0185245353cfa32ad97027342216f)
set(MD5_BMP_420M_ISLOW_565D d1be3a3339166255e76fa50a0d70d73e)
set(MD5_PPM_420_ISLOW_SKIP15_31 c4c65c1e43d7275cd50328a61e6534f0)
set(MD5_PPM_420_ISLOW_ARI_SKIP16_139 087c6b123db16ac00cb88c5b590bb74a)
set(MD5_PPM_420_ISLOW_PROG_CROP62x62_71_71 26eb36ccc7d1f0cb80cdabb0ac8b5d99)
set(MD5_PPM_420_ISLOW_ARI_CROP53x53_4_4 886c6775af22370257122f8b16207e6d)
set(MD5_PPM_444_ISLOW_SKIP1_6 5606f86874cf26b8fcee1117a0a436a6)
set(MD5_PPM_444_ISLOW_PROG_CROP98x98_13_13 db87dc7ce26bcdc7a6b56239ce2b9d6c)
set(MD5_PPM_444_ISLOW_ARI_CROP37x37_0_0 cb57b32bd6d03e35432362f7bf184b6d)
set(MD5_JPEG_CROP b4197f377e621c4e9b1d20471432610d)
endif()
if(WITH_JAVA)
add_test(TJUnitTest
${JAVA_RUNTIME} -cp java/${OBJDIR}turbojpeg.jar
-Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
TJUnitTest)
add_test(TJUnitTest-yuv
${JAVA_RUNTIME} -cp java/${OBJDIR}turbojpeg.jar
-Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
TJUnitTest -yuv)
add_test(TJUnitTest-yuv-nopad
${JAVA_RUNTIME} -cp java/${OBJDIR}turbojpeg.jar
-Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
TJUnitTest -yuv -noyuvpad)
add_test(TJUnitTest-bi
${JAVA_RUNTIME} -cp java/${OBJDIR}turbojpeg.jar
-Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
TJUnitTest -bi)
add_test(TJUnitTest-bi-yuv
${JAVA_RUNTIME} -cp java/${OBJDIR}turbojpeg.jar
-Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
TJUnitTest -bi -yuv)
add_test(TJUnitTest-bi-yuv-nopad
${JAVA_RUNTIME} -cp java/${OBJDIR}turbojpeg.jar
-Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
TJUnitTest -bi -yuv -noyuvpad)
endif()
set(TEST_LIBTYPES "")
if(ENABLE_SHARED)
set(TEST_LIBTYPES ${TEST_LIBTYPES} shared)
endif()
if(ENABLE_STATIC)
set(TEST_LIBTYPES ${TEST_LIBTYPES} static)
endif()
set(TESTIMAGES ${CMAKE_SOURCE_DIR}/testimages)
set(MD5CMP ${CMAKE_CURRENT_BINARY_DIR}/md5/md5cmp)
if(CMAKE_CROSSCOMPILING)
file(RELATIVE_PATH TESTIMAGES ${CMAKE_CURRENT_BINARY_DIR} ${TESTIMAGES})
file(RELATIVE_PATH MD5CMP ${CMAKE_CURRENT_BINARY_DIR} ${MD5CMP})
endif()
foreach(libtype ${TEST_LIBTYPES})
if(libtype STREQUAL "shared")
set(dir sharedlib/)
else()
set(dir "")
set(suffix -static)
endif()
if(WITH_TURBOJPEG)
add_test(tjunittest${suffix} tjunittest${suffix})
add_test(tjunittest${suffix}-alloc tjunittest${suffix} -alloc)
add_test(tjunittest${suffix}-yuv tjunittest${suffix} -yuv)
add_test(tjunittest${suffix}-yuv-alloc tjunittest${suffix} -yuv -alloc)
add_test(tjunittest${suffix}-yuv-nopad tjunittest${suffix} -yuv -noyuvpad)
endif()
# These tests are carefully chosen to provide full coverage of as many of the
# underlying algorithms as possible (including all of the SIMD-accelerated
# ones.)
# CC: null SAMP: fullsize FDCT: islow ENT: huff
add_test(cjpeg${suffix}-rgb-islow
${dir}cjpeg${suffix} -rgb -dct int
-outfile testout_rgb_islow.jpg ${TESTIMAGES}/testorig.ppm)
add_test(cjpeg${suffix}-rgb-islow-cmp
${MD5CMP} ${MD5_JPEG_RGB_ISLOW} testout_rgb_islow.jpg)
# CC: null SAMP: fullsize IDCT: islow ENT: huff
add_test(djpeg${suffix}-rgb-islow
${dir}djpeg${suffix} -dct int -ppm
-outfile testout_rgb_islow.ppm testout_rgb_islow.jpg)
add_test(djpeg${suffix}-rgb-islow-cmp
${MD5CMP} ${MD5_PPM_RGB_ISLOW} testout_rgb_islow.ppm)
if(NOT WITH_12BIT)
# CC: RGB->RGB565 SAMP: fullsize IDCT: islow ENT: huff
add_test(djpeg${suffix}-rgb-islow-565
${dir}djpeg${suffix} -dct int -rgb565 -dither none -bmp
-outfile testout_rgb_islow_565.bmp testout_rgb_islow.jpg)
add_test(djpeg${suffix}-rgb-islow-565-cmp
${MD5CMP} ${MD5_BMP_RGB_ISLOW_565} testout_rgb_islow_565.bmp)
# CC: RGB->RGB565 (dithered) SAMP: fullsize IDCT: islow ENT: huff
add_test(djpeg${suffix}-rgb-islow-565D
${dir}djpeg${suffix} -dct int -rgb565 -bmp
-outfile testout_rgb_islow_565D.bmp testout_rgb_islow.jpg)
add_test(djpeg${suffix}-rgb-islow-565D-cmp
${MD5CMP} ${MD5_BMP_RGB_ISLOW_565D} testout_rgb_islow_565D.bmp)
endif()
# CC: RGB->YCC SAMP: fullsize/h2v1 FDCT: ifast ENT: 2-pass huff
add_test(cjpeg${suffix}-422-ifast-opt
${dir}cjpeg${suffix} -sample 2x1 -dct fast -opt
-outfile testout_422_ifast_opt.jpg ${TESTIMAGES}/testorig.ppm)
add_test(cjpeg${suffix}-422-ifast-opt-cmp
${MD5CMP} ${MD5_JPEG_422_IFAST_OPT} testout_422_ifast_opt.jpg)
# CC: YCC->RGB SAMP: fullsize/h2v1 fancy IDCT: ifast ENT: huff
add_test(djpeg${suffix}-422-ifast
${dir}djpeg${suffix} -dct fast
-outfile testout_422_ifast.ppm testout_422_ifast_opt.jpg)
add_test(djpeg${suffix}-422-ifast-cmp
${MD5CMP} ${MD5_PPM_422_IFAST} testout_422_ifast.ppm)
# CC: YCC->RGB SAMP: h2v1 merged IDCT: ifast ENT: huff
add_test(djpeg${suffix}-422m-ifast
${dir}djpeg${suffix} -dct fast -nosmooth
-outfile testout_422m_ifast.ppm testout_422_ifast_opt.jpg)
add_test(djpeg${suffix}-422m-ifast-cmp
${MD5CMP} ${MD5_PPM_422M_IFAST} testout_422m_ifast.ppm)
if(NOT WITH_12BIT)
# CC: YCC->RGB565 SAMP: h2v1 merged IDCT: ifast ENT: huff
add_test(djpeg${suffix}-422m-ifast-565
${dir}djpeg${suffix} -dct int -nosmooth -rgb565 -dither none -bmp
-outfile testout_422m_ifast_565.bmp testout_422_ifast_opt.jpg)
add_test(djpeg${suffix}-422m-ifast-565-cmp
${MD5CMP} ${MD5_BMP_422M_IFAST_565} testout_422m_ifast_565.bmp)
# CC: YCC->RGB565 (dithered) SAMP: h2v1 merged IDCT: ifast ENT: huff
add_test(djpeg${suffix}-422m-ifast-565D
${dir}djpeg${suffix} -dct int -nosmooth -rgb565 -bmp
-outfile testout_422m_ifast_565D.bmp testout_422_ifast_opt.jpg)
add_test(djpeg${suffix}-422m-ifast-565D-cmp
${MD5CMP} ${MD5_BMP_422M_IFAST_565D} testout_422m_ifast_565D.bmp)
endif()
# CC: RGB->YCC SAMP: fullsize/h2v2 FDCT: ifast ENT: prog huff
add_test(cjpeg${suffix}-420-q100-ifast-prog
${dir}cjpeg${suffix} -sample 2x2 -quality 100 -dct fast -prog
-outfile testout_420_q100_ifast_prog.jpg ${TESTIMAGES}/testorig.ppm)
add_test(cjpeg${suffix}-420-q100-ifast-prog-cmp
${MD5CMP} ${MD5_JPEG_420_IFAST_Q100_PROG} testout_420_q100_ifast_prog.jpg)
# CC: YCC->RGB SAMP: fullsize/h2v2 fancy IDCT: ifast ENT: prog huff
add_test(djpeg${suffix}-420-q100-ifast-prog
${dir}djpeg${suffix} -dct fast
-outfile testout_420_q100_ifast.ppm testout_420_q100_ifast_prog.jpg)
add_test(djpeg${suffix}-420-q100-ifast-prog-cmp
${MD5CMP} ${MD5_PPM_420_Q100_IFAST} testout_420_q100_ifast.ppm)
# CC: YCC->RGB SAMP: h2v2 merged IDCT: ifast ENT: prog huff
add_test(djpeg${suffix}-420m-q100-ifast-prog
${dir}djpeg${suffix} -dct fast -nosmooth
-outfile testout_420m_q100_ifast.ppm testout_420_q100_ifast_prog.jpg)
add_test(djpeg${suffix}-420m-q100-ifast-prog-cmp
${MD5CMP} ${MD5_PPM_420M_Q100_IFAST} testout_420m_q100_ifast.ppm)
# CC: RGB->Gray SAMP: fullsize FDCT: islow ENT: huff
add_test(cjpeg${suffix}-gray-islow
${dir}cjpeg${suffix} -gray -dct int
-outfile testout_gray_islow.jpg ${TESTIMAGES}/testorig.ppm)
add_test(cjpeg${suffix}-gray-islow-cmp
${MD5CMP} ${MD5_JPEG_GRAY_ISLOW} testout_gray_islow.jpg)
# CC: Gray->Gray SAMP: fullsize IDCT: islow ENT: huff
add_test(djpeg${suffix}-gray-islow
${dir}djpeg${suffix} -dct int
-outfile testout_gray_islow.ppm testout_gray_islow.jpg)
add_test(djpeg${suffix}-gray-islow-cmp
${MD5CMP} ${MD5_PPM_GRAY_ISLOW} testout_gray_islow.ppm)
# CC: Gray->RGB SAMP: fullsize IDCT: islow ENT: huff
add_test(djpeg${suffix}-gray-islow-rgb
${dir}djpeg${suffix} -dct int -rgb
-outfile testout_gray_islow_rgb.ppm testout_gray_islow.jpg)
add_test(djpeg${suffix}-gray-islow-rgb-cmp
${MD5CMP} ${MD5_PPM_GRAY_ISLOW_RGB} testout_gray_islow_rgb.ppm)
if(NOT WITH_12BIT)
# CC: Gray->RGB565 SAMP: fullsize IDCT: islow ENT: huff
add_test(djpeg${suffix}-gray-islow-565
${dir}djpeg${suffix} -dct int -rgb565 -dither none -bmp
-outfile testout_gray_islow_565.bmp testout_gray_islow.jpg)
add_test(djpeg${suffix}-gray-islow-565-cmp
${MD5CMP} ${MD5_BMP_GRAY_ISLOW_565} testout_gray_islow_565.bmp)
# CC: Gray->RGB565 (dithered) SAMP: fullsize IDCT: islow ENT: huff
add_test(djpeg${suffix}-gray-islow-565D
${dir}djpeg${suffix} -dct int -rgb565 -bmp
-outfile testout_gray_islow_565D.bmp testout_gray_islow.jpg)
add_test(djpeg${suffix}-gray-islow-565D-cmp
${MD5CMP} ${MD5_BMP_GRAY_ISLOW_565D} testout_gray_islow_565D.bmp)
endif()
# CC: RGB->YCC SAMP: fullsize smooth/h2v2 smooth FDCT: islow
# ENT: 2-pass huff
add_test(cjpeg${suffix}-420s-ifast-opt
${dir}cjpeg${suffix} -sample 2x2 -smooth 1 -dct int -opt
-outfile testout_420s_ifast_opt.jpg ${TESTIMAGES}/testorig.ppm)
add_test(cjpeg${suffix}-420s-ifast-opt-cmp
${MD5CMP} ${MD5_JPEG_420S_IFAST_OPT} testout_420s_ifast_opt.jpg)
# CC: RGB->YCC SAMP: fullsize/int FDCT: float ENT: prog huff
add_test(cjpeg${suffix}-3x2-float-prog
${dir}cjpeg${suffix} -sample 3x2 -dct float -prog
-outfile testout_3x2_float_prog.jpg ${TESTIMAGES}/testorig.ppm)
add_test(cjpeg${suffix}-3x2-float-prog-cmp
${MD5CMP} ${MD5_JPEG_3x2_FLOAT_PROG} testout_3x2_float_prog.jpg)
# CC: YCC->RGB SAMP: fullsize/int IDCT: float ENT: prog huff
add_test(djpeg${suffix}-3x2-float-prog
${dir}djpeg${suffix} -dct float
-outfile testout_3x2_float.ppm testout_3x2_float_prog.jpg)
add_test(djpeg${suffix}-3x2-float-prog-cmp
${MD5CMP} ${MD5_PPM_3x2_FLOAT} testout_3x2_float.ppm)
if(WITH_ARITH_ENC)
# CC: YCC->RGB SAMP: fullsize/h2v2 FDCT: islow ENT: arith
add_test(cjpeg${suffix}-420-islow-ari
${dir}cjpeg${suffix} -dct int -arithmetic
-outfile testout_420_islow_ari.jpg ${TESTIMAGES}/testorig.ppm)
add_test(cjpeg${suffix}-420-islow-ari-cmp
${MD5CMP} ${MD5_JPEG_420_ISLOW_ARI} testout_420_islow_ari.jpg)
add_test(jpegtran${suffix}-420-islow-ari
${dir}jpegtran${suffix} -arithmetic
-outfile testout_420_islow_ari.jpg ${TESTIMAGES}/testimgint.jpg)
add_test(jpegtran${suffix}-420-islow-ari-cmp
${MD5CMP} ${MD5_JPEG_420_ISLOW_ARI} testout_420_islow_ari.jpg)
# CC: YCC->RGB SAMP: fullsize FDCT: islow ENT: prog arith
add_test(cjpeg${suffix}-444-islow-progari
${dir}cjpeg${suffix} -sample 1x1 -dct int -prog -arithmetic
-outfile testout_444_islow_progari.jpg ${TESTIMAGES}/testorig.ppm)
add_test(cjpeg${suffix}-444-islow-progari-cmp
${MD5CMP} ${MD5_JPEG_444_ISLOW_PROGARI} testout_444_islow_progari.jpg)
endif()
if(WITH_ARITH_DEC)
# CC: RGB->YCC SAMP: h2v2 merged IDCT: ifast ENT: arith
add_test(djpeg${suffix}-420m-ifast-ari
${dir}djpeg${suffix} -fast -ppm
-outfile testout_420m_ifast_ari.ppm ${TESTIMAGES}/testimgari.jpg)
add_test(djpeg${suffix}-420m-ifast-ari-cmp
${MD5CMP} ${MD5_PPM_420M_IFAST_ARI} testout_420m_ifast_ari.ppm)
add_test(jpegtran${suffix}-420-islow
${dir}jpegtran${suffix}
-outfile testout_420_islow.jpg ${TESTIMAGES}/testimgari.jpg)
add_test(jpegtran${suffix}-420-islow-cmp
${MD5CMP} ${MD5_JPEG_420_ISLOW} testout_420_islow.jpg)
endif()
# 2/1-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 16x16 islow ENT: huff
# 15/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 15x15 islow ENT: huff
# 13/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 13x13 islow ENT: huff
# 11/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 11x11 islow ENT: huff
# 9/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 9x9 islow ENT: huff
# 7/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 7x7 islow/14x14 islow
# ENT: huff
# 3/4-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 6x6 islow/12x12 islow
# ENT: huff
# 5/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 5x5 islow/10x10 islow
# ENT: huff
# 1/2-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 4x4 islow/8x8 islow
# ENT: huff
# 3/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 3x3 islow/6x6 islow
# ENT: huff
# 1/4-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 2x2 islow/4x4 islow
# ENT: huff
# 1/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 1x1 islow/2x2 islow
# ENT: huff
foreach(scale 2_1 15_8 13_8 11_8 9_8 7_8 3_4 5_8 1_2 3_8 1_4 1_8)
string(REGEX REPLACE "_" "/" scalearg ${scale})
add_test(djpeg${suffix}-420m-islow-${scale}
${dir}djpeg${suffix} -dct int -scale ${scalearg} -nosmooth -ppm
-outfile testout_420m_islow_${scale}.ppm ${TESTIMAGES}/${TESTORIG})
add_test(djpeg${suffix}-420m-islow-${scale}-cmp
${MD5CMP} ${MD5_PPM_420M_ISLOW_${scale}} testout_420m_islow_${scale}.ppm)
endforeach()
if(NOT WITH_12BIT)
# CC: YCC->RGB (dithered) SAMP: h2v2 fancy IDCT: islow ENT: huff
add_test(djpeg${suffix}-420-islow-256
${dir}djpeg${suffix} -dct int -colors 256 -bmp
-outfile testout_420_islow_256.bmp ${TESTIMAGES}/${TESTORIG})
add_test(djpeg${suffix}-420-islow-256-cmp
${MD5CMP} ${MD5_BMP_420_ISLOW_256} testout_420_islow_256.bmp)
# CC: YCC->RGB565 SAMP: h2v2 fancy IDCT: islow ENT: huff
add_test(djpeg${suffix}-420-islow-565
${dir}djpeg${suffix} -dct int -rgb565 -dither none -bmp
-outfile testout_420_islow_565.bmp ${TESTIMAGES}/${TESTORIG})
add_test(djpeg${suffix}-420-islow-565-cmp
${MD5CMP} ${MD5_BMP_420_ISLOW_565} testout_420_islow_565.bmp)
# CC: YCC->RGB565 (dithered) SAMP: h2v2 fancy IDCT: islow ENT: huff
add_test(djpeg${suffix}-420-islow-565D
${dir}djpeg${suffix} -dct int -rgb565 -bmp
-outfile testout_420_islow_565D.bmp ${TESTIMAGES}/${TESTORIG})
add_test(djpeg${suffix}-420-islow-565D-cmp
${MD5CMP} ${MD5_BMP_420_ISLOW_565D} testout_420_islow_565D.bmp)
# CC: YCC->RGB565 SAMP: h2v2 merged IDCT: islow ENT: huff
add_test(djpeg${suffix}-420m-islow-565
${dir}djpeg${suffix} -dct int -nosmooth -rgb565 -dither none -bmp
-outfile testout_420m_islow_565.bmp ${TESTIMAGES}/${TESTORIG})
add_test(djpeg${suffix}-420m-islow-565-cmp
${MD5CMP} ${MD5_BMP_420M_ISLOW_565} testout_420m_islow_565.bmp)
# CC: YCC->RGB565 (dithered) SAMP: h2v2 merged IDCT: islow ENT: huff
add_test(djpeg${suffix}-420m-islow-565D
${dir}djpeg${suffix} -dct int -nosmooth -rgb565 -bmp
-outfile testout_420m_islow_565D.bmp ${TESTIMAGES}/${TESTORIG})
add_test(djpeg${suffix}-420m-islow-565D-cmp
${MD5CMP} ${MD5_BMP_420M_ISLOW_565D} testout_420m_islow_565D.bmp)
endif()
# Partial decode tests. These tests are designed to cover all of the
# possible code paths in jpeg_skip_scanlines().
# Context rows: Yes Intra-iMCU row: Yes iMCU row prefetch: No ENT: huff
add_test(djpeg${suffix}-420-islow-skip15_31
${dir}djpeg${suffix} -dct int -skip 15,31 -ppm
-outfile testout_420_islow_skip15,31.ppm ${TESTIMAGES}/${TESTORIG})
add_test(djpeg${suffix}-420-islow-skip15_31-cmp
${MD5CMP} ${MD5_PPM_420_ISLOW_SKIP15_31} testout_420_islow_skip15,31.ppm)
# Context rows: Yes Intra-iMCU row: No iMCU row prefetch: Yes ENT: arith
if(WITH_ARITH_DEC)
add_test(djpeg${suffix}-420-islow-ari-skip16_139
${dir}djpeg${suffix} -dct int -skip 16,139 -ppm
-outfile testout_420_islow_ari_skip16,139.ppm
${TESTIMAGES}/testimgari.jpg)
add_test(djpeg${suffix}-420-islow-ari_skip16_139-cmp
${MD5CMP} ${MD5_PPM_420_ISLOW_ARI_SKIP16_139}
testout_420_islow_ari_skip16,139.ppm)
endif()
# Context rows: Yes Intra-iMCU row: No iMCU row prefetch: No ENT: prog huff
add_test(cjpeg${suffix}-420-islow-prog
${dir}cjpeg${suffix} -dct int -prog
-outfile testout_420_islow_prog.jpg ${TESTIMAGES}/testorig.ppm)
add_test(djpeg${suffix}-420-islow-prog-crop62x62_71_71
${dir}djpeg${suffix} -dct int -crop 62x62+71+71 -ppm
-outfile testout_420_islow_prog_crop62x62,71,71.ppm
testout_420_islow_prog.jpg)
add_test(djpeg${suffix}-420-islow-prog-crop62x62_71_71-cmp
${MD5CMP} ${MD5_PPM_420_ISLOW_PROG_CROP62x62_71_71}
testout_420_islow_prog_crop62x62,71,71.ppm)
# Context rows: Yes Intra-iMCU row: No iMCU row prefetch: No ENT: arith
if(WITH_ARITH_DEC)
add_test(djpeg${suffix}-420-islow-ari-crop53x53_4_4
${dir}djpeg${suffix} -dct int -crop 53x53+4+4 -ppm
-outfile testout_420_islow_ari_crop53x53,4,4.ppm
${TESTIMAGES}/testimgari.jpg)
add_test(djpeg${suffix}-420-islow-ari-crop53x53_4_4-cmp
${MD5CMP} ${MD5_PPM_420_ISLOW_ARI_CROP53x53_4_4}
testout_420_islow_ari_crop53x53,4,4.ppm)
endif()
# Context rows: No Intra-iMCU row: Yes ENT: huff
add_test(cjpeg${suffix}-444-islow
${dir}cjpeg${suffix} -dct int -sample 1x1
-outfile testout_444_islow.jpg ${TESTIMAGES}/testorig.ppm)
add_test(djpeg${suffix}-444-islow-skip1_6
${dir}djpeg${suffix} -dct int -skip 1,6 -ppm
-outfile testout_444_islow_skip1,6.ppm testout_444_islow.jpg)
add_test(djpeg${suffix}-444-islow-skip1_6-cmp
${MD5CMP} ${MD5_PPM_444_ISLOW_SKIP1_6} testout_444_islow_skip1,6.ppm)
# Context rows: No Intra-iMCU row: No ENT: prog huff
add_test(cjpeg${suffix}-444-islow-prog
${dir}cjpeg${suffix} -dct int -prog -sample 1x1
-outfile testout_444_islow_prog.jpg ${TESTIMAGES}/testorig.ppm)
add_test(djpeg${suffix}-444-islow-prog-crop98x98_13_13
${dir}djpeg${suffix} -dct int -crop 98x98+13+13 -ppm
-outfile testout_444_islow_prog_crop98x98,13,13.ppm
testout_444_islow_prog.jpg)
add_test(djpeg${suffix}-444-islow-prog_crop98x98_13_13-cmp
${MD5CMP} ${MD5_PPM_444_ISLOW_PROG_CROP98x98_13_13}
testout_444_islow_prog_crop98x98,13,13.ppm)
# Context rows: No Intra-iMCU row: No ENT: arith
if(WITH_ARITH_ENC)
add_test(cjpeg${suffix}-444-islow-ari
${dir}cjpeg${suffix} -dct int -arithmetic -sample 1x1
-outfile testout_444_islow_ari.jpg ${TESTIMAGES}/testorig.ppm)
if(WITH_ARITH_DEC)
add_test(djpeg${suffix}-444-islow-ari-crop37x37_0_0
${dir}djpeg${suffix} -dct int -crop 37x37+0+0 -ppm
-outfile testout_444_islow_ari_crop37x37,0,0.ppm
testout_444_islow_ari.jpg)
add_test(djpeg${suffix}-444-islow-ari-crop37x37_0_0-cmp
${MD5CMP} ${MD5_PPM_444_ISLOW_ARI_CROP37x37_0_0}
testout_444_islow_ari_crop37x37,0,0.ppm)
endif()
endif()
add_test(jpegtran${suffix}-crop
${dir}jpegtran${suffix} -crop 120x90+20+50 -transpose -perfect
-outfile testout_crop.jpg ${TESTIMAGES}/${TESTORIG})
add_test(jpegtran${suffix}-crop-cmp
${MD5CMP} ${MD5_JPEG_CROP} testout_crop.jpg)
endforeach()
add_custom_target(testclean COMMAND ${MD5CMP} -P
${CMAKE_SOURCE_DIR}/cmakescripts/testclean.cmake)
#
# Installer
#
if(MSVC)
set(INST_PLATFORM "Visual C++")
set(INST_NAME ${CMAKE_PROJECT_NAME}-${VERSION}-vc)
set(INST_REG_NAME ${CMAKE_PROJECT_NAME})
elseif(MINGW)
set(INST_PLATFORM GCC)
set(INST_NAME ${CMAKE_PROJECT_NAME}-${VERSION}-gcc)
set(INST_REG_NAME ${CMAKE_PROJECT_NAME}-gcc)
set(INST_DEFS -DGCC)
endif()
if(64BIT)
set(INST_PLATFORM "${INST_PLATFORM} 64-bit")
set(INST_NAME ${INST_NAME}64)
set(INST_REG_NAME ${INST_DIR}64)
set(INST_DEFS ${INST_DEFS} -DWIN64)
endif()
if(WITH_JAVA)
set(INST_DEFS ${INST_DEFS} -DJAVA)
endif()
if(MSVC_IDE)
set(INST_DEFS ${INST_DEFS} "-DBUILDDIR=${CMAKE_CFG_INTDIR}\\")
else()
set(INST_DEFS ${INST_DEFS} "-DBUILDDIR=")
endif()
STRING(REGEX REPLACE "/" "\\\\" INST_DIR ${CMAKE_INSTALL_PREFIX})
configure_file(release/libjpeg-turbo.nsi.in libjpeg-turbo.nsi @ONLY)
if(WITH_JAVA)
set(JAVA_DEPEND java)
endif()
add_custom_target(installer
makensis -nocd ${INST_DEFS} libjpeg-turbo.nsi
DEPENDS jpeg jpeg-static turbojpeg turbojpeg-static rdjpgcom wrjpgcom
cjpeg djpeg jpegtran tjbench ${JAVA_DEPEND}
SOURCES libjpeg-turbo.nsi)
if(WITH_TURBOJPEG)
if(ENABLE_SHARED)
install(TARGETS turbojpeg tjbench
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
RUNTIME DESTINATION bin)
endif()
if(ENABLE_STATIC)
install(TARGETS turbojpeg-static ARCHIVE DESTINATION lib)
if(NOT ENABLE_SHARED)
install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/tjbench-static.exe
DESTINATION bin RENAME tjbench.exe)
endif()
endif()
install(FILES ${CMAKE_SOURCE_DIR}/turbojpeg.h DESTINATION include)
endif()
if(ENABLE_STATIC)
install(TARGETS jpeg-static ARCHIVE DESTINATION lib)
if(NOT ENABLE_SHARED)
install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/cjpeg-static.exe
DESTINATION bin RENAME cjpeg.exe)
install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/djpeg-static.exe
DESTINATION bin RENAME djpeg.exe)
install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/jpegtran-static.exe
DESTINATION bin RENAME jpegtran.exe)
endif()
endif()
install(TARGETS rdjpgcom wrjpgcom RUNTIME DESTINATION bin)
install(FILES ${CMAKE_SOURCE_DIR}/README.ijg ${CMAKE_SOURCE_DIR}/README.md
${CMAKE_SOURCE_DIR}/example.c ${CMAKE_SOURCE_DIR}/libjpeg.txt
${CMAKE_SOURCE_DIR}/structure.txt ${CMAKE_SOURCE_DIR}/usage.txt
${CMAKE_SOURCE_DIR}/wizard.txt
DESTINATION doc)
install(FILES ${CMAKE_BINARY_DIR}/jconfig.h ${CMAKE_SOURCE_DIR}/jerror.h
${CMAKE_SOURCE_DIR}/jmorecfg.h ${CMAKE_SOURCE_DIR}/jpeglib.h
DESTINATION include)
File diff suppressed because it is too large Load Diff
-88
View File
@@ -1,88 +0,0 @@
libjpeg-turbo Licenses
======================
libjpeg-turbo is covered by three compatible BSD-style open source licenses:
- The IJG (Independent JPEG Group) License, which is listed in
[README.ijg](README.ijg)
This license applies to the libjpeg API library and associated programs
(any code inherited from libjpeg, and any modifications to that code.)
- The Modified (3-clause) BSD License, which is listed in
[turbojpeg.c](turbojpeg.c)
This license covers the TurboJPEG API library and associated programs.
- The zlib License, which is listed in [simd/jsimdext.inc](simd/jsimdext.inc)
This license is a subset of the other two, and it covers the libjpeg-turbo
SIMD extensions.
Complying with the libjpeg-turbo Licenses
=========================================
This section provides a roll-up of the libjpeg-turbo licensing terms, to the
best of our understanding.
1. If you are distributing a modified version of the libjpeg-turbo source,
then:
1. You cannot alter or remove any existing copyright or license notices
from the source.
**Origin**
- Clause 1 of the IJG License
- Clause 1 of the Modified BSD License
- Clauses 1 and 3 of the zlib License
2. You must add your own copyright notice to the header of each source
file you modified, so others can tell that you modified that file (if
there is not an existing copyright header in that file, then you can
simply add a notice stating that you modified the file.)
**Origin**
- Clause 1 of the IJG License
- Clause 2 of the zlib License
3. You must include the IJG README file, and you must not alter any of the
copyright or license text in that file.
**Origin**
- Clause 1 of the IJG License
2. If you are distributing only libjpeg-turbo binaries without the source, or
if you are distributing an application that statically links with
libjpeg-turbo, then:
1. Your product documentation must include a message stating:
This software is based in part on the work of the Independent JPEG
Group.
**Origin**
- Clause 2 of the IJG license
2. If your binary distribution includes or uses the TurboJPEG API, then
your product documentation must include the text of the Modified BSD
License.
**Origin**
- Clause 2 of the Modified BSD License
3. You cannot use the name of the IJG or The libjpeg-turbo Project or the
contributors thereof in advertising, publicity, etc.
**Origin**
- IJG License
- Clause 3 of the Modified BSD License
4. The IJG and The libjpeg-turbo Project do not warrant libjpeg-turbo to be
free of defects, nor do we accept any liability for undesirable
consequences resulting from your use of the software.
**Origin**
- IJG License
- Modified BSD License
- zlib License
-781
View File
@@ -1,781 +0,0 @@
lib_LTLIBRARIES = libjpeg.la
libjpeg_la_LDFLAGS = -version-info ${LIBTOOL_CURRENT}:${SO_MINOR_VERSION}:${SO_AGE} -no-undefined
include_HEADERS = jerror.h jmorecfg.h jpeglib.h
if WITH_TURBOJPEG
lib_LTLIBRARIES += libturbojpeg.la
libturbojpeg_la_LDFLAGS = -version-info 1:0:1 -no-undefined
include_HEADERS += turbojpeg.h
endif
nodist_include_HEADERS = jconfig.h
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = pkgscripts/libjpeg.pc
if WITH_TURBOJPEG
pkgconfig_DATA += pkgscripts/libturbojpeg.pc
endif
HDRS = jchuff.h jdct.h jdhuff.h jerror.h jinclude.h jmemsys.h jmorecfg.h \
jpegint.h jpeglib.h jversion.h jsimd.h jsimddct.h jpegcomp.h \
jpeg_nbits_table.h
libjpeg_la_SOURCES = $(HDRS) jcapimin.c jcapistd.c jccoefct.c jccolor.c \
jcdctmgr.c jchuff.c jcinit.c jcmainct.c jcmarker.c jcmaster.c \
jcomapi.c jcparam.c jcphuff.c jcprepct.c jcsample.c jctrans.c \
jdapimin.c jdapistd.c jdatadst.c jdatasrc.c jdcoefct.c jdcolor.c \
jddctmgr.c jdhuff.c jdinput.c jdmainct.c jdmarker.c jdmaster.c \
jdmerge.c jdphuff.c jdpostct.c jdsample.c jdtrans.c jerror.c \
jfdctflt.c jfdctfst.c jfdctint.c jidctflt.c jidctfst.c jidctint.c \
jidctred.c jquant1.c jquant2.c jutils.c jmemmgr.c jmemnobs.c
if WITH_ARITH
libjpeg_la_SOURCES += jaricom.c
endif
if WITH_ARITH_ENC
libjpeg_la_SOURCES += jcarith.c
endif
if WITH_ARITH_DEC
libjpeg_la_SOURCES += jdarith.c
endif
SUBDIRS = java
if WITH_TURBOJPEG
libturbojpeg_la_SOURCES = $(libjpeg_la_SOURCES) turbojpeg.c turbojpeg.h \
transupp.c transupp.h jdatadst-tj.c jdatasrc-tj.c
if WITH_JAVA
libturbojpeg_la_SOURCES += turbojpeg-jni.c
libturbojpeg_la_CFLAGS = ${JNI_CFLAGS}
TJMAPFILE = turbojpeg-mapfile.jni
else
TJMAPFILE = turbojpeg-mapfile
endif
libturbojpeg_la_SOURCES += $(TJMAPFILE)
if VERSION_SCRIPT
libturbojpeg_la_LDFLAGS += $(VERSION_SCRIPT_FLAG)$(srcdir)/$(TJMAPFILE)
endif
endif
if VERSION_SCRIPT
libjpeg_la_LDFLAGS += $(VERSION_SCRIPT_FLAG)libjpeg.map
endif
if WITH_SIMD
SUBDIRS += simd
libjpeg_la_LIBADD = simd/libsimd.la
libturbojpeg_la_LIBADD = simd/libsimd.la
else
libjpeg_la_SOURCES += jsimd_none.c
endif
bin_PROGRAMS = cjpeg djpeg jpegtran rdjpgcom wrjpgcom
noinst_PROGRAMS = jcstest
if WITH_TURBOJPEG
bin_PROGRAMS += tjbench
noinst_PROGRAMS += tjunittest
tjbench_SOURCES = tjbench.c bmp.h bmp.c tjutil.h tjutil.c rdbmp.c rdppm.c \
wrbmp.c wrppm.c
tjbench_LDADD = libturbojpeg.la libjpeg.la -lm
tjbench_CFLAGS = -DBMP_SUPPORTED -DPPM_SUPPORTED
tjunittest_SOURCES = tjunittest.c tjutil.h tjutil.c
tjunittest_LDADD = libturbojpeg.la
endif
cjpeg_SOURCES = cdjpeg.h cderror.h cdjpeg.c cjpeg.c rdgif.c rdppm.c rdswitch.c
if WITH_12BIT
else
cjpeg_SOURCES += rdbmp.c rdtarga.c
endif
cjpeg_LDADD = libjpeg.la
cjpeg_CFLAGS = -DGIF_SUPPORTED -DPPM_SUPPORTED
if WITH_12BIT
else
cjpeg_CFLAGS += -DBMP_SUPPORTED -DTARGA_SUPPORTED
endif
djpeg_SOURCES = cdjpeg.h cderror.h cdjpeg.c djpeg.c rdcolmap.c rdswitch.c \
wrgif.c wrppm.c
if WITH_12BIT
else
djpeg_SOURCES += wrbmp.c wrtarga.c
endif
djpeg_LDADD = libjpeg.la
djpeg_CFLAGS = -DGIF_SUPPORTED -DPPM_SUPPORTED
if WITH_12BIT
else
djpeg_CFLAGS += -DBMP_SUPPORTED -DTARGA_SUPPORTED
endif
jpegtran_SOURCES = jpegtran.c rdswitch.c cdjpeg.c transupp.c transupp.h
jpegtran_LDADD = libjpeg.la
rdjpgcom_SOURCES = rdjpgcom.c
rdjpgcom_LDADD = libjpeg.la
wrjpgcom_SOURCES = wrjpgcom.c
wrjpgcom_LDADD = libjpeg.la
jcstest_SOURCES = jcstest.c
jcstest_LDADD = libjpeg.la
dist_man1_MANS = cjpeg.1 djpeg.1 jpegtran.1 rdjpgcom.1 wrjpgcom.1
DOCS= coderules.txt jconfig.txt change.log rdrle.c wrrle.c BUILDING.md \
ChangeLog.md
dist_doc_DATA = README.ijg README.md libjpeg.txt structure.txt usage.txt \
wizard.txt LICENSE.md
exampledir = $(docdir)
dist_example_DATA = example.c
EXTRA_DIST = win release $(DOCS) testimages CMakeLists.txt \
sharedlib/CMakeLists.txt cmakescripts libjpeg.map.in doc doxygen.config \
doxygen-extra.css jccolext.c jdcolext.c jdcol565.c jdmrgext.c jdmrg565.c \
jstdhuff.c jdcoefct.h jdmainct.h jdmaster.h jdsample.h wrppm.h \
md5/CMakeLists.txt
dist-hook:
rm -rf `find $(distdir) -name .svn`
SUBDIRS += md5
if WITH_12BIT
TESTORIG = testorig12.jpg
MD5_JPEG_RGB_ISLOW = 9620f424569594bb9242b48498ad801f
MD5_PPM_RGB_ISLOW = f3301d2219783b8b3d942b7239fa50c0
MD5_JPEG_422_IFAST_OPT = 7322e3bd2f127f7de4b40d4480ce60e4
MD5_PPM_422_IFAST = 79807fa552899e66a04708f533e16950
MD5_PPM_422M_IFAST = 07737bfe8a7c1c87aaa393a0098d16b0
MD5_JPEG_420_IFAST_Q100_PROG = a1da220b5604081863a504297ed59e55
MD5_PPM_420_Q100_IFAST = 1b3730122709f53d007255e8dfd3305e
MD5_PPM_420M_Q100_IFAST = 980a1a3c5bf9510022869d30b7d26566
MD5_JPEG_GRAY_ISLOW = 235c90707b16e2e069f37c888b2636d9
MD5_PPM_GRAY_ISLOW = 7213c10af507ad467da5578ca5ee1fca
MD5_PPM_GRAY_ISLOW_RGB = e96ee81c30a6ed422d466338bd3de65d
MD5_JPEG_420S_IFAST_OPT = 7af8e60be4d9c227ec63ac9b6630855e
MD5_JPEG_3x2_FLOAT_PROG_SSE = a8c17daf77b457725ec929e215b603f8
MD5_PPM_3x2_FLOAT_SSE = 42876ab9e5c2f76a87d08db5fbd57956
MD5_JPEG_3x2_FLOAT_PROG_32BIT = a8c17daf77b457725ec929e215b603f8
MD5_PPM_3x2_FLOAT_32BIT = 42876ab9e5c2f76a87d08db5fbd57956
MD5_PPM_3x2_FLOAT_64BIT = d6fbc71153b3d8ded484dbc17c7b9cf4
MD5_JPEG_3x2_IFAST_PROG = 1396cc2b7185cfe943d408c9d305339e
MD5_PPM_3x2_IFAST = 3975985ef6eeb0a2cdc58daa651ccc00
MD5_PPM_420M_ISLOW_2_1 = 4ca6be2a6f326ff9eaab63e70a8259c0
MD5_PPM_420M_ISLOW_15_8 = 12aa9f9534c1b3d7ba047322226365eb
MD5_PPM_420M_ISLOW_13_8 = f7e22817c7b25e1393e4ec101e9d4e96
MD5_PPM_420M_ISLOW_11_8 = 800a16f9f4dc9b293197bfe11be10a82
MD5_PPM_420M_ISLOW_9_8 = 06b7a92a9bc69f4dc36ec40f1937d55c
MD5_PPM_420M_ISLOW_7_8 = 3ec444a14a4ab4eab88ffc49c48eca43
MD5_PPM_420M_ISLOW_3_4 = 3e726b7ea872445b19437d1c1d4f0d93
MD5_PPM_420M_ISLOW_5_8 = a8a771abdc94301d20ffac119b2caccd
MD5_PPM_420M_ISLOW_1_2 = b419124dd5568b085787234866102866
MD5_PPM_420M_ISLOW_3_8 = 343d19015531b7bbe746124127244fa8
MD5_PPM_420M_ISLOW_1_4 = 35fd59d866e44659edfa3c18db2a3edb
MD5_PPM_420M_ISLOW_1_8 = ccaed48ac0aedefda5d4abe4013f4ad7
MD5_PPM_420_ISLOW_SKIP15_31 = 86664cd9dc956536409e44e244d20a97
MD5_PPM_420_ISLOW_PROG_CROP62x62_71_71 = 452a21656115a163029cfba5c04fa76a
MD5_PPM_444_ISLOW_SKIP1_6 = ef63901f71ef7a75cd78253fc0914f84
MD5_PPM_444_ISLOW_PROG_CROP98x98_13_13 = 15b173fb5872d9575572fbcc1b05956f
MD5_JPEG_CROP = cdb35ff4b4519392690ea040c56ea99c
else
TESTORIG = testorig.jpg
MD5_JPEG_RGB_ISLOW = 768e970dd57b340ff1b83c9d3d47c77b
MD5_PPM_RGB_ISLOW = 00a257f5393fef8821f2b88ac7421291
MD5_BMP_RGB_ISLOW_565 = f07d2e75073e4bb10f6c6f4d36e2e3be
MD5_BMP_RGB_ISLOW_565D = 4cfa0928ef3e6bb626d7728c924cfda4
MD5_JPEG_422_IFAST_OPT = 2540287b79d913f91665e660303ab2c8
MD5_PPM_422_IFAST = 35bd6b3f833bad23de82acea847129fa
MD5_PPM_422M_IFAST = 8dbc65323d62cca7c91ba02dd1cfa81d
MD5_BMP_422M_IFAST_565 = 3294bd4d9a1f2b3d08ea6020d0db7065
MD5_BMP_422M_IFAST_565D = da98c9c7b6039511be4a79a878a9abc1
MD5_JPEG_420_IFAST_Q100_PROG = 990cbe0329c882420a2094da7e5adade
MD5_PPM_420_Q100_IFAST = 5a732542015c278ff43635e473a8a294
MD5_PPM_420M_Q100_IFAST = ff692ee9323a3b424894862557c092f1
MD5_JPEG_GRAY_ISLOW = 72b51f894b8f4a10b3ee3066770aa38d
MD5_PPM_GRAY_ISLOW = 8d3596c56eace32f205deccc229aa5ed
MD5_PPM_GRAY_ISLOW_RGB = 116424ac07b79e5e801f00508eab48ec
MD5_BMP_GRAY_ISLOW_565 = 12f78118e56a2f48b966f792fedf23cc
MD5_BMP_GRAY_ISLOW_565D = bdbbd616441a24354c98553df5dc82db
MD5_JPEG_420S_IFAST_OPT = 388708217ac46273ca33086b22827ed8
# See README.md for more details on why this next bit is necessary.
MD5_JPEG_3x2_FLOAT_PROG_SSE = 343e3f8caf8af5986ebaf0bdc13b5c71
MD5_PPM_3x2_FLOAT_SSE = 1a75f36e5904d6fc3a85a43da9ad89bb
MD5_JPEG_3x2_FLOAT_PROG_32BIT = 9bca803d2042bd1eb03819e2bf92b3e5
MD5_PPM_3x2_FLOAT_32BIT = f6bfab038438ed8f5522fbd33595dcdc
MD5_PPM_3x2_FLOAT_64BIT = 0e917a34193ef976b679a6b069b1be26
MD5_JPEG_3x2_IFAST_PROG = 1ee5d2c1a77f2da495f993c8c7cceca5
MD5_PPM_3x2_IFAST = fd283664b3b49127984af0a7f118fccd
MD5_JPEG_420_ISLOW_ARI = e986fb0a637a8d833d96e8a6d6d84ea1
MD5_JPEG_444_ISLOW_PROGARI = 0a8f1c8f66e113c3cf635df0a475a617
MD5_PPM_420M_IFAST_ARI = 72b59a99bcf1de24c5b27d151bde2437
MD5_JPEG_420_ISLOW = 9a68f56bc76e466aa7e52f415d0f4a5f
MD5_PPM_420M_ISLOW_2_1 = 9f9de8c0612f8d06869b960b05abf9c9
MD5_PPM_420M_ISLOW_15_8 = b6875bc070720b899566cc06459b63b7
MD5_PPM_420M_ISLOW_13_8 = bc3452573c8152f6ae552939ee19f82f
MD5_PPM_420M_ISLOW_11_8 = d8cc73c0aaacd4556569b59437ba00a5
MD5_PPM_420M_ISLOW_9_8 = d25e61bc7eac0002f5b393aa223747b6
MD5_PPM_420M_ISLOW_7_8 = ddb564b7c74a09494016d6cd7502a946
MD5_PPM_420M_ISLOW_3_4 = 8ed8e68808c3fbc4ea764fc9d2968646
MD5_PPM_420M_ISLOW_5_8 = a3363274999da2366a024efae6d16c9b
MD5_PPM_420M_ISLOW_1_2 = e692a315cea26b988c8e8b29a5dbcd81
MD5_PPM_420M_ISLOW_3_8 = 79eca9175652ced755155c90e785a996
MD5_PPM_420M_ISLOW_1_4 = 79cd778f8bf1a117690052cacdd54eca
MD5_PPM_420M_ISLOW_1_8 = 391b3d4aca640c8567d6f8745eb2142f
MD5_BMP_420_ISLOW_256 = 4980185e3776e89bd931736e1cddeee6
MD5_BMP_420_ISLOW_565 = bf9d13e16c4923b92e1faa604d7922cb
MD5_BMP_420_ISLOW_565D = 6bde71526acc44bcff76f696df8638d2
MD5_BMP_420M_ISLOW_565 = 8dc0185245353cfa32ad97027342216f
MD5_BMP_420M_ISLOW_565D =d1be3a3339166255e76fa50a0d70d73e
MD5_PPM_420_ISLOW_SKIP15_31 = c4c65c1e43d7275cd50328a61e6534f0
MD5_PPM_420_ISLOW_ARI_SKIP16_139 = 087c6b123db16ac00cb88c5b590bb74a
MD5_PPM_420_ISLOW_PROG_CROP62x62_71_71 = 26eb36ccc7d1f0cb80cdabb0ac8b5d99
MD5_PPM_420_ISLOW_ARI_CROP53x53_4_4 = 886c6775af22370257122f8b16207e6d
MD5_PPM_444_ISLOW_SKIP1_6 = 5606f86874cf26b8fcee1117a0a436a6
MD5_PPM_444_ISLOW_PROG_CROP98x98_13_13 = db87dc7ce26bcdc7a6b56239ce2b9d6c
MD5_PPM_444_ISLOW_ARI_CROP37x37_0_0 = cb57b32bd6d03e35432362f7bf184b6d
MD5_JPEG_CROP = b4197f377e621c4e9b1d20471432610d
endif
.PHONY: test
test: tjquicktest tjbittest bittest
if CROSS_COMPILING
tjquicktest: testclean
else
tjquicktest: testclean all
endif
if WITH_TURBOJPEG
if WITH_JAVA
$(JAVA) -cp java/turbojpeg.jar -Djava.library.path=.libs TJUnitTest
$(JAVA) -cp java/turbojpeg.jar -Djava.library.path=.libs TJUnitTest -bi
$(JAVA) -cp java/turbojpeg.jar -Djava.library.path=.libs TJUnitTest -yuv
$(JAVA) -cp java/turbojpeg.jar -Djava.library.path=.libs TJUnitTest -yuv -noyuvpad
$(JAVA) -cp java/turbojpeg.jar -Djava.library.path=.libs TJUnitTest -yuv -bi
$(JAVA) -cp java/turbojpeg.jar -Djava.library.path=.libs TJUnitTest -yuv -bi -noyuvpad
endif
./tjunittest
./tjunittest -alloc
./tjunittest -yuv
./tjunittest -yuv -alloc
./tjunittest -yuv -noyuvpad
endif
echo GREAT SUCCESS!
if CROSS_COMPILING
tjbittest: testclean
else
tjbittest: testclean all
endif
if WITH_TURBOJPEG
MD5_PPM_GRAY_TILE = 89d3ca21213d9d864b50b4e4e7de4ca6
MD5_PPM_420_8x8_TILE = 847fceab15c5b7b911cb986cf0f71de3
MD5_PPM_420_16x16_TILE = ca45552a93687e078f7137cc4126a7b0
MD5_PPM_420_32x32_TILE = d8676f1d6b68df358353bba9844f4a00
MD5_PPM_420_64x64_TILE = 4e4c1a3d7ea4bace4f868bcbe83b7050
MD5_PPM_420_128x128_TILE = f24c3429c52265832beab9df72a0ceae
MD5_PPM_420M_8x8_TILE = bc25320e1f4c31ce2e610e43e9fd173c
MD5_PPM_420M_TILE = 75ffdf14602258c5c189522af57fa605
MD5_PPM_422_8x8_TILE = d83dacd9fc73b0a6f10c09acad64eb1e
MD5_PPM_422_16x16_TILE = 35077fb610d72dd743b1eb0cbcfe10fb
MD5_PPM_422_32x32_TILE = e6902ed8a449ecc0f0d6f2bf945f65f7
MD5_PPM_422_64x64_TILE = 2b4502a8f316cedbde1da7bce3d2231e
MD5_PPM_422_128x128_TILE = f0b5617d578f5e13c8eee215d64d4877
MD5_PPM_422M_8x8_TILE = 828941d7f41cd6283abd6beffb7fd51d
MD5_PPM_422M_TILE = e877ae1324c4a280b95376f7f018172f
MD5_PPM_444_TILE = 7964e41e67cfb8d0a587c0aa4798f9c3
# Test compressing from/decompressing to an arbitrary subregion of a larger
# image buffer
cp $(srcdir)/testimages/testorig.ppm testout_tile.ppm
./tjbench testout_tile.ppm 95 -rgb -quiet -tile -benchtime 0.01 >/dev/null 2>&1
for i in 8 16 32 64 128; do \
md5/md5cmp $(MD5_PPM_GRAY_TILE) testout_tile_GRAY_Q95_$$i\x$$i.ppm; \
done
md5/md5cmp $(MD5_PPM_420_8x8_TILE) testout_tile_420_Q95_8x8.ppm
md5/md5cmp $(MD5_PPM_420_16x16_TILE) testout_tile_420_Q95_16x16.ppm
md5/md5cmp $(MD5_PPM_420_32x32_TILE) testout_tile_420_Q95_32x32.ppm
md5/md5cmp $(MD5_PPM_420_64x64_TILE) testout_tile_420_Q95_64x64.ppm
md5/md5cmp $(MD5_PPM_420_128x128_TILE) testout_tile_420_Q95_128x128.ppm
md5/md5cmp $(MD5_PPM_422_8x8_TILE) testout_tile_422_Q95_8x8.ppm
md5/md5cmp $(MD5_PPM_422_16x16_TILE) testout_tile_422_Q95_16x16.ppm
md5/md5cmp $(MD5_PPM_422_32x32_TILE) testout_tile_422_Q95_32x32.ppm
md5/md5cmp $(MD5_PPM_422_64x64_TILE) testout_tile_422_Q95_64x64.ppm
md5/md5cmp $(MD5_PPM_422_128x128_TILE) testout_tile_422_Q95_128x128.ppm
for i in 8 16 32 64 128; do \
md5/md5cmp $(MD5_PPM_444_TILE) testout_tile_444_Q95_$$i\x$$i.ppm; \
done
rm -f testout_tile_GRAY_* testout_tile_420_* testout_tile_422_* testout_tile_444_*
./tjbench testout_tile.ppm 95 -rgb -fastupsample -quiet -tile -benchtime 0.01 >/dev/null 2>&1
md5/md5cmp $(MD5_PPM_420M_8x8_TILE) testout_tile_420_Q95_8x8.ppm
for i in 16 32 64 128; do \
md5/md5cmp $(MD5_PPM_420M_TILE) testout_tile_420_Q95_$$i\x$$i.ppm; \
done
md5/md5cmp $(MD5_PPM_422M_8x8_TILE) testout_tile_422_Q95_8x8.ppm
for i in 16 32 64 128; do \
md5/md5cmp $(MD5_PPM_422M_TILE) testout_tile_422_Q95_$$i\x$$i.ppm; \
done
rm -f testout_tile_GRAY_* testout_tile_420_* testout_tile_422_* testout_tile_444_* testout_tile.ppm
echo GREAT SUCCESS!
endif
if CROSS_COMPILING
bittest: testclean
else
bittest: testclean all
endif
# These tests are carefully crafted to provide full coverage of as many of the
# underlying algorithms as possible (including all of the SIMD-accelerated
# ones.)
# CC: null SAMP: fullsize FDCT: islow ENT: huff
./cjpeg -rgb -dct int -outfile testout_rgb_islow.jpg $(srcdir)/testimages/testorig.ppm
md5/md5cmp $(MD5_JPEG_RGB_ISLOW) testout_rgb_islow.jpg
# CC: null SAMP: fullsize IDCT: islow ENT: huff
./djpeg -dct int -ppm -outfile testout_rgb_islow.ppm testout_rgb_islow.jpg
md5/md5cmp $(MD5_PPM_RGB_ISLOW) testout_rgb_islow.ppm
rm -f testout_rgb_islow.ppm
if WITH_12BIT
rm -f testout_rgb_islow.jpg
else
# CC: RGB->RGB565 SAMP: fullsize IDCT: islow ENT: huff
./djpeg -dct int -rgb565 -dither none -bmp -outfile testout_rgb_islow_565.bmp testout_rgb_islow.jpg
md5/md5cmp $(MD5_BMP_RGB_ISLOW_565) testout_rgb_islow_565.bmp
rm -f testout_rgb_islow_565.bmp
# CC: RGB->RGB565 (dithered) SAMP: fullsize IDCT: islow ENT: huff
./djpeg -dct int -rgb565 -bmp -outfile testout_rgb_islow_565D.bmp testout_rgb_islow.jpg
md5/md5cmp $(MD5_BMP_RGB_ISLOW_565D) testout_rgb_islow_565D.bmp
rm -f testout_rgb_islow_565D.bmp testout_rgb_islow.jpg
endif
# CC: RGB->YCC SAMP: fullsize/h2v1 FDCT: ifast ENT: 2-pass huff
./cjpeg -sample 2x1 -dct fast -opt -outfile testout_422_ifast_opt.jpg $(srcdir)/testimages/testorig.ppm
md5/md5cmp $(MD5_JPEG_422_IFAST_OPT) testout_422_ifast_opt.jpg
# CC: YCC->RGB SAMP: fullsize/h2v1 fancy IDCT: ifast ENT: huff
./djpeg -dct fast -outfile testout_422_ifast.ppm testout_422_ifast_opt.jpg
md5/md5cmp $(MD5_PPM_422_IFAST) testout_422_ifast.ppm
rm -f testout_422_ifast.ppm
# CC: YCC->RGB SAMP: h2v1 merged IDCT: ifast ENT: huff
./djpeg -dct fast -nosmooth -outfile testout_422m_ifast.ppm testout_422_ifast_opt.jpg
md5/md5cmp $(MD5_PPM_422M_IFAST) testout_422m_ifast.ppm
rm -f testout_422m_ifast.ppm
if WITH_12BIT
rm -f testout_422_ifast_opt.jpg
else
# CC: YCC->RGB565 SAMP: h2v1 merged IDCT: ifast ENT: huff
./djpeg -dct int -nosmooth -rgb565 -dither none -bmp -outfile testout_422m_ifast_565.bmp testout_422_ifast_opt.jpg
md5/md5cmp $(MD5_BMP_422M_IFAST_565) testout_422m_ifast_565.bmp
rm -f testout_422m_ifast_565.bmp
# CC: YCC->RGB565 (dithered) SAMP: h2v1 merged IDCT: ifast ENT: huff
./djpeg -dct int -nosmooth -rgb565 -bmp -outfile testout_422m_ifast_565D.bmp testout_422_ifast_opt.jpg
md5/md5cmp $(MD5_BMP_422M_IFAST_565D) testout_422m_ifast_565D.bmp
rm -f testout_422m_ifast_565D.bmp testout_422_ifast_opt.jpg
endif
# CC: RGB->YCC SAMP: fullsize/h2v2 FDCT: ifast ENT: prog huff
./cjpeg -sample 2x2 -quality 100 -dct fast -prog -outfile testout_420_q100_ifast_prog.jpg $(srcdir)/testimages/testorig.ppm
md5/md5cmp $(MD5_JPEG_420_IFAST_Q100_PROG) testout_420_q100_ifast_prog.jpg
# CC: YCC->RGB SAMP: fullsize/h2v2 fancy IDCT: ifast ENT: prog huff
./djpeg -dct fast -outfile testout_420_q100_ifast.ppm testout_420_q100_ifast_prog.jpg
md5/md5cmp $(MD5_PPM_420_Q100_IFAST) testout_420_q100_ifast.ppm
rm -f testout_420_q100_ifast.ppm
# CC: YCC->RGB SAMP: h2v2 merged IDCT: ifast ENT: prog huff
./djpeg -dct fast -nosmooth -outfile testout_420m_q100_ifast.ppm testout_420_q100_ifast_prog.jpg
md5/md5cmp $(MD5_PPM_420M_Q100_IFAST) testout_420m_q100_ifast.ppm
rm -f testout_420m_q100_ifast.ppm testout_420_q100_ifast_prog.jpg
# CC: RGB->Gray SAMP: fullsize FDCT: islow ENT: huff
./cjpeg -gray -dct int -outfile testout_gray_islow.jpg $(srcdir)/testimages/testorig.ppm
md5/md5cmp $(MD5_JPEG_GRAY_ISLOW) testout_gray_islow.jpg
# CC: Gray->Gray SAMP: fullsize IDCT: islow ENT: huff
./djpeg -dct int -outfile testout_gray_islow.ppm testout_gray_islow.jpg
md5/md5cmp $(MD5_PPM_GRAY_ISLOW) testout_gray_islow.ppm
rm -f testout_gray_islow.ppm
# CC: Gray->RGB SAMP: fullsize IDCT: islow ENT: huff
./djpeg -dct int -rgb -outfile testout_gray_islow_rgb.ppm testout_gray_islow.jpg
md5/md5cmp $(MD5_PPM_GRAY_ISLOW_RGB) testout_gray_islow_rgb.ppm
rm -f testout_gray_islow_rgb.ppm
if WITH_12BIT
rm -f testout_gray_islow.jpg
else
# CC: Gray->RGB565 SAMP: fullsize IDCT: islow ENT: huff
./djpeg -dct int -rgb565 -dither none -bmp -outfile testout_gray_islow_565.bmp testout_gray_islow.jpg
md5/md5cmp $(MD5_BMP_GRAY_ISLOW_565) testout_gray_islow_565.bmp
rm -f testout_gray_islow_565.bmp
# CC: Gray->RGB565 (dithered) SAMP: fullsize IDCT: islow ENT: huff
./djpeg -dct int -rgb565 -bmp -outfile testout_gray_islow_565D.bmp testout_gray_islow.jpg
md5/md5cmp $(MD5_BMP_GRAY_ISLOW_565D) testout_gray_islow_565D.bmp
rm -f testout_gray_islow_565D.bmp testout_gray_islow.jpg
endif
# CC: RGB->YCC SAMP: fullsize smooth/h2v2 smooth FDCT: islow
# ENT: 2-pass huff
./cjpeg -sample 2x2 -smooth 1 -dct int -opt -outfile testout_420s_ifast_opt.jpg $(srcdir)/testimages/testorig.ppm
md5/md5cmp $(MD5_JPEG_420S_IFAST_OPT) testout_420s_ifast_opt.jpg
rm -f testout_420s_ifast_opt.jpg
# The output of the floating point tests is not validated by default, because
# the output differs depending on the type of floating point math used, and
# this is only deterministic if the DCT/IDCT are implemented using SIMD
# instructions on a particular platform. Pass one of the following on the make
# command line to validate the floating point tests against one of the expected
# results:
#
# FLOATTEST=sse validate against the expected results from the libjpeg-turbo
# SSE SIMD extensions
# FLOATTEST=32bit validate against the expected results from the C code
# when running on a 32-bit FPU (or when SSE is being used for
# floating point math, which is generally the default with
# x86-64 compilers)
# FLOATTEST=64bit validate against the exepected results from the C code
# when running on a 64-bit FPU
# CC: RGB->YCC SAMP: fullsize/int FDCT: float ENT: prog huff
./cjpeg -sample 3x2 -dct float -prog -outfile testout_3x2_float_prog.jpg $(srcdir)/testimages/testorig.ppm
if [ "${FLOATTEST}" = "sse" ]; then \
md5/md5cmp $(MD5_JPEG_3x2_FLOAT_PROG_SSE) testout_3x2_float_prog.jpg; \
elif [ "${FLOATTEST}" = "32bit" -o "${FLOATTEST}" = "64bit" ]; then \
md5/md5cmp $(MD5_JPEG_3x2_FLOAT_PROG_32BIT) testout_3x2_float_prog.jpg; \
fi
# CC: YCC->RGB SAMP: fullsize/int IDCT: float ENT: prog huff
./djpeg -dct float -outfile testout_3x2_float.ppm testout_3x2_float_prog.jpg
if [ "${FLOATTEST}" = "sse" ]; then \
md5/md5cmp $(MD5_PPM_3x2_FLOAT_SSE) testout_3x2_float.ppm; \
elif [ "${FLOATTEST}" = "32bit" ]; then \
md5/md5cmp $(MD5_PPM_3x2_FLOAT_32BIT) testout_3x2_float.ppm; \
elif [ "${FLOATTEST}" = "64bit" ]; then \
md5/md5cmp $(MD5_PPM_3x2_FLOAT_64BIT) testout_3x2_float.ppm; \
fi
rm -f testout_3x2_float.ppm testout_3x2_float_prog.jpg
# CC: RGB->YCC SAMP: fullsize/int FDCT: ifast ENT: prog huff
./cjpeg -sample 3x2 -dct fast -prog -outfile testout_3x2_ifast_prog.jpg $(srcdir)/testimages/testorig.ppm
md5/md5cmp $(MD5_JPEG_3x2_IFAST_PROG) testout_3x2_ifast_prog.jpg
# CC: YCC->RGB SAMP: fullsize/int IDCT: ifast ENT: prog huff
./djpeg -dct fast -outfile testout_3x2_ifast.ppm testout_3x2_ifast_prog.jpg
md5/md5cmp $(MD5_PPM_3x2_IFAST) testout_3x2_ifast.ppm
rm -f testout_3x2_ifast.ppm testout_3x2_ifast_prog.jpg
if WITH_ARITH_ENC
# CC: YCC->RGB SAMP: fullsize/h2v2 FDCT: islow ENT: arith
./cjpeg -dct int -arithmetic -outfile testout_420_islow_ari.jpg $(srcdir)/testimages/testorig.ppm
md5/md5cmp $(MD5_JPEG_420_ISLOW_ARI) testout_420_islow_ari.jpg
rm -f testout_420_islow_ari.jpg
./jpegtran -arithmetic -outfile testout_420_islow_ari.jpg $(srcdir)/testimages/testimgint.jpg
md5/md5cmp $(MD5_JPEG_420_ISLOW_ARI) testout_420_islow_ari.jpg
rm -f testout_420_islow_ari.jpg
# CC: YCC->RGB SAMP: fullsize FDCT: islow ENT: prog arith
./cjpeg -sample 1x1 -dct int -prog -arithmetic -outfile testout_444_islow_progari.jpg $(srcdir)/testimages/testorig.ppm
md5/md5cmp $(MD5_JPEG_444_ISLOW_PROGARI) testout_444_islow_progari.jpg
rm -f testout_444_islow_progari.jpg
endif
if WITH_ARITH_DEC
# CC: RGB->YCC SAMP: h2v2 merged IDCT: ifast ENT: arith
./djpeg -fast -ppm -outfile testout_420m_ifast_ari.ppm $(srcdir)/testimages/testimgari.jpg
md5/md5cmp $(MD5_PPM_420M_IFAST_ARI) testout_420m_ifast_ari.ppm
rm -f testout_420m_ifast_ari.ppm
./jpegtran -outfile testout_420_islow.jpg $(srcdir)/testimages/testimgari.jpg
md5/md5cmp $(MD5_JPEG_420_ISLOW) testout_420_islow.jpg
rm -f testout_420_islow.jpg
endif
# CC: YCC->RGB SAMP: h2v2 merged IDCT: 16x16 islow ENT: huff
./djpeg -dct int -scale 2/1 -nosmooth -ppm -outfile testout_420m_islow_2_1.ppm $(srcdir)/testimages/$(TESTORIG)
md5/md5cmp $(MD5_PPM_420M_ISLOW_2_1) testout_420m_islow_2_1.ppm
rm -f testout_420m_islow_2_1.ppm
# CC: YCC->RGB SAMP: h2v2 merged IDCT: 15x15 islow ENT: huff
./djpeg -dct int -scale 15/8 -nosmooth -ppm -outfile testout_420m_islow_15_8.ppm $(srcdir)/testimages/$(TESTORIG)
md5/md5cmp $(MD5_PPM_420M_ISLOW_15_8) testout_420m_islow_15_8.ppm
rm -f testout_420m_islow_15_8.ppm
# CC: YCC->RGB SAMP: h2v2 merged IDCT: 13x13 islow ENT: huff
./djpeg -dct int -scale 13/8 -nosmooth -ppm -outfile testout_420m_islow_13_8.ppm $(srcdir)/testimages/$(TESTORIG)
md5/md5cmp $(MD5_PPM_420M_ISLOW_13_8) testout_420m_islow_13_8.ppm
rm -f testout_420m_islow_13_8.ppm
# CC: YCC->RGB SAMP: h2v2 merged IDCT: 11x11 islow ENT: huff
./djpeg -dct int -scale 11/8 -nosmooth -ppm -outfile testout_420m_islow_11_8.ppm $(srcdir)/testimages/$(TESTORIG)
md5/md5cmp $(MD5_PPM_420M_ISLOW_11_8) testout_420m_islow_11_8.ppm
rm -f testout_420m_islow_11_8.ppm
# CC: YCC->RGB SAMP: h2v2 merged IDCT: 9x9 islow ENT: huff
./djpeg -dct int -scale 9/8 -nosmooth -ppm -outfile testout_420m_islow_9_8.ppm $(srcdir)/testimages/$(TESTORIG)
md5/md5cmp $(MD5_PPM_420M_ISLOW_9_8) testout_420m_islow_9_8.ppm
rm -f testout_420m_islow_9_8.ppm
# CC: YCC->RGB SAMP: h2v2 merged IDCT: 7x7 islow/14x14 islow ENT: huff
./djpeg -dct int -scale 7/8 -nosmooth -ppm -outfile testout_420m_islow_7_8.ppm $(srcdir)/testimages/$(TESTORIG)
md5/md5cmp $(MD5_PPM_420M_ISLOW_7_8) testout_420m_islow_7_8.ppm
rm -f testout_420m_islow_7_8.ppm
# CC: YCC->RGB SAMP: h2v2 merged IDCT: 6x6 islow/12x12 islow ENT: huff
./djpeg -dct int -scale 3/4 -nosmooth -ppm -outfile testout_420m_islow_3_4.ppm $(srcdir)/testimages/$(TESTORIG)
md5/md5cmp $(MD5_PPM_420M_ISLOW_3_4) testout_420m_islow_3_4.ppm
rm -f testout_420m_islow_3_4.ppm
# CC: YCC->RGB SAMP: h2v2 merged IDCT: 5x5 islow/10x10 islow ENT: huff
./djpeg -dct int -scale 5/8 -nosmooth -ppm -outfile testout_420m_islow_5_8.ppm $(srcdir)/testimages/$(TESTORIG)
md5/md5cmp $(MD5_PPM_420M_ISLOW_5_8) testout_420m_islow_5_8.ppm
rm -f testout_420m_islow_5_8.ppm
# CC: YCC->RGB SAMP: h2v2 merged IDCT: 4x4 islow/8x8 islow ENT: huff
./djpeg -dct int -scale 1/2 -nosmooth -ppm -outfile testout_420m_islow_1_2.ppm $(srcdir)/testimages/$(TESTORIG)
md5/md5cmp $(MD5_PPM_420M_ISLOW_1_2) testout_420m_islow_1_2.ppm
rm -f testout_420m_islow_1_2.ppm
# CC: YCC->RGB SAMP: h2v2 merged IDCT: 3x3 islow/6x6 islow ENT: huff
./djpeg -dct int -scale 3/8 -nosmooth -ppm -outfile testout_420m_islow_3_8.ppm $(srcdir)/testimages/$(TESTORIG)
md5/md5cmp $(MD5_PPM_420M_ISLOW_3_8) testout_420m_islow_3_8.ppm
rm -f testout_420m_islow_3_8.ppm
# CC: YCC->RGB SAMP: h2v2 merged IDCT: 2x2 islow/4x4 islow ENT: huff
./djpeg -dct int -scale 1/4 -nosmooth -ppm -outfile testout_420m_islow_1_4.ppm $(srcdir)/testimages/$(TESTORIG)
md5/md5cmp $(MD5_PPM_420M_ISLOW_1_4) testout_420m_islow_1_4.ppm
rm -f testout_420m_islow_1_4.ppm
# CC: YCC->RGB SAMP: h2v2 merged IDCT: 1x1 islow/2x2 islow ENT: huff
./djpeg -dct int -scale 1/8 -nosmooth -ppm -outfile testout_420m_islow_1_8.ppm $(srcdir)/testimages/$(TESTORIG)
md5/md5cmp $(MD5_PPM_420M_ISLOW_1_8) testout_420m_islow_1_8.ppm
rm -f testout_420m_islow_1_8.ppm
if WITH_12BIT
else
# CC: YCC->RGB (dithered) SAMP: h2v2 fancy IDCT: islow ENT: huff
./djpeg -dct int -colors 256 -bmp -outfile testout_420_islow_256.bmp $(srcdir)/testimages/$(TESTORIG)
md5/md5cmp $(MD5_BMP_420_ISLOW_256) testout_420_islow_256.bmp
rm -f testout_420_islow_256.bmp
# CC: YCC->RGB565 SAMP: h2v2 fancy IDCT: islow ENT: huff
./djpeg -dct int -rgb565 -dither none -bmp -outfile testout_420_islow_565.bmp $(srcdir)/testimages/$(TESTORIG)
md5/md5cmp $(MD5_BMP_420_ISLOW_565) testout_420_islow_565.bmp
rm -f testout_420_islow_565.bmp
# CC: YCC->RGB565 (dithered) SAMP: h2v2 fancy IDCT: islow ENT: huff
./djpeg -dct int -rgb565 -bmp -outfile testout_420_islow_565D.bmp $(srcdir)/testimages/$(TESTORIG)
md5/md5cmp $(MD5_BMP_420_ISLOW_565D) testout_420_islow_565D.bmp
rm -f testout_420_islow_565D.bmp
# CC: YCC->RGB565 SAMP: h2v2 merged IDCT: islow ENT: huff
./djpeg -dct int -nosmooth -rgb565 -dither none -bmp -outfile testout_420m_islow_565.bmp $(srcdir)/testimages/$(TESTORIG)
md5/md5cmp $(MD5_BMP_420M_ISLOW_565) testout_420m_islow_565.bmp
rm -f testout_420m_islow_565.bmp
# CC: YCC->RGB565 (dithered) SAMP: h2v2 merged IDCT: islow ENT: huff
./djpeg -dct int -nosmooth -rgb565 -bmp -outfile testout_420m_islow_565D.bmp $(srcdir)/testimages/$(TESTORIG)
md5/md5cmp $(MD5_BMP_420M_ISLOW_565D) testout_420m_islow_565D.bmp
rm -f testout_420m_islow_565D.bmp
endif
# Partial decode tests. These tests are designed to cover all of the possible
# code paths in jpeg_skip_scanlines().
# Context rows: Yes Intra-iMCU row: Yes iMCU row prefetch: No ENT: huff
./djpeg -dct int -skip 15,31 -ppm -outfile testout_420_islow_skip15,31.ppm $(srcdir)/testimages/$(TESTORIG)
md5/md5cmp $(MD5_PPM_420_ISLOW_SKIP15_31) testout_420_islow_skip15,31.ppm
rm -f testout_420_islow_skip15,31.ppm
# Context rows: Yes Intra-iMCU row: No iMCU row prefetch: Yes ENT: arith
if WITH_ARITH_DEC
./djpeg -dct int -skip 16,139 -ppm -outfile testout_420_islow_ari_skip16,139.ppm $(srcdir)/testimages/testimgari.jpg
md5/md5cmp $(MD5_PPM_420_ISLOW_ARI_SKIP16_139) testout_420_islow_ari_skip16,139.ppm
rm -f testout_420_islow_ari_skip16,139.ppm
endif
# Context rows: Yes Intra-iMCU row: No iMCU row prefetch: No ENT: prog huff
./cjpeg -dct int -prog -outfile testout_420_islow_prog.jpg $(srcdir)/testimages/testorig.ppm
./djpeg -dct int -crop 62x62+71+71 -ppm -outfile testout_420_islow_prog_crop62x62,71,71.ppm testout_420_islow_prog.jpg
md5/md5cmp $(MD5_PPM_420_ISLOW_PROG_CROP62x62_71_71) testout_420_islow_prog_crop62x62,71,71.ppm
rm -f testout_420_islow_prog_crop62x62,71,71.ppm testout_420_islow_prog.jpg
# Context rows: Yes Intra-iMCU row: No iMCU row prefetch: No ENT: arith
if WITH_ARITH_DEC
./djpeg -dct int -crop 53x53+4+4 -ppm -outfile testout_420_islow_ari_crop53x53,4,4.ppm $(srcdir)/testimages/testimgari.jpg
md5/md5cmp $(MD5_PPM_420_ISLOW_ARI_CROP53x53_4_4) testout_420_islow_ari_crop53x53,4,4.ppm
rm -f testout_420_islow_ari_crop53x53,4,4.ppm
endif
# Context rows: No Intra-iMCU row: Yes ENT: huff
./cjpeg -dct int -sample 1x1 -outfile testout_444_islow.jpg $(srcdir)/testimages/testorig.ppm
./djpeg -dct int -skip 1,6 -ppm -outfile testout_444_islow_skip1,6.ppm testout_444_islow.jpg
md5/md5cmp $(MD5_PPM_444_ISLOW_SKIP1_6) testout_444_islow_skip1,6.ppm
rm -f testout_444_islow_skip1,6.ppm testout_444_islow.jpg
# Context rows: No Intra-iMCU row: No ENT: prog huff
./cjpeg -dct int -prog -sample 1x1 -outfile testout_444_islow_prog.jpg $(srcdir)/testimages/testorig.ppm
./djpeg -dct int -crop 98x98+13+13 -ppm -outfile testout_444_islow_prog_crop98x98,13,13.ppm testout_444_islow_prog.jpg
md5/md5cmp $(MD5_PPM_444_ISLOW_PROG_CROP98x98_13_13) testout_444_islow_prog_crop98x98,13,13.ppm
rm -f testout_444_islow_prog_crop98x98,13,13.ppm testout_444_islow_prog.jpg
# Context rows: No Intra-iMCU row: No ENT: arith
if WITH_ARITH_ENC
./cjpeg -dct int -arithmetic -sample 1x1 -outfile testout_444_islow_ari.jpg $(srcdir)/testimages/testorig.ppm
if WITH_ARITH_DEC
./djpeg -dct int -crop 37x37+0+0 -ppm -outfile testout_444_islow_ari_crop37x37,0,0.ppm testout_444_islow_ari.jpg
md5/md5cmp $(MD5_PPM_444_ISLOW_ARI_CROP37x37_0_0) testout_444_islow_ari_crop37x37,0,0.ppm
rm -f testout_444_islow_ari_crop37x37,0,0.ppm
endif
rm -f testout_444_islow_ari.jpg
endif
./jpegtran -crop 120x90+20+50 -transpose -perfect -outfile testout_crop.jpg $(srcdir)/testimages/$(TESTORIG)
md5/md5cmp $(MD5_JPEG_CROP) testout_crop.jpg
rm -f testout_crop.jpg
echo GREAT SUCCESS!
testclean:
rm -f testout*
rm -f *_GRAY_*.bmp
rm -f *_GRAY_*.png
rm -f *_GRAY_*.ppm
rm -f *_GRAY_*.jpg
rm -f *_GRAY.yuv
rm -f *_420_*.bmp
rm -f *_420_*.png
rm -f *_420_*.ppm
rm -f *_420_*.jpg
rm -f *_420.yuv
rm -f *_422_*.bmp
rm -f *_422_*.png
rm -f *_422_*.ppm
rm -f *_422_*.jpg
rm -f *_422.yuv
rm -f *_444_*.bmp
rm -f *_444_*.png
rm -f *_444_*.ppm
rm -f *_444_*.jpg
rm -f *_444.yuv
rm -f *_440_*.bmp
rm -f *_440_*.png
rm -f *_440_*.ppm
rm -f *_440_*.jpg
rm -f *_440.yuv
rm -f *_411_*.bmp
rm -f *_411_*.png
rm -f *_411_*.ppm
rm -f *_411_*.jpg
rm -f *_411.yuv
tjtest:
sh ./tjbenchtest
sh ./tjbenchtest -alloc
sh ./tjbenchtest -yuv
sh ./tjbenchtest -yuv -alloc
if WITH_JAVA
sh ./tjbenchtest.java
sh ./tjbenchtest.java -yuv
endif
pkgscripts/libjpeg-turbo.spec: pkgscripts/libjpeg-turbo.spec.tmpl
cat pkgscripts/libjpeg-turbo.spec.tmpl | sed s@%{__prefix}@$(prefix)@g | \
sed s@%{__bindir}@$(bindir)@g | sed s@%{__datadir}@$(datadir)@g | \
sed s@%{__docdir}@$(docdir)@g | sed s@%{__includedir}@$(includedir)@g | \
sed s@%{__libdir}@$(libdir)@g | sed s@%{__mandir}@$(mandir)@g \
> pkgscripts/libjpeg-turbo.spec
rpm: all pkgscripts/libjpeg-turbo.spec
TMPDIR=`mktemp -d /tmp/${PACKAGE_NAME}-build.XXXXXX`; \
mkdir -p $$TMPDIR/RPMS; \
ln -fs `pwd` $$TMPDIR/BUILD; \
rm -f ${PKGNAME}-${VERSION}.${RPMARCH}.rpm; \
rpmbuild -bb --define "_blddir $$TMPDIR/buildroot" \
--define "_topdir $$TMPDIR" \
--target ${RPMARCH} pkgscripts/libjpeg-turbo.spec; \
cp $$TMPDIR/RPMS/${RPMARCH}/${PKGNAME}-${VERSION}-${BUILD}.${RPMARCH}.rpm \
${PKGNAME}-${VERSION}.${RPMARCH}.rpm; \
rm -rf $$TMPDIR
srpm: dist-gzip pkgscripts/libjpeg-turbo.spec
TMPDIR=`mktemp -d /tmp/${PACKAGE_NAME}-build.XXXXXX`; \
mkdir -p $$TMPDIR/RPMS; \
mkdir -p $$TMPDIR/SRPMS; \
mkdir -p $$TMPDIR/BUILD; \
mkdir -p $$TMPDIR/SOURCES; \
mkdir -p $$TMPDIR/SPECS; \
rm -f ${PKGNAME}-${VERSION}.src.rpm; \
cp ${PACKAGE_NAME}-${VERSION}.tar.gz $$TMPDIR/SOURCES; \
cat pkgscripts/libjpeg-turbo.spec | sed s/%{_blddir}/%{_tmppath}/g \
| sed s/#--\>//g \
> $$TMPDIR/SPECS/libjpeg-turbo.spec; \
rpmbuild -bs --define "_topdir $$TMPDIR" $$TMPDIR/SPECS/libjpeg-turbo.spec; \
cp $$TMPDIR/SRPMS/${PKGNAME}-${VERSION}-${BUILD}.src.rpm \
${PKGNAME}-${VERSION}.src.rpm; \
rm -rf $$TMPDIR
pkgscripts/makedpkg: pkgscripts/makedpkg.tmpl
cat pkgscripts/makedpkg.tmpl | sed s@%{__prefix}@$(prefix)@g | \
sed s@%{__docdir}@$(docdir)@g | sed s@%{__libdir}@$(libdir)@g \
> pkgscripts/makedpkg
deb: all pkgscripts/makedpkg
sh pkgscripts/makedpkg
pkgscripts/uninstall: pkgscripts/uninstall.tmpl
cat pkgscripts/uninstall.tmpl | sed s@%{__prefix}@$(prefix)@g | \
sed s@%{__bindir}@$(bindir)@g | sed s@%{__datadir}@$(datadir)@g | \
sed s@%{__includedir}@$(includedir)@g | sed s@%{__libdir}@$(libdir)@g | \
sed s@%{__mandir}@$(mandir)@g > pkgscripts/uninstall
pkgscripts/makemacpkg: pkgscripts/makemacpkg.tmpl
cat pkgscripts/makemacpkg.tmpl | sed s@%{__prefix}@$(prefix)@g | \
sed s@%{__bindir}@$(bindir)@g | sed s@%{__docdir}@$(docdir)@g | \
sed s@%{__libdir}@$(libdir)@g > pkgscripts/makemacpkg
if X86_64
udmg: all pkgscripts/makemacpkg pkgscripts/uninstall
sh pkgscripts/makemacpkg -build32 ${BUILDDIR32}
iosdmg: all pkgscripts/makemacpkg pkgscripts/uninstall
sh pkgscripts/makemacpkg -build32 ${BUILDDIR32} -buildarmv7 ${BUILDDIRARMV7} -buildarmv7s ${BUILDDIRARMV7S} -buildarmv8 ${BUILDDIRARMV8} -lipo "${LIPO}"
else
iosdmg: all pkgscripts/makemacpkg pkgscripts/uninstall
sh pkgscripts/makemacpkg -buildarmv7 ${BUILDDIRARMV7} -buildarmv7s ${BUILDDIRARMV7S} -buildarmv8 ${BUILDDIRARMV8} -lipo "${LIPO}"
endif
dmg: all pkgscripts/makemacpkg pkgscripts/uninstall
sh pkgscripts/makemacpkg
pkgscripts/makecygwinpkg: pkgscripts/makecygwinpkg.tmpl
cat pkgscripts/makecygwinpkg.tmpl | sed s@%{__prefix}@$(prefix)@g | \
sed s@%{__docdir}@$(docdir)@g | sed s@%{__libdir}@$(libdir)@g \
> pkgscripts/makecygwinpkg
cygwinpkg: all pkgscripts/makecygwinpkg
sh pkgscripts/makecygwinpkg
File diff suppressed because it is too large Load Diff
-279
View File
@@ -1,279 +0,0 @@
libjpeg-turbo note: This file has been modified by The libjpeg-turbo Project
to include only information relevant to libjpeg-turbo, to wordsmith certain
sections, and to remove impolitic language that existed in the libjpeg v8
README. It is included only for reference. Please see README.md for
information specific to libjpeg-turbo.
The Independent JPEG Group's JPEG software
==========================================
This distribution contains a release of the Independent JPEG Group's free JPEG
software. You are welcome to redistribute this software and to use it for any
purpose, subject to the conditions under LEGAL ISSUES, below.
This software is the work of Tom Lane, Guido Vollbeding, Philip Gladstone,
Bill Allombert, Jim Boucher, Lee Crocker, Bob Friesenhahn, Ben Jackson,
Julian Minguillon, Luis Ortiz, George Phillips, Davide Rossi, Ge' Weijers,
and other members of the Independent JPEG Group.
IJG is not affiliated with the ISO/IEC JTC1/SC29/WG1 standards committee
(also known as JPEG, together with ITU-T SG16).
DOCUMENTATION ROADMAP
=====================
This file contains the following sections:
OVERVIEW General description of JPEG and the IJG software.
LEGAL ISSUES Copyright, lack of warranty, terms of distribution.
REFERENCES Where to learn more about JPEG.
ARCHIVE LOCATIONS Where to find newer versions of this software.
FILE FORMAT WARS Software *not* to get.
TO DO Plans for future IJG releases.
Other documentation files in the distribution are:
User documentation:
usage.txt Usage instructions for cjpeg, djpeg, jpegtran,
rdjpgcom, and wrjpgcom.
*.1 Unix-style man pages for programs (same info as usage.txt).
wizard.txt Advanced usage instructions for JPEG wizards only.
change.log Version-to-version change highlights.
Programmer and internal documentation:
libjpeg.txt How to use the JPEG library in your own programs.
example.c Sample code for calling the JPEG library.
structure.txt Overview of the JPEG library's internal structure.
coderules.txt Coding style rules --- please read if you contribute code.
Please read at least usage.txt. Some information can also be found in the JPEG
FAQ (Frequently Asked Questions) article. See ARCHIVE LOCATIONS below to find
out where to obtain the FAQ article.
If you want to understand how the JPEG code works, we suggest reading one or
more of the REFERENCES, then looking at the documentation files (in roughly
the order listed) before diving into the code.
OVERVIEW
========
This package contains C software to implement JPEG image encoding, decoding,
and transcoding. JPEG (pronounced "jay-peg") is a standardized compression
method for full-color and grayscale images. JPEG's strong suit is compressing
photographic images or other types of images that have smooth color and
brightness transitions between neighboring pixels. Images with sharp lines or
other abrupt features may not compress well with JPEG, and a higher JPEG
quality may have to be used to avoid visible compression artifacts with such
images.
JPEG is lossy, meaning that the output pixels are not necessarily identical to
the input pixels. However, on photographic content and other "smooth" images,
very good compression ratios can be obtained with no visible compression
artifacts, and extremely high compression ratios are possible if you are
willing to sacrifice image quality (by reducing the "quality" setting in the
compressor.)
This software implements JPEG baseline, extended-sequential, and progressive
compression processes. Provision is made for supporting all variants of these
processes, although some uncommon parameter settings aren't implemented yet.
We have made no provision for supporting the hierarchical or lossless
processes defined in the standard.
We provide a set of library routines for reading and writing JPEG image files,
plus two sample applications "cjpeg" and "djpeg", which use the library to
perform conversion between JPEG and some other popular image file formats.
The library is intended to be reused in other applications.
In order to support file conversion and viewing software, we have included
considerable functionality beyond the bare JPEG coding/decoding capability;
for example, the color quantization modules are not strictly part of JPEG
decoding, but they are essential for output to colormapped file formats or
colormapped displays. These extra functions can be compiled out of the
library if not required for a particular application.
We have also included "jpegtran", a utility for lossless transcoding between
different JPEG processes, and "rdjpgcom" and "wrjpgcom", two simple
applications for inserting and extracting textual comments in JFIF files.
The emphasis in designing this software has been on achieving portability and
flexibility, while also making it fast enough to be useful. In particular,
the software is not intended to be read as a tutorial on JPEG. (See the
REFERENCES section for introductory material.) Rather, it is intended to
be reliable, portable, industrial-strength code. We do not claim to have
achieved that goal in every aspect of the software, but we strive for it.
We welcome the use of this software as a component of commercial products.
No royalty is required, but we do ask for an acknowledgement in product
documentation, as described under LEGAL ISSUES.
LEGAL ISSUES
============
In plain English:
1. We don't promise that this software works. (But if you find any bugs,
please let us know!)
2. You can use this software for whatever you want. You don't have to pay us.
3. You may not pretend that you wrote this software. If you use it in a
program, you must acknowledge somewhere in your documentation that
you've used the IJG code.
In legalese:
The authors make NO WARRANTY or representation, either express or implied,
with respect to this software, its quality, accuracy, merchantability, or
fitness for a particular purpose. This software is provided "AS IS", and you,
its user, assume the entire risk as to its quality and accuracy.
This software is copyright (C) 1991-2016, Thomas G. Lane, Guido Vollbeding.
All Rights Reserved except as specified below.
Permission is hereby granted to use, copy, modify, and distribute this
software (or portions thereof) for any purpose, without fee, subject to these
conditions:
(1) If any part of the source code for this software is distributed, then this
README file must be included, with this copyright and no-warranty notice
unaltered; and any additions, deletions, or changes to the original files
must be clearly indicated in accompanying documentation.
(2) If only executable code is distributed, then the accompanying
documentation must state that "this software is based in part on the work of
the Independent JPEG Group".
(3) Permission for use of this software is granted only if the user accepts
full responsibility for any undesirable consequences; the authors accept
NO LIABILITY for damages of any kind.
These conditions apply to any software derived from or based on the IJG code,
not just to the unmodified library. If you use our work, you ought to
acknowledge us.
Permission is NOT granted for the use of any IJG author's name or company name
in advertising or publicity relating to this software or products derived from
it. This software may be referred to only as "the Independent JPEG Group's
software".
We specifically permit and encourage the use of this software as the basis of
commercial products, provided that all warranty or liability claims are
assumed by the product vendor.
The Unix configuration script "configure" was produced with GNU Autoconf.
It is copyright by the Free Software Foundation but is freely distributable.
The same holds for its supporting scripts (config.guess, config.sub,
ltmain.sh). Another support script, install-sh, is copyright by X Consortium
but is also freely distributable.
The IJG distribution formerly included code to read and write GIF files.
To avoid entanglement with the Unisys LZW patent (now expired), GIF reading
support has been removed altogether, and the GIF writer has been simplified
to produce "uncompressed GIFs". This technique does not use the LZW
algorithm; the resulting GIF files are larger than usual, but are readable
by all standard GIF decoders.
We are required to state that
"The Graphics Interchange Format(c) is the Copyright property of
CompuServe Incorporated. GIF(sm) is a Service Mark property of
CompuServe Incorporated."
REFERENCES
==========
We recommend reading one or more of these references before trying to
understand the innards of the JPEG software.
The best short technical introduction to the JPEG compression algorithm is
Wallace, Gregory K. "The JPEG Still Picture Compression Standard",
Communications of the ACM, April 1991 (vol. 34 no. 4), pp. 30-44.
(Adjacent articles in that issue discuss MPEG motion picture compression,
applications of JPEG, and related topics.) If you don't have the CACM issue
handy, a PDF file containing a revised version of Wallace's article is
available at http://www.ijg.org/files/Wallace.JPEG.pdf. The file (actually
a preprint for an article that appeared in IEEE Trans. Consumer Electronics)
omits the sample images that appeared in CACM, but it includes corrections
and some added material. Note: the Wallace article is copyright ACM and IEEE,
and it may not be used for commercial purposes.
A somewhat less technical, more leisurely introduction to JPEG can be found in
"The Data Compression Book" by Mark Nelson and Jean-loup Gailly, published by
M&T Books (New York), 2nd ed. 1996, ISBN 1-55851-434-1. This book provides
good explanations and example C code for a multitude of compression methods
including JPEG. It is an excellent source if you are comfortable reading C
code but don't know much about data compression in general. The book's JPEG
sample code is far from industrial-strength, but when you are ready to look
at a full implementation, you've got one here...
The best currently available description of JPEG is the textbook "JPEG Still
Image Data Compression Standard" by William B. Pennebaker and Joan L.
Mitchell, published by Van Nostrand Reinhold, 1993, ISBN 0-442-01272-1.
Price US$59.95, 638 pp. The book includes the complete text of the ISO JPEG
standards (DIS 10918-1 and draft DIS 10918-2).
The original JPEG standard is divided into two parts, Part 1 being the actual
specification, while Part 2 covers compliance testing methods. Part 1 is
titled "Digital Compression and Coding of Continuous-tone Still Images,
Part 1: Requirements and guidelines" and has document numbers ISO/IEC IS
10918-1, ITU-T T.81. Part 2 is titled "Digital Compression and Coding of
Continuous-tone Still Images, Part 2: Compliance testing" and has document
numbers ISO/IEC IS 10918-2, ITU-T T.83.
The JPEG standard does not specify all details of an interchangeable file
format. For the omitted details we follow the "JFIF" conventions, revision
1.02. JFIF 1.02 has been adopted as an Ecma International Technical Report
and thus received a formal publication status. It is available as a free
download in PDF format from
http://www.ecma-international.org/publications/techreports/E-TR-098.htm.
A PostScript version of the JFIF document is available at
http://www.ijg.org/files/jfif.ps.gz. There is also a plain text version at
http://www.ijg.org/files/jfif.txt.gz, but it is missing the figures.
The TIFF 6.0 file format specification can be obtained by FTP from
ftp://ftp.sgi.com/graphics/tiff/TIFF6.ps.gz. The JPEG incorporation scheme
found in the TIFF 6.0 spec of 3-June-92 has a number of serious problems.
IJG does not recommend use of the TIFF 6.0 design (TIFF Compression tag 6).
Instead, we recommend the JPEG design proposed by TIFF Technical Note #2
(Compression tag 7). Copies of this Note can be obtained from
http://www.ijg.org/files/. It is expected that the next revision
of the TIFF spec will replace the 6.0 JPEG design with the Note's design.
Although IJG's own code does not support TIFF/JPEG, the free libtiff library
uses our library to implement TIFF/JPEG per the Note.
ARCHIVE LOCATIONS
=================
The "official" archive site for this software is www.ijg.org.
The most recent released version can always be found there in
directory "files".
The JPEG FAQ (Frequently Asked Questions) article is a source of some
general information about JPEG.
It is available on the World Wide Web at http://www.faqs.org/faqs/jpeg-faq/
and other news.answers archive sites, including the official news.answers
archive at rtfm.mit.edu: ftp://rtfm.mit.edu/pub/usenet/news.answers/jpeg-faq/.
If you don't have Web or FTP access, send e-mail to mail-server@rtfm.mit.edu
with body
send usenet/news.answers/jpeg-faq/part1
send usenet/news.answers/jpeg-faq/part2
FILE FORMAT WARS
================
The ISO/IEC JTC1/SC29/WG1 standards committee (also known as JPEG, together
with ITU-T SG16) currently promotes different formats containing the name
"JPEG" which are incompatible with original DCT-based JPEG. IJG therefore does
not support these formats (see REFERENCES). Indeed, one of the original
reasons for developing this free software was to help force convergence on
common, interoperable format standards for JPEG files.
Don't use an incompatible file format!
(In any case, our decoder will remain capable of reading existing JPEG
image files indefinitely.)
TO DO
=====
Please send bug reports, offers of help, etc. to jpeg-info@jpegclub.org.
-341
View File
@@ -1,341 +0,0 @@
Background
==========
libjpeg-turbo is a JPEG image codec that uses SIMD instructions (MMX, SSE2,
NEON, AltiVec) to accelerate baseline JPEG compression and decompression on
x86, x86-64, ARM, and PowerPC systems. On such systems, libjpeg-turbo is
generally 2-6x as fast as libjpeg, all else being equal. On other types of
systems, libjpeg-turbo can still outperform libjpeg by a significant amount, by
virtue of its highly-optimized Huffman coding routines. In many cases, the
performance of libjpeg-turbo rivals that of proprietary high-speed JPEG codecs.
libjpeg-turbo implements both the traditional libjpeg API as well as the less
powerful but more straightforward TurboJPEG API. libjpeg-turbo also features
colorspace extensions that allow it to compress from/decompress to 32-bit and
big-endian pixel buffers (RGBX, XBGR, etc.), as well as a full-featured Java
interface.
libjpeg-turbo was originally based on libjpeg/SIMD, an MMX-accelerated
derivative of libjpeg v6b developed by Miyasaka Masaru. The TigerVNC and
VirtualGL projects made numerous enhancements to the codec in 2009, and in
early 2010, libjpeg-turbo spun off into an independent project, with the goal
of making high-speed JPEG compression/decompression technology available to a
broader range of users and developers.
License
=======
libjpeg-turbo is covered by three compatible BSD-style open source licenses.
Refer to [LICENSE.md](LICENSE.md) for a roll-up of license terms.
Building libjpeg-turbo
======================
Refer to [BUILDING.md](BUILDING.md) for complete instructions.
Using libjpeg-turbo
===================
libjpeg-turbo includes two APIs that can be used to compress and decompress
JPEG images:
- **TurboJPEG API**
This API provides an easy-to-use interface for compressing and decompressing
JPEG images in memory. It also provides some functionality that would not be
straightforward to achieve using the underlying libjpeg API, such as
generating planar YUV images and performing multiple simultaneous lossless
transforms on an image. The Java interface for libjpeg-turbo is written on
top of the TurboJPEG API.
- **libjpeg API**
This is the de facto industry-standard API for compressing and decompressing
JPEG images. It is more difficult to use than the TurboJPEG API but also
more powerful. The libjpeg API implementation in libjpeg-turbo is both
API/ABI-compatible and mathematically compatible with libjpeg v6b. It can
also optionally be configured to be API/ABI-compatible with libjpeg v7 and v8
(see below.)
There is no significant performance advantage to either API when both are used
to perform similar operations.
Colorspace Extensions
---------------------
libjpeg-turbo includes extensions that allow JPEG images to be compressed
directly from (and decompressed directly to) buffers that use BGR, BGRX,
RGBX, XBGR, and XRGB pixel ordering. This is implemented with ten new
colorspace constants:
JCS_EXT_RGB /* red/green/blue */
JCS_EXT_RGBX /* red/green/blue/x */
JCS_EXT_BGR /* blue/green/red */
JCS_EXT_BGRX /* blue/green/red/x */
JCS_EXT_XBGR /* x/blue/green/red */
JCS_EXT_XRGB /* x/red/green/blue */
JCS_EXT_RGBA /* red/green/blue/alpha */
JCS_EXT_BGRA /* blue/green/red/alpha */
JCS_EXT_ABGR /* alpha/blue/green/red */
JCS_EXT_ARGB /* alpha/red/green/blue */
Setting `cinfo.in_color_space` (compression) or `cinfo.out_color_space`
(decompression) to one of these values will cause libjpeg-turbo to read the
red, green, and blue values from (or write them to) the appropriate position in
the pixel when compressing from/decompressing to an RGB buffer.
Your application can check for the existence of these extensions at compile
time with:
#ifdef JCS_EXTENSIONS
At run time, attempting to use these extensions with a libjpeg implementation
that does not support them will result in a "Bogus input colorspace" error.
Applications can trap this error in order to test whether run-time support is
available for the colorspace extensions.
When using the RGBX, BGRX, XBGR, and XRGB colorspaces during decompression, the
X byte is undefined, and in order to ensure the best performance, libjpeg-turbo
can set that byte to whatever value it wishes. If an application expects the X
byte to be used as an alpha channel, then it should specify `JCS_EXT_RGBA`,
`JCS_EXT_BGRA`, `JCS_EXT_ABGR`, or `JCS_EXT_ARGB`. When these colorspace
constants are used, the X byte is guaranteed to be 0xFF, which is interpreted
as opaque.
Your application can check for the existence of the alpha channel colorspace
extensions at compile time with:
#ifdef JCS_ALPHA_EXTENSIONS
[jcstest.c](jcstest.c), located in the libjpeg-turbo source tree, demonstrates
how to check for the existence of the colorspace extensions at compile time and
run time.
libjpeg v7 and v8 API/ABI Emulation
-----------------------------------
With libjpeg v7 and v8, new features were added that necessitated extending the
compression and decompression structures. Unfortunately, due to the exposed
nature of those structures, extending them also necessitated breaking backward
ABI compatibility with previous libjpeg releases. Thus, programs that were
built to use libjpeg v7 or v8 did not work with libjpeg-turbo, since it is
based on the libjpeg v6b code base. Although libjpeg v7 and v8 are not
as widely used as v6b, enough programs (including a few Linux distros) made
the switch that there was a demand to emulate the libjpeg v7 and v8 ABIs
in libjpeg-turbo. It should be noted, however, that this feature was added
primarily so that applications that had already been compiled to use libjpeg
v7+ could take advantage of accelerated baseline JPEG encoding/decoding
without recompiling. libjpeg-turbo does not claim to support all of the
libjpeg v7+ features, nor to produce identical output to libjpeg v7+ in all
cases (see below.)
By passing an argument of `--with-jpeg7` or `--with-jpeg8` to `configure`, or
an argument of `-DWITH_JPEG7=1` or `-DWITH_JPEG8=1` to `cmake`, you can build a
version of libjpeg-turbo that emulates the libjpeg v7 or v8 ABI, so that
programs that are built against libjpeg v7 or v8 can be run with libjpeg-turbo.
The following section describes which libjpeg v7+ features are supported and
which aren't.
### Support for libjpeg v7 and v8 Features
#### Fully supported
- **libjpeg: IDCT scaling extensions in decompressor**
libjpeg-turbo supports IDCT scaling with scaling factors of 1/8, 1/4, 3/8,
1/2, 5/8, 3/4, 7/8, 9/8, 5/4, 11/8, 3/2, 13/8, 7/4, 15/8, and 2/1 (only 1/4
and 1/2 are SIMD-accelerated.)
- **libjpeg: Arithmetic coding**
- **libjpeg: In-memory source and destination managers**
See notes below.
- **cjpeg: Separate quality settings for luminance and chrominance**
Note that the libpjeg v7+ API was extended to accommodate this feature only
for convenience purposes. It has always been possible to implement this
feature with libjpeg v6b (see rdswitch.c for an example.)
- **cjpeg: 32-bit BMP support**
- **cjpeg: `-rgb` option**
- **jpegtran: Lossless cropping**
- **jpegtran: `-perfect` option**
- **jpegtran: Forcing width/height when performing lossless crop**
- **rdjpgcom: `-raw` option**
- **rdjpgcom: Locale awareness**
#### Not supported
NOTE: As of this writing, extensive research has been conducted into the
usefulness of DCT scaling as a means of data reduction and SmartScale as a
means of quality improvement. The reader is invited to peruse the research at
<http://www.libjpeg-turbo.org/About/SmartScale> and draw his/her own conclusions,
but it is the general belief of our project that these features have not
demonstrated sufficient usefulness to justify inclusion in libjpeg-turbo.
- **libjpeg: DCT scaling in compressor**
`cinfo.scale_num` and `cinfo.scale_denom` are silently ignored.
There is no technical reason why DCT scaling could not be supported when
emulating the libjpeg v7+ API/ABI, but without the SmartScale extension (see
below), only scaling factors of 1/2, 8/15, 4/7, 8/13, 2/3, 8/11, 4/5, and
8/9 would be available, which is of limited usefulness.
- **libjpeg: SmartScale**
`cinfo.block_size` is silently ignored.
SmartScale is an extension to the JPEG format that allows for DCT block
sizes other than 8x8. Providing support for this new format would be
feasible (particularly without full acceleration.) However, until/unless
the format becomes either an official industry standard or, at minimum, an
accepted solution in the community, we are hesitant to implement it, as
there is no sense of whether or how it might change in the future. It is
our belief that SmartScale has not demonstrated sufficient usefulness as a
lossless format nor as a means of quality enhancement, and thus our primary
interest in providing this feature would be as a means of supporting
additional DCT scaling factors.
- **libjpeg: Fancy downsampling in compressor**
`cinfo.do_fancy_downsampling` is silently ignored.
This requires the DCT scaling feature, which is not supported.
- **jpegtran: Scaling**
This requires both the DCT scaling and SmartScale features, which are not
supported.
- **Lossless RGB JPEG files**
This requires the SmartScale feature, which is not supported.
### What About libjpeg v9?
libjpeg v9 introduced yet another field to the JPEG compression structure
(`color_transform`), thus making the ABI backward incompatible with that of
libjpeg v8. This new field was introduced solely for the purpose of supporting
lossless SmartScale encoding. Furthermore, there was actually no reason to
extend the API in this manner, as the color transform could have just as easily
been activated by way of a new JPEG colorspace constant, thus preserving
backward ABI compatibility.
Our research (see link above) has shown that lossless SmartScale does not
generally accomplish anything that can't already be accomplished better with
existing, standard lossless formats. Therefore, at this time it is our belief
that there is not sufficient technical justification for software projects to
upgrade from libjpeg v8 to libjpeg v9, and thus there is not sufficient
echnical justification for us to emulate the libjpeg v9 ABI.
In-Memory Source/Destination Managers
-------------------------------------
By default, libjpeg-turbo 1.3 and later includes the `jpeg_mem_src()` and
`jpeg_mem_dest()` functions, even when not emulating the libjpeg v8 API/ABI.
Previously, it was necessary to build libjpeg-turbo from source with libjpeg v8
API/ABI emulation in order to use the in-memory source/destination managers,
but several projects requested that those functions be included when emulating
the libjpeg v6b API/ABI as well. This allows the use of those functions by
programs that need them, without breaking ABI compatibility for programs that
don't, and it allows those functions to be provided in the "official"
libjpeg-turbo binaries.
Those who are concerned about maintaining strict conformance with the libjpeg
v6b or v7 API can pass an argument of `--without-mem-srcdst` to `configure` or
an argument of `-DWITH_MEM_SRCDST=0` to `cmake` prior to building
libjpeg-turbo. This will restore the pre-1.3 behavior, in which
`jpeg_mem_src()` and `jpeg_mem_dest()` are only included when emulating the
libjpeg v8 API/ABI.
On Un*x systems, including the in-memory source/destination managers changes
the dynamic library version from 62.0.0 to 62.1.0 if using libjpeg v6b API/ABI
emulation and from 7.0.0 to 7.1.0 if using libjpeg v7 API/ABI emulation.
Note that, on most Un*x systems, the dynamic linker will not look for a
function in a library until that function is actually used. Thus, if a program
is built against libjpeg-turbo 1.3+ and uses `jpeg_mem_src()` or
`jpeg_mem_dest()`, that program will not fail if run against an older version
of libjpeg-turbo or against libjpeg v7- until the program actually tries to
call `jpeg_mem_src()` or `jpeg_mem_dest()`. Such is not the case on Windows.
If a program is built against the libjpeg-turbo 1.3+ DLL and uses
`jpeg_mem_src()` or `jpeg_mem_dest()`, then it must use the libjpeg-turbo 1.3+
DLL at run time.
Both cjpeg and djpeg have been extended to allow testing the in-memory
source/destination manager functions. See their respective man pages for more
details.
Mathematical Compatibility
==========================
For the most part, libjpeg-turbo should produce identical output to libjpeg
v6b. The one exception to this is when using the floating point DCT/IDCT, in
which case the outputs of libjpeg v6b and libjpeg-turbo can differ for the
following reasons:
- The SSE/SSE2 floating point DCT implementation in libjpeg-turbo is ever so
slightly more accurate than the implementation in libjpeg v6b, but not by
any amount perceptible to human vision (generally in the range of 0.01 to
0.08 dB gain in PNSR.)
- When not using the SIMD extensions, libjpeg-turbo uses the more accurate
(and slightly faster) floating point IDCT algorithm introduced in libjpeg
v8a as opposed to the algorithm used in libjpeg v6b. It should be noted,
however, that this algorithm basically brings the accuracy of the floating
point IDCT in line with the accuracy of the slow integer IDCT. The floating
point DCT/IDCT algorithms are mainly a legacy feature, and they do not
produce significantly more accuracy than the slow integer algorithms (to put
numbers on this, the typical difference in PNSR between the two algorithms
is less than 0.10 dB, whereas changing the quality level by 1 in the upper
range of the quality scale is typically more like a 1.0 dB difference.)
- If the floating point algorithms in libjpeg-turbo are not implemented using
SIMD instructions on a particular platform, then the accuracy of the
floating point DCT/IDCT can depend on the compiler settings.
While libjpeg-turbo does emulate the libjpeg v8 API/ABI, under the hood it is
still using the same algorithms as libjpeg v6b, so there are several specific
cases in which libjpeg-turbo cannot be expected to produce the same output as
libjpeg v8:
- When decompressing using scaling factors of 1/2 and 1/4, because libjpeg v8
implements those scaling algorithms differently than libjpeg v6b does, and
libjpeg-turbo's SIMD extensions are based on the libjpeg v6b behavior.
- When using chrominance subsampling, because libjpeg v8 implements this
with its DCT/IDCT scaling algorithms rather than with a separate
downsampling/upsampling algorithm. In our testing, the subsampled/upsampled
output of libjpeg v8 is less accurate than that of libjpeg v6b for this
reason.
- When decompressing using a scaling factor > 1 and merged (AKA "non-fancy" or
"non-smooth") chrominance upsampling, because libjpeg v8 does not support
merged upsampling with scaling factors > 1.
Performance Pitfalls
====================
Restart Markers
---------------
The optimized Huffman decoder in libjpeg-turbo does not handle restart markers
in a way that makes the rest of the libjpeg infrastructure happy, so it is
necessary to use the slow Huffman decoder when decompressing a JPEG image that
has restart markers. This can cause the decompression performance to drop by
as much as 20%, but the performance will still be much greater than that of
libjpeg. Many consumer packages, such as PhotoShop, use restart markers when
generating JPEG images, so images generated by those programs will experience
this issue.
Fast Integer Forward DCT at High Quality Levels
-----------------------------------------------
The algorithm used by the SIMD-accelerated quantization function cannot produce
correct results whenever the fast integer forward DCT is used along with a JPEG
quality of 98-100. Thus, libjpeg-turbo must use the non-SIMD quantization
function in those cases. This causes performance to drop by as much as 40%.
It is therefore strongly advised that you use the slow integer forward DCT
whenever encoding images with a JPEG quality of 98 or higher.
-254
View File
@@ -1,254 +0,0 @@
# AC_PROG_NASM
# --------------------------
# Check that NASM exists and determine flags
AC_DEFUN([AC_PROG_NASM],[
AC_ARG_VAR(NASM, [NASM command (used to build the x86/x86-64 SIMD code)])
if test "x$NASM" = "x"; then
AC_CHECK_PROGS(NASM, [nasm nasmw yasm])
test -z "$NASM" && AC_MSG_ERROR([no nasm (Netwide Assembler) found])
fi
AC_MSG_CHECKING([for object file format of host system])
case "$host_os" in
cygwin* | mingw* | pw32* | interix*)
case "$host_cpu" in
x86_64)
objfmt='Win64-COFF'
;;
*)
objfmt='Win32-COFF'
;;
esac
;;
msdosdjgpp* | go32*)
objfmt='COFF'
;;
os2-emx*) # not tested
objfmt='MSOMF' # obj
;;
linux*coff* | linux*oldld*)
objfmt='COFF' # ???
;;
linux*aout*)
objfmt='a.out'
;;
linux*)
case "$host_cpu" in
x86_64)
objfmt='ELF64'
;;
*)
objfmt='ELF'
;;
esac
;;
kfreebsd* | freebsd* | netbsd* | openbsd*)
if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
objfmt='BSD-a.out'
else
case "$host_cpu" in
x86_64 | amd64)
objfmt='ELF64'
;;
*)
objfmt='ELF'
;;
esac
fi
;;
solaris* | sunos* | sysv* | sco*)
case "$host_cpu" in
x86_64)
objfmt='ELF64'
;;
*)
objfmt='ELF'
;;
esac
;;
darwin* | rhapsody* | nextstep* | openstep* | macos*)
case "$host_cpu" in
x86_64)
objfmt='Mach-O64'
;;
*)
objfmt='Mach-O'
;;
esac
;;
*)
objfmt='ELF ?'
;;
esac
AC_MSG_RESULT([$objfmt])
if test "$objfmt" = 'ELF ?'; then
objfmt='ELF'
AC_MSG_WARN([unexpected host system. assumed that the format is $objfmt.])
fi
AC_MSG_CHECKING([for object file format specifier (NAFLAGS) ])
case "$objfmt" in
MSOMF) NAFLAGS='-fobj -DOBJ32';;
Win32-COFF) NAFLAGS='-fwin32 -DWIN32';;
Win64-COFF) NAFLAGS='-fwin64 -DWIN64 -D__x86_64__';;
COFF) NAFLAGS='-fcoff -DCOFF';;
a.out) NAFLAGS='-faout -DAOUT';;
BSD-a.out) NAFLAGS='-faoutb -DAOUT';;
ELF) NAFLAGS='-felf -DELF';;
ELF64) NAFLAGS='-felf64 -DELF -D__x86_64__';;
RDF) NAFLAGS='-frdf -DRDF';;
Mach-O) NAFLAGS='-fmacho -DMACHO';;
Mach-O64) NAFLAGS='-fmacho64 -DMACHO -D__x86_64__';;
esac
AC_MSG_RESULT([$NAFLAGS])
AC_SUBST([NAFLAGS])
AC_MSG_CHECKING([whether the assembler ($NASM $NAFLAGS) works])
cat > conftest.asm <<EOF
[%line __oline__ "configure"
section .text
global _main,main
_main:
main: xor eax,eax
ret
]EOF
try_nasm='$NASM $NAFLAGS -o conftest.o conftest.asm'
if AC_TRY_EVAL(try_nasm) && test -s conftest.o; then
AC_MSG_RESULT(yes)
else
echo "configure: failed program was:" >&AC_FD_CC
cat conftest.asm >&AC_FD_CC
rm -rf conftest*
AC_MSG_RESULT(no)
AC_MSG_ERROR([installation or configuration problem: assembler cannot create object files.])
fi
AC_MSG_CHECKING([whether the linker accepts assembler output])
try_nasm='${CC-cc} -o conftest${ac_exeext} $LDFLAGS conftest.o $LIBS 1>&AC_FD_CC'
if AC_TRY_EVAL(try_nasm) && test -s conftest${ac_exeext}; then
rm -rf conftest*
AC_MSG_RESULT(yes)
else
rm -rf conftest*
AC_MSG_RESULT(no)
AC_MSG_ERROR([configuration problem: maybe object file format mismatch.])
fi
])
# AC_CHECK_COMPATIBLE_ARM_ASSEMBLER_IFELSE
# --------------------------
# Test whether the assembler is suitable and supports NEON instructions
AC_DEFUN([AC_CHECK_COMPATIBLE_ARM_ASSEMBLER_IFELSE],[
ac_good_gnu_arm_assembler=no
ac_save_CC="$CC"
ac_save_CFLAGS="$CFLAGS"
CFLAGS="$CCASFLAGS -x assembler-with-cpp"
CC="$CCAS"
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
.text
.fpu neon
.arch armv7a
.object_arch armv4
.arm
pld [r0]
vmovn.u16 d0, q0]])], ac_good_gnu_arm_assembler=yes)
ac_use_gas_preprocessor=no
if test "x$ac_good_gnu_arm_assembler" = "xno" ; then
CC="gas-preprocessor.pl $CCAS"
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
.text
.fpu neon
.arch armv7a
.object_arch armv4
.arm
pld [r0]
vmovn.u16 d0, q0]])], ac_use_gas_preprocessor=yes)
fi
CFLAGS="$ac_save_CFLAGS"
CC="$ac_save_CC"
if test "x$ac_use_gas_preprocessor" = "xyes" ; then
CCAS="gas-preprocessor.pl $CCAS"
AC_SUBST([CCAS])
ac_good_gnu_arm_assembler=yes
fi
if test "x$ac_good_gnu_arm_assembler" = "xyes" ; then
$1
else
$2
fi
])
# AC_CHECK_COMPATIBLE_MIPSEL_ASSEMBLER_IFELSE
# --------------------------
# Test whether the assembler is suitable and supports MIPS instructions
AC_DEFUN([AC_CHECK_COMPATIBLE_MIPS_ASSEMBLER_IFELSE],[
have_mips_dspr2=no
ac_save_CFLAGS="$CFLAGS"
CFLAGS="$CCASFLAGS -mdspr2"
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
int main ()
{
int c = 0, a = 0, b = 0;
__asm__ __volatile__ (
"precr.qb.ph %[c], %[a], %[b] \n\t"
: [c] "=r" (c)
: [a] "r" (a), [b] "r" (b)
);
return c;
}
]])], have_mips_dspr2=yes)
CFLAGS=$ac_save_CFLAGS
if test "x$have_mips_dspr2" = "xyes" ; then
$1
else
$2
fi
])
AC_DEFUN([AC_CHECK_COMPATIBLE_ARM64_ASSEMBLER_IFELSE],[
ac_good_gnu_arm_assembler=no
ac_save_CC="$CC"
ac_save_CFLAGS="$CFLAGS"
CFLAGS="$CCASFLAGS -x assembler-with-cpp"
CC="$CCAS"
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
.text
MYVAR .req x0
movi v0.16b, #100
mov MYVAR, #100
.unreq MYVAR]])], ac_good_gnu_arm_assembler=yes)
ac_use_gas_preprocessor=no
if test "x$ac_good_gnu_arm_assembler" = "xno" ; then
CC="gas-preprocessor.pl $CCAS"
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
.text
MYVAR .req x0
movi v0.16b, #100
mov MYVAR, #100
.unreq MYVAR]])], ac_use_gas_preprocessor=yes)
fi
CFLAGS="$ac_save_CFLAGS"
CC="$ac_save_CC"
if test "x$ac_use_gas_preprocessor" = "xyes" ; then
CCAS="gas-preprocessor.pl $CCAS"
AC_SUBST([CCAS])
ac_good_gnu_arm_assembler=yes
fi
if test "x$ac_good_gnu_arm_assembler" = "xyes" ; then
$1
else
$2
fi
])
File diff suppressed because it is too large Load Diff
-270
View File
@@ -1,270 +0,0 @@
#! /bin/sh
# Wrapper for Microsoft lib.exe
me=ar-lib
scriptversion=2012-03-01.08; # UTC
# Copyright (C) 2010-2014 Free Software Foundation, Inc.
# Written by Peter Rosin <peda@lysator.liu.se>.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
# configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that program.
# This file is maintained in Automake, please report
# bugs to <bug-automake@gnu.org> or send patches to
# <automake-patches@gnu.org>.
# func_error message
func_error ()
{
echo "$me: $1" 1>&2
exit 1
}
file_conv=
# func_file_conv build_file
# Convert a $build file to $host form and store it in $file
# Currently only supports Windows hosts.
func_file_conv ()
{
file=$1
case $file in
/ | /[!/]*) # absolute file, and not a UNC file
if test -z "$file_conv"; then
# lazily determine how to convert abs files
case `uname -s` in
MINGW*)
file_conv=mingw
;;
CYGWIN*)
file_conv=cygwin
;;
*)
file_conv=wine
;;
esac
fi
case $file_conv in
mingw)
file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
;;
cygwin)
file=`cygpath -m "$file" || echo "$file"`
;;
wine)
file=`winepath -w "$file" || echo "$file"`
;;
esac
;;
esac
}
# func_at_file at_file operation archive
# Iterate over all members in AT_FILE performing OPERATION on ARCHIVE
# for each of them.
# When interpreting the content of the @FILE, do NOT use func_file_conv,
# since the user would need to supply preconverted file names to
# binutils ar, at least for MinGW.
func_at_file ()
{
operation=$2
archive=$3
at_file_contents=`cat "$1"`
eval set x "$at_file_contents"
shift
for member
do
$AR -NOLOGO $operation:"$member" "$archive" || exit $?
done
}
case $1 in
'')
func_error "no command. Try '$0 --help' for more information."
;;
-h | --h*)
cat <<EOF
Usage: $me [--help] [--version] PROGRAM ACTION ARCHIVE [MEMBER...]
Members may be specified in a file named with @FILE.
EOF
exit $?
;;
-v | --v*)
echo "$me, version $scriptversion"
exit $?
;;
esac
if test $# -lt 3; then
func_error "you must specify a program, an action and an archive"
fi
AR=$1
shift
while :
do
if test $# -lt 2; then
func_error "you must specify a program, an action and an archive"
fi
case $1 in
-lib | -LIB \
| -ltcg | -LTCG \
| -machine* | -MACHINE* \
| -subsystem* | -SUBSYSTEM* \
| -verbose | -VERBOSE \
| -wx* | -WX* )
AR="$AR $1"
shift
;;
*)
action=$1
shift
break
;;
esac
done
orig_archive=$1
shift
func_file_conv "$orig_archive"
archive=$file
# strip leading dash in $action
action=${action#-}
delete=
extract=
list=
quick=
replace=
index=
create=
while test -n "$action"
do
case $action in
d*) delete=yes ;;
x*) extract=yes ;;
t*) list=yes ;;
q*) quick=yes ;;
r*) replace=yes ;;
s*) index=yes ;;
S*) ;; # the index is always updated implicitly
c*) create=yes ;;
u*) ;; # TODO: don't ignore the update modifier
v*) ;; # TODO: don't ignore the verbose modifier
*)
func_error "unknown action specified"
;;
esac
action=${action#?}
done
case $delete$extract$list$quick$replace,$index in
yes,* | ,yes)
;;
yesyes*)
func_error "more than one action specified"
;;
*)
func_error "no action specified"
;;
esac
if test -n "$delete"; then
if test ! -f "$orig_archive"; then
func_error "archive not found"
fi
for member
do
case $1 in
@*)
func_at_file "${1#@}" -REMOVE "$archive"
;;
*)
func_file_conv "$1"
$AR -NOLOGO -REMOVE:"$file" "$archive" || exit $?
;;
esac
done
elif test -n "$extract"; then
if test ! -f "$orig_archive"; then
func_error "archive not found"
fi
if test $# -gt 0; then
for member
do
case $1 in
@*)
func_at_file "${1#@}" -EXTRACT "$archive"
;;
*)
func_file_conv "$1"
$AR -NOLOGO -EXTRACT:"$file" "$archive" || exit $?
;;
esac
done
else
$AR -NOLOGO -LIST "$archive" | sed -e 's/\\/\\\\/g' | while read member
do
$AR -NOLOGO -EXTRACT:"$member" "$archive" || exit $?
done
fi
elif test -n "$quick$replace"; then
if test ! -f "$orig_archive"; then
if test -z "$create"; then
echo "$me: creating $orig_archive"
fi
orig_archive=
else
orig_archive=$archive
fi
for member
do
case $1 in
@*)
func_file_conv "${1#@}"
set x "$@" "@$file"
;;
*)
func_file_conv "$1"
set x "$@" "$file"
;;
esac
shift
shift
done
if test -n "$orig_archive"; then
$AR -NOLOGO -OUT:"$archive" "$orig_archive" "$@" || exit $?
else
$AR -NOLOGO -OUT:"$archive" "$@" || exit $?
fi
elif test -n "$list"; then
if test ! -f "$orig_archive"; then
func_error "archive not found"
fi
$AR -NOLOGO -LIST "$archive" || exit $?
fi
@@ -1,861 +0,0 @@
1.5 beta1
=========
[1] Added full SIMD acceleration for PowerPC platforms using AltiVec VMX
(128-bit SIMD) instructions. Although the performance of libjpeg-turbo on
PowerPC was already good, due to the increased number of registers available
to the compiler vs. x86, it was still possible to speed up compression by about
3-4x and decompression by about 2-2.5x (relative to libjpeg v6b) through the
use of AltiVec instructions.
[2] Added two new libjpeg API functions (jpeg_skip_scanlines() and
jpeg_crop_scanline()) that can be used to partially decode a JPEG image. See
libjpeg.txt for more details.
[3] The TJCompressor and TJDecompressor classes in the TurboJPEG Java API now
implement the Closeable interface, so those classes can be used with a
try-with-resources statement.
[4] The TurboJPEG Java classes now throw unchecked idiomatic exceptions
(IllegalArgumentException, IllegalStateException) for unrecoverable errors
caused by incorrect API usage, and those classes throw a new checked exception
type (TJException) for errors that are passed through from the C library.
[5] Source buffers for the TurboJPEG C API functions, as well as the
jpeg_mem_src() function in the libjpeg API, are now declared as const pointers.
This facilitates passing read-only buffers to those functions and ensures the
caller that the source buffer will not be modified. This should not create any
backward API or ABI incompatibilities with prior libjpeg-turbo releases.
[6] The MIPS DSPr2 SIMD code can now be compiled to support either FR=0 or FR=1
FPUs.
[7] Fixed additional negative left shifts and other issues reported by the GCC
and Clang undefined behavior sanitizers. Most of these issues affected only
32-bit code, and none of them was known to pose a security threat, but removing
the warnings makes it easier to detect actual security issues, should they
arise in the future.
[8] Removed the unnecessary .arch directive from the ARM64 NEON SIMD code.
This directive was preventing the code from assembling using the clang
integrated assembler.
[9] Fixed a regression caused by 1.4.1[6] that prevented 32-bit and 64-bit
libjpeg-turbo RPMs from being installed simultaneously on recent Red Hat/Fedora
distributions. This was due to the addition of a macro in jconfig.h that
allows the Huffman codec to determine the word size at compile time. Since
that macro differs between 32-bit and 64-bit builds, this caused a conflict
between the i386 and x86_64 RPMs (any differing files, other than executables,
are not allowed when 32-bit and 64-bit RPMs are installed simultaneously.)
Since the macro is used only internally, it has been moved into jconfigint.h.
[10] The x86-64 SIMD code can now be disabled at run time by setting the
JSIMD_FORCENONE environment variable to 1 (the other SIMD implementations
already had this capability.)
[11] Added a new command-line argument to TJBench (-nowrite) that prevents the
benchmark from outputting any images. This removes any potential operating
system overhead that might be caused by lazy writes to disk and thus improves
the consistency of the performance measurements.
[12] Added SIMD acceleration for Huffman encoding on SSE2-capable x86 and
x86-64 platforms. This speeds up the compression of full-color JPEGs by about
10-15% on average (relative to libjpeg-turbo 1.4.x) when using modern Intel and
AMD CPUs. Additionally, this works around an issue in the clang optimizer that
prevents it (as of this writing) from achieving the same performance as GCC
when compiling the C version of the Huffman encoder
(https://llvm.org/bugs/show_bug.cgi?id=16035). For the purposes of benchmarking
or regression testing, SIMD-accelerated Huffman encoding can be disabled by
setting the JSIMD_NOHUFFENC environment variable to 1.
[13] Added ARM 64-bit (ARMv8) NEON SIMD implementations of the commonly-used
compression algorithms (including the slow integer forward DCT and h2v2 & h2v1
downsampling algorithms, which are not accelerated in the 32-bit NEON
implementation.) This speeds up the compression of full-color JPEGs by about
75% on average on a Cavium ThunderX processor and by about 2-2.5x on average on
Cortex-A53 and Cortex-A57 cores.
[14] Added SIMD acceleration for Huffman encoding on NEON-capable ARM 32-bit
and 64-bit platforms.
For 32-bit code, this speeds up the compression of full-color JPEGs by about
30% on average on a typical iOS device (iPhone 4S, Cortex-A9) and by about 6-7%
on average on a typical Android device (Nexus 5X, Cortex-A53 and Cortex-A57),
relative to libjpeg-turbo 1.4.x. Note that the larger speedup under iOS is due
to the fact that iOS builds use LLVM, which does not optimize the C Huffman
encoder as well as GCC does.
For 64-bit code, NEON-accelerated Huffman encoding speeds up the compression of
full-color JPEGs by about 40% on average on a typical iOS device (iPhone 5S,
Apple A7) and by about 7-8% on average on a typical Android device (Nexus 5X,
Cortex-A53 and Cortex-A57), in addition to the speedup described in [13] above.
For the purposes of benchmarking or regression testing, SIMD-accelerated
Huffman encoding can be disabled by setting the JSIMD_NOHUFFENC environment
variable to 1.
[15] pkg-config (.pc) scripts are now included for both the libjpeg and
TurboJPEG API libraries on Un*x systems. Note that if a project's build system
relies on these scripts, then it will not be possible to build that project
with libjpeg or with a prior version of libjpeg-turbo.
[16] Optimized the ARM 64-bit (ARMv8) NEON SIMD decompression routines to
improve performance on CPUs with in-order pipelines. This speeds up the
decompression of full-color JPEGs by nearly 2x on average on a Cavium ThunderX
processor and by about 15% on average on a Cortex-A53 core.
[17] Fixed an issue in the accelerated Huffman decoder that could have caused
the decoder to read past the end of the input buffer when a malformed,
specially-crafted JPEG image was being decompressed. In prior versions of
libjpeg-turbo, the accelerated Huffman decoder was invoked (in most cases) only
if there were > 128 bytes of data in the input buffer. However, it is possible
to construct a JPEG image in which a single Huffman block is over 430 bytes
long, so this version of libjpeg-turbo activates the accelerated Huffman
decoder only if there are > 512 bytes of data in the input buffer.
[18] Fixed a memory leak in tjunittest encountered when running the program
with the -yuv option.
1.4.2
=====
[1] Fixed an issue whereby cjpeg would segfault if a Windows bitmap with a
negative width or height was used as an input image (Windows bitmaps can have
a negative height if they are stored in top-down order, but such files are
rare and not supported by libjpeg-turbo.)
[2] Fixed an issue whereby, under certain circumstances, libjpeg-turbo would
incorrectly encode certain JPEG images when quality=100 and the fast integer
forward DCT were used. This was known to cause 'make test' to fail when the
library was built with '-march=haswell' on x86 systems.
[3] Fixed an issue whereby libjpeg-turbo would crash when built with the latest
& greatest development version of the Clang/LLVM compiler. This was caused by
an x86-64 ABI conformance issue in some of libjpeg-turbo's 64-bit SSE2 SIMD
routines. Those routines were incorrectly using a 64-bit mov instruction to
transfer a 32-bit JDIMENSION argument, whereas the x86-64 ABI allows the upper
(unused) 32 bits of a 32-bit argument's register to be undefined. The new
Clang/LLVM optimizer uses load combining to transfer multiple adjacent 32-bit
structure members into a single 64-bit register, and this exposed the ABI
conformance issue.
[4] Fixed a bug in the MIPS DSPr2 4:2:0 "plain" (non-fancy and non-merged)
upsampling routine that caused a buffer overflow (and subsequent segfault) when
decompressing a 4:2:0 JPEG image whose scaled output width was less than 16
pixels. The "plain" upsampling routines are normally only used when
decompressing a non-YCbCr JPEG image, but they are also used when decompressing
a JPEG image whose scaled output height is 1.
[5] Fixed various negative left shifts and other issues reported by the GCC and
Clang undefined behavior sanitizers. None of these was known to pose a
security threat, but removing the warnings makes it easier to detect actual
security issues, should they arise in the future.
1.4.1
=====
[1] tjbench now properly handles CMYK/YCCK JPEG files. Passing an argument of
-cmyk (instead of, for instance, -rgb) will cause tjbench to internally convert
the source bitmap to CMYK prior to compression, to generate YCCK JPEG files,
and to internally convert the decompressed CMYK pixels back to RGB after
decompression (the latter is done automatically if a CMYK or YCCK JPEG is
passed to tjbench as a source image.) The CMYK<->RGB conversion operation is
not benchmarked. NOTE: The quick & dirty CMYK<->RGB conversions that tjbench
uses are suitable for testing only. Proper conversion between CMYK and RGB
requires a color management system.
[2] 'make test' now performs additional bitwise regression tests using tjbench,
mainly for the purpose of testing compression from/decompression to a subregion
of a larger image buffer.
[3] 'make test' no longer tests the regression of the floating point DCT/IDCT
by default, since the results of those tests can vary if the algorithms in
question are not implemented using SIMD instructions on a particular platform.
See the comments in Makefile.am for information on how to re-enable the tests
and to specify an expected result for them based on the particulars of your
platform.
[4] The NULL color conversion routines have been significantly optimized,
which speeds up the compression of RGB and CMYK JPEGs by 5-20% when using
64-bit code and 0-3% when using 32-bit code, and the decompression of those
images by 10-30% when using 64-bit code and 3-12% when using 32-bit code.
[5] Fixed an "illegal instruction" error that occurred when djpeg from a
SIMD-enabled libjpeg-turbo MIPS build was executed with the -nosmooth option on
a MIPS machine that lacked DSPr2 support. The MIPS SIMD routines for h2v1 and
h2v2 merged upsampling were not properly checking for the existence of DSPr2.
[6] Performance has been improved significantly on 64-bit non-Linux and
non-Windows platforms (generally 10-20% faster compression and 5-10% faster
decompression.) Due to an oversight, the 64-bit version of the accelerated
Huffman codec was not being compiled in when libjpeg-turbo was built on
platforms other than Windows or Linux. Oops.
[7] Fixed an extremely rare bug in the Huffman encoder that caused 64-bit
builds of libjpeg-turbo to incorrectly encode a few specific test images when
quality=98, an optimized Huffman table, and the slow integer forward DCT were
used.
[8] The Windows (CMake) build system now supports building only static or only
shared libraries. This is accomplished by adding either -DENABLE_STATIC=0 or
-DENABLE_SHARED=0 to the CMake command line.
[9] TurboJPEG API functions will now return an error code if a warning is
triggered in the underlying libjpeg API. For instance, if a JPEG file is
corrupt, the TurboJPEG decompression functions will attempt to decompress
as much of the image as possible, but those functions will now return -1 to
indicate that the decompression was not entirely successful.
[10] Fixed a bug in the MIPS DSPr2 4:2:2 fancy upsampling routine that caused a
buffer overflow (and subsequent segfault) when decompressing a 4:2:2 JPEG image
in which the right-most MCU was 5 or 6 pixels wide.
1.4.0
=====
[1] Fixed a build issue on OS X PowerPC platforms (md5cmp failed to build
because OS X does not provide the le32toh() and htole32() functions.)
[2] The non-SIMD RGB565 color conversion code did not work correctly on big
endian machines. This has been fixed.
[3] Fixed an issue in tjPlaneSizeYUV() whereby it would erroneously return 1
instead of -1 if componentID was > 0 and subsamp was TJSAMP_GRAY.
[3] Fixed an issue in tjBufSizeYUV2() whereby it would erroneously return 0
instead of -1 if width was < 1.
[5] The Huffman encoder now uses clz and bsr instructions for bit counting on
ARM64 platforms (see 1.4 beta1 [5].)
[6] The close() method in the TJCompressor and TJDecompressor Java classes is
now idempotent. Previously, that method would call the native tjDestroy()
function even if the TurboJPEG instance had already been destroyed. This
caused an exception to be thrown during finalization, if the close() method had
already been called. The exception was caught, but it was still an expensive
operation.
[7] The TurboJPEG API previously generated an error ("Could not determine
subsampling type for JPEG image") when attempting to decompress grayscale JPEG
images that were compressed with a sampling factor other than 1 (for instance,
with 'cjpeg -grayscale -sample 2x2'). Subsampling technically has no meaning
with grayscale JPEGs, and thus the horizontal and vertical sampling factors
for such images are ignored by the decompressor. However, the TurboJPEG API
was being too rigid and was expecting the sampling factors to be equal to 1
before it treated the image as a grayscale JPEG.
[8] cjpeg, djpeg, and jpegtran now accept an argument of -version, which will
print the library version and exit.
[9] Referring to 1.4 beta1 [15], another extremely rare circumstance was
discovered under which the Huffman encoder's local buffer can be overrun
when a buffered destination manager is being used and an
extremely-high-frequency block (basically junk image data) is being encoded.
Even though the Huffman local buffer was increased from 128 bytes to 136 bytes
to address the previous issue, the new issue caused even the larger buffer to
be overrun. Further analysis reveals that, in the absolute worst case (such as
setting alternating AC coefficients to 32767 and -32768 in the JPEG scanning
order), the Huffman encoder can produce encoded blocks that approach double the
size of the unencoded blocks. Thus, the Huffman local buffer was increased to
256 bytes, which should prevent any such issue from re-occurring in the future.
[10] The new tjPlaneSizeYUV(), tjPlaneWidth(), and tjPlaneHeight() functions
were not actually usable on any platform except OS X and Windows, because
those functions were not included in the libturbojpeg mapfile. This has been
fixed.
[11] Restored the JPP(), JMETHOD(), and FAR macros in the libjpeg-turbo header
files. The JPP() and JMETHOD() macros were originally implemented in libjpeg
as a way of supporting non-ANSI compilers that lacked support for prototype
parameters. libjpeg-turbo has never supported such compilers, but some
software packages still use the macros to define their own prototypes.
Similarly, libjpeg-turbo has never supported MS-DOS and other platforms that
have far symbols, but some software packages still use the FAR macro. A pretty
good argument can be made that this is a bad practice on the part of the
software in question, but since this affects more than one package, it's just
easier to fix it here.
[12] Fixed issues that were preventing the ARM 64-bit SIMD code from compiling
for iOS, and included an ARMv8 architecture in all of the binaries installed by
the "official" libjpeg-turbo SDK for OS X.
1.3.90 (1.4 beta1)
==================
[1] New features in the TurboJPEG API:
-- YUV planar images can now be generated with an arbitrary line padding
(previously only 4-byte padding, which was compatible with X Video, was
supported.)
-- The decompress-to-YUV function has been extended to support image scaling.
-- JPEG images can now be compressed from YUV planar source images.
-- YUV planar images can now be decoded into RGB or grayscale images.
-- 4:1:1 subsampling is now supported. This is mainly included for
compatibility, since 4:1:1 is not fully accelerated in libjpeg-turbo and has no
significant advantages relative to 4:2:0.
-- CMYK images are now supported. This feature allows CMYK source images to be
compressed to YCCK JPEGs and YCCK or CMYK JPEGs to be decompressed to CMYK
destination images. Conversion between CMYK/YCCK and RGB or YUV images is not
supported. Such conversion requires a color management system and is thus out
of scope for a codec library.
-- The handling of YUV images in the Java API has been significantly refactored
and should now be much more intuitive.
-- The Java API now supports encoding a YUV image from an arbitrary position in
a large image buffer.
-- All of the YUV functions now have a corresponding function that operates on
separate image planes instead of a unified image buffer. This allows for
compressing/decoding from or decompressing/encoding to a subregion of a larger
YUV image. It also allows for handling YUV formats that swap the order of the
U and V planes.
[2] Added SIMD acceleration for DSPr2-capable MIPS platforms. This speeds up
the compression of full-color JPEGs by 70-80% on such platforms and
decompression by 25-35%.
[3] If an application attempts to decompress a Huffman-coded JPEG image whose
header does not contain Huffman tables, libjpeg-turbo will now insert the
default Huffman tables. In order to save space, many motion JPEG video frames
are encoded without the default Huffman tables, so these frames can now be
successfully decompressed by libjpeg-turbo without additional work on the part
of the application. An application can still override the Huffman tables, for
instance to re-use tables from a previous frame of the same video.
[4] The Mac packaging system now uses pkgbuild and productbuild rather than
PackageMaker (which is obsolete and no longer supported.) This means that
OS X 10.6 "Snow Leopard" or later must be used when packaging libjpeg-turbo,
although the packages produced can be installed on OS X 10.5 "Leopard" or
later. OS X 10.4 "Tiger" is no longer supported.
[5] The Huffman encoder now uses clz and bsr instructions for bit counting on
ARM platforms rather than a lookup table. This reduces the memory footprint
by 64k, which may be important for some mobile applications. Out of four
Android devices that were tested, two demonstrated a small overall performance
loss (~3-4% on average) with ARMv6 code and a small gain (also ~3-4%) with
ARMv7 code when enabling this new feature, but the other two devices
demonstrated a significant overall performance gain with both ARMv6 and ARMv7
code (~10-20%) when enabling the feature. Actual mileage may vary.
[6] Worked around an issue with Visual C++ 2010 and later that caused incorrect
pixels to be generated when decompressing a JPEG image to a 256-color bitmap,
if compiler optimization was enabled when libjpeg-turbo was built. This caused
the regression tests to fail when doing a release build under Visual C++ 2010
and later.
[7] Improved the accuracy and performance of the non-SIMD implementation of the
floating point inverse DCT (using code borrowed from libjpeg v8a and later.)
The accuracy of this implementation now matches the accuracy of the SSE/SSE2
implementation. Note, however, that the floating point DCT/IDCT algorithms are
mainly a legacy feature. They generally do not produce significantly better
accuracy than the slow integer DCT/IDCT algorithms, and they are quite a bit
slower.
[8] Added a new output colorspace (JCS_RGB565) to the libjpeg API that allows
for decompressing JPEG images into RGB565 (16-bit) pixels. If dithering is not
used, then this code path is SIMD-accelerated on ARM platforms.
[9] Numerous obsolete features, such as support for non-ANSI compilers and
support for the MS-DOS memory model, were removed from the libjpeg code,
greatly improving its readability and making it easier to maintain and extend.
[10] Fixed a segfault that occurred when calling output_message() with msg_code
set to JMSG_COPYRIGHT.
[11] Fixed an issue whereby wrjpgcom was allowing comments longer than 65k
characters to be passed on the command line, which was causing it to generate
incorrect JPEG files.
[12] Fixed a bug in the build system that was causing the Windows version of
wrjpgcom to be built using the rdjpgcom source code.
[13] Restored 12-bit-per-component JPEG support. A 12-bit version of
libjpeg-turbo can now be built by passing an argument of --with-12bit to
configure (Unix) or -DWITH_12BIT=1 to cmake (Windows.) 12-bit JPEG support is
included only for convenience. Enabling this feature disables all of the
performance features in libjpeg-turbo, as well as arithmetic coding and the
TurboJPEG API. The resulting library still contains the other libjpeg-turbo
features (such as the colorspace extensions), but in general, it performs no
faster than libjpeg v6b.
[14] Added ARM 64-bit SIMD acceleration for the YCC-to-RGB color conversion
and IDCT algorithms (both are used during JPEG decompression.) For unknown
reasons (probably related to clang), this code cannot currently be compiled for
iOS.
[15] Fixed an extremely rare bug that could cause the Huffman encoder's local
buffer to overrun when a very high-frequency MCU is compressed using quality
100 and no subsampling, and when the JPEG output buffer is being dynamically
resized by the destination manager. This issue was so rare that, even with a
test program specifically designed to make the bug occur (by injecting random
high-frequency YUV data into the compressor), it was reproducible only once in
about every 25 million iterations.
[16] Fixed an oversight in the TurboJPEG C wrapper: if any of the JPEG
compression functions was called repeatedly with the same
automatically-allocated destination buffer, then TurboJPEG would erroneously
assume that the jpegSize parameter was equal to the size of the buffer, when in
fact that parameter was probably equal to the size of the most recently
compressed JPEG image. If the size of the previous JPEG image was not as large
as the current JPEG image, then TurboJPEG would unnecessarily reallocate the
destination buffer.
1.3.1
=====
[1] On Un*x systems, 'make install' now installs the libjpeg-turbo libraries
into /opt/libjpeg-turbo/lib32 by default on any 32-bit system, not just x86,
and into /opt/libjpeg-turbo/lib64 by default on any 64-bit system, not just
x86-64. You can override this by overriding either the 'prefix' or 'libdir'
configure variables.
[2] The Windows installer now places a copy of the TurboJPEG DLLs in the same
directory as the rest of the libjpeg-turbo binaries. This was mainly done
to support TurboVNC 1.3, which bundles the DLLs in its Windows installation.
When using a 32-bit version of CMake on 64-bit Windows, it is impossible to
access the c:\WINDOWS\system32 directory, which made it impossible for the
TurboVNC build scripts to bundle the 64-bit TurboJPEG DLL.
[3] Fixed a bug whereby attempting to encode a progressive JPEG with arithmetic
entropy coding (by passing arguments of -progressive -arithmetic to cjpeg or
jpegtran, for instance) would result in an error, "Requested feature was
omitted at compile time".
[4] Fixed a couple of issues whereby malformed JPEG images would cause
libjpeg-turbo to use uninitialized memory during decompression.
[5] Fixed an error ("Buffer passed to JPEG library is too small") that occurred
when calling the TurboJPEG YUV encoding function with a very small (< 5x5)
source image, and added a unit test to check for this error.
[6] The Java classes should now build properly under Visual Studio 2010 and
later.
[7] Fixed an issue that prevented SRPMs generated using the in-tree packaging
tools from being rebuilt on certain newer Linux distributions.
[8] Numerous minor fixes to eliminate compilation and build/packaging system
warnings, fix cosmetic issues, improve documentation clarity, and other general
source cleanup.
1.3.0
=====
[1] 'make test' now works properly on FreeBSD, and it no longer requires the
md5sum executable to be present on other Un*x platforms.
[2] Overhauled the packaging system:
-- To avoid conflict with vendor-supplied libjpeg-turbo packages, the
official RPMs and DEBs for libjpeg-turbo have been renamed to
"libjpeg-turbo-official".
-- The TurboJPEG libraries are now located under /opt/libjpeg-turbo in the
official Linux and Mac packages, to avoid conflict with vendor-supplied
packages and also to streamline the packaging system.
-- Release packages are now created with the directory structure defined
by the configure variables "prefix", "bindir", "libdir", etc. (Un*x) or by the
CMAKE_INSTALL_PREFIX variable (Windows.) The exception is that the docs are
always located under the system default documentation directory on Un*x and Mac
systems, and on Windows, the TurboJPEG DLL is always located in the Windows
system directory.
-- To avoid confusion, official libjpeg-turbo packages on Linux/Unix platforms
(except for Mac) will always install the 32-bit libraries in
/opt/libjpeg-turbo/lib32 and the 64-bit libraries in /opt/libjpeg-turbo/lib64.
-- Fixed an issue whereby, in some cases, the libjpeg-turbo executables on Un*x
systems were not properly linking with the shared libraries installed by the
same package.
-- Fixed an issue whereby building the "installer" target on Windows when
WITH_JAVA=1 would fail if the TurboJPEG JAR had not been previously built.
-- Building the "install" target on Windows now installs files into the same
places that the installer does.
[3] Fixed a Huffman encoder bug that prevented I/O suspension from working
properly.
1.2.90 (1.3 beta1)
==================
[1] Added support for additional scaling factors (3/8, 5/8, 3/4, 7/8, 9/8, 5/4,
11/8, 3/2, 13/8, 7/4, 15/8, and 2) when decompressing. Note that the IDCT will
not be SIMD-accelerated when using any of these new scaling factors.
[2] The TurboJPEG dynamic library is now versioned. It was not strictly
necessary to do so, because TurboJPEG uses versioned symbols, and if a function
changes in an ABI-incompatible way, that function is renamed and a legacy
function is provided to maintain backward compatibility. However, certain
Linux distro maintainers have a policy against accepting any library that isn't
versioned.
[3] Extended the TurboJPEG Java API so that it can be used to compress a JPEG
image from and decompress a JPEG image to an arbitrary position in a large
image buffer.
[4] The tjDecompressToYUV() function now supports the TJFLAG_FASTDCT flag.
[5] The 32-bit supplementary package for amd64 Debian systems now provides
symlinks in /usr/lib/i386-linux-gnu for the TurboJPEG libraries in /usr/lib32.
This allows those libraries to be used on MultiArch-compatible systems (such as
Ubuntu 11 and later) without setting the linker path.
[6] The TurboJPEG Java wrapper should now find the JNI library on Mac systems
without having to pass -Djava.library.path=/usr/lib to java.
[7] TJBench has been ported to Java to provide a convenient way of validating
the performance of the TurboJPEG Java API. It can be run with
'java -cp turbojpeg.jar TJBench'.
[8] cjpeg can now be used to generate JPEG files with the RGB colorspace
(feature ported from jpeg-8d.)
[9] The width and height in the -crop argument passed to jpegtran can now be
suffixed with "f" to indicate that, when the upper left corner of the cropping
region is automatically moved to the nearest iMCU boundary, the bottom right
corner should be moved by the same amount. In other words, this feature causes
jpegtran to strictly honor the specified width/height rather than the specified
bottom right corner (feature ported from jpeg-8d.)
[10] JPEG files using the RGB colorspace can now be decompressed into grayscale
images (feature ported from jpeg-8d.)
[11] Fixed a regression caused by 1.2.1[7] whereby the build would fail with
multiple "Mismatch in operand sizes" errors when attempting to build the x86
SIMD code with NASM 0.98.
[12] The in-memory source/destination managers (jpeg_mem_src() and
jpeg_mem_dest()) are now included by default when building libjpeg-turbo with
libjpeg v6b or v7 emulation, so that programs can take advantage of these
functions without requiring the use of the backward-incompatible libjpeg v8
ABI. The "age number" of the libjpeg-turbo library on Un*x systems has been
incremented by 1 to reflect this. You can disable this feature with a
configure/CMake switch in order to retain strict API/ABI compatibility with the
libjpeg v6b or v7 API/ABI (or with previous versions of libjpeg-turbo.) See
README.md for more details.
[13] Added ARMv7s architecture to libjpeg.a and libturbojpeg.a in the official
libjpeg-turbo binary package for OS X, so that those libraries can be used to
build applications that leverage the faster CPUs in the iPhone 5 and iPad 4.
1.2.1
=====
[1] Creating or decoding a JPEG file that uses the RGB colorspace should now
properly work when the input or output colorspace is one of the libjpeg-turbo
colorspace extensions.
[2] When libjpeg-turbo was built without SIMD support and merged (non-fancy)
upsampling was used along with an alpha-enabled colorspace during
decompression, the unused byte of the decompressed pixels was not being set to
0xFF. This has been fixed. TJUnitTest has also been extended to test for the
correct behavior of the colorspace extensions when merged upsampling is used.
[3] Fixed a bug whereby the libjpeg-turbo SSE2 SIMD code would not preserve the
upper 64 bits of xmm6 and xmm7 on Win64 platforms, which violated the Win64
calling conventions.
[4] Fixed a regression caused by 1.2.0[6] whereby decompressing corrupt JPEG
images (specifically, images in which the component count was erroneously set
to a large value) would cause libjpeg-turbo to segfault.
[5] Worked around a severe performance issue with "Bobcat" (AMD Embedded APU)
processors. The MASKMOVDQU instruction, which was used by the libjpeg-turbo
SSE2 SIMD code, is apparently implemented in microcode on AMD processors, and
it is painfully slow on Bobcat processors in particular. Eliminating the use
of this instruction improved performance by an order of magnitude on Bobcat
processors and by a small amount (typically 5%) on AMD desktop processors.
[6] Added SIMD acceleration for performing 4:2:2 upsampling on NEON-capable ARM
platforms. This speeds up the decompression of 4:2:2 JPEGs by 20-25% on such
platforms.
[7] Fixed a regression caused by 1.2.0[2] whereby, on Linux/x86 platforms
running the 32-bit SSE2 SIMD code in libjpeg-turbo, decompressing a 4:2:0 or
4:2:2 JPEG image into a 32-bit (RGBX, BGRX, etc.) buffer without using fancy
upsampling would produce several incorrect columns of pixels at the right-hand
side of the output image if each row in the output image was not evenly
divisible by 16 bytes.
[8] Fixed an issue whereby attempting to build the SIMD extensions with Xcode
4.3 on OS X platforms would cause NASM to return numerous errors of the form
"'%define' expects a macro identifier".
[9] Added flags to the TurboJPEG API that allow the caller to force the use of
either the fast or the accurate DCT/IDCT algorithms in the underlying codec.
1.2.0
=====
[1] Fixed build issue with YASM on Unix systems (the libjpeg-turbo build system
was not adding the current directory to the assembler include path, so YASM
was not able to find jsimdcfg.inc.)
[2] Fixed out-of-bounds read in SSE2 SIMD code that occurred when decompressing
a JPEG image to a bitmap buffer whose size was not a multiple of 16 bytes.
This was more of an annoyance than an actual bug, since it did not cause any
actual run-time problems, but the issue showed up when running libjpeg-turbo in
valgrind. See http://crbug.com/72399 for more information.
[3] Added a compile-time macro (LIBJPEG_TURBO_VERSION) that can be used to
check the version of libjpeg-turbo against which an application was compiled.
[4] Added new RGBA/BGRA/ABGR/ARGB colorspace extension constants (libjpeg API)
and pixel formats (TurboJPEG API), which allow applications to specify that,
when decompressing to a 4-component RGB buffer, the unused byte should be set
to 0xFF so that it can be interpreted as an opaque alpha channel.
[5] Fixed regression issue whereby DevIL failed to build against libjpeg-turbo
because libjpeg-turbo's distributed version of jconfig.h contained an INLINE
macro, which conflicted with a similar macro in DevIL. This macro is used only
internally when building libjpeg-turbo, so it was moved into config.h.
[6] libjpeg-turbo will now correctly decompress erroneous CMYK/YCCK JPEGs whose
K component is assigned a component ID of 1 instead of 4. Although these files
are in violation of the spec, other JPEG implementations handle them
correctly.
[7] Added ARMv6 and ARMv7 architectures to libjpeg.a and libturbojpeg.a in
the official libjpeg-turbo binary package for OS X, so that those libraries can
be used to build both OS X and iOS applications.
1.1.90 (1.2 beta1)
==================
[1] Added a Java wrapper for the TurboJPEG API. See java/README for more
details.
[2] The TurboJPEG API can now be used to scale down images during
decompression.
[3] Added SIMD routines for RGB-to-grayscale color conversion, which
significantly improves the performance of grayscale JPEG compression from an
RGB source image.
[4] Improved the performance of the C color conversion routines, which are used
on platforms for which SIMD acceleration is not available.
[5] Added a function to the TurboJPEG API that performs lossless transforms.
This function is implemented using the same back end as jpegtran, but it
performs transcoding entirely in memory and allows multiple transforms and/or
crop operations to be batched together, so the source coefficients only need to
be read once. This is useful when generating image tiles from a single source
JPEG.
[6] Added tests for the new TurboJPEG scaled decompression and lossless
transform features to tjbench (the TurboJPEG benchmark, formerly called
"jpgtest".)
[7] Added support for 4:4:0 (transposed 4:2:2) subsampling in TurboJPEG, which
was necessary in order for it to read 4:2:2 JPEG files that had been losslessly
transposed or rotated 90 degrees.
[8] All legacy VirtualGL code has been re-factored, and this has allowed
libjpeg-turbo, in its entirety, to be re-licensed under a BSD-style license.
[9] libjpeg-turbo can now be built with YASM.
[10] Added SIMD acceleration for ARM Linux and iOS platforms that support
NEON instructions.
[11] Refactored the TurboJPEG C API and documented it using Doxygen. The
TurboJPEG 1.2 API uses pixel formats to define the size and component order of
the uncompressed source/destination images, and it includes a more efficient
version of TJBUFSIZE() that computes a worst-case JPEG size based on the level
of chrominance subsampling. The refactored implementation of the TurboJPEG API
now uses the libjpeg memory source and destination managers, which allows the
TurboJPEG compressor to grow the JPEG buffer as necessary.
[12] Eliminated errors in the output of jpegtran on Windows that occurred when
the application was invoked using I/O redirection
(jpegtran <input.jpg >output.jpg).
[13] The inclusion of libjpeg v7 and v8 emulation as well as arithmetic coding
support in libjpeg-turbo v1.1.0 introduced several new error constants in
jerror.h, and these were mistakenly enabled for all emulation modes, causing
the error enum in libjpeg-turbo to sometimes have different values than the
same enum in libjpeg. This represents an ABI incompatibility, and it caused
problems with rare applications that took specific action based on a particular
error value. The fix was to include the new error constants conditionally
based on whether libjpeg v7 or v8 emulation was enabled.
[14] Fixed an issue whereby Windows applications that used libjpeg-turbo would
fail to compile if the Windows system headers were included before jpeglib.h.
This issue was caused by a conflict in the definition of the INT32 type.
[15] Fixed 32-bit supplementary package for amd64 Debian systems, which was
broken by enhancements to the packaging system in 1.1.
[16] When decompressing a JPEG image using an output colorspace of
JCS_EXT_RGBX, JCS_EXT_BGRX, JCS_EXT_XBGR, or JCS_EXT_XRGB, libjpeg-turbo will
now set the unused byte to 0xFF, which allows applications to interpret that
byte as an alpha channel (0xFF = opaque).
1.1.1
=====
[1] Fixed a 1-pixel error in row 0, column 21 of the luminance plane generated
by tjEncodeYUV().
[2] libjpeg-turbo's accelerated Huffman decoder previously ignored unexpected
markers found in the middle of the JPEG data stream during decompression. It
will now hand off decoding of a particular block to the unaccelerated Huffman
decoder if an unexpected marker is found, so that the unaccelerated Huffman
decoder can generate an appropriate warning.
[3] Older versions of MinGW64 prefixed symbol names with underscores by
default, which differed from the behavior of 64-bit Visual C++. MinGW64 1.0
has adopted the behavior of 64-bit Visual C++ as the default, so to accommodate
this, the libjpeg-turbo SIMD function names are no longer prefixed with an
underscore when building with MinGW64. This means that, when building
libjpeg-turbo with older versions of MinGW64, you will now have to add
-fno-leading-underscore to the CFLAGS.
[4] Fixed a regression bug in the NSIS script that caused the Windows installer
build to fail when using the Visual Studio IDE.
[5] Fixed a bug in jpeg_read_coefficients() whereby it would not initialize
cinfo->image_width and cinfo->image_height if libjpeg v7 or v8 emulation was
enabled. This specifically caused the jpegoptim program to fail if it was
linked against a version of libjpeg-turbo that was built with libjpeg v7 or v8
emulation.
[6] Eliminated excessive I/O overhead that occurred when reading BMP files in
cjpeg.
[7] Eliminated errors in the output of cjpeg on Windows that occurred when the
application was invoked using I/O redirection (cjpeg <inputfile >output.jpg).
1.1.0
=====
[1] The algorithm used by the SIMD quantization function cannot produce correct
results when the JPEG quality is >= 98 and the fast integer forward DCT is
used. Thus, the non-SIMD quantization function is now used for those cases,
and libjpeg-turbo should now produce identical output to libjpeg v6b in all
cases.
[2] Despite the above, the fast integer forward DCT still degrades somewhat for
JPEG qualities greater than 95, so the TurboJPEG wrapper will now automatically
use the slow integer forward DCT when generating JPEG images of quality 96 or
greater. This reduces compression performance by as much as 15% for these
high-quality images but is necessary to ensure that the images are perceptually
lossless. It also ensures that the library can avoid the performance pitfall
created by [1].
[3] Ported jpgtest.cxx to pure C to avoid the need for a C++ compiler.
[4] Fixed visual artifacts in grayscale JPEG compression caused by a typo in
the RGB-to-luminance lookup tables.
[5] The Windows distribution packages now include the libjpeg run-time programs
(cjpeg, etc.)
[6] All packages now include jpgtest.
[7] The TurboJPEG dynamic library now uses versioned symbols.
[8] Added two new TurboJPEG API functions, tjEncodeYUV() and
tjDecompressToYUV(), to replace the somewhat hackish TJ_YUV flag.
1.0.90 (1.1 beta1)
==================
[1] Added emulation of the libjpeg v7 and v8 APIs and ABIs. See
README.md for more details. This feature was sponsored by CamTrace SAS.
[2] Created a new CMake-based build system for the Visual C++ and MinGW builds.
[3] Grayscale bitmaps can now be compressed from/decompressed to using the
TurboJPEG API.
[4] jpgtest can now be used to test decompression performance with existing
JPEG images.
[5] If the default install prefix (/opt/libjpeg-turbo) is used, then
'make install' now creates /opt/libjpeg-turbo/lib32 and
/opt/libjpeg-turbo/lib64 sym links to duplicate the behavior of the binary
packages.
[6] All symbols in the libjpeg-turbo dynamic library are now versioned, even
when the library is built with libjpeg v6b emulation.
[7] Added arithmetic encoding and decoding support (can be disabled with
configure or CMake options)
[8] Added a TJ_YUV flag to the TurboJPEG API, which causes both the compressor
and decompressor to output planar YUV images.
[9] Added an extended version of tjDecompressHeader() to the TurboJPEG API,
which allows the caller to determine the type of subsampling used in a JPEG
image.
[10] Added further protections against invalid Huffman codes.
1.0.1
=====
[1] The Huffman decoder will now handle erroneous Huffman codes (for instance,
from a corrupt JPEG image.) Previously, these would cause libjpeg-turbo to
crash under certain circumstances.
[2] Fixed typo in SIMD dispatch routines that was causing 4:2:2 upsampling to
be used instead of 4:2:0 when decompressing JPEG images using SSE2 code.
[3] configure script will now automatically determine whether the
INCOMPLETE_TYPES_BROKEN macro should be defined.
1.0.0
=====
[1] 2983700: Further FreeBSD build tweaks (no longer necessary to specify
--host when configuring on a 64-bit system)
[2] Created symlinks in the Unix/Linux packages so that the TurboJPEG
include file can always be found in /opt/libjpeg-turbo/include, the 32-bit
static libraries can always be found in /opt/libjpeg-turbo/lib32, and the
64-bit static libraries can always be found in /opt/libjpeg-turbo/lib64.
[3] The Unix/Linux distribution packages now include the libjpeg run-time
programs (cjpeg, etc.) and man pages.
[4] Created a 32-bit supplementary package for amd64 Debian systems, which
contains just the 32-bit libjpeg-turbo libraries.
[5] Moved the libraries from */lib32 to */lib in the i386 Debian package.
[6] Include distribution package for Cygwin
[7] No longer necessary to specify --without-simd on non-x86 architectures, and
unit tests now work on those architectures.
0.0.93
======
[1] 2982659, Fixed x86-64 build on FreeBSD systems
[2] 2988188: Added support for Windows 64-bit systems
0.0.91
======
[1] Added documentation to .deb packages
[2] 2968313: Fixed data corruption issues when decompressing large JPEG images
and/or using buffered I/O with the libjpeg-turbo decompressor
0.0.90
======
Initial release
@@ -1,2 +0,0 @@
# This file contains additional build requirements that did not get
# picked up automatically. One name per line, no whitespace.
@@ -1,2 +0,0 @@
# This file contains build requirements that get picked up but are
# undesirable. One entry per line, no whitespace.

Some files were not shown because too many files have changed in this diff Show More