Compare commits

..
Author SHA1 Message Date
gronod fe0230b3d5 Merge branch 'development' into main
Windows x86_64 Release Build / build (push) Successful in 7m43s
Linux x86_64 Release Build / build (push) Successful in 10m3s
2026-08-26 01:11:26 +01:00
gronod 885fa3fee8 Merge pull request 'Development' (#18) from development into main
Windows x86_64 Release Build / build (push) Has been cancelled
Linux x86_64 Release Build / build (push) Has been cancelled
Reviewed-on: #18
2026-08-26 01:02:30 +01:00
10 changed files with 48 additions and 275 deletions
-9
View File
@@ -63,15 +63,6 @@ jobs:
echo "SHORT_SHA=${SHORT_SHA}" >> $GITHUB_ENV
mv Argyll_V*_win64_exe.zip "Argyll_${TAG}_${SHORT_SHA}_win64_exe.zip"
- name: Verify Package Contents
run: |
ZIP_FILE=$(ls Argyll_*_win64_exe.zip)
echo "Verifying contents of ${ZIP_FILE}..."
unzip -l "${ZIP_FILE}" | grep "usb/ArgyllCMS.inf"
unzip -l "${ZIP_FILE}" | grep "usb/bin/amd64/libusb0.sys"
unzip -l "${ZIP_FILE}" | grep "doc/ArgyllDoc.html"
unzip -l "${ZIP_FILE}" | grep "ReadMe.txt"
- name: Upload Artifact
uses: actions/upload-artifact@v3
with:
+2 -118
View File
@@ -11,11 +11,11 @@ jobs:
strategy:
matrix:
include:
- os: macos-latest
- os: macos-15-intel
arch: x86_64
machtype: x86_64-apple-darwin
artifact: macOS_x86_64_bin
- os: macos-latest
- os: macos-15
arch: arm64
machtype: arm64-apple-darwin
artifact: macOS_arm64_bin
@@ -43,16 +43,6 @@ jobs:
export CCOPTFLAG="-O0"
jam -q -d2 -fJambase -j1 -sBUILTIN_TIFF=true -sBUILTIN_JPEG=true -sBUILTIN_PNG=true -sBUILTIN_Z=true -sBUILTIN_SSL=true install
- name: Ad-hoc Sign & Verify Binaries
run: |
for f in bin/*; do
if [ -f "$f" ] && file "$f" | grep -q "Mach-O"; then
echo "Ad-hoc signing $f"
codesign -f -s - "$f"
codesign -dvv "$f"
fi
done
- name: Smoke Tests
env:
ARGYLL_NOT_INTERACTIVE: "1"
@@ -74,12 +64,6 @@ jobs:
echo "SHORT_SHA=${SHORT_SHA}" >> $GITHUB_ENV
mv Argyll_V*_${{ matrix.artifact }}.tgz "Argyll_${TAG}_${SHORT_SHA}_${{ matrix.artifact }}.tgz"
- name: Upload Raw Binaries
uses: actions/upload-artifact@v4
with:
name: raw-bin-${{ matrix.arch }}
path: bin/
- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
@@ -93,103 +77,3 @@ jobs:
name: Release ${{ github.ref_name }}
body: "Release ${{ github.ref_name }} built from commit ${{ github.sha }}"
files: Argyll_*_${{ matrix.artifact }}.tgz
universal:
needs: build
runs-on: macos-15
permissions:
contents: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Download x86_64 binaries
uses: actions/download-artifact@v4
with:
name: raw-bin-x86_64
path: raw-bin-x86_64
- name: Download arm64 binaries
uses: actions/download-artifact@v4
with:
name: raw-bin-arm64
path: raw-bin-arm64
- name: Create Universal Binaries
run: |
mkdir -p bin
for file in raw-bin-arm64/*; do
bin_name=$(basename "$file")
if [ -f "raw-bin-x86_64/$bin_name" ]; then
if file "raw-bin-arm64/$bin_name" | grep -q "Mach-O" && file "raw-bin-x86_64/$bin_name" | grep -q "Mach-O"; then
echo "Creating universal binary with lipo: $bin_name"
lipo -create "raw-bin-x86_64/$bin_name" "raw-bin-arm64/$bin_name" -output "bin/$bin_name"
chmod +x "bin/$bin_name"
codesign -f -s - "bin/$bin_name"
else
echo "Non Mach-O file, copying directly: $bin_name"
cp "$file" "bin/$bin_name"
fi
else
echo "Warning: $bin_name not found in raw-bin-x86_64, copying arm64 version"
cp "$file" "bin/$bin_name"
if file "bin/$bin_name" | grep -q "Mach-O"; then
codesign -f -s - "bin/$bin_name"
fi
fi
done
for file in raw-bin-x86_64/*; do
bin_name=$(basename "$file")
if [ ! -f "bin/$bin_name" ]; then
echo "Warning: $bin_name only found in raw-bin-x86_64, copying x86_64 version"
cp "$file" "bin/$bin_name"
if file "bin/$bin_name" | grep -q "Mach-O"; then
codesign -f -s - "bin/$bin_name"
fi
fi
done
- name: Verify Architecture & Code Signatures
env:
ARGYLL_NOT_INTERACTIVE: "1"
ARGYLL_EXCLUDE_SERIAL_SCAN: "1"
run: |
echo "=== Binary Architecture & Signature Verification ==="
for file in bin/*; do
if [ -f "$file" ] && file "$file" | grep -q "Mach-O"; then
file "$file"
codesign -dvv "$file"
fi
done
echo "=== Smoke Tests ==="
./bin/dispcal -? || true
./bin/chartread -? || true
./bin/colprof -? || true
./bin/targen -? || true
- name: Package Universal Release
run: |
export OSTYPE=darwin
export MACHTYPE=universal-apple-darwin
export HOSTTYPE=universal
export NO_BUILD=1
./makepackagebin.sh
TAG="${{ github.ref_name }}"
SHORT_SHA="$(git rev-parse --short HEAD)"
echo "SHORT_SHA=${SHORT_SHA}" >> $GITHUB_ENV
mv Argyll_V*_macOS_universal_bin.tgz "Argyll_${TAG}_${SHORT_SHA}_macOS_universal_bin.tgz"
- name: Upload Universal Artifact
uses: actions/upload-artifact@v4
with:
name: Argyll_${{ github.ref_name }}_${{ env.SHORT_SHA }}_macOS_universal_bin
path: Argyll_*_macOS_universal_bin.tgz
- name: Upload Universal Release Asset
if: startsWith(github.ref, 'refs/tags/')
uses: softprops/action-gh-release@v2
with:
name: Release ${{ github.ref_name }}
body: "Release ${{ github.ref_name }} built from commit ${{ github.sha }}"
files: Argyll_*_macOS_universal_bin.tgz
-9
View File
@@ -65,15 +65,6 @@ jobs:
echo "SHORT_SHA=${SHORT_SHA}" >> $GITHUB_ENV
mv Argyll_V*_win64_exe.zip "Argyll_${TAG}_${SHORT_SHA}_win64_exe.zip"
- name: Verify Package Contents
run: |
ZIP_FILE=$(ls Argyll_*_win64_exe.zip)
echo "Verifying contents of ${ZIP_FILE}..."
unzip -l "${ZIP_FILE}" | grep "usb/ArgyllCMS.inf"
unzip -l "${ZIP_FILE}" | grep "usb/bin/amd64/libusb0.sys"
unzip -l "${ZIP_FILE}" | grep "doc/ArgyllDoc.html"
unzip -l "${ZIP_FILE}" | grep "ReadMe.txt"
- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
-3
View File
@@ -19,9 +19,6 @@
<h1>[V3.4.1 -&gt; V3.5.0] 4th February 2026<br>
</h1>
<ul>
<li>Added macOS Universal Binary release archive (Intel x86_64 + Apple Silicon arm64).</li>
<li>Fixed non-blocking stdin polling deadlock on MSWindows anonymous pipes when running interactive measurement tools in subprocess mode.</li>
<li>Added -d switch to printtarg to allow custom chart label strings or omit labelling entirely.</li>
<li>Added MSWindows ARM release.</li>
<li>Added Mac ARM release.</li>
<li>Removed Mac PowerPC build from release.</li>
-7
View File
@@ -264,7 +264,6 @@ channels
Dither 8 bit TIFF values down from 16 bit<br>
&nbsp;<a href="#d">-d "string"</a>&nbsp;&nbsp;&nbsp; Custom target label string, or "" to omit labelling<br>
&nbsp;<a href="#Q">-Q nbits</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Quantize
test
@@ -759,12 +758,6 @@ A3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
to use it to verify the overall operation of the printing system), then you
can use the <b>-U</b> flag to disable this.<br>
<br>
<a name="d"></a> The <b>-d</b> parameter allows specifying a custom
chart description/label string to be printed along the page/strip borders on
generated test target files (TIFF, PostScript, EPS), replacing the default
generated chart identifier. If an empty string is provided (<b>-d ""</b>),
chart labelling along the page borders is suppressed entirely.<br>
<br>
<a name="p"></a> The <b>-p</b> parameter specifies the paper size. The size
can either be one of the default sizes, <a name="pp"></a>or can be
specified in millimeters. Limitations of the instrument may limit the
+25 -53
View File
@@ -7,7 +7,7 @@ echo "Script to invoke Jam and then package the binary release."
PRODUCT=Argyll
# Set the environment string VERSION from the #define, ie 1.0.0
VERSION=`grep ARGYLL_VERSION_STR h/aconfig.h | head -1 | sed 's/# define ARGYLL_VERSION_STR //' | sed 's/\"//g'`
VERSION=`grep ARGYLL_VERSION_STR h/aconfig.h | head -1 | sed 's/# define ARGYLL_VERSION_STR //' | sed 's/"//g'`
# Typical environment variables:
# (NOTE some systems don't export these ENV vars. by default !!!)
@@ -113,13 +113,6 @@ else if [ "${OSTYPE#*darwin*}" != "$OSTYPE" ] ; then
echo "We're on MacOS arm64!"
PACKAGE=${PRODUCT}_V${VERSION}_macOS_arm64_bin.tgz
export MACOSX_DEPLOYMENT_TARGET="11.0" # Minimum target platform version
else if [ X$HOSTTYPE = "Xuniversal" \
-o X$MACHTYPE = "Xuniversal-apple-darwin" \
-o X$COMPILER = "XUNIVERSAL" ] ; then
echo "We're on MacOS Universal!"
PACKAGE=${PRODUCT}_V${VERSION}_macOS_universal_bin.tgz
export MACOSX_DEPLOYMENT_TARGET="10.15" # Minimum target platform version
fi
fi
fi
fi
@@ -152,56 +145,35 @@ fi
echo "Making GNU $PRODUCT binary distribution $PACKAGE for Version $VERSION"
if [ X$NO_BUILD = "X" ] ; then
# Clean up so we get a solid build
# .sp come from profile, .cht from scanin and .ti3 from spectro
rm -f bin/*.exe bin/*.dll
rm -f ref/*.sp ref/*.cht ref/*.ti2
# Clean up so we get a solid build
# .sp come from profile, .cht from scanin and .ti3 from spectro
rm -f bin/*.exe bin/*.dll
rm -f ref/*.sp ref/*.cht ref/*.ti2
if [ X$CROSS_COMPILE = "X" ] ; then # If not cross compiling
echo "Cleaning before build ..."
if ! jam -fJambase -sBUILTIN_TIFF=true -sBUILTIN_JPEG=true -sBUILTIN_PNG=true -sBUILTIN_Z=true -sBUILTIN_SSL=true clean ; then
echo "Clean failed!"
exit 1
fi
fi
# Make sure it's built and installed
if ! jam -q -fJambase -j${NUMBER_OF_PROCESSORS:-1} -sBUILTIN_TIFF=true -sBUILTIN_JPEG=true -sBUILTIN_PNG=true -sBUILTIN_Z=true -sBUILTIN_SSL=true install ; then
echo "Build failed!"
exit 1
fi
fi
# Apply ad-hoc code signatures to macOS Mach-O binaries before staging
if [ "${OSTYPE#*darwin*}" != "$OSTYPE" ] ; then
echo "=== Applying ad-hoc code signatures to macOS Mach-O binaries ==="
for f in bin/* ; do
if [ -f "$f" ] && file "$f" | grep -q "Mach-O" ; then
echo "Signing $f..."
codesign -f -s - "$f" || true
fi
done
if [ X$CROSS_COMPILE = "X" ] ; then # If not cross compiling
echo "Cleaning before build ..."
if ! jam -fJambase -sBUILTIN_TIFF=true -sBUILTIN_JPEG=true -sBUILTIN_PNG=true -sBUILTIN_Z=true -sBUILTIN_SSL=true clean ; then
echo "Clean failed!"
exit 1
fi
fi
# Make sure it's built and installed
if ! jam -q -fJambase -j${NUMBER_OF_PROCESSORS:-1} -sBUILTIN_TIFF=true -sBUILTIN_JPEG=true -sBUILTIN_PNG=true -sBUILTIN_Z=true -sBUILTIN_SSL=true install ; then
echo "Build failed!"
exit 1
fi
rm -rf $TOPDIR
mkdir $TOPDIR
# Ensure catalog copies exist if needed for Windows packaging
if [ -d usb ] ; then
if [ -f usb/ArgyllCMS.cat ] ; then
[ ! -f usb/ArgyllCMS_x64.cat ] && cp usb/ArgyllCMS.cat usb/ArgyllCMS_x64.cat
[ ! -f usb/ArgyllCMS_arm64.cat ] && cp usb/ArgyllCMS.cat usb/ArgyllCMS_arm64.cat
fi
fi
# Collect the names of all the files that we're going to package
unset topfiles; for i in `tr -d '\r' < binfiles`; do topfiles="$topfiles ${i}"; done
unset docfiles; for i in `tr -d '\r' < doc/afiles`; do docfiles="$docfiles doc/${i}"; done
unset topfiles; for i in `cat binfiles`; do topfiles="$topfiles ${i}"; done
unset docfiles; for i in `cat doc/afiles`; do docfiles="$docfiles doc/${i}"; done
unset usbfiles;
for j in ${USBDIRS}; do
if [ ${j} ]; then
for i in `tr -d '\r' < ${j}/${USBBINFILES}`; do usbfiles="$usbfiles ${j}/${i}"; done
for i in `cat ${j}/${USBBINFILES}`; do usbfiles="$usbfiles ${j}/${i}"; done
fi
done
@@ -211,16 +183,16 @@ allfiles="${topfiles} bin/* ref/* ${docfiles} ${usbfiles}"
for i in ${allfiles}; do
path=${i%/*} # extract path without filename
file=${i##*/} # extract filename
if [ "$path" = "$i" ] ; then
if [ $path = $i ] ; then
path=
fi
if [ X"$path" != "X" ] ; then
mkdir -p "$TOPDIR/${path}"
if [ X$path != "X" ] ; then
mkdir -p $TOPDIR/${path}
fi
if [ X"${file}" = "Xafiles" ] ; then
if [ X${file} = "Xafiles" ] ; then
continue
fi
cp "$i" "$TOPDIR/$i" || { echo "Failed to copy $i to $TOPDIR/$i"; exit 1; }
cp $i $TOPDIR/$i
done
# Create the package
+12 -13
View File
@@ -203,37 +203,36 @@ static int con_char(int wait) {
/* We assume pipe has been set to NOWAIT mode. */
} else if (stdin_type == FILE_TYPE_PIPE) {
int i, bib;
DWORD bytes_avail = 0;
/* Check available bytes in pipe before blocking */
if (!PeekNamedPipe(stdinh, NULL, 0, NULL, &bytes_avail, NULL) || bytes_avail == 0) {
if (!wait) {
return 0;
}
}
//fprintf(stderr,"~1 top of pipe\n");
for (bib = 0; bib < 10;) {
if (!wait) {
if (!PeekNamedPipe(stdinh, NULL, 0, NULL, &bytes_avail, NULL) || bytes_avail == 0) {
break;
}
}
//fprintf(stderr,"~1 got %d in buf\n",bib);
if ((!ReadFile(stdinh, buf + bib, 10 - bib, &bread, NULL) || bread == 0)
&& !wait) {
//fprintf(stderr,"~1 no chars waiting\n");
break;
}
bib += bread;
for (i = 0; i < bib; i++) {
if (buf[i] == '\n' || buf[i] == '\r' || buf[i] == 0x3) {
//fprintf(stderr,"~1 found lf at ix %d\n",i);
break;
}
}
if (i < bib) {
//fprintf(stderr,"~1 found lf\n");
break; /* Found '\n' */
}
Sleep(100); /* Wait for a line ending in '\n' */
}
//if (bread > 0) {
//fprintf(stderr,"~1 read %d: ",bread);
//for (i = 0; i < bread; i++)
//fprintf(stderr," 0x%x",buf[i]);
//fprintf(stderr,"\n//");
//}
rv = buf[0];
/* Assume a file. This will have very limited functionality. */
+9 -63
View File
@@ -463,29 +463,6 @@ static void ps_hexagon(trend *ss,
fprintf(s->of,"%f %f %f %f hex\n",w,h,x,y);
}
/* Helper to escape characters in PostScript string literals */
static void ps_escape_str(char *dst, int maxdst, const char *src) {
int di = 0;
if (dst == NULL || maxdst <= 0) return;
if (src == NULL) { dst[0] = '\0'; return; }
while (*src != '\0' && di < maxdst - 2) {
if (*src == '(' || *src == ')' || *src == '\\') {
if (di < maxdst - 3) {
dst[di++] = '\\';
dst[di++] = *src++;
} else {
break;
}
} else if (*src == '\r' || *src == '\n') {
dst[di++] = ' ';
src++;
} else {
dst[di++] = *src++;
}
}
dst[di] = '\0';
}
/* A centered string */
static void ps_string(trend *ss,
double x, double y, /* Bot Left Corner of rectangle in mm from origin */
@@ -493,17 +470,15 @@ static void ps_string(trend *ss,
char *str /* String */
) {
ps_trend *s = (ps_trend *)ss;
char esc_str[2048];
if (fabs(w) < 1e-6 || fabs(h) < 1e-6 || str == NULL || str[0] == '\000')
return; /* Skip zero sized or empty string */
ps_escape_str(esc_str, sizeof(esc_str), str);
if (fabs(w) < 1e-6 || fabs(h) < 1e-6)
return; /* Skip zero sized string */
x = mm2pnt(x);
y = mm2pnt(y);
w = mm2pnt(w);
h = mm2pnt(h);
fprintf(s->of,"%f scaleTimes\n",h * 0.75);
fprintf(s->of,"(%s) %f %f centerShow\n",esc_str,x+w/2.0,y+h/2.0);
fprintf(s->of,"(%s) %f %f centerShow\n",str,x+w/2.0,y+h/2.0);
}
/* A vertically centered string */
@@ -513,17 +488,15 @@ static void ps_vstring(trend *ss,
char *str /* String */
) {
ps_trend *s = (ps_trend *)ss;
char esc_str[2048];
if (fabs(w) < 1e-6 || fabs(h) < 1e-6 || str == NULL || str[0] == '\000')
return; /* Skip zero sized or empty string */
ps_escape_str(esc_str, sizeof(esc_str), str);
if (fabs(w) < 1e-6 || fabs(h) < 1e-6)
return; /* Skip zero sized string */
x = mm2pnt(x);
y = mm2pnt(y);
w = mm2pnt(w);
h = mm2pnt(h);
fprintf(s->of,"%f scaleTimes\n",w * 0.75);
fprintf(s->of,"(%s) %f %f vcenterShow\n",esc_str,x-w/2.0,y+h/2.0);
fprintf(s->of,"(%s) %f %f vcenterShow\n",str,x-w/2.0,y+h/2.0);
}
/* A dotted line */
@@ -899,8 +872,6 @@ static void tiff_string(trend *ss,
tiff_trend *s = (tiff_trend *)ss;
double sw = 0.0, sh = 0.0;
if (fabs(w) < 1e-6 || fabs(h) < 1e-6 || str == NULL || str[0] == '\000')
return; /* Skip zero sized or empty string */
sh = h * 0.57;
meas_string2d(s->r,&sw,NULL,timesr_b,str,sh,0);
/* Center the string within the recangle */
@@ -918,8 +889,6 @@ static void tiff_vstring(trend *ss,
tiff_trend *s = (tiff_trend *)ss;
double sw = 0.0, sh = 0.0;
if (fabs(w) < 1e-6 || fabs(h) < 1e-6 || str == NULL || str[0] == '\000')
return; /* Skip zero sized or empty string */
x -= w; /* Make it bot left corner */
sw = w * 0.57;
meas_string2d(s->r,NULL, &sh,timesr_b,str,sw,3);
@@ -2296,9 +2265,6 @@ int *p_npat /* Return number of patches including padding */
if (scanc & 2) /* Scan compatiblity */
sxwi = pwid/2.0; /* First row patches extra width */
if (label == NULL || label[0] == '\000')
dopglabel = 0; /* Omit per-page labelling */
/* Compute limits for this page size */
/* Figure the available space for patches */
mints = bord + txhisl + lcar; /* Minimum top space due to border, text and clear area */
@@ -3043,7 +3009,6 @@ void usage(char *diag, ...) {
fprintf(stderr," -C Don't use TIFF compression\n");
fprintf(stderr," -N Use TIFF alpha N channels more than 4\n");
fprintf(stderr," -D Dither 8 bit TIFF values down from 16 bit\n");
fprintf(stderr," -d label Custom chart description/label string, or \"\" to omit labelling\n");
fprintf(stderr," -Q nbits Quantize test values to fit in nbits\n");
fprintf(stderr," -R rsnum Use given random start number\n");
fprintf(stderr," -K file.cal Apply printer calibration to patch values and include in .ti2\n");
@@ -3105,9 +3070,7 @@ int main(int argc, char *argv[]) {
int nchan = 0; /* Number of device chanels */
int i;
int si, fi, wi; /* Sample id index, field index, keyWord index */
char *custom_label = NULL; /* Custom chart label string */
int custom_label_set = 0; /* Flag, custom label was specified */
char label[1024]; /* Space for chart label */
char label[400]; /* Space for chart label */
double marg = DEF_MARGINE; /* Margin from paper edge in mm */
int nosubmarg = 0; /* Don't subtract it from raster */
int nolpcbord = 0; /* NZ to suppress left paper clip border */
@@ -3339,13 +3302,6 @@ int main(int argc, char *argv[]) {
else if (argv[fa][1] == 'D') {
tiffdith = 1;
}
/* Custom chart label string */
else if (argv[fa][1] == 'd') {
fa = nfa;
if (na == NULL) usage("Expected argument to -d");
custom_label = na;
custom_label_set = 1;
}
/* Don't use TIFF compression */
else if (argv[fa][1] == 'C') {
tiffcomp = 0;
@@ -3833,18 +3789,8 @@ int main(int argc, char *argv[]) {
pcol = pcold; /* Density spacer alues */
if (custom_label_set) {
if (custom_label[0] != '\000') {
strncpy(label, custom_label, sizeof(label) - 1);
label[sizeof(label) - 1] = '\000';
ocg->add_kword(ocg, 0, "CHART_LABEL", custom_label, NULL);
} else {
label[0] = '\000';
}
} else {
sprintf(label, "ArgyllCMS - Chart \"%s\" (%s %d) %s",
psname, rand ? "Random Start" : "Chart ID", rstart, atm);
}
sprintf(label, "ArgyllCMS - Chart \"%s\" (%s %d) %s",
psname, rand ? "Random Start" : "Chart ID", rstart, atm);
generate_file(itype, itype_mod, psname, cols, npat, applycal ? cal : NULL, label,
pap != NULL ? pap->w : cwidth, pap != NULL ? pap->h : cheight,
marg, nosubmarg, nollimit, nolpcbord, rand, rstart, saix, paix, ixord,
Binary file not shown.
Binary file not shown.