Skip to content

Commit

Permalink
WIP: Upgrade internals to C++17
Browse files Browse the repository at this point in the history
  • Loading branch information
lovell committed Nov 1, 2024
1 parent 3796dd8 commit 63f87e7
Show file tree
Hide file tree
Showing 6 changed files with 37 additions and 47 deletions.
4 changes: 2 additions & 2 deletions docs/install.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ deno run --allow-ffi ...

Ready-compiled sharp and libvips binaries are provided for use on the most common platforms:

* macOS x64 (>= 10.13)
* macOS x64 (>= 10.15)
* macOS ARM64
* Linux ARM (glibc >= 2.28)
* Linux ARM64 (glibc >= 2.26, musl >= 1.2.2)
Expand Down Expand Up @@ -111,7 +111,7 @@ environment variables.

Building from source requires:

* C++11 compiler
* C++17 compiler
* [node-addon-api](https://www.npmjs.com/package/node-addon-api) version 7+
* [node-gyp](https://github.com/nodejs/node-gyp#installation) version 9+ and its dependencies

Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@
"jsdoc-to-markdown": "^9.0.4",
"license-checker": "^25.0.1",
"mocha": "^10.7.3",
"node-addon-api": "8.1.0",
"node-addon-api": "^8.2.1",
"nyc": "^17.1.0",
"prebuild": "^13.0.1",
"semistandard": "^17.0.0",
Expand Down
13 changes: 10 additions & 3 deletions src/binding.gyp
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,9 @@
'Release': {
'msvs_settings': {
'VCCLCompilerTool': {
"AdditionalOptions": [
"/std:c++20"
],
'ExceptionHandling': 1,
'Optimization': 1,
'WholeProgramOptimization': 'true'
Expand Down Expand Up @@ -172,6 +175,7 @@
'-l:libvips-cpp.so.<(vips_version)'
],
'ldflags': [
'-lstdc++fs',
'-Wl,-s',
'-Wl,--disable-new-dtags',
'-Wl,-z,nodelete',
Expand Down Expand Up @@ -207,14 +211,14 @@
}]
],
'cflags_cc': [
'-std=c++0x',
'-std=c++17',
'-fexceptions',
'-Wall',
'-Os'
],
'xcode_settings': {
'CLANG_CXX_LANGUAGE_STANDARD': 'c++11',
'MACOSX_DEPLOYMENT_TARGET': '10.13',
'CLANG_CXX_LANGUAGE_STANDARD': 'c++17',
'MACOSX_DEPLOYMENT_TARGET': '10.15',
'GCC_ENABLE_CPP_EXCEPTIONS': 'YES',
'GCC_ENABLE_CPP_RTTI': 'YES',
'OTHER_CPLUSPLUSFLAGS': [
Expand All @@ -234,6 +238,9 @@
['OS == "win"', {
'msvs_settings': {
'VCCLCompilerTool': {
"AdditionalOptions": [
"/std:c++20"
],
'ExceptionHandling': 1,
'Optimization': 1,
'WholeProgramOptimization': 'true'
Expand Down
10 changes: 3 additions & 7 deletions src/common.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,9 @@
#error "libvips version 8.16.0+ is required - please see https://sharp.pixelplumbing.com/install"
#endif

#if ((!defined(__clang__)) && defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 6)))
#error "GCC version 4.6+ is required for C++11 features - please see https://sharp.pixelplumbing.com/install"
#endif

#if (defined(__clang__) && defined(__has_feature))
#if (!__has_feature(cxx_range_for))
#error "clang version 3.0+ is required for C++11 features - please see https://sharp.pixelplumbing.com/install"
#if defined(__has_include)
#if !__has_include(<filesystem>)
#error "C++17 compiler required - please see https://sharp.pixelplumbing.com/install"
#endif
#endif

Expand Down
20 changes: 5 additions & 15 deletions src/pipeline.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

#include <algorithm>
#include <cmath>
#include <filesystem>
#include <map>
#include <memory>
#include <numeric>
Expand All @@ -20,17 +21,6 @@
#include "operations.h"
#include "pipeline.h"

#ifdef _WIN32
#define STAT64_STRUCT __stat64
#define STAT64_FUNCTION _stat64
#elif defined(_LARGEFILE64_SOURCE)
#define STAT64_STRUCT stat64
#define STAT64_FUNCTION stat64
#else
#define STAT64_STRUCT stat
#define STAT64_FUNCTION stat
#endif

class PipelineWorker : public Napi::AsyncWorker {
public:
PipelineWorker(Napi::Function callback, PipelineBaton *baton,
Expand Down Expand Up @@ -1306,10 +1296,10 @@ class PipelineWorker : public Napi::AsyncWorker {
Callback().Call(Receiver().Value(), { env.Null(), data, info });
} else {
// Add file size to info
struct STAT64_STRUCT st;
if (STAT64_FUNCTION(baton->fileOut.data(), &st) == 0) {
info.Set("size", static_cast<uint32_t>(st.st_size));
}
try {
uint32_t const size = static_cast<uint32_t>(std::filesystem::file_size(baton->fileOut.data()));
info.Set("size", size);
} catch (...) {}
Callback().Call(Receiver().Value(), { env.Null(), info });
}
} else {
Expand Down
35 changes: 16 additions & 19 deletions test/unit/tile.js
Original file line number Diff line number Diff line change
Expand Up @@ -483,7 +483,7 @@ describe('Tile', function () {
assert.strictEqual(2725, info.width);
assert.strictEqual(2225, info.height);
assert.strictEqual(3, info.channels);
assert.strictEqual('number', typeof info.size);
assert.strictEqual(undefined, info.size);
fs.stat(path.join(directory, 'ImageProperties.xml'), function (err, stat) {
if (err) throw err;
assert.strictEqual(true, stat.isFile());
Expand All @@ -509,7 +509,7 @@ describe('Tile', function () {
assert.strictEqual(2725, info.width);
assert.strictEqual(2225, info.height);
assert.strictEqual(3, info.channels);
assert.strictEqual('number', typeof info.size);
assert.strictEqual(undefined, info.size);
assertZoomifyTiles(directory, 256, 1, done);
});
});
Expand All @@ -530,7 +530,7 @@ describe('Tile', function () {
assert.strictEqual(2725, info.width);
assert.strictEqual(2225, info.height);
assert.strictEqual(3, info.channels);
assert.strictEqual('number', typeof info.size);
assert.strictEqual(undefined, info.size);
assertZoomifyTiles(directory, 256, 5, done);
});
});
Expand All @@ -551,7 +551,7 @@ describe('Tile', function () {
assert.strictEqual(2725, info.width);
assert.strictEqual(2225, info.height);
assert.strictEqual(3, info.channels);
assert.strictEqual('number', typeof info.size);
assert.strictEqual(undefined, info.size);
assertZoomifyTiles(directory, 256, 13, done);
});
});
Expand All @@ -575,7 +575,7 @@ describe('Tile', function () {
assert.strictEqual(2048, info.width);
assert.strictEqual(1536, info.height);
assert.strictEqual(3, info.channels);
assert.strictEqual('number', typeof info.size);
assert.strictEqual(undefined, info.size);
assertZoomifyTiles(directory, 256, 4, done);
});
});
Expand All @@ -594,7 +594,7 @@ describe('Tile', function () {
assert.strictEqual(2725, info.width);
assert.strictEqual(2225, info.height);
assert.strictEqual(3, info.channels);
assert.strictEqual('number', typeof info.size);
assert.strictEqual(undefined, info.size);
fs.stat(path.join(directory, '0', '0', '0.jpg'), function (err, stat) {
if (err) throw err;
assert.strictEqual(true, stat.isFile());
Expand All @@ -621,7 +621,7 @@ describe('Tile', function () {
assert.strictEqual(2725, info.width);
assert.strictEqual(2225, info.height);
assert.strictEqual(3, info.channels);
assert.strictEqual('number', typeof info.size);
assert.strictEqual(undefined, info.size);
const sample = path.join(directory, '0', '0', '0.jpg');
sharp(sample).metadata(function (err, metadata) {
if (err) throw err;
Expand Down Expand Up @@ -658,7 +658,7 @@ describe('Tile', function () {
assert.strictEqual(2725, info.width);
assert.strictEqual(2225, info.height);
assert.strictEqual(3, info.channels);
assert.strictEqual('number', typeof info.size);
assert.strictEqual(undefined, info.size);
const sample = path.join(directory, '0', '0', '0.png');
sharp(sample).metadata(function (err, metadata) {
if (err) throw err;
Expand Down Expand Up @@ -696,7 +696,7 @@ describe('Tile', function () {
assert.strictEqual(2725, info.width);
assert.strictEqual(2225, info.height);
assert.strictEqual(3, info.channels);
assert.strictEqual('number', typeof info.size);
assert.strictEqual(undefined, info.size);
const sample = path.join(directory, '0', '0', '0.webp');
sharp(sample).metadata(function (err, metadata) {
if (err) throw err;
Expand Down Expand Up @@ -732,8 +732,7 @@ describe('Tile', function () {
assert.strictEqual(2725, info.width);
assert.strictEqual(2225, info.height);
assert.strictEqual(3, info.channels);
assert.strictEqual('number', typeof info.size);

assert.strictEqual(undefined, info.size);
assertGoogleTiles(directory, 256, 1, done);
});
});
Expand All @@ -754,8 +753,7 @@ describe('Tile', function () {
assert.strictEqual(2725, info.width);
assert.strictEqual(2225, info.height);
assert.strictEqual(3, info.channels);
assert.strictEqual('number', typeof info.size);

assert.strictEqual(undefined, info.size);
assertGoogleTiles(directory, 256, 5, done);
});
});
Expand All @@ -779,8 +777,7 @@ describe('Tile', function () {
assert.strictEqual(2809, info.width);
assert.strictEqual(2074, info.height);
assert.strictEqual(3, info.channels);
assert.strictEqual('number', typeof info.size);

assert.strictEqual(undefined, info.size);
assertGoogleTiles(directory, 256, 5, done);
});
});
Expand All @@ -800,7 +797,7 @@ describe('Tile', function () {
assert.strictEqual(2725, info.width);
assert.strictEqual(2225, info.height);
assert.strictEqual(3, info.channels);
assert.strictEqual('number', typeof info.size);
assert.strictEqual(undefined, info.size);
fixtures.assertSimilar(fixtures.expected('tile_centered.jpg'), fs.readFileSync(path.join(directory, '0', '0', '0.jpg')), done);
});
});
Expand All @@ -820,7 +817,7 @@ describe('Tile', function () {
assert.strictEqual(2725, info.width);
assert.strictEqual(2225, info.height);
assert.strictEqual(3, info.channels);
assert.strictEqual('number', typeof info.size);
assert.strictEqual(undefined, info.size);
fixtures.assertSimilar(fixtures.expected('tile_centered.jpg'), fs.readFileSync(path.join(directory, '0', '0', '0.jpg')), done);
});
});
Expand All @@ -842,7 +839,7 @@ describe('Tile', function () {
assert.strictEqual(2725, info.width);
assert.strictEqual(2225, info.height);
assert.strictEqual(3, info.channels);
assert.strictEqual('number', typeof info.size);
assert.strictEqual(undefined, info.size);
const infoJson = require(path.join(directory, 'info.json'));
assert.strictEqual('http://iiif.io/api/image/2/context.json', infoJson['@context']);
assert.strictEqual(`${id}/${name}`, infoJson['@id']);
Expand Down Expand Up @@ -872,7 +869,7 @@ describe('Tile', function () {
assert.strictEqual(2725, info.width);
assert.strictEqual(2225, info.height);
assert.strictEqual(3, info.channels);
assert.strictEqual('number', typeof info.size);
assert.strictEqual(undefined, info.size);
const infoJson = require(path.join(directory, 'info.json'));
assert.strictEqual('http://iiif.io/api/image/3/context.json', infoJson['@context']);
assert.strictEqual('ImageService3', infoJson.type);
Expand Down

0 comments on commit 63f87e7

Please sign in to comment.