Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f1f44154d3 |
@@ -8,8 +8,6 @@ config.guess
|
|||||||
config.sub
|
config.sub
|
||||||
aclocal.m4
|
aclocal.m4
|
||||||
config.h.in
|
config.h.in
|
||||||
compile
|
|
||||||
ar-lib
|
|
||||||
missing
|
missing
|
||||||
install-sh
|
install-sh
|
||||||
*.glade.cpp
|
*.glade.cpp
|
||||||
@@ -23,6 +23,10 @@ examples are covered under the Unlicense. See LICENSE_unlicense.txt for
|
|||||||
details.
|
details.
|
||||||
|
|
||||||
|
|
||||||
|
Portions of this software are copyright Google Inc. See LICENSE_pcrecpp.txt
|
||||||
|
for details.
|
||||||
|
|
||||||
|
|
||||||
This product includes the HZ library (or portions of it). See LICENSE_hz.txt
|
This product includes the HZ library (or portions of it). See LICENSE_hz.txt
|
||||||
for details.
|
for details.
|
||||||
|
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
Copyright (c) 2005 - 2010, Google Inc.
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are
|
||||||
|
met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above
|
||||||
|
copyright notice, this list of conditions and the following disclaimer
|
||||||
|
in the documentation and/or other materials provided with the
|
||||||
|
distribution.
|
||||||
|
* Neither the name of Google Inc. nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived from
|
||||||
|
this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
@@ -0,0 +1,154 @@
|
|||||||
|
|
||||||
|
# Add autoconf.m4 directory to local macro search path
|
||||||
|
ACLOCAL_AMFLAGS = -I autoconf.m4
|
||||||
|
|
||||||
|
SUBDIRS = data debian.dist src
|
||||||
|
|
||||||
|
|
||||||
|
# These files are actually needed for compilation.
|
||||||
|
noinst_DATA = AUTHORS.txt LICENSE_gsmartcontrol.txt README.txt
|
||||||
|
|
||||||
|
|
||||||
|
# For the files to be bundled with the distribution, specify them in
|
||||||
|
# one of the following.
|
||||||
|
|
||||||
|
# These will be installed into docdir.
|
||||||
|
# Some of these files are actually needed for compilation (see src/res/Makefile.am).
|
||||||
|
dist_doc_DATA = AUTHORS.txt ChangeLog NEWS README.txt \
|
||||||
|
LICENSE_boost_1_0.txt \
|
||||||
|
LICENSE_bsd-ac.txt \
|
||||||
|
LICENSE_bsd-ucb.txt \
|
||||||
|
LICENSE_gpl2.txt \
|
||||||
|
LICENSE_gpl3.txt \
|
||||||
|
LICENSE_gsmartcontrol.txt \
|
||||||
|
LICENSE_hz.txt \
|
||||||
|
LICENSE_pcrecpp.txt \
|
||||||
|
LICENSE_unlicense.txt \
|
||||||
|
LICENSE_zlib.txt
|
||||||
|
|
||||||
|
|
||||||
|
# nobase_ preserves their directory names.
|
||||||
|
nobase_dist_doc_DATA = contrib/cron-based_noadmin/README \
|
||||||
|
contrib/cron-based_noadmin/cron_gather_smart.sh \
|
||||||
|
contrib/cron-based_noadmin/crontab.example \
|
||||||
|
contrib/cron-based_noadmin/smartctl_subst.sh
|
||||||
|
|
||||||
|
|
||||||
|
# Extra files bundled with distribution.
|
||||||
|
# file2csource.sh is needed for building but not installed.
|
||||||
|
EXTRA_DIST = COPYING INSTALL configure autogen.sh \
|
||||||
|
gsmartcontrol.kdev4 \
|
||||||
|
file2csource.sh \
|
||||||
|
gsmartcontrol.spec
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# PCH support
|
||||||
|
|
||||||
|
global_macros.h.gch: $(top_srcdir)/src/global_macros.h
|
||||||
|
$(CXX) $(CXXFLAGS) $(DEFS) -x "c++-header" $(top_srcdir)/src/global_macros.h -o global_macros.h.gch
|
||||||
|
|
||||||
|
gch: global_macros.h.gch
|
||||||
|
|
||||||
|
gch-clean:
|
||||||
|
rm -f global_macros.h.gch
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# rpm support
|
||||||
|
|
||||||
|
src-rpm: dist
|
||||||
|
rpmbuild -ts $(distdir).tar.bz2
|
||||||
|
|
||||||
|
|
||||||
|
# Don't use this - it does something weird, and gcc errors out with "long long long" errors, etc...
|
||||||
|
#rpm: dist
|
||||||
|
# rpmbuild -ta $(distdir).tar.bz2
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# NSIS installer support.
|
||||||
|
# Requires wine, installed NSIS, smartctl-nc.exe, smartctl.exe, update-smart-drivedb.exe.
|
||||||
|
# Gtkmm dlls and pcre dlls are required if linking against them.
|
||||||
|
# dos2unix on build machine.
|
||||||
|
# Execute only with win32 build present.
|
||||||
|
|
||||||
|
WIN_ZIP_NAME = $(PACKAGE)-$(VERSION)-win32
|
||||||
|
WIN_ZIP_NOGTK_NAME = $(PACKAGE)-$(VERSION)-win32-nogtk
|
||||||
|
|
||||||
|
|
||||||
|
win-dist: win-dist-nocleanup win-dist-cleanup
|
||||||
|
|
||||||
|
win-dist-nocleanup: win-dist-prepare nsis-dist-nocleanup win-zip-dist-nocleanup
|
||||||
|
|
||||||
|
win-dist-cleanup: win-zip-dist-cleanup nsis-dist-cleanup
|
||||||
|
rm -rf win-dist
|
||||||
|
|
||||||
|
win-dist-clean: win-dist-cleanup
|
||||||
|
rm -f gsmartcontrol-*.exe gsmartcontrol-*.zip
|
||||||
|
|
||||||
|
|
||||||
|
win-dist-prepare-all: nsis-dist-prepare win-zip-dist-prepare
|
||||||
|
|
||||||
|
|
||||||
|
# Don't strip smartctl (it will only change the header), and
|
||||||
|
# don't strip update-smart-drivedb (it will break its CRC check).
|
||||||
|
win-dist-prepare: all
|
||||||
|
$(MKDIR_P) win-dist
|
||||||
|
cp $(top_srcdir)/data/icon_*.png win-dist/
|
||||||
|
|
||||||
|
$(MKDIR_P) win-dist/doc
|
||||||
|
cp data/nsis/distribution*.txt win-dist/doc/
|
||||||
|
cp $(top_srcdir)/AUTHORS.txt $(top_srcdir)/LICENSE_* $(top_srcdir)/README.txt win-dist/doc/
|
||||||
|
cp $(top_srcdir)/NEWS win-dist/doc/NEWS.txt
|
||||||
|
|
||||||
|
cp src/gsmartcontrol.exe src/gsmartcontrol.exe.manifest win-dist/
|
||||||
|
|
||||||
|
unix2dos win-dist/doc/*.txt
|
||||||
|
|
||||||
|
cp -p "@WINDOWS_BINDIR@"/smartctl-nc.exe win-dist/
|
||||||
|
cp -p "@WINDOWS_BINDIR@"/smartctl.exe win-dist/
|
||||||
|
cp -p "@WINDOWS_BINDIR@"/update-smart-drivedb.exe win-dist/
|
||||||
|
|
||||||
|
|
||||||
|
nsis-dist-prepare: win-dist-prepare
|
||||||
|
cp -a win-dist nsis-dist
|
||||||
|
cp $(top_srcdir)/data/gsmartcontrol.ico nsis-dist/
|
||||||
|
cp data/nsis/*.nsi $(top_srcdir)/data/nsis/nsi_* nsis-dist/
|
||||||
|
unix2dos nsis-dist/*.nsi
|
||||||
|
cp "@WINDOWS_BINDIR@"/"@GTK_INSTALLER_NAME@".exe nsis-dist/
|
||||||
|
|
||||||
|
nsis-dist-nocleanup: nsis-dist-prepare
|
||||||
|
cd nsis-dist && @NSIS_EXEC@ gsmartcontrol.nsi
|
||||||
|
mv nsis-dist/$(PACKAGE)-$(VERSION).exe .
|
||||||
|
cd nsis-dist && @NSIS_EXEC@ /DNO_GTK gsmartcontrol.nsi
|
||||||
|
mv nsis-dist/$(PACKAGE)-$(VERSION)-nogtk.exe .
|
||||||
|
|
||||||
|
nsis-dist-cleanup:
|
||||||
|
rm -rf nsis-dist
|
||||||
|
|
||||||
|
nsis-dist: nsis-dist-nocleanup nsis-dist-cleanup
|
||||||
|
|
||||||
|
|
||||||
|
win-zip-dist-prepare:
|
||||||
|
cp -a win-dist $(WIN_ZIP_NAME)
|
||||||
|
cp -a win-dist $(WIN_ZIP_NOGTK_NAME)
|
||||||
|
cp -a "@WINDOWS_BINDIR@"/"@GTK_INSTALLER_NAME@"/* $(WIN_ZIP_NAME)/
|
||||||
|
|
||||||
|
win-zip-dist-nocleanup: win-zip-dist-prepare
|
||||||
|
zip -K -9r $(WIN_ZIP_NAME).zip $(WIN_ZIP_NAME) -x $(WIN_ZIP_NAME)/doc/distribution-nogtk.txt
|
||||||
|
zip -K -9r $(WIN_ZIP_NOGTK_NAME).zip $(WIN_ZIP_NOGTK_NAME) -x $(WIN_ZIP_NOGTK_NAME)/doc/distribution.txt
|
||||||
|
|
||||||
|
win-zip-dist-cleanup:
|
||||||
|
rm -rf $(WIN_ZIP_NAME)
|
||||||
|
rm -rf $(WIN_ZIP_NOGTK_NAME)
|
||||||
|
|
||||||
|
win-zip-dist: win-zip-dist-nocleanup win-zip-dist-cleanup
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
distclean-local: gch-clean win-dist-clean
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,56 +1,3 @@
|
|||||||
Version 1.1.3, released on 2017-11-12
|
|
||||||
Fixed gsmartcontrol-root not launching if GDK_* variables are not set.
|
|
||||||
|
|
||||||
Version 1.1.2, released on 2017-11-11
|
|
||||||
Fixed gsmartcontrol-root not passing GDK_SCALE and GDK_DPI_SCALE variables
|
|
||||||
to gsmartcontrol when using PolKit.
|
|
||||||
Fixed blurriness of icons in the main window with GDK_SCALE=2.
|
|
||||||
Tweaked the main window interface.
|
|
||||||
Windows: Show volume labels beside drive letters in icon tooltips.
|
|
||||||
|
|
||||||
Version 1.1.1, released on 2017-09-25
|
|
||||||
Windows: Use Adwaita GTK+ theme for systems which support Classic Windows
|
|
||||||
theme, since the default win32 GTK+ theme is broken in it; this
|
|
||||||
includes Windows 7 and Windows Server.
|
|
||||||
Statistics entry values are formatted with commas for readability.
|
|
||||||
Moved help information to website.
|
|
||||||
|
|
||||||
Version 1.1.0, released on 2017-09-07
|
|
||||||
New Statistics, Temperature Log, Error Recovery, Physical and Directory
|
|
||||||
tabs.
|
|
||||||
General tab shows non-SMART device settings as well.
|
|
||||||
Attributes tab shows entries in "brief" format.
|
|
||||||
Error Log tab shows Extended error log by default (if supported).
|
|
||||||
Self-Test Log tab now shows Extended self-test log by default (if
|
|
||||||
supported).
|
|
||||||
GSmartControl now uses "-x" equivalent for retrieving data (as upposed to
|
|
||||||
"-a"); loading "-x" outputs as virtual drives is also supported.
|
|
||||||
Implemented ability to copy rows in CSV format from Attribute, Statistics
|
|
||||||
and Self-Test Log tables.
|
|
||||||
Implemented "Update Drive Database" functionality.
|
|
||||||
Windows: Drive letters are shown for each drive.
|
|
||||||
Scan time is shown under virtual drive icons.
|
|
||||||
Polkit is supported with gsmartcontrol-root script now.
|
|
||||||
Pcrecpp is no longer bundled, use system-installed one instead.
|
|
||||||
Smartmontools version 5.43 is required at runtime.
|
|
||||||
Other minor improvements and fixes.
|
|
||||||
|
|
||||||
Version 1.0.2, released on 2017-07-21
|
|
||||||
Fixed incomplete capturing of smartctl output under Windows.
|
|
||||||
Added missing icons under Windows.
|
|
||||||
Fixed being able to turn on AODC even if unsupported.
|
|
||||||
|
|
||||||
Version 1.0.1, released on 2017-06-19
|
|
||||||
Fixed compilation under macOS.
|
|
||||||
Fixed compilation under Fedora Rawhide.
|
|
||||||
Don't use -mtune=generic for all targets.
|
|
||||||
|
|
||||||
Version 1.0.0, released on 2017-06-16
|
|
||||||
Ported to GTK+ 3.
|
|
||||||
Tweaked the user interface a bit.
|
|
||||||
Dropped support for Windows XP, 2000 and 2003 (they are no longer
|
|
||||||
supported by GTK+).
|
|
||||||
Fixed detection of newer system-installed smartmontools under Windows.
|
|
||||||
|
|
||||||
Version 0.9.0, released on 2017-05-11
|
Version 0.9.0, released on 2017-05-11
|
||||||
Implemented (untested) support for Linux-based Areca controllers with
|
Implemented (untested) support for Linux-based Areca controllers with
|
||||||
@@ -0,0 +1,422 @@
|
|||||||
|
|
||||||
|
About GSmartControl
|
||||||
|
|
||||||
|
GSmartControl - Hard disk drive and SSD health inspection tool.
|
||||||
|
|
||||||
|
GSmartControl is a graphical user interface for smartctl (from smartmontools
|
||||||
|
package, see http://smartmontools.sourceforge.net), which is a tool for
|
||||||
|
querying and controlling SMART (Self-Monitoring, Analysis, and Reporting
|
||||||
|
Technology) data on modern hard disk and solid-state drives. It allows you to
|
||||||
|
inspect the drive's SMART data to determine its health, as well as run various
|
||||||
|
tests on it.
|
||||||
|
|
||||||
|
Note: GSmartControl supports ATA drives (both PATA and SATA), various USB to
|
||||||
|
ATA bridges and drives behind some RAID controllers (selected models of
|
||||||
|
3ware, Areca, Adaptec, Intel RAID controllers).
|
||||||
|
|
||||||
|
http://gsmartcontrol.sourceforge.net
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Features
|
||||||
|
|
||||||
|
* automatically reports and highlights any anomalies;
|
||||||
|
|
||||||
|
* allows enabling/disabling SMART;
|
||||||
|
|
||||||
|
* allows enabling/disabling Automatic Offline Data Collection - a short
|
||||||
|
self-check that the drive will perform automatically every four hours with no
|
||||||
|
impact on performance;
|
||||||
|
|
||||||
|
* supports configuration of global and per-drive options for smartctl;
|
||||||
|
|
||||||
|
* performs SMART self-tests;
|
||||||
|
|
||||||
|
* displays drive identity information, capabilities, attributes, and
|
||||||
|
self-test/error logs;
|
||||||
|
|
||||||
|
* can read in smartctl output from a saved file, interpreting it as a
|
||||||
|
read-only virtual device;
|
||||||
|
|
||||||
|
* works on most smartctl-supported operating systems;
|
||||||
|
|
||||||
|
* has extensive help information.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
What Is SMART?
|
||||||
|
|
||||||
|
Short answer: SMART is a technology which provides hard disk drives with
|
||||||
|
methods to predict certain kinds of failures with certain chance of success.
|
||||||
|
|
||||||
|
Long answer: read below.
|
||||||
|
|
||||||
|
Self-Monitoring, Analysis, and Reporting Technology, or SMART, is a
|
||||||
|
monitoring system for hard drives and SSDs to detect and report various
|
||||||
|
indicators of reliability, in the hope of anticipating failures. SMART is
|
||||||
|
implemented inside the drives, providing several ways of monitoring the drive
|
||||||
|
health. It may present information about general health, various drive
|
||||||
|
attributes (for example, number of unreadable sectors), error logs, and so on.
|
||||||
|
It may also provide ways to instruct the drive to run various self-tests,
|
||||||
|
which may report valuable information. It may even automatically scan the disk
|
||||||
|
surface in when the drive is idle, repairing the defects while reallocating
|
||||||
|
the data to more safe areas.
|
||||||
|
|
||||||
|
While having SMART sounds really good, there are some nuances to consider. One
|
||||||
|
of the common pitfalls is that it may create a false sense of security. That
|
||||||
|
is, a perfectly good SMART data is NOT an indication that the drive won't fail
|
||||||
|
the next minute. The reverse is also true - some drives may function perfectly
|
||||||
|
even with not-so-good-looking SMART data. However, as studies indicate, given
|
||||||
|
a large population of drives, some SMART attributes may reliably predict
|
||||||
|
drive failures within up to two months.
|
||||||
|
|
||||||
|
Another common mistake is to assume that the attribute values are the real
|
||||||
|
physical values, as experienced by the drive. As manufacturers do not
|
||||||
|
necessarily agree on precise attribute definitions and measurement units, the
|
||||||
|
exact meaning of the attributes may vary greatly across different drive
|
||||||
|
models.
|
||||||
|
|
||||||
|
At present SMART is implemented individually by manufacturers. While some
|
||||||
|
aspects are standardized for compatibility, others are not. In fact, most
|
||||||
|
manufacturers refer the users to their own health monitoring utilities and
|
||||||
|
advice against taking SMART data seriously. Nevertheless, SMART may prove an
|
||||||
|
effective measure against data loss.
|
||||||
|
|
||||||
|
Yet another issue is that quite often the drives have bugs which prevent
|
||||||
|
correct SMART usage. This is usually due to buggy firmware, or the
|
||||||
|
manufacturer ignoring the standards. Luckily, smartmontools usually detects
|
||||||
|
these bugs and works around them.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Software Requirements
|
||||||
|
|
||||||
|
You need to have the following software installed:
|
||||||
|
|
||||||
|
* pcre - http://www.pcre.org .
|
||||||
|
|
||||||
|
* smartmontools - see http://smartmontools.sourceforge.net .
|
||||||
|
|
||||||
|
* GTK+, version 2.6 or higher - see http://www.gtk.org .
|
||||||
|
|
||||||
|
* Gtkmm, version 2.6 or higher - see http://www.gtkmm.org .
|
||||||
|
|
||||||
|
* libglademm, version 2.4 or higher - see http://www.gtkmm.org .
|
||||||
|
Note: libglademm is not needed when using GTK+ / Gtkmm 2.12 or newer.
|
||||||
|
|
||||||
|
Note that having GTK+ 2.12 and Gtkmm 2.12 is HIGHLY recommended. While earlier
|
||||||
|
versions may work, they may produce suboptimal results and buggy behavior.
|
||||||
|
|
||||||
|
Most of these packages are probably already provided by your distribution.
|
||||||
|
Here are the packages you need to have to build GSmartControl on some Linux
|
||||||
|
distributions:
|
||||||
|
|
||||||
|
openSUSE, SLES, SLED:
|
||||||
|
gcc-c++, pcre-devel, gtkmm2-devel, (possibly) libglademm-devel.
|
||||||
|
|
||||||
|
Fedora, CentOS, RHEL:
|
||||||
|
gcc-c++, pcre-devel, gtkmm24-devel, (possibly) libglademm24-devel.
|
||||||
|
|
||||||
|
Mandriva:
|
||||||
|
gcc-c++, gcc-cpp, libpcre-devel, gtkmm2.4-devel, (possibly)
|
||||||
|
libglademm2.4-devel.
|
||||||
|
|
||||||
|
Ubuntu, Debian GNU/Linux:
|
||||||
|
g++, libpcre3-dev, libgtkmm-2.4-dev, (possibly) libglademm-2.4-dev.
|
||||||
|
|
||||||
|
Note that usually you need to specify only these packages - the rest is
|
||||||
|
installed automatically by the package manager's dependency resolver. Keep in
|
||||||
|
mind that you also need smartmontools to run the program.
|
||||||
|
|
||||||
|
Note: If using the official Windows package, the requirements are listed on
|
||||||
|
GSmartControl's website.
|
||||||
|
|
||||||
|
|
||||||
|
The following operating systems are supported:
|
||||||
|
|
||||||
|
* Linux - All the popular configurations should work.
|
||||||
|
|
||||||
|
* FreeBSD - Tested with DesktopBSD 1.6 (FreeBSD 6.3) / x86.
|
||||||
|
|
||||||
|
* NetBSD - Tested with NetBSD 4.0.1 / x86.
|
||||||
|
|
||||||
|
* OpenBSD - Tested with OpenBSD 4.3 / x86-64 / gcc-3.3.5.
|
||||||
|
|
||||||
|
* Windows (2000 SP4 or newer) - Tested with Windows 2000 SP4, Windows XP SP3,
|
||||||
|
Windows Vista SP2 (32-bit and 64-bit), Windows 7 SP1 (32-bit and 64-bit). The
|
||||||
|
Windows port uses pd0, pd1, etc... for physical drives 0, 1, etc... .
|
||||||
|
|
||||||
|
* Solaris - Tested with Solaris 10 / x86 / gcc-3.4.3 / blastwave,
|
||||||
|
Solaris 10 / x86 / sunstudio12 / sunfreeware. OpenSolaris should work but has
|
||||||
|
not been tested yet.
|
||||||
|
|
||||||
|
* Mac OS X - 3rd-party testing by the MacPorts and Fink projects.
|
||||||
|
|
||||||
|
* DragonFlyBSD - Code written but no testing has been performed yet. Expected
|
||||||
|
to work without any issues.
|
||||||
|
|
||||||
|
* QNX - Code written but no testing has been performed yet.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Installation
|
||||||
|
|
||||||
|
Short answer: build and install via: ./configure; make; make install
|
||||||
|
|
||||||
|
Run gsmartcontrol-root to invoke gsmartcontrol with your desktop's su
|
||||||
|
mechanism, or use the desktop menu entry.
|
||||||
|
|
||||||
|
|
||||||
|
Long answer: read below.
|
||||||
|
|
||||||
|
First, check if you can find a pre-built package for your distribution or
|
||||||
|
operating system - they usually provide the best integration and the easiest
|
||||||
|
installation procedure. For Linux, one option is to try the openSUSE Build
|
||||||
|
Service - it provides ready-to-install packages for various popular Linux
|
||||||
|
distributions (openSUSE, Fedora, etc...). See
|
||||||
|
http://download.opensuse.org/repositories/home:/alex_sh/ .
|
||||||
|
|
||||||
|
If you want to compile from source, check that you have all the required
|
||||||
|
dependencies (see Software Requirements section). Then the usual
|
||||||
|
|
||||||
|
./configure; make; make install
|
||||||
|
|
||||||
|
will build and install it. Installation usually requires administrative
|
||||||
|
privileges, but you don't need to install the program in order to run it
|
||||||
|
directly from the build directory.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Smartctl Options
|
||||||
|
|
||||||
|
GSmartControl tries its best to guard the user from having to specify smartctl
|
||||||
|
options. However, this is not always possible due to drive firmware bugs,
|
||||||
|
unimplemented features, and so on. The smartctl manual page contains all the
|
||||||
|
information you may need when dealing with smartctl.
|
||||||
|
See http://smartmontools.sourceforge.net/man/smartctl.8.html
|
||||||
|
|
||||||
|
Additional information is available at http://smartmontools.sourceforge.net
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Command Line Options
|
||||||
|
|
||||||
|
GSmartControl inherits options from GTK+ and other libraries, so be sure to
|
||||||
|
run it with --help option to get a full list of accepted parameters.
|
||||||
|
Note: The Windows version may not have a text output at all, so --help and
|
||||||
|
similar arguments won't have any effect. However, --verbose will still
|
||||||
|
increase the verbosity of a log saved via "Options -> View Execution Log ->
|
||||||
|
Save All".
|
||||||
|
|
||||||
|
The most important parameters are:
|
||||||
|
|
||||||
|
-?, --help - Show help options.
|
||||||
|
|
||||||
|
-l, --no-locale - Don't use system locale.
|
||||||
|
|
||||||
|
-V, --version - Display version information.
|
||||||
|
|
||||||
|
--no-scan - Don't scan devices on startup.
|
||||||
|
|
||||||
|
--no-hide-tabs - Don't hide non-identity tabs when SMART is disabled. Useful
|
||||||
|
for debugging.
|
||||||
|
|
||||||
|
--add-virtual - Load smartctl data from file, creating a virtual drive. You
|
||||||
|
can specify this option multiple times.
|
||||||
|
|
||||||
|
--add-device - Add this device to device list. The format of the device is
|
||||||
|
"<device>::<type>::<extra_args>", where type and extra_args are optional. This
|
||||||
|
option is useful with --no-scan to list certain drives only. You can specify
|
||||||
|
this option multiple times.
|
||||||
|
Example: --add-device /dev/sda --add-device /dev/twa0::3ware,2 --add-device
|
||||||
|
'/dev/sdb::::-T permissive'.
|
||||||
|
|
||||||
|
-v, --verbose - Enable verbose logging; same as --verbosity-level 5.
|
||||||
|
|
||||||
|
-q, --quiet - Disable logging; same as --verbosity-level 0.
|
||||||
|
|
||||||
|
-b, --verbosity-level - Set verbosity level [0-5].
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Permission Problems
|
||||||
|
|
||||||
|
Short answer: you need to be root (that's Administrator in Windows).
|
||||||
|
In X11, use kdesu, gnomesu, sux, xdg-su or similar.
|
||||||
|
|
||||||
|
Long answer: read below.
|
||||||
|
|
||||||
|
Most operating systems prohibit direct access to hardware to users with
|
||||||
|
non-administrative privileges. Unfortunately, to access SMART data, smartctl
|
||||||
|
needs to directly access the hard drive.
|
||||||
|
|
||||||
|
The provided X11 desktop and menu icons should show the "Please enter the root
|
||||||
|
password" dialog boxes, and, after correct information is entered, should run
|
||||||
|
this program with root privileges. The dialogs should be available in most
|
||||||
|
commonly used X11 desktop environments.
|
||||||
|
|
||||||
|
Another way is to use the included gsmartcontrol-root script, which finds the
|
||||||
|
available su program and runs gsmartcontrol with it.
|
||||||
|
|
||||||
|
Yet another way is to manually invoke the program with kdesu, gnomesu, sux or
|
||||||
|
similar programs. For example,
|
||||||
|
|
||||||
|
kdesu -u root -c gsmartcontrol
|
||||||
|
|
||||||
|
will ask for root password and run gsmartcontrol with root privileges. Replace
|
||||||
|
"kdesu" with "gnomesu" if using Gnome. The "sux" or "xdg-su" commands may also
|
||||||
|
help, if neither KDE or GNOME are available.
|
||||||
|
|
||||||
|
Please don't set the "setuid" flag on smartctl binary. It is considered a
|
||||||
|
security risk.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Enable SMART Permanently
|
||||||
|
|
||||||
|
Specifications say that once you set a SMART-related property, it will be
|
||||||
|
preserved across reboots. So, when you, say, enable SMART and Automatic
|
||||||
|
Offline Data Collection, both will stay enabled until you disable them.
|
||||||
|
|
||||||
|
However, BIOS, your operating system, your other operating systems (if
|
||||||
|
present), and various startup programs may affect that. For example, BIOS may
|
||||||
|
enable SMART each time you start your computer, so if you disabled SMART
|
||||||
|
previously, it will be re-enabled on reboot.
|
||||||
|
|
||||||
|
The easiest way to work around this is to set the desired settings on system
|
||||||
|
startup. You may use smartctl or smartd to do that. For example, to enable
|
||||||
|
both SMART and Automatic Offline Data Collection on /dev/sda, one would write
|
||||||
|
the following to the system startup script (e.g. boot.local, rc.local or
|
||||||
|
similar on Linux):
|
||||||
|
|
||||||
|
smartctl -s on -o on /dev/sda
|
||||||
|
|
||||||
|
For more information, see smartctl and smartd documentation.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Known Issues
|
||||||
|
|
||||||
|
Only ATA drives (both PATA and SATA), various USB to ATA bridges and drives
|
||||||
|
behind some RAID controllers are supported for now. The main reasons are:
|
||||||
|
|
||||||
|
* We can't support drives which don't work with smartmontools. This affects
|
||||||
|
drives which don't support SMART or don't export SMART data correctly (e.g.
|
||||||
|
some USB enclosures, RAIDs, etc...).
|
||||||
|
|
||||||
|
* Smartctl's output for SCSI drives is completely different compared to ATA.
|
||||||
|
Also, SCSI drives are rarely found in desktop systems and the servers rarely
|
||||||
|
have X11 / Gtkmm running, so this is a low priority task.
|
||||||
|
|
||||||
|
* I only have ATA drives, so testing anything else is very difficult.
|
||||||
|
|
||||||
|
Immediate Offline Tests are not supported. I haven't found a way to reliably
|
||||||
|
monitor them yet. Besides, they run automatically anyway if Automatic Offline
|
||||||
|
Data Collection is enabled.
|
||||||
|
|
||||||
|
Testing is only supported on drives which correctly report their progress
|
||||||
|
information in capabilities.
|
||||||
|
|
||||||
|
Not all drives support disabling Automatic Offline Data Collection, even if
|
||||||
|
they report otherwise. Unfortunately, there's no way to detect such drives.
|
||||||
|
|
||||||
|
Running on GTK+ / Gtkmm versions earlier than 2.12 may cause visual artifacts,
|
||||||
|
usability issues (especially with tooltips and icons), instability, etc...
|
||||||
|
|
||||||
|
The texts probably contain a lot of grammatical errors, English being my third
|
||||||
|
language and all.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Reporting Bugs
|
||||||
|
|
||||||
|
If it is a SMART or drive-related problem, please try to test it with smartctl
|
||||||
|
first. Chances are, the problem you're experiencing is not tied to
|
||||||
|
GSmartControl, but is a drive firmware or smartctl problem. For example, to
|
||||||
|
see a complete information about your /dev/sda drive, type the following in a
|
||||||
|
terminal emulator (e.g., xterm, konsole or gnome-terminal):
|
||||||
|
|
||||||
|
smartctl -a /dev/sda
|
||||||
|
|
||||||
|
Note: If using Windows, the device name should be /dev/pd1 for the second
|
||||||
|
physical drive, etc... .
|
||||||
|
|
||||||
|
If you still think it's a GSmartControl issue, please collect the following
|
||||||
|
information about your system. Without it, it may be very hard or impossible
|
||||||
|
to fix the bug.
|
||||||
|
|
||||||
|
* Which operating system you use (for example, openSUSE Linux 11.4).
|
||||||
|
|
||||||
|
* Which version of GTK and Gtkmm you have installed. Finding this out is very
|
||||||
|
distribution-specific. For example, on openSUSE it would be
|
||||||
|
"rpm -q gtk2 gtkmm2". Some distributions have gtkmm24 instead. You may also
|
||||||
|
search them in your distribution's graphical package manager, if there is one.
|
||||||
|
|
||||||
|
* Execution log from the program, if possible. To obtain it, run the program
|
||||||
|
with -v option, e.g. (type the following in a terminal emulator or Run
|
||||||
|
dialog):
|
||||||
|
|
||||||
|
gsmartcontrol-root auto -v
|
||||||
|
|
||||||
|
Note: On Windows, run gsmartcontrol.exe with "-v" switch as Administrator.
|
||||||
|
|
||||||
|
Perform the steps needed to reproduce the bug, then go to
|
||||||
|
"Options -> View Execution Log", and click "Save All".
|
||||||
|
|
||||||
|
* Detailed description of steps you performed when the bug occurred.
|
||||||
|
|
||||||
|
Once you have this information, send an email to me, Alexander Shaduri
|
||||||
|
<ashaduri 'at' gmail.com>. Note that I may refer you to smartmontools support
|
||||||
|
if it's a bug in smartmontools and not GSmartControl. Normally, I won't
|
||||||
|
redirect your support request to them myself, because they may ask questions
|
||||||
|
which only you have the answers to.
|
||||||
|
|
||||||
|
Please read the "License and Copyright" and "Patch Licensing" sections before
|
||||||
|
sending any patches.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
License and Copyright
|
||||||
|
|
||||||
|
For license information, see LICENSE_gsmartcontrol.txt file.
|
||||||
|
|
||||||
|
You may notice that GSmartControl is not licensed under "GNU GPL version X or
|
||||||
|
later", but under "GNU GPL version X and Y". I firmly believe that it's unwise
|
||||||
|
to license a piece of code under non-existent licenses, whatever anyone else
|
||||||
|
might say. The reason for this is that one simply CANNOT know that, say, in 20
|
||||||
|
years FSF won't be bought by some corporation who will release GPL version Z
|
||||||
|
which will completely reverse the reasons GPL was created for.
|
||||||
|
|
||||||
|
The removal of "or later" clause somewhat imposes responsibility on the
|
||||||
|
copyright holders to review every future version of the license once it's
|
||||||
|
released, and, if deemed acceptable, re-license the code under the new license
|
||||||
|
(possibly retaining the old licenses). Unfortunately, this is a necessary
|
||||||
|
inconvenience we will have to deal with.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Patch Licensing
|
||||||
|
|
||||||
|
Due to reasons described in "License and Copyright" section, to make it
|
||||||
|
possible to re-license the code without tracking down all the people who ever
|
||||||
|
wrote a patch, the copyrights of all minor patches must be assigned to the
|
||||||
|
central copyright holder of the project. If the patch is major enough (that
|
||||||
|
is, it forms a significant part of the program source code), the author may
|
||||||
|
retain the copyright, if he or she chooses to do so. However, unless the
|
||||||
|
author plans to maintain his part of the source code, he / she is humbly asked
|
||||||
|
to consider assigning away his / her copyright. A simple "I disclaim all
|
||||||
|
copyright to this patch" by the author is sufficient. All credits will be
|
||||||
|
mentioned in product documentation, whatever the size of the patch is.
|
||||||
|
|
||||||
|
Please note that centralization of copyright is needed to maintain a
|
||||||
|
reasonably healthy legal status of the project. Also note that this method is
|
||||||
|
not unique - FSF and many other organizations require exactly the same thing.
|
||||||
|
|
||||||
|
Some contributors may have reasonable doubts about the future status of this
|
||||||
|
project. Let me assure you that this project will never have more restrictive
|
||||||
|
license than GPLv2. If, some time in the future, the GPL is somehow
|
||||||
|
invalidated in court, the project will be re-licensed under similar (in
|
||||||
|
spirit) license, if possible, or a license less restrictive than GPL (for
|
||||||
|
example, the three-clause BSD license).
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,250 @@
|
|||||||
|
|
||||||
|
|
||||||
|
GTKMM Notes:
|
||||||
|
|
||||||
|
To transfer an ownership from your local code to a container, use
|
||||||
|
Gtk::Button* pButton = Gtk::manage(new Gtk::Button("Test"));
|
||||||
|
container->add(*pButton);
|
||||||
|
(add() takes an object by reference).
|
||||||
|
otherwise, you will need to delete() it.
|
||||||
|
|
||||||
|
local scope destruction also works if using stack variables.
|
||||||
|
{
|
||||||
|
Gtk::Button aButton;
|
||||||
|
// destroyed here
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
A treeview (also iconview, combobox) from glade comes
|
||||||
|
with existing model, which should be unset.
|
||||||
|
|
||||||
|
|
||||||
|
Bugs / patches:
|
||||||
|
Patch pangomm for Pango::strip_markup().
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
--------------------------------------------------------
|
||||||
|
|
||||||
|
TODO:
|
||||||
|
|
||||||
|
Don't rely on smartctl return code (2), parse the output instead.
|
||||||
|
This will allow us to show the Info page.
|
||||||
|
|
||||||
|
?Fix not being able to quit while executing commands.
|
||||||
|
Cannot reproduce.
|
||||||
|
https://www.google.com/search?client=opera&q=IA__gtk_main_quit:+assertion+%60main_loops+!=+NULL'+failed&sourceid=opera&ie=utf-8&oe=utf-8&channel=suggest
|
||||||
|
https://developer.gnome.org/gtk2/2.24/gtk2-General.html#gtk-main-quit
|
||||||
|
https://www.google.com/search?num=50&hl=en&safe=off&client=opera&hs=Dr5&channel=suggest&q=calling+gtk_main_quit+during+gtk_main_iteration+warning&oq=calling+gtk_main_quit+during+gtk_main_iteration+warning&gs_l=serp.12...7064.8155.0.12753.8.8.0.0.0.0.216.935.0j6j1.7.0.les%3B..0.0...1c.1.4.serp.GUiDL5IM2U8
|
||||||
|
https://developer.gnome.org/glib/2.34/glib-The-Main-Event-Loop.html#g-main-loop-quit
|
||||||
|
|
||||||
|
Port to GTK2 with disable-deprecated flags, then GTK3.
|
||||||
|
Drop support for old distros.
|
||||||
|
|
||||||
|
|
||||||
|
In main window add multi-selection support and right-click menu with various
|
||||||
|
tests, so that it's possible to run multiple tests in parallel from there.
|
||||||
|
|
||||||
|
|
||||||
|
Areca detection
|
||||||
|
Linux:
|
||||||
|
Somehow differentiate between the cards with expanders (-d areca,N/E) and without (-d areca,N).
|
||||||
|
The expander ones seem to have "ix" (case-insensitive) as their name suffixes.
|
||||||
|
areca,N - N is [1,24].
|
||||||
|
areca,N/E - N is [1,128], E is [1,8].
|
||||||
|
We should limit these using some config key (36 for N and 4 for E seems ok).
|
||||||
|
N/E syntax is since smartmontools 5.43.
|
||||||
|
For older versions we get: /dev/<something>: Option -d areca,N requires N to be a non-negative integer
|
||||||
|
Windows Detection:
|
||||||
|
Credit Richard Kagerer.
|
||||||
|
|
||||||
|
|
||||||
|
Credit Fabrice Bacchella for Linux CCISS detection.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Add ability (through ctrl-C?) to copy individual rows from attributes page,
|
||||||
|
in tab-separated format (for easy pasting into libreoffice).
|
||||||
|
|
||||||
|
|
||||||
|
Investiage the new "-l ssd" and "-l devstat" options (since 5.42)
|
||||||
|
|
||||||
|
Check also other options in 5.42 and 5.43.
|
||||||
|
"-g all" looks promising alongside -i (shows APM and other stuff as well).
|
||||||
|
|
||||||
|
Add --identify option to context menu, for convenience.
|
||||||
|
|
||||||
|
Add menu item - "update drive database" (not sure about linux, should
|
||||||
|
check if it's supported first; also need to run it in terminal).
|
||||||
|
|
||||||
|
|
||||||
|
Testing:
|
||||||
|
If ETA time has elapsed, but it's still only at 10% completion,
|
||||||
|
ETA 0 is displayed. Fix.
|
||||||
|
If smartctl -t ... returns an error, testing=true should not be set.
|
||||||
|
Can't reproduce it?
|
||||||
|
Detect running tests on launch (maybe ask the user too? some tests
|
||||||
|
may be stuck due to bad firmware, e.g. 3ware/windows).
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
48-bit ATA command support:
|
||||||
|
'-l xerror' -> Extended Comprehensive Error log: An multi-sector and
|
||||||
|
LBA48 capable version of '-l error'. Output is similar, except more
|
||||||
|
entries can exists and the high bytes of the registers are also printed.
|
||||||
|
Some newer drives (Samsung) only write to this log.
|
||||||
|
|
||||||
|
'-l xselftest' -> Extended Self Test Log: An multi-sector and LBA48
|
||||||
|
capable version of '-l selftest'. Output will be similar, except more
|
||||||
|
entries can exists and the LBA values can be somewhat longer.
|
||||||
|
|
||||||
|
"smartctl -l this_wont_exist" gives the list of supported logs - this
|
||||||
|
is needed to detect xerror / xselftest support in smartctl.
|
||||||
|
|
||||||
|
|
||||||
|
Rework drive properties UI:
|
||||||
|
use 48-bit or not or auto.
|
||||||
|
Enable/disable/dont_touch SMART on startup for this drive.
|
||||||
|
Enable/disable/dont_touch AODC on startup for this drive.
|
||||||
|
Add --init-smart-only option to only apply the SMART/AODC enabling status
|
||||||
|
from the drive properties.
|
||||||
|
Add also --no-init-smart to avoid doing that on GUI startup.
|
||||||
|
|
||||||
|
Notifications:
|
||||||
|
Tied to (drive::subdrive, notif_key, exact_value(optional)).
|
||||||
|
If exact_value isn't specified when ignoring, notify on every value change.
|
||||||
|
Ignore options:
|
||||||
|
Per-drive: Ignore all notifications for this key, ignore only this value.
|
||||||
|
Don't generate multiple notifications for the same drive/key combo.
|
||||||
|
Clearing in preferences: Clear all ignored, clear ignored for this drive, clear individual.
|
||||||
|
Soft-warnings require "-a" by default, tricky for scsi (maybe try -a, then -i?).
|
||||||
|
|
||||||
|
Monitor:
|
||||||
|
Needs root access, so not gonna happen until the dbus/udisks stuff
|
||||||
|
is finalized.
|
||||||
|
Same program, add --tray option to start in tray only.
|
||||||
|
Option to enable the tray icon.
|
||||||
|
Option to continue running in the tray on window close.
|
||||||
|
Use freedesktop notifications when notifications are generated
|
||||||
|
and we're running in tray only.
|
||||||
|
Don't generate the same notification at a single run time if it was
|
||||||
|
ignored (untouched) by the user; Change the tray icon and
|
||||||
|
show them in the main window instead.
|
||||||
|
Periodically re-run smartctl to refresh the notifications.
|
||||||
|
Periodically see if drives were added / removed (possibly use OS callbacks
|
||||||
|
instead of polling?)
|
||||||
|
|
||||||
|
Win7 widget:
|
||||||
|
Can be done in html/js.
|
||||||
|
Shows temperature
|
||||||
|
Detects drives
|
||||||
|
Opens GSmartControl
|
||||||
|
|
||||||
|
If a drive is not recognized, suggest using -d (sat, sat,12, ...)
|
||||||
|
Refer the user to
|
||||||
|
http://sourceforge.net/apps/trac/smartmontools/wiki/Supported_USB-Devices
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
RAID:
|
||||||
|
http://sourceforge.net/apps/trac/smartmontools/wiki/Supported_RAID-Controllers
|
||||||
|
|
||||||
|
Areca Windows:
|
||||||
|
Detection not supported by smartctl --scan-open.
|
||||||
|
|
||||||
|
Areca FreeBSD: since 5.42.
|
||||||
|
Call as: smartctl -a -d areca,[1-24] /dev/arcmsr1
|
||||||
|
|
||||||
|
3ware FreeBSD:
|
||||||
|
Call as: smartctl -i -d 3ware,[0-127] /dev/twa0 (or twe0)
|
||||||
|
Detection: unknown.
|
||||||
|
|
||||||
|
LSI MegaRAID (SCSI/SAS), Linux:
|
||||||
|
Call as: smartctl -i -d megaraid,[0-?] /dev/sda
|
||||||
|
We should differentiate between ordinary sda and RAID one (not sure if sda is detected).
|
||||||
|
Detection: unknown.
|
||||||
|
|
||||||
|
HighPoint RocketRAID ((S)ATA) Linux:
|
||||||
|
Call as: smartctl -i -d hpt,[1-8]/[1-8] /dev/sda
|
||||||
|
Call as: smartctl -i -d hpt,[1-8]/[1-8]/[1-15] /dev/sda
|
||||||
|
Note: /dev/sda should be derived from this controller.
|
||||||
|
We should differentiate between ordinary sda and RAID one (not sure if sda is detected).
|
||||||
|
Smartctl docs specify smaller limits, but the code says these are the ones.
|
||||||
|
Detection: unknown.
|
||||||
|
|
||||||
|
HighPoint RocketRAID ((S)ATA) FreeBSD:
|
||||||
|
Call as: smartctl -i -d hpt,[1-8]/[1-8] /dev/hptrr
|
||||||
|
Call as: smartctl -i -d hpt,[1-8]/[1-8]/[1-15] /dev/hptrr
|
||||||
|
Note: /dev/hptrr should be derived from this controller.
|
||||||
|
Smartctl docs specify smaller limits, but the code says these are the ones.
|
||||||
|
Detection: unknown.
|
||||||
|
TODO: Analyze sent info.
|
||||||
|
|
||||||
|
CCISS (HP (Compaq) Smart Array Controller) FreeBSD:
|
||||||
|
Seems to be the same as Linux (uses the same driver?).
|
||||||
|
Detection: unknown.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
libdebug:
|
||||||
|
per-channel disabling.
|
||||||
|
per-channel formatting.
|
||||||
|
all flags should be per-channel.
|
||||||
|
bug: if -q is passed, Execution log doesn't contain libdebug log. (requires per-channel status control).
|
||||||
|
use format_time() instead of ctime() and friends, with ISO formatting.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
'-l sataphy' -> SATA Phy event counters: Non-SMART feature, useful to detect SATA cabling problems.
|
||||||
|
|
||||||
|
|
||||||
|
SCT Temperatures
|
||||||
|
-l scttemp prints temperature and history.
|
||||||
|
-t scttempint,N[,p] (N - count, p - preserve across reset or not).
|
||||||
|
This configures temperature logging interval (1 min by default) and clears the history.
|
||||||
|
-l scterc[,...] to get/set the SCT Error Recovery Control time limit (5.40 and newer).
|
||||||
|
|
||||||
|
|
||||||
|
Add detection for Interix (i586-pc-interix3), maybe with debian?
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
----------- SMART stuff ----------
|
||||||
|
|
||||||
|
|
||||||
|
Run one-time Immediate Offline test (-t offline).
|
||||||
|
Offline tests only update Attributes, and if errors are found they will
|
||||||
|
appear in SMART error log. Self-test logs are unaffected.
|
||||||
|
Abort (-X). Abort works with Offline only if there's
|
||||||
|
"Abort Offline collection upon new command" capability.
|
||||||
|
If the drive has "Suspend Offline collection upon new command" capability,
|
||||||
|
immediate offline test may be tracked through --capabilities (not on mine!).
|
||||||
|
If it's "Abort Offline collection upon new command", then the test
|
||||||
|
will abort on --capabilities or --abort.
|
||||||
|
|
||||||
|
|
||||||
|
Polling time
|
||||||
|
The self-test routine recommended polling time shall be equal to the number of minutes that is the minimum
|
||||||
|
recommended time before which the host should first poll for test completion status. Actual test time could
|
||||||
|
be several times this value. Polling before this time could extend the self-test execution time or abort the test
|
||||||
|
depending on the state of bit 2 of the off-line data capability bits.
|
||||||
|
|
||||||
|
Autosave
|
||||||
|
This command enables and disables the optional attribute autosave feature of the device. This command
|
||||||
|
may either allow the device, after some vendor specified event, to save the device updated attribute values
|
||||||
|
to non-volatile memory; or this command may cause the autosave feature to be disabled. The state of the
|
||||||
|
attribute autosave feature (either enabled or disabled) shall be preserved by the device across power cycles.
|
||||||
|
A value of zero written by the host into the device’s Sector Count register before issuing this command shall
|
||||||
|
cause this feature to be disabled. Disabling this feature does not preclude the device from saving SMART
|
||||||
|
data to non-volatile memory during some other normal operation such as during a power-on or power-off
|
||||||
|
sequence or during an error recovery sequence.
|
||||||
|
A value of F1h written by the host into the device’s Sector Count register before issuing this command shall
|
||||||
|
cause this feature to be enabled. Any other meaning of this value or any other non-zero value written by the
|
||||||
|
host into this register before issuing this command may differ from device to device. The meaning of any
|
||||||
|
non-zero value written to this register at this time shall be preserved by the device across power cycles.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,157 @@
|
|||||||
|
|
||||||
|
############################################################################
|
||||||
|
# Copyright:
|
||||||
|
# (C) 2008 - 2009 Alexander Shaduri <ashaduri 'at' gmail.com>
|
||||||
|
# License: See LICENSE_zlib.txt file
|
||||||
|
############################################################################
|
||||||
|
|
||||||
|
|
||||||
|
# APP_CHOOSE_GLD_READER([C|C++][, flags_prefix])
|
||||||
|
# This macro detects whether GtkBuilder (from gtk >= 2.12) or libglade
|
||||||
|
# are present. If the first parameter is C++, then gtkmm and libglademm
|
||||||
|
# are searched for instead.
|
||||||
|
# flags_prefixCFLAGS, flags_prefixCXXFLAGS and flags_prefixLIBS
|
||||||
|
# will be initialized (or appended to) with the correct flags in case of libglade(mm).
|
||||||
|
# app_cv_gld_reader will be set to none, libglade or gtkbuilder.
|
||||||
|
|
||||||
|
# ENABLE_LIBGLADE or ENABLE_GTKBUILDER will be exported to config.h
|
||||||
|
|
||||||
|
# You must call AX_COMPILER_VENDOR before using this macro.
|
||||||
|
|
||||||
|
AC_DEFUN([APP_CHOOSE_GLD_READER], [
|
||||||
|
# These requirements check compile-time presence, not that they were called
|
||||||
|
AC_REQUIRE([AX_COMPILER_VENDOR])
|
||||||
|
|
||||||
|
AC_ARG_ENABLE(abort-if-no-glade-reader, AS_HELP_STRING([--disable-abort-if-no-glade-reader],
|
||||||
|
[disable abort if no glade file reader is found (default: configure aborts when glade file reader is not found)]),
|
||||||
|
[app_cv_abort_if_no_glade_reader=${enableval}], [app_cv_abort_if_no_glade_reader=yes])
|
||||||
|
|
||||||
|
AC_MSG_NOTICE([Abort if no glade file reader is found: $app_cv_abort_if_no_glade_reader])
|
||||||
|
|
||||||
|
# This is just in case
|
||||||
|
# PKG_PROG_PKG_CONFIG()
|
||||||
|
|
||||||
|
# this variable will have values "none", "libglade" or "gtkbuilder".
|
||||||
|
app_cv_gld_reader="none";
|
||||||
|
|
||||||
|
# in case libglade(mm) is found, these will contain the flags.
|
||||||
|
app_cv_gld_reader_CFLAGS="";
|
||||||
|
app_cv_gld_reader_CXXFLAGS="";
|
||||||
|
app_cv_gld_reader_LIBS="";
|
||||||
|
|
||||||
|
app_cv_gld_reader_libglade_name="libglade";
|
||||||
|
app_cv_gld_reader_libglade_pkg_name="libglade-2.0";
|
||||||
|
app_cv_gld_reader_gtk_name="gtk";
|
||||||
|
app_cv_gld_reader_gtk_pkg_name="gtk+-2.0";
|
||||||
|
if test "x$1" = "xC++"; then
|
||||||
|
app_cv_gld_reader_libglade_name="libglademm";
|
||||||
|
app_cv_gld_reader_libglade_pkg_name="libglademm-2.4";
|
||||||
|
app_cv_gld_reader_gtk_name="gtkmm";
|
||||||
|
app_cv_gld_reader_gtk_pkg_name="gtkmm-2.4";
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# Manual control. AC_ARG_ENABLE doesn't get bash variables, so we have
|
||||||
|
# to do it this way. If put inside a shell conditional, it still shows up in configure help.
|
||||||
|
|
||||||
|
AC_ARG_ENABLE(libglade, AS_HELP_STRING([--enable-libglade],
|
||||||
|
[use libglade(mm) instead of GtkBuilder (default: auto)]),
|
||||||
|
[with_libglade=${enableval}], [with_libglade=auto])
|
||||||
|
|
||||||
|
|
||||||
|
# Try gtkbuilder first
|
||||||
|
if test "x$with_libglade" = "xno" || test "x$with_libglade" = "xauto"; then
|
||||||
|
PKG_CHECK_EXISTS([$app_cv_gld_reader_gtk_pkg_name >= 2.12.0],
|
||||||
|
[app_cv_gld_reader="gtkbuilder"])
|
||||||
|
fi
|
||||||
|
if test "$with_libglade" = "no" && test "$app_cv_gld_reader" = "none"; then
|
||||||
|
AC_MSG_ERROR([GtkBuilder support not found (you need $app_cv_gld_reader_gtk_name version 2.12 or higher). Try using $app_cv_gld_reader_libglade_name instead.])
|
||||||
|
fi
|
||||||
|
|
||||||
|
# libglade specified, or auto and no gtkbuilder. gtkmm2.4-compatible libglademm is >= 2.4.0.
|
||||||
|
# (not sure about libglade version).
|
||||||
|
if test "x$app_cv_gld_reader" = "xnone"; then
|
||||||
|
if test "x$app_cv_gld_reader_libglade_name" = "xlibglade"; then
|
||||||
|
# libglade
|
||||||
|
PKG_CHECK_MODULES([LIBGLADE], [$app_cv_gld_reader_libglade_pkg_name >= 2.4.0],
|
||||||
|
[app_cv_gld_reader="libglade"], [AC_MSG_WARN([$LIBGLADE_PKG_ERRORS])])
|
||||||
|
app_cv_gld_reader_CFLAGS="$LIBGLADE_CFLAGS";
|
||||||
|
app_cv_gld_reader_CXXFLAGS="$LIBGLADE_CFLAGS";
|
||||||
|
app_cv_gld_reader_LIBS="$LIBGLADE_LIBS";
|
||||||
|
else
|
||||||
|
# libglademm
|
||||||
|
PKG_CHECK_MODULES([LIBGLADEMM], [$app_cv_gld_reader_libglade_pkg_name >= 2.4.0],
|
||||||
|
[app_cv_gld_reader="libglade"], [AC_MSG_WARN([$LIBGLADEMM_PKG_ERRORS])])
|
||||||
|
app_cv_gld_reader_CFLAGS=""
|
||||||
|
app_cv_gld_reader_CXXFLAGS="$LIBGLADEMM_CFLAGS";
|
||||||
|
app_cv_gld_reader_LIBS="$LIBGLADEMM_LIBS";
|
||||||
|
fi
|
||||||
|
# reset them so they don't interfere later
|
||||||
|
LIBGLADE_CFLAGS="";
|
||||||
|
LIBGLADE_LIBS="";
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "x$with_libglade" = "xyes" && test "x$app_cv_gld_reader" = "xnone"; then
|
||||||
|
AC_MSG_ERROR([$app_cv_gld_reader_libglade_name not found. Try building with GtkBuilder support (you need $app_cv_gld_reader_gtk_name version 2.12 or higher).])
|
||||||
|
fi
|
||||||
|
|
||||||
|
# still not found.
|
||||||
|
if test "$app_cv_gld_reader" = "none"; then
|
||||||
|
if test "x$app_cv_abort_if_no_glade_reader" = "xno"; then
|
||||||
|
AC_MSG_WARN([$LIBGLADE_PKG_ERRORS])
|
||||||
|
AC_MSG_WARN([Neither GtkBuilder nor $app_cv_gld_reader_libglade_name found. The program will be unable to compile fully.])
|
||||||
|
else
|
||||||
|
AC_MSG_WARN([Neither GtkBuilder nor $app_cv_gld_reader_libglade_name found.])
|
||||||
|
AC_MSG_ERROR([$LIBGLADE_PKG_ERRORS])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# export the flags
|
||||||
|
if test "x$2" != "x"; then
|
||||||
|
if test "x$$2[]CFLAGS" = "x"; then
|
||||||
|
$2[]CFLAGS="$app_cv_gld_reader_CFLAGS";
|
||||||
|
else
|
||||||
|
$2[]CFLAGS="$$2[]CFLAGS $app_cv_gld_reader_CFLAGS";
|
||||||
|
fi
|
||||||
|
if test "x$$2[]CXXFLAGS" = "x"; then
|
||||||
|
$2[]CXXFLAGS="$app_cv_gld_reader_CXXFLAGS";
|
||||||
|
else
|
||||||
|
$2[]CXXFLAGS="$$2[]CXXFLAGS $app_cv_gld_reader_CXXFLAGS";
|
||||||
|
fi
|
||||||
|
if test "x$$2[]LIBS" = "x"; then
|
||||||
|
$2[]LIBS="$app_cv_gld_reader_LIBS";
|
||||||
|
else
|
||||||
|
$2[]LIBS="$$2[]LIBS $app_cv_gld_reader_LIBS";
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# export to automake.am-s
|
||||||
|
AM_CONDITIONAL([ENABLE_LIBGLADE], [test "$app_cv_gld_reader" = "libglade"])
|
||||||
|
AM_CONDITIONAL([ENABLE_GTKBUILDER], [test "$app_cv_gld_reader" = "gtkbuilder"])
|
||||||
|
|
||||||
|
|
||||||
|
# export to config.h
|
||||||
|
if test "$app_cv_gld_reader" = "libglade"; then
|
||||||
|
AC_DEFINE(ENABLE_LIBGLADE, 1, [Use libglade(mm) instead of GtkBuilder])
|
||||||
|
else
|
||||||
|
AC_DEFINE(ENABLE_LIBGLADE, 0, [Use libglade(mm) instead of GtkBuilder])
|
||||||
|
fi
|
||||||
|
if test "$app_cv_gld_reader" = "gtkbuilder"; then
|
||||||
|
AC_DEFINE(ENABLE_GTKBUILDER, 1, [Use GtkBuilder instead of libglademm])
|
||||||
|
else
|
||||||
|
AC_DEFINE(ENABLE_GTKBUILDER, 1, [Use GtkBuilder instead of libglademm])
|
||||||
|
fi
|
||||||
|
|
||||||
|
# If we move this to the start, some messages get in between, so we have to have it here.
|
||||||
|
AC_MSG_CHECKING([for glade file support])
|
||||||
|
|
||||||
|
AC_MSG_RESULT([$app_cv_gld_reader])
|
||||||
|
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -31,7 +31,7 @@ AC_DEFUN([APP_COMPILER_OPTIONS], [
|
|||||||
|
|
||||||
AC_ARG_ENABLE(common-options, AS_HELP_STRING([--enable-common-options=<compiler>|auto|none],
|
AC_ARG_ENABLE(common-options, AS_HELP_STRING([--enable-common-options=<compiler>|auto|none],
|
||||||
[enable useful compilation options (warnings, mostly). Accepted values are auto, none, gnu, clang, intel, sun. (Default: auto)]),
|
[enable useful compilation options (warnings, mostly). Accepted values are auto, none, gnu, clang, intel, sun. (Default: auto)]),
|
||||||
[app_cv_compiler_common_options=${enableval}], [app_cv_compiler_common_options=none])
|
[app_cv_compiler_common_options=${enableval}], [app_cv_compiler_common_options=auto])
|
||||||
|
|
||||||
# the default value is "yes" (if no value given after =), treat it as auto.
|
# the default value is "yes" (if no value given after =), treat it as auto.
|
||||||
if test "x$app_cv_compiler_common_options" = "xyes" || test "x$app_cv_compiler_common_options" = "xauto"; then
|
if test "x$app_cv_compiler_common_options" = "xyes" || test "x$app_cv_compiler_common_options" = "xauto"; then
|
||||||
@@ -54,14 +54,14 @@ AC_DEFUN([APP_COMPILER_OPTIONS], [
|
|||||||
|| test "x$app_cv_target_os_env" = "xcygwin"; then
|
|| test "x$app_cv_target_os_env" = "xcygwin"; then
|
||||||
# mingw gcc options:
|
# mingw gcc options:
|
||||||
# -mno-cygwin - generate non-cygwin executables in cygwin's mingw.
|
# -mno-cygwin - generate non-cygwin executables in cygwin's mingw.
|
||||||
# -mms-bitfields - make structures compatible with msvc. recommended default for non-cygwin. Default for mingw.
|
# -mms-bitfields - make structures compatible with msvc. recommended default for non-cygwin.
|
||||||
app_cv_compiler_options_cflags="$app_cv_compiler_options_cflags -mms-bitfields"
|
app_cv_compiler_options_cflags="$app_cv_compiler_options_cflags -mms-bitfields"
|
||||||
app_cv_compiler_options_cxxflags="$app_cv_compiler_options_cxxflags -mms-bitfields"
|
app_cv_compiler_options_cxxflags="$app_cv_compiler_options_cxxflags -mms-bitfields"
|
||||||
app_cv_compiler_options_ldflags="$app_cv_compiler_options_ldflags -mms-bitfields"
|
app_cv_compiler_options_ldflags="$app_cv_compiler_options_ldflags -mms-bitfields"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
app_cv_compiler_tmp_var="-Wall -Wcast-align -Wcast-qual -Wconversion \
|
app_cv_compiler_tmp_var="-Wall -Wcast-align -Wcast-qual -Wconversion \
|
||||||
-Wfloat-equal -Wnon-virtual-dtor -Woverloaded-virtual \
|
-Wctor-dtor-privacy -Wfloat-equal -Wnon-virtual-dtor -Woverloaded-virtual \
|
||||||
-Wpointer-arith -Wshadow -Wsign-compare -Wsign-promo -Wundef -Wwrite-strings";
|
-Wpointer-arith -Wshadow -Wsign-compare -Wsign-promo -Wundef -Wwrite-strings";
|
||||||
if test "x$app_cv_compiler_common_options" = "xclang"; then
|
if test "x$app_cv_compiler_common_options" = "xclang"; then
|
||||||
# these are really annoying
|
# these are really annoying
|
||||||
@@ -183,23 +183,10 @@ AC_DEFUN([APP_COMPILER_OPTIONS], [
|
|||||||
app_cv_compiler_options_cxxflags="$app_cv_compiler_options_cxxflags -g0 -O3 -s -march=i686";
|
app_cv_compiler_options_cxxflags="$app_cv_compiler_options_cxxflags -g0 -O3 -s -march=i686";
|
||||||
app_cv_compiler_options_ldflags="$app_cv_compiler_options_ldflags -g0 -O3 -s -march=i686";
|
app_cv_compiler_options_ldflags="$app_cv_compiler_options_ldflags -g0 -O3 -s -march=i686";
|
||||||
else # mingw64, cygwin (they have new gcc), others.
|
else # mingw64, cygwin (they have new gcc), others.
|
||||||
app_cv_compiler_options_cflags="$app_cv_compiler_options_cflags -g0 -O3 -s";
|
app_cv_compiler_options_cflags="$app_cv_compiler_options_cflags -g0 -O3 -s -mtune=generic";
|
||||||
app_cv_compiler_options_cxxflags="$app_cv_compiler_options_cxxflags -g0 -O3 -s";
|
app_cv_compiler_options_cxxflags="$app_cv_compiler_options_cxxflags -g0 -O3 -s -mtune=generic";
|
||||||
app_cv_compiler_options_ldflags="$app_cv_compiler_options_ldflags -g0 -O3 -s";
|
app_cv_compiler_options_ldflags="$app_cv_compiler_options_ldflags -g0 -O3 -s -mtune=generic";
|
||||||
fi
|
fi
|
||||||
# -mtune=generic is only for x86*
|
|
||||||
case "$target" in
|
|
||||||
i686-*)
|
|
||||||
app_cv_compiler_options_cflags="$app_cv_compiler_options_cflags -mtune=generic";
|
|
||||||
app_cv_compiler_options_cxxflags="$app_cv_compiler_options_cxxflags -mtune=generic";
|
|
||||||
app_cv_compiler_options_ldflags="$app_cv_compiler_options_ldflags -mtune=generic";
|
|
||||||
;;
|
|
||||||
x86_64-*)
|
|
||||||
app_cv_compiler_options_cflags="$app_cv_compiler_options_cflags -mtune=generic";
|
|
||||||
app_cv_compiler_options_cxxflags="$app_cv_compiler_options_cxxflags -mtune=generic";
|
|
||||||
app_cv_compiler_options_ldflags="$app_cv_compiler_options_ldflags -mtune=generic";
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# intel / gnu
|
# intel / gnu
|
||||||
elif test "x$app_cv_compiler_optimize_options" = "xintel" && test "x$app_cv_target_os_env" = "xgnu"; then
|
elif test "x$app_cv_compiler_optimize_options" = "xintel" && test "x$app_cv_target_os_env" = "xgnu"; then
|
||||||
@@ -89,7 +89,7 @@ AC_DEFUN([APP_USE_SYSTEM_EXTENSIONS], [
|
|||||||
# See sys/featuretest.h
|
# See sys/featuretest.h
|
||||||
;;
|
;;
|
||||||
|
|
||||||
mingw*)
|
mingw32)
|
||||||
# This enables standards-compliant stdio behaviour (regarding printf and
|
# This enables standards-compliant stdio behaviour (regarding printf and
|
||||||
# friends), as opposed to msvc-compatible one. This is usually enabled
|
# friends), as opposed to msvc-compatible one. This is usually enabled
|
||||||
# by default if one of the usual macros are encountered (_XOPEN_SOURCE,
|
# by default if one of the usual macros are encountered (_XOPEN_SOURCE,
|
||||||
@@ -98,8 +98,14 @@ AC_DEFUN([APP_USE_SYSTEM_EXTENSIONS], [
|
|||||||
# Other things to consider: _NO_OLDNAMES (disable "deprecated"
|
# Other things to consider: _NO_OLDNAMES (disable "deprecated"
|
||||||
# non-underscored names like chdir (use _chdir), etc...).
|
# non-underscored names like chdir (use _chdir), etc...).
|
||||||
# See _mingw.h for details.
|
# See _mingw.h for details.
|
||||||
app_cv_target_extension_cflags="-D__USE_MINGW_ANSI_STDIO=1 -DWINVER=0x0600" # Since Vista
|
app_cv_target_extension_cflags="-D__USE_MINGW_ANSI_STDIO=1 -DWINVER=0x0500"
|
||||||
app_cv_target_extension_cxxflags="-D__USE_MINGW_ANSI_STDIO=1 -DWINVER=0x0600"
|
app_cv_target_extension_cxxflags="-D__USE_MINGW_ANSI_STDIO=1 -DWINVER=0x0500"
|
||||||
|
;;
|
||||||
|
|
||||||
|
mingw64)
|
||||||
|
# Same as ming32, but enable "from xp" mode, since there's no x86_64 2k.
|
||||||
|
app_cv_target_extension_cflags="-D__USE_MINGW_ANSI_STDIO=1 -DWINVER=0x0501"
|
||||||
|
app_cv_target_extension_cxxflags="-D__USE_MINGW_ANSI_STDIO=1 -DWINVER=0x0501"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
interix)
|
interix)
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
# autoconf
|
# autoconf
|
||||||
|
|
||||||
|
|
||||||
autoreconf --verbose --install -W all --force
|
autoreconf --verbose --install -W all
|
||||||
|
|
||||||
|
|
||||||
rm -f config.cache
|
rm -f config.cache
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
stamp="../gsmartcontrol-`date +%F`"
|
||||||
|
echo $stamp
|
||||||
|
|
||||||
|
mkdir $stamp
|
||||||
|
cp -dp * $stamp/
|
||||||
|
|
||||||
|
rm -f $stamp/*pcs # kdevelop persistent store files
|
||||||
|
|
||||||
|
cp -a autoconf.m4/ $stamp/
|
||||||
|
cp -a data/ $stamp/
|
||||||
|
cp -a src/ $stamp/
|
||||||
|
cp -a templates/ $stamp/
|
||||||
|
# cp -a test-data/ $stamp/
|
||||||
|
|
||||||
|
tar cvf $stamp.tar $stamp
|
||||||
|
bzip2 -9 $stamp.tar
|
||||||
|
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Configure a build directory according to developer flags
|
||||||
|
|
||||||
|
type="$1";
|
||||||
|
configure_script="$2";
|
||||||
|
|
||||||
|
if [ "$type" == "" ]; then
|
||||||
|
echo "Usage: $0 <type> [<configure_script>]"
|
||||||
|
echo "where <type> is one of:"
|
||||||
|
echo "debug optimized icc clang win32 win32-debug win64-debug sun portland open64";
|
||||||
|
echo "<configure_script> is ../configure by default"
|
||||||
|
exit 1;
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$configure_script" == "" ]; then
|
||||||
|
configure_script="../configure";
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
flags="";
|
||||||
|
|
||||||
|
case $type in
|
||||||
|
optimized)
|
||||||
|
flags="--disable-user-flags --enable-optimize-options --enable-tests" ;;
|
||||||
|
debug)
|
||||||
|
flags="--enable-debug-options --enable-tests" ;;
|
||||||
|
clang)
|
||||||
|
flags="CC=clang CXX=clang++ --enable-debug-options --enable-tests" ;;
|
||||||
|
icc)
|
||||||
|
flags="CC=icc64 CXX=icpc64 --disable-user-flags --enable-tests" ;;
|
||||||
|
win32)
|
||||||
|
flags="CC=i386-pc-mingw32-gcc CXX=i386-pc-mingw32-g++ \
|
||||||
|
PKG_CONFIG_PATH=/cross/w32/target/lib/pkgconfig PKG_CONFIG_LIBDIR=\"\" \
|
||||||
|
PATH=\"/cross/w32/gcc-bin:/cross/w32/target/bin:$PATH\" \
|
||||||
|
--with-windows-gtk-name=gtk2-runtime-2.24.10-2012-10-10-ash --disable-user-flags \
|
||||||
|
--with-nsis=/root/.wine/drive_c/Programs_x86/NSIS/makensis.exe \
|
||||||
|
--enable-optimize-options --enable-tests --build=i686-linux --host=i386-pc-mingw32" ;;
|
||||||
|
win32-debug)
|
||||||
|
flags="CC=i386-pc-mingw32-gcc CXX=i386-pc-mingw32-g++ \
|
||||||
|
PKG_CONFIG_PATH=/cross/w32/target/lib/pkgconfig PKG_CONFIG_LIBDIR=\"\" \
|
||||||
|
PATH=\"/cross/w32/gcc-bin:/cross/w32/target/bin:$PATH\" \
|
||||||
|
--disable-user-flags --enable-debug-options --enable-tests --build=i686-linux --host=i386-pc-mingw32" ;;
|
||||||
|
win64-debug)
|
||||||
|
flags="CC=x86_64-pc-mingw32-gcc CXX=x86_64-pc-mingw32-g++
|
||||||
|
PKG_CONFIG_PATH=/cross/w64/target/lib/pkgconfig \
|
||||||
|
PKG_CONFIG_LIBDIR=\"\" PATH=\"/cross/w64/gcc-bin:/cross/w64/target/bin:$PATH\" \
|
||||||
|
--disable-user-flags --enable-optimize-options --enable-tests --build=i686-linux \
|
||||||
|
--host=x86_64-pc-mingw32" ;;
|
||||||
|
sun)
|
||||||
|
flags="CC=suncc CXX=sunCC CFLAGS=\"-errwarn=%all -I/opt/sun/target64/include\" \
|
||||||
|
CXXFLAGS=\"-I/opt/sun/target64/include\" PATH=\"/opt/sun/sunstudio/bin:$PATH\" \
|
||||||
|
LDFLAGS=\"-R/opt/sun/target64/lib64 -L/opt/sun/target64/lib64\" \
|
||||||
|
PKG_CONFIG_PATH=\"/opt/sun/target64/lib64/pkgconfig:/usr/lib64/pkgconfig\" \
|
||||||
|
PKG_CONFIG_LIBDIR=\"\" --enable-tests" ;;
|
||||||
|
portland)
|
||||||
|
flags="CC=pgcc CXX=pgCC LDFLAGS=\"-s\" CFLAGS=\"-Minform=warn -Bstatic_pgi\" \
|
||||||
|
CXXFLAGS=\"-Minform=warn -Bstatic_pgi -noswitcherror -define_macro=HZ_NO_COMPILER_AUTOINCLUDE\" \
|
||||||
|
--enable-tests" ;;
|
||||||
|
|
||||||
|
open64)
|
||||||
|
flags="CC=/opt/open64/bin/opencc CXX=/opt/open64/bin/openCC CXXFLAGS=\"-Wall\" \
|
||||||
|
--enable-tests" ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
|
||||||
|
echo "Running:"
|
||||||
|
echo $configure_script $flags;
|
||||||
|
|
||||||
|
$configure_script $flags
|
||||||
|
|
||||||
|
|
||||||
|
exit $?
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
AC_INIT([GSmartControl],[1.1.3],[],[gsmartcontrol])
|
AC_INIT([GSmartControl],[0.9.0],[],[gsmartcontrol])
|
||||||
|
|
||||||
AC_CONFIG_SRCDIR([configure.ac])
|
AC_CONFIG_SRCDIR([configure.ac])
|
||||||
AC_CONFIG_HEADERS([config.h])
|
AC_CONFIG_HEADERS([config.h])
|
||||||
@@ -22,7 +22,6 @@ AC_PROG_CXX
|
|||||||
#AC_PROG_CXXCPP
|
#AC_PROG_CXXCPP
|
||||||
|
|
||||||
#AM_PROG_LIBTOOL
|
#AM_PROG_LIBTOOL
|
||||||
AM_PROG_AR
|
|
||||||
|
|
||||||
# C++ support in checks
|
# C++ support in checks
|
||||||
#AC_LANG([C])
|
#AC_LANG([C])
|
||||||
@@ -64,10 +63,6 @@ APP_DETECT_OS_KERNEL([build], [CONFIG_HOST_KERNEL_])
|
|||||||
# which is important for some compatibility flags (e.g. __func__ visibility, etc...).
|
# which is important for some compatibility flags (e.g. __func__ visibility, etc...).
|
||||||
APP_COMPILER_OPTIONS([])
|
APP_COMPILER_OPTIONS([])
|
||||||
|
|
||||||
# Enable C++11 support. This is implied by gtkmm3, but CentOS7 fails to add it
|
|
||||||
# to gtkmm flags, so we have to enable it manually. Make it optional for Debian 7 (gcc 4.7).
|
|
||||||
AX_CXX_COMPILE_STDCXX([11], [], [optional])
|
|
||||||
|
|
||||||
# Thread support for known configurations.
|
# Thread support for known configurations.
|
||||||
# Sun compiler (at least on linux) has some runtime issues with stringstream
|
# Sun compiler (at least on linux) has some runtime issues with stringstream
|
||||||
# unless we use the thread flags. Also, Linux-based gdb fails to debug
|
# unless we use the thread flags. Also, Linux-based gdb fails to debug
|
||||||
@@ -132,6 +127,9 @@ APP_CXX_EXTERN_C_OVERLOAD
|
|||||||
# This may be needed for pch support
|
# This may be needed for pch support
|
||||||
AC_CHECK_HEADERS([stdc++.h])
|
AC_CHECK_HEADERS([stdc++.h])
|
||||||
|
|
||||||
|
# pcrecpp needs this (break on first function found)
|
||||||
|
AC_CHECK_FUNCS([strtoll _strtoi64], [break])
|
||||||
|
|
||||||
# Non-C99 systems don't have strtof and strtold. some have strtodf for strtof,
|
# Non-C99 systems don't have strtof and strtold. some have strtodf for strtof,
|
||||||
# but let's ignore it. Note: They may be supported by system libc,
|
# but let's ignore it. Note: They may be supported by system libc,
|
||||||
# but not enabled by default (e.g. by glibc feature macros). In that case,
|
# but not enabled by default (e.g. by glibc feature macros). In that case,
|
||||||
@@ -177,7 +175,8 @@ AC_ARG_ENABLE(abort-if-no-gtkmm, AS_HELP_STRING([--disable-abort-if-no-gtkmm],
|
|||||||
|
|
||||||
AC_MSG_NOTICE([Abort if no gtkmm is found: $app_cv_abort_if_no_gtkmm])
|
AC_MSG_NOTICE([Abort if no gtkmm is found: $app_cv_abort_if_no_gtkmm])
|
||||||
|
|
||||||
pkg_modules="gtkmm-3.0 >= 3.4.0"
|
# iconview is available since 2.6.0. gthread is not enabled by default.
|
||||||
|
pkg_modules="gtkmm-2.4 >= 2.6.0" # gthread-2.0 >= 2.0
|
||||||
|
|
||||||
# define ENABLE_GLIB and friends if it's found.
|
# define ENABLE_GLIB and friends if it's found.
|
||||||
gtkmm_found="no"
|
gtkmm_found="no"
|
||||||
@@ -202,38 +201,67 @@ if test "x$gtkmm_found" = "xno"; then
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# GTK flags must be prepended, or glib_config.h conflict between
|
||||||
|
# gtk 2.x and 1.2 may occur.
|
||||||
|
|
||||||
#CFLAGS="$GTKMM_CFLAGS $CFLAGS"
|
#CFLAGS="$GTKMM_CFLAGS $CFLAGS"
|
||||||
CXXFLAGS="$GTKMM_CFLAGS $CXXFLAGS"
|
CXXFLAGS="$GTKMM_CFLAGS $CXXFLAGS"
|
||||||
LIBS="$GTKMM_LIBS $LIBS"
|
LIBS="$GTKMM_LIBS $LIBS"
|
||||||
|
|
||||||
|
|
||||||
|
# Detect libglade / gtkbuilder support
|
||||||
|
|
||||||
|
APP_CHOOSE_GLD_READER([C++], [LIBGLADE_])
|
||||||
|
|
||||||
|
if test "$app_cv_gld_reader" = "libglade"; then
|
||||||
|
CFLAGS="$CFLAGS $LIBGLADE_CFLAGS"
|
||||||
|
CXXFLAGS="$CXXFLAGS $LIBGLADE_CXXFLAGS"
|
||||||
|
LIBS="$LIBS $LIBGLADE_LIBS"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
# -------------------------------------------------------------------------------------
|
# -------------------------------------------------------------------------------------
|
||||||
|
|
||||||
# -------------------------------------------------------------------------------------
|
# -------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
PCRECPP_CFLAGS="";
|
PCRE_CFLAGS="";
|
||||||
PCRECPP_LIBS="";
|
PCRE_LIBS="";
|
||||||
|
|
||||||
# try pkg-config first
|
# try pkg-config first
|
||||||
PKG_CHECK_MODULES(PCRECPP, [libpcrecpp], [pcrecpp_found=yes], [pcrecpp_found=no])
|
PKG_CHECK_MODULES(PCRE, [libpcre], [pcre_found=yes], [pcre_found=no])
|
||||||
|
|
||||||
# if not found, try pcre-config (solaris had it but not pkg-config).
|
# if not found, try pcre-config (solaris had it but not pkg-config).
|
||||||
if test "x$pcrecpp_found" = "xno"; then
|
if test "x$pcre_found" = "xno"; then
|
||||||
AC_PATH_PROG(pcre_config_binary, [pcre-config])
|
AC_PATH_PROG(pcre_config_binary, [pcre-config])
|
||||||
if test "x$pcre_config_binary" != "x"; then
|
if test "x$pcre_config_binary" != "x"; then
|
||||||
PCRE_CFLAGS="`pcre-config --cflags`"
|
PCRE_CFLAGS="`pcre-config --cflags`"
|
||||||
PCRE_LIBS="`pcre-config --libs-cpp`"
|
PCRE_LIBS="`pcre-config --libs`"
|
||||||
else
|
else
|
||||||
# AC_MSG_ERROR([Could not find pcrecpp through pkg-config and pcre-config. Make sure the pcre and pcrecpp libraries are installed])
|
# AC_MSG_ERROR([Could not find pcre through pkg-config and pcre-config. Make sure the pcre libraries are installed])
|
||||||
AC_MSG_ERROR([$PCRECPP_PKG_ERRORS])
|
AC_MSG_ERROR([$PCRE_PKG_ERRORS])
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
CFLAGS="$CFLAGS $PCRECPP_CFLAGS"
|
CFLAGS="$CFLAGS $PCRE_CFLAGS"
|
||||||
CXXFLAGS="$CXXFLAGS $PCRECPP_CFLAGS"
|
CXXFLAGS="$CXXFLAGS $PCRE_CFLAGS"
|
||||||
LIBS="$LIBS $PCRECPP_LIBS"
|
LIBS="$LIBS $PCRE_LIBS"
|
||||||
|
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
# Test stuff here...
|
||||||
|
# <nothing>
|
||||||
|
|
||||||
|
#SDL_VERSION=1.2.0
|
||||||
|
#AM_PATH_SDL($SDL_VERSION, :,
|
||||||
|
# AC_MSG_ERROR([*** SDL version $SDL_VERSION not found!]) )
|
||||||
|
#CFLAGS="$CFLAGS $SDL_CFLAGS"
|
||||||
|
#CXXFLAGS="$CXXFLAGS $SDL_CFLAGS "
|
||||||
|
#LIBS="$LIBS $SDL_LIBS"
|
||||||
|
|
||||||
|
|
||||||
# -------------------------------------------------------------------------------------
|
# -------------------------------------------------------------------------------------
|
||||||
@@ -249,13 +277,17 @@ AC_ARG_WITH([nsis], [AS_HELP_STRING([--with-nsis=<location>|auto],
|
|||||||
["~/.wine/drive_c/Program Files/NSIS/Unicode/makensis.exe" for others)])],
|
["~/.wine/drive_c/Program Files/NSIS/Unicode/makensis.exe" for others)])],
|
||||||
[with_nsis=${withval}], [with_nsis=auto])
|
[with_nsis=${withval}], [with_nsis=auto])
|
||||||
|
|
||||||
AC_ARG_ENABLE([nsis-wine], [AS_HELP_STRING([--enable-nsis-wine=yes|no],
|
AC_ARG_ENABLE([nsis-wine], [AS_HELP_STRING([--enable-nsis-wine=yes|no|auto],
|
||||||
[use wine to run makensis.exe when making NSIS packages (default: no)])],
|
[use wine to run makensis.exe when making NSIS packages (default: auto, which is no for windows, yes for others)])],
|
||||||
[with_nsis_wine=${enableval}], [with_nsis_wine=no])
|
[with_nsis_wine=${enableval}], [with_nsis_wine=yes])
|
||||||
|
|
||||||
AC_ARG_WITH([windows-sysroot], [AS_HELP_STRING([--with-windows-sysroot],
|
AC_ARG_WITH([windows-bindir], [AS_HELP_STRING([--with-windows-bindir],
|
||||||
[specify location of Windows system root directory when making Windows packages (default: /mingw32)])],
|
[specify location of Windows dlls and executables when making Windows packages (default: /cross/w32/target/bin)])],
|
||||||
[with_windows_sysroot=${withval}], [with_windows_sysroot=auto])
|
[with_windows_bindir=${withval}], [with_windows_bindir=auto])
|
||||||
|
|
||||||
|
AC_ARG_WITH([windows-gtk-name], [AS_HELP_STRING([--with-windows-gtk-name],
|
||||||
|
[specify name of Windows GTK+ runtime (installer and unpacked directory) when making Windows packages. It will be looked in windows-bindir.])],
|
||||||
|
[with_windows_gtk_name=${withval}], [with_windows_gtk_name=])
|
||||||
|
|
||||||
if test "x$with_nsis" = "xauto" || test "x$with_nsis" = "x"; then
|
if test "x$with_nsis" = "xauto" || test "x$with_nsis" = "x"; then
|
||||||
# if building on windows, use native paths
|
# if building on windows, use native paths
|
||||||
@@ -266,26 +298,30 @@ if test "x$with_nsis" = "xauto" || test "x$with_nsis" = "x"; then
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if test "x$with_nsis_wine" = "xauto"; then
|
||||||
|
# if not building on windows, use wine
|
||||||
|
if test "x$app_cv_build_os_kernel" = "xwindows32" || test "x$app_cv_build_os_kernel" = "xwindows64"; then
|
||||||
|
with_nsis_wine="no";
|
||||||
|
else
|
||||||
|
with_nsis_wine="yes";
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
NSIS_EXEC="$with_nsis";
|
NSIS_EXEC="$with_nsis";
|
||||||
if test "x$with_nsis_wine" = "xyes"; then
|
if test "x$with_nsis_wine" != "xno"; then
|
||||||
NSIS_EXEC="wine $with_nsis";
|
NSIS_EXEC="wine $with_nsis";
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test "x$with_windows_sysroot" = "xauto" || test "x$with_windows_sysroot" = "x"; then
|
if test "x$with_windows_bindir" = "xauto" || test "x$with_windows_bindir" = "x"; then
|
||||||
with_windows_sysroot="/mingw32"
|
with_windows_bindir="/cross/w32/target/bin"
|
||||||
fi
|
fi
|
||||||
WINDOWS_SYSROOT="$with_windows_sysroot";
|
WINDOWS_BINDIR="$with_windows_bindir";
|
||||||
|
|
||||||
WINDOWS_SUFFIX="";
|
GTK_INSTALLER_NAME="$with_windows_gtk_name";
|
||||||
if test "x$app_cv_target_os_kernel" = "xwindows32"; then
|
|
||||||
WINDOWS_SUFFIX="win32"
|
|
||||||
elif test "x$app_cv_target_os_kernel" = "xwindows64"; then
|
|
||||||
WINDOWS_SUFFIX="win64"
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_SUBST(NSIS_EXEC)
|
AC_SUBST(NSIS_EXEC)
|
||||||
AC_SUBST(WINDOWS_SYSROOT)
|
AC_SUBST(WINDOWS_BINDIR)
|
||||||
AC_SUBST(WINDOWS_SUFFIX)
|
AC_SUBST(GTK_INSTALLER_NAME)
|
||||||
|
|
||||||
|
|
||||||
# -------------------------------------------------------------------------------------
|
# -------------------------------------------------------------------------------------
|
||||||
@@ -310,20 +346,26 @@ AC_SUBST(WINDOWS_ARCH)
|
|||||||
# -------------------------------------------------------------------------------------
|
# -------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
RES_FILES="src/res/gsc_about_dialog.ui \
|
RES_FILES="src/res/gsc_about_dialog.glade \
|
||||||
src/res/gsc_add_device_window.ui \
|
src/res/gsc_add_device_window.glade \
|
||||||
src/res/gsc_executor_log_window.ui \
|
src/res/gsc_executor_log_window.glade \
|
||||||
src/res/gsc_info_window.ui \
|
src/res/gsc_help_window.glade \
|
||||||
src/res/gsc_main_window.ui \
|
src/res/gsc_info_window.glade \
|
||||||
src/res/gsc_preferences_window.ui \
|
src/res/gsc_main_window.glade \
|
||||||
src/res/gsc_text_window.ui \
|
src/res/gsc_preferences_window.glade \
|
||||||
AUTHORS.txt LICENSE_gsmartcontrol.txt"
|
src/res/gsc_text_window.glade \
|
||||||
|
AUTHORS.txt LICENSE_gsmartcontrol.txt README.txt"
|
||||||
|
|
||||||
# Unfortunately, _SOURCES can't contain substitutions, so we use LIBADD.
|
# Unfortunately, _SOURCES can't contain substitutions, so we use LIBADD.
|
||||||
RES_LIBADD="" # .o file to put into .a, libres_a_LIBADD, libres_a_DEPENDENCIES.
|
RES_LIBADD="" # .o file to put into .a, libres_a_LIBADD, libres_a_DEPENDENCIES.
|
||||||
RES_DIST="" # only files in "res" directory, EXTRA_DIST
|
RES_DIST="" # only files in "res" directory, EXTRA_DIST
|
||||||
RES_TARGETS="" # entry for each file in makefile
|
RES_TARGETS="" # entry for each file in makefile
|
||||||
|
|
||||||
|
RES_GLD_EXT="glade"
|
||||||
|
if test "$app_cv_gld_reader" = "gtkbuilder"; then
|
||||||
|
RES_GLD_EXT="ui"
|
||||||
|
fi
|
||||||
|
|
||||||
for RES_FILE in $RES_FILES;
|
for RES_FILE in $RES_FILES;
|
||||||
do # on separate line for portability
|
do # on separate line for portability
|
||||||
RES_BASE=`echo "$RES_FILE" | sed 's/.*\///'` # "a/b/c" -> "c", "c" -> "c"
|
RES_BASE=`echo "$RES_FILE" | sed 's/.*\///'` # "a/b/c" -> "c", "c" -> "c"
|
||||||
@@ -339,14 +381,28 @@ do # on separate line for portability
|
|||||||
RES_FILE_CANON="\$(srcdir)/$RES_BASE" # shorter path, better make behaviour
|
RES_FILE_CANON="\$(srcdir)/$RES_BASE" # shorter path, better make behaviour
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test "$RES_BASE_EXT" = "ui"; then
|
# We use separate source files for gtkbuilder and libglademm, because
|
||||||
RES_LIBADD="$RES_LIBADD $RES_BASE_NOEXT.ui.$ac_objext" # file.ui.o
|
# make dist should be able to bundle both of them separately.
|
||||||
|
|
||||||
|
if test "$RES_BASE_EXT" = "glade"; then
|
||||||
|
|
||||||
|
RES_LIBADD="$RES_LIBADD $RES_BASE_NOEXT.$RES_GLD_EXT.$ac_objext" # file.ui.o or file.glade.o
|
||||||
|
|
||||||
|
# Output both glade and ui rules. This way make dist will be able
|
||||||
|
# to build cpp files of both of them.
|
||||||
|
|
||||||
RES_TARGETS="$RES_TARGETS
|
RES_TARGETS="$RES_TARGETS
|
||||||
$RES_BASE_NOEXT.ui.cpp: $RES_FILE_CANON
|
$RES_BASE_NOEXT.ui.cpp: $RES_FILE_CANON
|
||||||
\"\$(top_srcdir)/file2csource.sh\" \"$RES_FILE_CANON\" \"$RES_BASE_NOEXT.ui.cpp\" \"$RES_BASE_NOEXT\"_ui
|
gtk-builder-convert \"$RES_FILE_CANON\" \"$RES_BASE_NOEXT\".tmp_ui
|
||||||
|
\"\$(top_srcdir)/file2csource.sh\" \"$RES_BASE_NOEXT\".tmp_ui \"$RES_BASE_NOEXT.ui.cpp\" \"$RES_BASE_NOEXT\"_ui
|
||||||
|
"
|
||||||
|
RES_TARGETS="$RES_TARGETS
|
||||||
|
$RES_BASE_NOEXT.glade.cpp: $RES_FILE_CANON
|
||||||
|
\"\$(top_srcdir)/file2csource.sh\" \"$RES_FILE_CANON\" \"$RES_BASE_NOEXT.glade.cpp\" \"$RES_BASE_NOEXT\"_ui
|
||||||
"
|
"
|
||||||
|
|
||||||
else # txt, etc...
|
else # txt, etc...
|
||||||
|
|
||||||
SRC_FILE="$RES_BASE.cpp"
|
SRC_FILE="$RES_BASE.cpp"
|
||||||
RES_LIBADD="$RES_LIBADD $RES_BASE.$ac_objext" # file.txt.o
|
RES_LIBADD="$RES_LIBADD $RES_BASE.$ac_objext" # file.txt.o
|
||||||
|
|
||||||
@@ -389,20 +445,21 @@ CXXFLAGS="$CXXFLAGS $ADDITIONAL_FLAGS"
|
|||||||
# Add global configuration file. Note: It must be searched in top_builddir
|
# Add global configuration file. Note: It must be searched in top_builddir
|
||||||
# first (that's why -I is the first flag), for precompiled headers to work.
|
# first (that's why -I is the first flag), for precompiled headers to work.
|
||||||
|
|
||||||
ADDITIONAL_INCLUDES="-I\$(top_builddir) -I\$(top_srcdir)/src"
|
# Add pcrecpp too, because its files use #<file> on each other.
|
||||||
|
ADDITIONAL_INCLUDES="-I\$(top_builddir) -I\$(top_srcdir)/src -I\$(top_srcdir)/src/pcrecpp"
|
||||||
|
|
||||||
# -include works with gcc, intel, pathscale and sunstudio since 12u1, but doesn't work
|
# -include works with gcc, intel, pathscale and sunstudio since 12u1, but doesn't work
|
||||||
# with pgi and older sunstudio (the one in solaris10, for example).
|
# with pgi and older sunstudio (the one in solaris10, for example).
|
||||||
# Note: some gcc-frontend-based compilers may have to be added here
|
# Note: some gcc-frontend-based compilers may have to be added here
|
||||||
# (e.g. gccfss (gcc frontend / sun backend), etc...).
|
# (e.g. gccfss (gcc frontend / sun backend), etc...).
|
||||||
# We use -include only when using pch.
|
# We use -include only when using pch.
|
||||||
# if test "x$app_cv_compiler_gcc_pch" = "xyes"; then
|
if test "x$app_cv_compiler_gcc_pch" = "xyes"; then
|
||||||
# if test "$ax_cv_cxx_compiler_vendor" = "gnu" || test "$ax_cv_cxx_compiler_vendor" = "clang" \
|
if test "$ax_cv_cxx_compiler_vendor" = "gnu" || test "$ax_cv_cxx_compiler_vendor" = "clang" \
|
||||||
# || test "$ax_cv_cxx_compiler_vendor" = "intel" || test "$ax_cv_cxx_compiler_vendor" = "pathscale"; then
|
|| test "$ax_cv_cxx_compiler_vendor" = "intel" || test "$ax_cv_cxx_compiler_vendor" = "pathscale"; then
|
||||||
# # This auto-includes this file when compiling any file. Benefits include pch support.
|
# This auto-includes this file when compiling any file. Benefits include pch support.
|
||||||
# ADDITIONAL_INCLUDES="$ADDITIONAL_INCLUDES -include global_macros.h"
|
ADDITIONAL_INCLUDES="$ADDITIONAL_INCLUDES -include global_macros.h"
|
||||||
# fi
|
fi
|
||||||
# fi
|
fi
|
||||||
|
|
||||||
# our flags must be before all the others
|
# our flags must be before all the others
|
||||||
#CFLAGS="$ADDITIONAL_INCLUDES $CFLAGS"
|
#CFLAGS="$ADDITIONAL_INCLUDES $CFLAGS"
|
||||||
@@ -453,8 +510,6 @@ AC_SUBST(LDFLAGS)
|
|||||||
# print them out for debug purposes
|
# print them out for debug purposes
|
||||||
|
|
||||||
AC_MSG_NOTICE([
|
AC_MSG_NOTICE([
|
||||||
CXX:
|
|
||||||
$CXX
|
|
||||||
CXXFLAGS:
|
CXXFLAGS:
|
||||||
$CXXFLAGS
|
$CXXFLAGS
|
||||||
LDFLAGS:
|
LDFLAGS:
|
||||||
@@ -475,7 +530,7 @@ AC_SUBST(AUTODIRS)
|
|||||||
|
|
||||||
|
|
||||||
AC_CONFIG_FILES([ data/gsmartcontrol.desktop data/gsmartcontrol.appdata.xml \
|
AC_CONFIG_FILES([ data/gsmartcontrol.desktop data/gsmartcontrol.appdata.xml \
|
||||||
data/nsis/distribution.txt data/nsis/gsmartcontrol.nsi \
|
data/nsis/distribution.txt data/nsis/distribution-nogtk.txt data/nsis/gsmartcontrol.nsi \
|
||||||
debian.dist/changelog \
|
debian.dist/changelog \
|
||||||
src/gsc_winres.rc src/gsmartcontrol.exe.manifest \
|
src/gsc_winres.rc src/gsmartcontrol.exe.manifest \
|
||||||
gsmartcontrol.spec version compilation_flags ])
|
gsmartcontrol.spec version compilation_flags ])
|
||||||
@@ -487,7 +542,7 @@ AC_CONFIG_FILES([data/gsmartcontrol-root], [chmod +x data/gsmartcontrol-root])
|
|||||||
# these are all the makefiles to generate
|
# these are all the makefiles to generate
|
||||||
|
|
||||||
AC_CONFIG_FILES([Makefile src/Makefile src/applib/Makefile src/res/Makefile src/hz/Makefile \
|
AC_CONFIG_FILES([Makefile src/Makefile src/applib/Makefile src/res/Makefile src/hz/Makefile \
|
||||||
src/libdebug/Makefile src/rconfig/Makefile src/rmn/Makefile \
|
src/libdebug/Makefile src/pcrecpp/Makefile src/rconfig/Makefile src/rmn/Makefile \
|
||||||
data/Makefile data/16/Makefile data/22/Makefile data/24/Makefile data/32/Makefile \
|
data/Makefile data/16/Makefile data/22/Makefile data/24/Makefile data/32/Makefile \
|
||||||
data/48/Makefile data/64/Makefile data/128/Makefile data/256/Makefile data/nsis/Makefile \
|
data/48/Makefile data/64/Makefile data/128/Makefile data/256/Makefile data/nsis/Makefile \
|
||||||
debian.dist/Makefile])
|
debian.dist/Makefile])
|
||||||
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 5.8 KiB |
@@ -13,7 +13,7 @@ uninstall-extra-mans:
|
|||||||
|
|
||||||
# This command is needed if installing with make install (the cache
|
# This command is needed if installing with make install (the cache
|
||||||
# file is ignored for rpms).
|
# file is ignored for rpms).
|
||||||
gtk_update_icon_cache = gtk-update-icon-cache-3.0 -f -t $(datadir)/icons/hicolor
|
gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor
|
||||||
|
|
||||||
install-data-hook: install-extra-mans update-icon-cache
|
install-data-hook: install-extra-mans update-icon-cache
|
||||||
uninstall-hook: uninstall-extra-mans update-icon-cache
|
uninstall-hook: uninstall-extra-mans update-icon-cache
|
||||||
@@ -44,10 +44,6 @@ desktop_DATA = gsmartcontrol.desktop
|
|||||||
metainfodir = $(datadir)/metainfo
|
metainfodir = $(datadir)/metainfo
|
||||||
metainfo_DATA = gsmartcontrol.appdata.xml
|
metainfo_DATA = gsmartcontrol.appdata.xml
|
||||||
|
|
||||||
# PolKit files
|
|
||||||
polkitdir = $(datadir)/polkit-1/actions
|
|
||||||
polkit_DATA = org.gsmartcontrol.policy
|
|
||||||
|
|
||||||
|
|
||||||
# Application pixmap (fallback icon for desktop files).
|
# Application pixmap (fallback icon for desktop files).
|
||||||
# Same as 48/gsmartcontrol.png.
|
# Same as 48/gsmartcontrol.png.
|
||||||
@@ -57,7 +53,7 @@ pixmaps_DATA = 48/gsmartcontrol.png gsmartcontrol.xpm
|
|||||||
|
|
||||||
|
|
||||||
# Put everything inside the distribution
|
# Put everything inside the distribution
|
||||||
EXTRA_DIST = $(appdata_DATA) $(polkit_DATA) gsmartcontrol.ico gsmartcontrol.xpm
|
EXTRA_DIST = $(appdata_DATA) gsmartcontrol.ico gsmartcontrol.xpm
|
||||||
|
|
||||||
|
|
||||||
bin_SCRIPTS = gsmartcontrol-root
|
bin_SCRIPTS = gsmartcontrol-root
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
# Run gsmartcontrol with root, asking for root password first.
|
# Run gsmartcontrol with root, asking for root password first.
|
||||||
# export GSMARTCONTROL_SU to override a su command (e.g. "kdesu -c").
|
# export GSMARTCONTROL_SU to override a su command (e.g. "kdesu -c").
|
||||||
|
|
||||||
EXEC_BIN="@prefix@/sbin/gsmartcontrol";
|
EXEC_BIN="@prefix@/bin/gsmartcontrol";
|
||||||
prog_name="gsmartcontrol"
|
prog_name="gsmartcontrol"
|
||||||
|
|
||||||
|
|
||||||
@@ -71,12 +71,11 @@ fi
|
|||||||
|
|
||||||
|
|
||||||
# They're basically the same, only the order is different.
|
# They're basically the same, only the order is different.
|
||||||
# pkexec is for PolKit.
|
|
||||||
# sux requires xterm to ask for the password.
|
# sux requires xterm to ask for the password.
|
||||||
# xdg-su is basically like this script, except worse :)
|
# xdg-su is basically like this script, except worse :)
|
||||||
# su-to-root is a debian/ubuntu official method (although gksu is available).
|
# su-to-root is a debian/ubuntu official method (although gksu is available).
|
||||||
gnome_sus="pkexec su-to-root gnomesu gksu kdesu beesu xdg-su sux";
|
gnome_sus="su-to-root gnomesu gksu kdesu beesu xdg-su sux";
|
||||||
kde_sus="pkexec su-to-root kdesu gnomesu gksu beesu xdg-su sux";
|
kde_sus="su-to-root kdesu gnomesu gksu beesu xdg-su sux";
|
||||||
other_sus="$gnome_sus";
|
other_sus="$gnome_sus";
|
||||||
|
|
||||||
|
|
||||||
@@ -102,7 +101,7 @@ if [ "$GSMARTCONTROL_SU" = "" ]; then
|
|||||||
|
|
||||||
if [ "$found_su" = "" ]; then
|
if [ "$found_su" = "" ]; then
|
||||||
xmessage "Error launching ${prog_name}: No suitable su mechanism found.
|
xmessage "Error launching ${prog_name}: No suitable su mechanism found.
|
||||||
Try installing PolKit, kdesu, gnomesu, gksu, beesu or sux first.";
|
Try installing kdesu, gnomesu, gksu, beesu or sux first.";
|
||||||
exit 1;
|
exit 1;
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
@@ -137,15 +136,6 @@ full_cmd="";
|
|||||||
if [ "$GSMARTCONTROL_SU" != "" ]; then
|
if [ "$GSMARTCONTROL_SU" != "" ]; then
|
||||||
full_cmd="$GSMARTCONTROL_SU '$EXEC_BIN $final_args_quoted'";
|
full_cmd="$GSMARTCONTROL_SU '$EXEC_BIN $final_args_quoted'";
|
||||||
|
|
||||||
elif [ "$found_su" = "pkexec" ]; then
|
|
||||||
if [ "$GDK_SCALE" != "" ]; then
|
|
||||||
final_args_quoted="$final_args_quoted --gdk-scale='$GDK_SCALE'"
|
|
||||||
fi
|
|
||||||
if [ "$GDK_DPI_SCALE" != "" ]; then
|
|
||||||
final_args_quoted="$final_args_quoted --gdk-dpi-scale='$GDK_DPI_SCALE'"
|
|
||||||
fi
|
|
||||||
full_cmd="pkexec --disable-internal-agent $EXEC_BIN $final_args_quoted";
|
|
||||||
|
|
||||||
elif [ "$found_su" = "sux" ]; then
|
elif [ "$found_su" = "sux" ]; then
|
||||||
full_cmd="xterm -e sux -c '$EXEC_BIN $final_args_quoted'";
|
full_cmd="xterm -e sux -c '$EXEC_BIN $final_args_quoted'";
|
||||||
|
|
||||||
@@ -16,19 +16,19 @@
|
|||||||
</p>
|
</p>
|
||||||
</description>
|
</description>
|
||||||
<launchable type="desktop-id">gsmartcontrol.desktop</launchable>
|
<launchable type="desktop-id">gsmartcontrol.desktop</launchable>
|
||||||
<url type="homepage">https://gsmartcontrol.sourceforge.io</url>
|
<url type="homepage">http://gsmartcontrol.sourceforge.net</url>
|
||||||
<screenshots>
|
<screenshots>
|
||||||
<screenshot type="default">
|
<screenshot type="default">
|
||||||
<caption>Main window</caption>
|
<caption>Main window</caption>
|
||||||
<image>https://gsmartcontrol.sourceforge.io/home/images/main_ok.png</image>
|
<image>http://gsmartcontrol.sourceforge.net/home/images/main_ok.png</image>
|
||||||
</screenshot>
|
</screenshot>
|
||||||
<screenshot>
|
<screenshot>
|
||||||
<caption>Drive identity information</caption>
|
<caption>Drive identity information</caption>
|
||||||
<image>https://gsmartcontrol.sourceforge.io/home/images/info_identity.png</image>
|
<image>http://gsmartcontrol.sourceforge.net/home/images/info_identity.png</image>
|
||||||
</screenshot>
|
</screenshot>
|
||||||
<screenshot>
|
<screenshot>
|
||||||
<caption>Attribute list of a failing drive</caption>
|
<caption>Attribute list of a failing drive</caption>
|
||||||
<image>https://gsmartcontrol.sourceforge.io/home/images/info_failing.png</image>
|
<image>http://gsmartcontrol.sourceforge.net/home/images/info_failing.png</image>
|
||||||
</screenshot>
|
</screenshot>
|
||||||
</screenshots>
|
</screenshots>
|
||||||
</component>
|
</component>
|
||||||
@@ -9,11 +9,8 @@ Categories=System;Monitor;
|
|||||||
Name=GSmartControl
|
Name=GSmartControl
|
||||||
# short description, usually shown in parentheses after Name
|
# short description, usually shown in parentheses after Name
|
||||||
GenericName=Hard Disk and SSD Health Inspection
|
GenericName=Hard Disk and SSD Health Inspection
|
||||||
GenericName[fr]=Inspecteur de santé de disque dur et de SSD
|
|
||||||
|
|
||||||
# tooltip
|
# tooltip
|
||||||
Comment=Monitor and control SMART data on hard disk and solid-state drives
|
Comment=Monitor and control SMART data on hard disk and solid-state drives
|
||||||
Comment[fr]=Surveille et contrôle les données SMART des disques durs et des SSD
|
|
||||||
|
|
||||||
# If it's a name only, it looks for "name.[png|xpm]" file in
|
# If it's a name only, it looks for "name.[png|xpm]" file in
|
||||||
# $XDG_DATA_DIRS/icons and /usr/share/pixmaps.
|
# $XDG_DATA_DIRS/icons and /usr/share/pixmaps.
|
||||||
|
Before Width: | Height: | Size: 95 KiB After Width: | Height: | Size: 95 KiB |
|
After Width: | Height: | Size: 4.6 KiB |
|
After Width: | Height: | Size: 3.8 KiB |
@@ -0,0 +1,29 @@
|
|||||||
|
|
||||||
|
GSmartControl - Hard disk drive and SSD health inspection tool
|
||||||
|
Version @VERSION@
|
||||||
|
|
||||||
|
The latest version of this distribution, as well as the source code of
|
||||||
|
GSmartControl, can be found at
|
||||||
|
http://gsmartcontrol.sourceforge.net
|
||||||
|
and
|
||||||
|
https://sourceforge.net/projects/gsmartcontrol/files/
|
||||||
|
|
||||||
|
You need GTK+ for Windows Runtime package to use this program. You can get one
|
||||||
|
at http://gtk-win.sf.net (you must download at least version 2.16.6-2010-02-21
|
||||||
|
of gtk2-runtime).
|
||||||
|
|
||||||
|
|
||||||
|
This distribution includes:
|
||||||
|
|
||||||
|
* GSmartControl binary (gsmartcontrol.exe) and associated resources. The
|
||||||
|
binary was compiled for 32-bit Windows, and should work on both 32-bit and
|
||||||
|
64-bit Windows. The binary was statically compiled against Gtkmm
|
||||||
|
(http://www.gtkmm.org/) and related libraries, and PCRE (http://www.pcre.org/).
|
||||||
|
|
||||||
|
* Smartctl binaries (from smartmontools 6.5, http://smartmontools.sf.net/)
|
||||||
|
- smartctl-nc.exe (compiled without console output), smartctl.exe (compiled
|
||||||
|
with console output), update-smart-drivedb.exe (drive database updater).
|
||||||
|
|
||||||
|
|
||||||
|
The combined distribution is multi-licensed under GNU GPL versions 2 and 3.
|
||||||
|
See LICENSE_gpl2.txt and LICENSE_gpl3.txt for details.
|
||||||
@@ -4,21 +4,25 @@ Version @VERSION@
|
|||||||
|
|
||||||
The latest version of this distribution, as well as the source code of
|
The latest version of this distribution, as well as the source code of
|
||||||
GSmartControl, can be found at
|
GSmartControl, can be found at
|
||||||
https://gsmartcontrol.sourceforge.io
|
http://gsmartcontrol.sourceforge.net
|
||||||
and
|
and
|
||||||
https://sourceforge.net/projects/gsmartcontrol/files/
|
https://sourceforge.net/projects/gsmartcontrol/files/
|
||||||
|
|
||||||
|
|
||||||
This distribution includes:
|
This distribution includes:
|
||||||
|
|
||||||
* GSmartControl binary (gsmartcontrol.exe) and associated resources.
|
* GSmartControl binary (gsmartcontrol.exe) and associated resources. The
|
||||||
The binary was compiled against Gtkmm (http://www.gtkmm.org/), GTK+
|
binary was compiled for 32-bit Windows, and should work on both 32-bit and
|
||||||
(http://gtk.org/) and related libraries, and PCRE (http://www.pcre.org/).
|
64-bit Windows. The binary was statically compiled against Gtkmm
|
||||||
|
(http://www.gtkmm.org/) and related libraries, and PCRE (http://www.pcre.org/).
|
||||||
|
|
||||||
* Smartctl binaries (from smartmontools 6.6, http://smartmontools.sf.net/)
|
* Smartctl binaries (from smartmontools 6.5, http://smartmontools.sf.net/)
|
||||||
- smartctl-nc.exe (compiled without console output), smartctl.exe (compiled
|
- smartctl-nc.exe (compiled without console output), smartctl.exe (compiled
|
||||||
with console output), update-smart-drivedb.exe (drive database updater).
|
with console output), update-smart-drivedb.exe (drive database updater).
|
||||||
|
|
||||||
|
* GTK+ for Windows Runtime package (@GTK_INSTALLER_NAME@)
|
||||||
|
from http://gtk-win.sf.net, either in original or unpacked form.
|
||||||
|
|
||||||
|
|
||||||
The combined distribution is multi-licensed under GNU GPL versions 2 and 3.
|
The combined distribution is multi-licensed under GNU GPL versions 2 and 3.
|
||||||
See LICENSE_gpl2.txt and LICENSE_gpl3.txt for details.
|
See LICENSE_gpl2.txt and LICENSE_gpl3.txt for details.
|
||||||
@@ -4,16 +4,23 @@
|
|||||||
; Compatible with NSIS Unicode 2.45.
|
; Compatible with NSIS Unicode 2.45.
|
||||||
; Public Domain
|
; Public Domain
|
||||||
|
|
||||||
|
; pass /DNO_GTK to makensis to disable inclusion of gtk.
|
||||||
|
|
||||||
|
; gtk installer name for embedding
|
||||||
|
!define GTK_INSTALLER_EXE "@GTK_INSTALLER_NAME@.exe"
|
||||||
|
|
||||||
!define PRODUCT_VERSION "@VERSION@"
|
!define PRODUCT_VERSION "@VERSION@"
|
||||||
!define PRODUCT_NAME "GSmartControl"
|
!define PRODUCT_NAME "GSmartControl"
|
||||||
!define PRODUCT_NAME_SMALL "gsmartcontrol"
|
!define PRODUCT_NAME_SMALL "gsmartcontrol"
|
||||||
!define PRODUCT_PUBLISHER "Alexander Shaduri"
|
!define PRODUCT_PUBLISHER "Alexander Shaduri"
|
||||||
!define PRODUCT_WEB_SITE "https://gsmartcontrol.sourceforge.io"
|
!define PRODUCT_WEB_SITE "http://gsmartcontrol.sourceforge.net"
|
||||||
|
|
||||||
;!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\AppMainExe.exe"
|
;!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\AppMainExe.exe"
|
||||||
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
|
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
|
||||||
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
|
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
|
||||||
|
|
||||||
|
!define REGISTRY_APP_PATHS "Software\Microsoft\Windows\CurrentVersion\App Paths"
|
||||||
|
|
||||||
|
|
||||||
!include "FileFunc.nsh" ; GetOptions
|
!include "FileFunc.nsh" ; GetOptions
|
||||||
|
|
||||||
@@ -35,12 +42,16 @@ CRCCheck On
|
|||||||
Name "${PRODUCT_NAME}" ; ${PRODUCT_VERSION}
|
Name "${PRODUCT_NAME}" ; ${PRODUCT_VERSION}
|
||||||
|
|
||||||
; Output File Name
|
; Output File Name
|
||||||
OutFile "${PRODUCT_NAME_SMALL}-${PRODUCT_VERSION}-@WINDOWS_SUFFIX@.exe"
|
!ifdef NO_GTK
|
||||||
|
OutFile "${PRODUCT_NAME_SMALL}-${PRODUCT_VERSION}-nogtk.exe"
|
||||||
|
!else
|
||||||
|
OutFile "${PRODUCT_NAME_SMALL}-${PRODUCT_VERSION}.exe"
|
||||||
|
!endif
|
||||||
|
|
||||||
|
|
||||||
; The Default Installation Directory:
|
; The Default Installation Directory:
|
||||||
; Try to install to the same directory as runtime.
|
; Try to install to the same directory as runtime.
|
||||||
InstallDir "$PROGRAMFILES64\${PRODUCT_NAME}"
|
InstallDir "$PROGRAMFILES\${PRODUCT_NAME}"
|
||||||
; If already installed, try here
|
; If already installed, try here
|
||||||
InstallDirRegKey HKLM "SOFTWARE\${PRODUCT_NAME}" "InstallationDirectory"
|
InstallDirRegKey HKLM "SOFTWARE\${PRODUCT_NAME}" "InstallationDirectory"
|
||||||
|
|
||||||
@@ -78,11 +89,19 @@ ShowUnInstDetails show
|
|||||||
;!define MUI_LANGDLL_REGISTRY_KEY "${PRODUCT_UNINST_KEY}"
|
;!define MUI_LANGDLL_REGISTRY_KEY "${PRODUCT_UNINST_KEY}"
|
||||||
;!define MUI_LANGDLL_REGISTRY_VALUENAME "NSIS:Language"
|
;!define MUI_LANGDLL_REGISTRY_VALUENAME "NSIS:Language"
|
||||||
|
|
||||||
!define LICENSE_FILE "doc\distribution.txt"
|
!ifdef NO_GTK
|
||||||
|
!define LICENSE_FILE "doc\distribution-nogtk.txt"
|
||||||
|
!else
|
||||||
|
!define LICENSE_FILE "doc\distribution.txt"
|
||||||
|
!endif
|
||||||
|
|
||||||
; Pages to show during installation
|
; Pages to show during installation
|
||||||
!insertmacro MUI_PAGE_WELCOME
|
!insertmacro MUI_PAGE_WELCOME
|
||||||
!insertmacro MUI_PAGE_LICENSE "${LICENSE_FILE}"
|
!insertmacro MUI_PAGE_LICENSE "${LICENSE_FILE}"
|
||||||
|
!ifndef NO_GTK
|
||||||
|
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE on_components_page_leave
|
||||||
|
!insertmacro MUI_PAGE_COMPONENTS
|
||||||
|
!endif
|
||||||
!insertmacro MUI_PAGE_DIRECTORY
|
!insertmacro MUI_PAGE_DIRECTORY
|
||||||
!insertmacro MUI_PAGE_INSTFILES
|
!insertmacro MUI_PAGE_INSTFILES
|
||||||
|
|
||||||
@@ -132,19 +151,21 @@ SectionIn 1 RO
|
|||||||
; File "gsmartcontrol.conf"
|
; File "gsmartcontrol.conf"
|
||||||
|
|
||||||
SetOverwrite On
|
SetOverwrite On
|
||||||
File *.exe
|
File gsmartcontrol.exe
|
||||||
File *.dll
|
|
||||||
File gsmartcontrol.exe.manifest
|
File gsmartcontrol.exe.manifest
|
||||||
File gsmartcontrol.ico
|
File gsmartcontrol.ico
|
||||||
File icon_*.png
|
File icon_*.png
|
||||||
File drivedb.h
|
; File *.dll
|
||||||
|
File smartctl-nc.exe
|
||||||
|
File smartctl.exe
|
||||||
|
File update-smart-drivedb.exe
|
||||||
|
|
||||||
; Include the "doc" directory completely.
|
; Include the "doc" directory completely, excluding the file we're not using (e.g. the -nogtk file in gtk installer).
|
||||||
File /r doc
|
!ifdef NO_GTK
|
||||||
|
File /r /x distribution.txt doc
|
||||||
; GTK and stuff
|
!else
|
||||||
File /r etc
|
File /r /x distribution-nogtk.txt doc
|
||||||
File /r share
|
!endif
|
||||||
|
|
||||||
; Add Shortcuts (this inherits the exe's run permissions)
|
; Add Shortcuts (this inherits the exe's run permissions)
|
||||||
CreateShortCut "$SMPROGRAMS\GSmartControl.lnk" "$INSTDIR\gsmartcontrol.exe" "" \
|
CreateShortCut "$SMPROGRAMS\GSmartControl.lnk" "$INSTDIR\gsmartcontrol.exe" "" \
|
||||||
@@ -154,6 +175,42 @@ SectionEnd
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
!ifndef NO_GTK
|
||||||
|
|
||||||
|
; The SecGtkPrivate and SecGtkPublic sections are mutually exclusive.
|
||||||
|
|
||||||
|
Section "GTK+ (for this program only)" SecGtkPrivate
|
||||||
|
SectionIn 1
|
||||||
|
SetShellVarContext all ; use all user variables as opposed to current user
|
||||||
|
AddSize 12200 ; ~ size of unpacked gtk
|
||||||
|
SetOutPath "$INSTDIR"
|
||||||
|
File "${GTK_INSTALLER_EXE}"
|
||||||
|
; TODO: in the future, when we have translations for this program,
|
||||||
|
; make the GTK+ translations installation dependent on their installation status.
|
||||||
|
ExecWait '"${GTK_INSTALLER_EXE}" /sideeffects=no /dllpath=root /translations=no /compatdlls=no /S /D=$INSTDIR'
|
||||||
|
Delete "$INSTDIR\${GTK_INSTALLER_EXE}"
|
||||||
|
SectionEnd
|
||||||
|
|
||||||
|
; disabled by default
|
||||||
|
Section /o "GTK+ (shared installation)" SecGtkPublic
|
||||||
|
SectionIn 1
|
||||||
|
SetShellVarContext all ; use all user variables as opposed to current user
|
||||||
|
AddSize 12200 ; ~ size of unpacked gtk
|
||||||
|
SetOutPath "$INSTDIR"
|
||||||
|
File "${GTK_INSTALLER_EXE}"
|
||||||
|
ExecWait '"${GTK_INSTALLER_EXE}"'
|
||||||
|
Delete "$INSTDIR\${GTK_INSTALLER_EXE}"
|
||||||
|
SectionEnd
|
||||||
|
|
||||||
|
!endif ; !NO_GTK
|
||||||
|
|
||||||
|
|
||||||
|
!ifndef NO_GTK
|
||||||
|
var gtk_mode ; "public", "private" or "none"
|
||||||
|
var gtk_tmp ; temporary variable
|
||||||
|
!endif
|
||||||
|
|
||||||
|
|
||||||
; Executed on installation start
|
; Executed on installation start
|
||||||
Function .onInit
|
Function .onInit
|
||||||
SetShellVarContext all ; use all user variables as opposed to current user
|
SetShellVarContext all ; use all user variables as opposed to current user
|
||||||
@@ -163,16 +220,119 @@ Function .onInit
|
|||||||
Call PreventMultipleInstances
|
Call PreventMultipleInstances
|
||||||
|
|
||||||
Call DetectPrevInstallation
|
Call DetectPrevInstallation
|
||||||
|
|
||||||
|
; ask for gtk only if it's a non-gtk installer.
|
||||||
|
!ifdef NO_GTK
|
||||||
|
Call AskForGtk
|
||||||
|
!endif
|
||||||
|
|
||||||
|
!ifndef NO_GTK
|
||||||
|
StrCpy $gtk_mode "private" ; default
|
||||||
|
!endif
|
||||||
|
|
||||||
FunctionEnd
|
FunctionEnd
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function .onselchange
|
||||||
|
|
||||||
|
!ifndef NO_GTK
|
||||||
|
; Remember which gtk section was selected.
|
||||||
|
; Deselect the other section.
|
||||||
|
|
||||||
|
; If it was private, we check if public is checked and uncheck private.
|
||||||
|
|
||||||
|
StrCmp $gtk_mode "private" check_public ; old selection
|
||||||
|
StrCmp $gtk_mode "public" check_private ; old selection
|
||||||
|
goto check_exit
|
||||||
|
|
||||||
|
check_public:
|
||||||
|
SectionGetFlags ${SecGtkPublic} $gtk_tmp ; see if it's checked
|
||||||
|
IntOp $gtk_tmp $gtk_tmp & ${SF_SELECTED}
|
||||||
|
IntCmp $gtk_tmp ${SF_SELECTED} "" check_exit check_exit
|
||||||
|
SectionGetFlags ${SecGtkPrivate} $gtk_tmp ; unselect the other one
|
||||||
|
IntOp $gtk_tmp $gtk_tmp & ${SECTION_OFF}
|
||||||
|
SectionSetFlags ${SecGtkPrivate} $gtk_tmp
|
||||||
|
goto check_exit
|
||||||
|
|
||||||
|
check_private:
|
||||||
|
SectionGetFlags ${SecGtkPrivate} $gtk_tmp ; see if it's checked
|
||||||
|
IntOp $gtk_tmp $gtk_tmp & ${SF_SELECTED}
|
||||||
|
IntCmp $gtk_tmp ${SF_SELECTED} "" check_exit check_exit
|
||||||
|
SectionGetFlags ${SecGtkPublic} $gtk_tmp ; unselect the other one
|
||||||
|
IntOp $gtk_tmp $gtk_tmp & ${SECTION_OFF}
|
||||||
|
SectionSetFlags ${SecGtkPublic} $gtk_tmp
|
||||||
|
|
||||||
|
check_exit:
|
||||||
|
|
||||||
|
|
||||||
|
; store the current mode
|
||||||
|
StrCpy $gtk_mode "none"
|
||||||
|
|
||||||
|
SectionGetFlags ${SecGtkPrivate} $gtk_tmp
|
||||||
|
IntOp $gtk_tmp $gtk_tmp & ${SF_SELECTED}
|
||||||
|
IntCmp $gtk_tmp ${SF_SELECTED} "" mode_end_private mode_end_private
|
||||||
|
StrCpy $gtk_mode "private"
|
||||||
|
mode_end_private:
|
||||||
|
|
||||||
|
SectionGetFlags ${SecGtkPublic} $gtk_tmp
|
||||||
|
IntOp $gtk_tmp $gtk_tmp & ${SF_SELECTED}
|
||||||
|
IntCmp $gtk_tmp ${SF_SELECTED} "" mode_end_public mode_end_public
|
||||||
|
StrCpy $gtk_mode "public"
|
||||||
|
mode_end_public:
|
||||||
|
|
||||||
|
; MessageBox MB_ICONINFORMATION|MB_OK "gtk_mode: $gtk_mode" /SD IDOK
|
||||||
|
!endif ; !NO_GTK
|
||||||
|
|
||||||
|
functionend
|
||||||
|
|
||||||
|
|
||||||
|
!ifndef NO_GTK
|
||||||
|
Function on_components_page_leave
|
||||||
|
StrCmp $gtk_mode "none" "" noabort
|
||||||
|
Call AskForGtk
|
||||||
|
noabort:
|
||||||
|
FunctionEnd
|
||||||
|
!endif ; !NO_GTK
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; Section descriptions
|
||||||
|
!ifndef NO_GTK ; this page is shown only when using gtk
|
||||||
|
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
|
||||||
|
!insertmacro MUI_DESCRIPTION_TEXT ${SecMain} "GSmartControl - hard disk drive and SSD health inspection tool"
|
||||||
|
!insertmacro MUI_DESCRIPTION_TEXT ${SecGtkPrivate} "GTK+ libraries, needed by GSmartControl. \
|
||||||
|
This will install a private version of GTK+, usable only by GSmartControl."
|
||||||
|
!insertmacro MUI_DESCRIPTION_TEXT ${SecGtkPublic} "GTK+ libraries, needed by GSmartControl. \
|
||||||
|
This will install a system-wide version of GTK+, shareable with other programs."
|
||||||
|
!insertmacro MUI_FUNCTION_DESCRIPTION_END
|
||||||
|
!endif
|
||||||
|
|
||||||
|
|
||||||
; ------------------ POST INSTALL
|
; ------------------ POST INSTALL
|
||||||
|
|
||||||
|
|
||||||
|
var gtk_dll_abs_path
|
||||||
|
|
||||||
Section -post
|
Section -post
|
||||||
SetShellVarContext all ; use all user variables as opposed to current user
|
SetShellVarContext all ; use all user variables as opposed to current user
|
||||||
|
|
||||||
|
; Don't set any paths for this exe if it has a private GTK+ installation.
|
||||||
|
!ifndef NO_GTK
|
||||||
|
StrCmp $gtk_mode "private" skip_exe_PATH
|
||||||
|
!endif
|
||||||
|
; set a special path for this exe, as GTK may not be in a global path.
|
||||||
|
ReadRegStr $gtk_dll_abs_path HKLM "SOFTWARE\GTK\2.0" "DllPath"
|
||||||
|
WriteRegStr HKLM "${REGISTRY_APP_PATHS}\gsmartcontrol.exe" "Path" "$gtk_dll_abs_path"
|
||||||
|
!ifndef NO_GTK
|
||||||
|
skip_exe_PATH:
|
||||||
|
!endif
|
||||||
|
|
||||||
|
!ifndef NO_GTK
|
||||||
|
WriteRegStr HKLM "SOFTWARE\${PRODUCT_NAME}" "GtkInstalledMode" "$gtk_mode"
|
||||||
|
!endif
|
||||||
|
|
||||||
WriteRegStr HKLM "SOFTWARE\${PRODUCT_NAME}" "InstallationDirectory" "$INSTDIR"
|
WriteRegStr HKLM "SOFTWARE\${PRODUCT_NAME}" "InstallationDirectory" "$INSTDIR"
|
||||||
WriteRegStr HKLM "SOFTWARE\${PRODUCT_NAME}" "Vendor" "${PRODUCT_PUBLISHER}"
|
WriteRegStr HKLM "SOFTWARE\${PRODUCT_NAME}" "Vendor" "${PRODUCT_PUBLISHER}"
|
||||||
|
|
||||||
@@ -218,26 +378,41 @@ Section Uninstall
|
|||||||
SetShellVarContext all ; use all user variables as opposed to current user
|
SetShellVarContext all ; use all user variables as opposed to current user
|
||||||
SetAutoClose false
|
SetAutoClose false
|
||||||
|
|
||||||
|
!ifndef NO_GTK
|
||||||
|
ReadRegStr $gtk_mode HKLM "SOFTWARE\${PRODUCT_NAME}" "GtkInstalledMode"
|
||||||
|
StrCmp $gtk_mode "private" "" skip_gtk_remove
|
||||||
|
; remove private GTK+, specify the same custom options are during installation
|
||||||
|
ExecWait "$INSTDIR\gtk2_runtime_uninst.exe /remove_config=yes /sideeffects=no /dllpath=root /translations=no /compatdlls=no /S"
|
||||||
|
; _?=$INSTDIR
|
||||||
|
; Delete "$INSTDIR\gtk2_runtime_uninst.exe" ; If using _? flag, it won't get deleted automatically, do it manually.
|
||||||
|
skip_gtk_remove:
|
||||||
|
!endif
|
||||||
|
|
||||||
; add delete commands to delete whatever files/registry keys/etc you installed here.
|
; add delete commands to delete whatever files/registry keys/etc you installed here.
|
||||||
Delete "$INSTDIR\gsmartcontrol_uninst.exe"
|
Delete "$INSTDIR\gsmartcontrol_uninst.exe"
|
||||||
|
|
||||||
DeleteRegKey HKLM "SOFTWARE\${PRODUCT_NAME}"
|
DeleteRegKey HKLM "SOFTWARE\${PRODUCT_NAME}"
|
||||||
DeleteRegKey HKLM "${PRODUCT_UNINST_KEY}"
|
DeleteRegKey HKLM "${PRODUCT_UNINST_KEY}"
|
||||||
|
|
||||||
Delete "$INSTDIR\*.exe"
|
Delete "$INSTDIR\gsmartcontrol.exe"
|
||||||
Delete "$INSTDIR\*.dll"
|
|
||||||
Delete "$INSTDIR\gsmartcontrol.exe.manifest"
|
Delete "$INSTDIR\gsmartcontrol.exe.manifest"
|
||||||
Delete "$INSTDIR\gsmartcontrol.ico"
|
Delete "$INSTDIR\gsmartcontrol.ico"
|
||||||
Delete "$INSTDIR\icon_*.png"
|
Delete "$INSTDIR\icon_*.png"
|
||||||
|
; Delete "$INSTDIR\*.dll"
|
||||||
|
Delete "$INSTDIR\smartctl-nc.exe"
|
||||||
|
Delete "$INSTDIR\smartctl.exe"
|
||||||
|
Delete "$INSTDIR\update-smart-drivedb.exe"
|
||||||
|
|
||||||
; update-smart-drivedb may leave these
|
; update-smart-drivedb may leave these
|
||||||
Delete "$INSTDIR\drivedb.h"
|
Delete "$INSTDIR\drivedb.h"
|
||||||
Delete "$INSTDIR\drivedb.h.*"
|
Delete "$INSTDIR\drivedb.h.new"
|
||||||
|
Delete "$INSTDIR\drivedb.h.old"
|
||||||
|
Delete "$INSTDIR\drivedb.h.error"
|
||||||
|
Delete "$INSTDIR\drivedb.h.lastcheck"
|
||||||
|
|
||||||
RMDir /r "$INSTDIR\doc"
|
RMDir /r "$INSTDIR\doc"
|
||||||
|
|
||||||
; GTK and stuff
|
; leftover from gtk
|
||||||
RMDir /r "$INSTDIR\etc"
|
|
||||||
RMDir /r "$INSTDIR\share"
|
RMDir /r "$INSTDIR\share"
|
||||||
|
|
||||||
; clean up generated stuff
|
; clean up generated stuff
|
||||||
@@ -246,6 +421,17 @@ Section Uninstall
|
|||||||
|
|
||||||
RMDir "$INSTDIR" ; only if empty
|
RMDir "$INSTDIR" ; only if empty
|
||||||
|
|
||||||
|
; For some reason, sometimes it's not deleted in the sections, so do it here.
|
||||||
|
Delete "$INSTDIR\${GTK_INSTALLER_EXE}"
|
||||||
|
|
||||||
|
!ifndef NO_GTK
|
||||||
|
StrCmp $gtk_mode "private" skip_exe_PATH_remove
|
||||||
|
!endif
|
||||||
|
DeleteRegKey HKLM "${REGISTRY_APP_PATHS}\gsmartcontrol.exe"
|
||||||
|
!ifndef NO_GTK
|
||||||
|
skip_exe_PATH_remove:
|
||||||
|
!endif
|
||||||
|
|
||||||
Delete "$SMPROGRAMS\GSmartControl.lnk"
|
Delete "$SMPROGRAMS\GSmartControl.lnk"
|
||||||
;Delete "$SMPROGRAMS\GSmartControl\Uninstall GSmartControl.lnk"
|
;Delete "$SMPROGRAMS\GSmartControl\Uninstall GSmartControl.lnk"
|
||||||
|
|
||||||
@@ -303,6 +489,35 @@ FunctionEnd
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; detect GTK installation (any of available versions)
|
||||||
|
Function AskForGtk
|
||||||
|
SetShellVarContext all ; use all user variables as opposed to current user
|
||||||
|
push $R0
|
||||||
|
|
||||||
|
ReadRegStr $R0 HKLM "SOFTWARE\GTK\2.0" "DllPath"
|
||||||
|
StrCmp $R0 "" no_gtk have_gtk
|
||||||
|
|
||||||
|
no_gtk:
|
||||||
|
MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION \
|
||||||
|
"GTK2-Runtime is not installed. This product needs it to function properly.$\n\
|
||||||
|
Please install GTK2-Runtime from http://gtk-win.sf.net/ first.$\n$\n\
|
||||||
|
Click 'Cancel' to abort the installation \
|
||||||
|
or 'OK' to continue anyway." \
|
||||||
|
/SD IDOK IDOK have_gtk
|
||||||
|
;Abort ; Abort has different meaning from onpage callbacks, so use Quit
|
||||||
|
Quit
|
||||||
|
goto end_gtk_check
|
||||||
|
|
||||||
|
have_gtk:
|
||||||
|
; do nothing
|
||||||
|
|
||||||
|
end_gtk_check:
|
||||||
|
|
||||||
|
pop $R0
|
||||||
|
FunctionEnd
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; Prevent running multiple instances of the installer
|
; Prevent running multiple instances of the installer
|
||||||
Function PreventMultipleInstances
|
Function PreventMultipleInstances
|
||||||
Push $R0
|
Push $R0
|
||||||
|
Before Width: | Height: | Size: 766 B After Width: | Height: | Size: 766 B |
|
Before Width: | Height: | Size: 766 B After Width: | Height: | Size: 766 B |
@@ -1,15 +1,18 @@
|
|||||||
Source: gsmartcontrol
|
Source: gsmartcontrol
|
||||||
Section: utils
|
Section: utils
|
||||||
Priority: extra
|
Priority: extra
|
||||||
Homepage: https://gsmartcontrol.sourceforge.io/
|
Homepage: http://gsmartcontrol.sourceforge.net/
|
||||||
Maintainer: Alexander Shaduri <ashaduriREMOVETHIS@gmail.com>
|
Maintainer: Alexander Shaduri <ashaduriREMOVETHIS@gmail.com>
|
||||||
|
# libglademm is also needed if libgtkmm-2.4 < 2.12, but don't write it
|
||||||
|
# here - newer distributions don't contain it.
|
||||||
Build-Depends: debhelper (>= 5), autotools-dev,
|
Build-Depends: debhelper (>= 5), autotools-dev,
|
||||||
libpcre3-dev, libgtkmm-3.0-dev (>= 3.4.0)
|
libpcre3-dev, libgtkmm-2.4-dev (>= 2.6.0)
|
||||||
Standards-Version: 3.7.3
|
Standards-Version: 3.7.3
|
||||||
|
|
||||||
Package: gsmartcontrol
|
Package: gsmartcontrol
|
||||||
Architecture: any
|
Architecture: any
|
||||||
Depends: ${shlibs:Depends}, smartmontools (>= 5.43), xterm, menu
|
#Depends: ${shlibs:Depends}, ${misc:Depends}, smartmontools, menu
|
||||||
|
Depends: ${shlibs:Depends}, smartmontools, menu
|
||||||
Description: Hard disk drive and SSD health inspection tool
|
Description: Hard disk drive and SSD health inspection tool
|
||||||
GSmartControl is a graphical user interface for smartctl (from smartmontools
|
GSmartControl is a graphical user interface for smartctl (from smartmontools
|
||||||
package), which is a tool for querying and controlling SMART
|
package), which is a tool for querying and controlling SMART
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
This package was debianized by Alexander Shaduri <ashaduri 'at' gmail.com> on
|
This package was debianized by Alexander Shaduri <ashaduri 'at' gmail.com> on
|
||||||
Sat, 15 Nov 2008 00:12:04 +0400.
|
Sat, 15 Nov 2008 00:12:04 +0400.
|
||||||
|
|
||||||
It was downloaded from <https://gsmartcontrol.sourceforge.io/>
|
It was downloaded from <http://gsmartcontrol.sourceforge.net/>
|
||||||
|
|
||||||
Copyright:
|
Copyright:
|
||||||
|
|
||||||
Copyright (C) 2008 - 2017 Alexander Shaduri <ashaduri 'at' gmail.com>
|
Copyright (C) 2008 - 2012 Alexander Shaduri <ashaduri 'at' gmail.com>
|
||||||
|
|
||||||
License:
|
License:
|
||||||
|
|
||||||
@@ -27,6 +27,6 @@ On Debian systems, the complete text of the GNU General
|
|||||||
Public Licenses can be found in `/usr/share/common-licenses/GPL-2' and
|
Public Licenses can be found in `/usr/share/common-licenses/GPL-2' and
|
||||||
`/usr/share/common-licenses/GPL-3'.
|
`/usr/share/common-licenses/GPL-3'.
|
||||||
|
|
||||||
The Debian packaging is (C) 2008 - 2017 Alexander Shaduri <ashaduri 'at' gmail.com> and
|
The Debian packaging is (C) 2008 - 2012 Alexander Shaduri <ashaduri 'at' gmail.com> and
|
||||||
is licensed under the GPLv2 and GPLv3, see above.
|
is licensed under the GPLv2 and GPLv3, see above.
|
||||||
|
|
||||||
@@ -0,0 +1,218 @@
|
|||||||
|
Name: gsmartcontrol
|
||||||
|
Version: @VERSION@
|
||||||
|
Release: 1as
|
||||||
|
License: GPL-2.0 AND GPL-3.0
|
||||||
|
Url: http://gsmartcontrol.sourceforge.net
|
||||||
|
Vendor: Alexander Shaduri <ashaduri 'at' gmail.com>
|
||||||
|
# Packager: Alexander Shaduri <ashaduri 'at' gmail.com>
|
||||||
|
Source: gsmartcontrol-%{version}.tar.bz2
|
||||||
|
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
||||||
|
Summary: GSmartControl - Hard Disk Drive and SSD Health Inspection Tool
|
||||||
|
|
||||||
|
%if 0%{?mandriva_version}
|
||||||
|
Group: System/Kernel and hardware
|
||||||
|
%else
|
||||||
|
Group: Hardware/Other
|
||||||
|
%endif
|
||||||
|
|
||||||
|
|
||||||
|
# Dependencies for various distributions. The actual deps are:
|
||||||
|
# smartmontools, pcre, (gtkmm2 >= 2.12 || (gtkmm2 >= 2.6.0 && libglademm >= 2.4.0))
|
||||||
|
# (with the respective -devel packages of the libraries for build requirements).
|
||||||
|
# For non-specified distributions we don't specify any dependencies to avoid errors.
|
||||||
|
|
||||||
|
# For mandriva, these contain the su programs.
|
||||||
|
# Suggests: libgnomesu, gksu, kdebase-progs
|
||||||
|
|
||||||
|
|
||||||
|
# SUSE / OpenSUSE. SLES also defines the correct suse_version.
|
||||||
|
%if 0%{?suse_version}
|
||||||
|
|
||||||
|
%if 0%{?%suse_version} >= 1030
|
||||||
|
Requires: smartmontools, pcre, gtkmm2 >= 2.12.0
|
||||||
|
BuildRequires: gcc-c++, libstdc++-devel, pcre-devel, gtkmm2-devel >= 2.12.0
|
||||||
|
%else
|
||||||
|
%if 0%{?%suse_version} == 1020
|
||||||
|
Requires: smartmontools, pcre, gtkmm2 >= 2.6.0, libglademm >= 2.4.0
|
||||||
|
BuildRequires: gcc-c++, libstdc++-devel, pcre-devel, gtkmm2-devel >= 2.6.0, libglademm-devel >= 2.4.0
|
||||||
|
%else
|
||||||
|
Requires: smartmontools, pcre, gtkmm24 >= 2.6.0, libglademm >= 2.4.0
|
||||||
|
BuildRequires: gcc-c++, libstdc++-devel, pcre-devel, gtkmm24-devel >= 2.6.0, libglademm-devel >= 2.4.0
|
||||||
|
%endif
|
||||||
|
%endif
|
||||||
|
BuildRequires: update-desktop-files
|
||||||
|
|
||||||
|
%if 0%{?suse_version} >= 1030
|
||||||
|
BuildRequires: fdupes
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%endif
|
||||||
|
|
||||||
|
|
||||||
|
# Fedora, CentOS, RHEL
|
||||||
|
%if 0%{?fedora_version} || 0%{?rhel_version} || 0%{?centos_version}
|
||||||
|
|
||||||
|
# I'm not sure about centos and rhel versions
|
||||||
|
%if 0%{?fedora_version} >= 8 || 0%{?rhel_version} >= 600 || 0%{?centos_version} >= 600
|
||||||
|
Requires: smartmontools, pcre, gtkmm24 >= 2.12.0
|
||||||
|
BuildRequires: gcc-c++, pcre-devel, gtkmm24-devel >= 2.12.0
|
||||||
|
%else
|
||||||
|
Requires: smartmontools, pcre, gtkmm24 >= 2.6.0, libglademm24 >= 2.4.0
|
||||||
|
BuildRequires: gcc-c++, pcre-devel, gtkmm24-devel >= 2.6.0, libglademm24-devel >= 2.4.0
|
||||||
|
%endif
|
||||||
|
|
||||||
|
# Fedora with consolehelper.
|
||||||
|
# usermode-gtk is for consolehelper-gtk.
|
||||||
|
%if 0%{?fedora_version}
|
||||||
|
Requires: usermode-gtk
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%endif
|
||||||
|
|
||||||
|
|
||||||
|
# Mandriva. Check the latest official spec file at
|
||||||
|
# http://svn.mandriva.com/cgi-bin/viewvc.cgi/packages/cooker/gsmartcontrol/current/
|
||||||
|
%if 0%{?mandriva_version}
|
||||||
|
|
||||||
|
%if 0%{?mandriva_version} >= 2008
|
||||||
|
Requires: smartmontools, libpcre0, gtkmm2.4 >= 2.12.0
|
||||||
|
BuildRequires: gcc-c++, gcc-cpp, pcre-devel, gtkmm2.4-devel >= 2.12.0, desktop-file-utils
|
||||||
|
%else
|
||||||
|
Requires: smartmontools, libpcre0, gtkmm2.4 >= 2.6.0, libglademm2.4 >= 2.4.0
|
||||||
|
BuildRequires: gcc-c++, gcc-cpp, pcre-devel, gtkmm2.4-devel >= 2.6.0, libglademm2.4-devel >= 2.4.0, desktop-file-utils
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%endif
|
||||||
|
|
||||||
|
|
||||||
|
%description
|
||||||
|
GSmartControl is a graphical user interface for smartctl, which is a tool for
|
||||||
|
querying and controlling SMART (Self-Monitoring, Analysis, and Reporting
|
||||||
|
Technology) data in hard disk and solid-state drives. It allows you to inspect
|
||||||
|
the drive's SMART data to determine its health, as well as run various tests
|
||||||
|
on it.
|
||||||
|
|
||||||
|
%prep
|
||||||
|
|
||||||
|
|
||||||
|
%setup -q
|
||||||
|
%if 0%{?mandriva_version} <= 2006
|
||||||
|
%configure
|
||||||
|
%else
|
||||||
|
%configure --enable-optimize-options=auto
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%build
|
||||||
|
# Set up for parallel builds
|
||||||
|
#numprocs=`grep -E -c ^cpu[0-9]+ /proc/stat || :`
|
||||||
|
#if [ "$numprocs" = "0" ]; then
|
||||||
|
# numprocs=1
|
||||||
|
#fi
|
||||||
|
#make -j$numprocs
|
||||||
|
make %{?_smp_mflags}
|
||||||
|
|
||||||
|
|
||||||
|
%install
|
||||||
|
|
||||||
|
# %%makeinstall
|
||||||
|
make DESTDIR=%buildroot install-strip
|
||||||
|
# Remove the icon cache file "make install" generates, to avoid package conflicts.
|
||||||
|
rm -f $RPM_BUILD_ROOT%{_datadir}/icons/hicolor/icon-theme.cache
|
||||||
|
|
||||||
|
%if 0%{?suse_version}
|
||||||
|
%suse_update_desktop_file -n %{name}
|
||||||
|
|
||||||
|
|
||||||
|
# There are some png file duplicates, hardlink them.
|
||||||
|
%if 0%{?suse_version} >= 1030
|
||||||
|
%fdupes
|
||||||
|
%endif
|
||||||
|
|
||||||
|
|
||||||
|
# We install icons, so this is needed.
|
||||||
|
%if 0%{?suse_version} >= 1140
|
||||||
|
%post
|
||||||
|
%icon_theme_cache_post
|
||||||
|
|
||||||
|
%postun
|
||||||
|
%icon_theme_cache_postun
|
||||||
|
%endif
|
||||||
|
|
||||||
|
# endif suse
|
||||||
|
%endif
|
||||||
|
|
||||||
|
|
||||||
|
%if 0%{?fedora_version}
|
||||||
|
# We still retain gsmartcontrol-root for consistency with other distributions.
|
||||||
|
|
||||||
|
# Make the desktop file run gsmartcontrol instead of gsmartcontrol-root
|
||||||
|
sed "s|gsmartcontrol-root|gsmartcontrol|g" %{buildroot}%{_datadir}/applications/gsmartcontrol.desktop > %{buildroot}%{_datadir}/applications/gsmartcontrol.desktop.new
|
||||||
|
mv -f %{buildroot}%{_datadir}/applications/gsmartcontrol.desktop.new %{buildroot}%{_datadir}/applications/gsmartcontrol.desktop
|
||||||
|
|
||||||
|
# The rest is taken from the official fedora spec:
|
||||||
|
# http://pkgs.fedoraproject.org/cgit/gsmartcontrol.git/tree/
|
||||||
|
|
||||||
|
# Set up for console-helper
|
||||||
|
mkdir -p %{buildroot}%{_sbindir}
|
||||||
|
# Add a copy as "gsmartcontrol-noroot", since gsmartcontrol will always
|
||||||
|
# ask for root password.
|
||||||
|
cp %{buildroot}%{_bindir}/%{name} %{buildroot}%{_bindir}/%{name}-noroot
|
||||||
|
mv %{buildroot}%{_bindir}/%{name} %{buildroot}%{_sbindir}/%{name}
|
||||||
|
ln -s consolehelper %{buildroot}%{_bindir}/%{name}
|
||||||
|
|
||||||
|
mkdir -p %{buildroot}%{_sysconfdir}/pam.d
|
||||||
|
cat <<EOF >%{buildroot}%{_sysconfdir}/pam.d/%{name}
|
||||||
|
#%%PAM-1.0
|
||||||
|
auth include config-util
|
||||||
|
account include config-util
|
||||||
|
session include config-util
|
||||||
|
EOF
|
||||||
|
|
||||||
|
mkdir -p %{buildroot}%{_sysconfdir}/security/console.apps
|
||||||
|
cat <<EOF >%{buildroot}%{_sysconfdir}/security/console.apps/%{name}
|
||||||
|
USER=root
|
||||||
|
PROGRAM=/usr/sbin/gsmartcontrol
|
||||||
|
SESSION=true
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# endif fedora
|
||||||
|
%endif
|
||||||
|
|
||||||
|
|
||||||
|
%if 0%{?mandriva_version}
|
||||||
|
desktop-file-install --vendor="" \
|
||||||
|
--remove-category="Application" \
|
||||||
|
--add-category="System" \
|
||||||
|
--add-category="X-MandrivaLinux-System-Configuration-Hardware;Settings;HardwareSettings" \
|
||||||
|
--dir $RPM_BUILD_ROOT%{_datadir}/applications $RPM_BUILD_ROOT%{_datadir}/applications/%{name}.desktop
|
||||||
|
%endif
|
||||||
|
|
||||||
|
|
||||||
|
%clean
|
||||||
|
rm -rf %buildroot
|
||||||
|
|
||||||
|
|
||||||
|
%files
|
||||||
|
%defattr(-,root,root)
|
||||||
|
|
||||||
|
%attr(0755,root,root) %{_bindir}/*
|
||||||
|
# %%attr(0644,root,root) %%config(noreplace) %%{_sysconfdir}/*
|
||||||
|
|
||||||
|
%doc %{_datadir}/doc/gsmartcontrol
|
||||||
|
%doc %{_mandir}/man1/*
|
||||||
|
|
||||||
|
%{_datadir}/gsmartcontrol
|
||||||
|
# %%{_datadir}/gsmartcontrol/*
|
||||||
|
%{_datadir}/applications/*.desktop
|
||||||
|
%{_datadir}/metainfo
|
||||||
|
%{_datadir}/metainfo/*.appdata.xml
|
||||||
|
%{_datadir}/icons/*
|
||||||
|
%{_datadir}/pixmaps/*
|
||||||
|
|
||||||
|
%if 0%{?fedora_version}
|
||||||
|
%config(noreplace) %{_sysconfdir}/pam.d/%{name}
|
||||||
|
%config(noreplace) %{_sysconfdir}/security/console.apps/%{name}
|
||||||
|
%{_sbindir}/gsmartcontrol
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%changelog
|
||||||
@@ -1 +0,0 @@
|
|||||||
svn propset svn:ignore -F .svnignore.txt .
|
|
||||||
@@ -1,262 +0,0 @@
|
|||||||
|
|
||||||
# Add autoconf.m4 directory to local macro search path
|
|
||||||
ACLOCAL_AMFLAGS = -I autoconf.m4
|
|
||||||
|
|
||||||
SUBDIRS = data debian.dist src
|
|
||||||
|
|
||||||
|
|
||||||
# These files are actually needed for compilation.
|
|
||||||
noinst_DATA = AUTHORS.txt LICENSE_gsmartcontrol.txt
|
|
||||||
|
|
||||||
|
|
||||||
# For the files to be bundled with the distribution, specify them in
|
|
||||||
# one of the following.
|
|
||||||
|
|
||||||
# These will be installed into docdir.
|
|
||||||
# Some of these files are actually needed for compilation (see src/res/Makefile.am).
|
|
||||||
dist_doc_DATA = AUTHORS.txt ChangeLog NEWS README.txt \
|
|
||||||
LICENSE_boost_1_0.txt \
|
|
||||||
LICENSE_bsd-ac.txt \
|
|
||||||
LICENSE_bsd-ucb.txt \
|
|
||||||
LICENSE_gpl2.txt \
|
|
||||||
LICENSE_gpl3.txt \
|
|
||||||
LICENSE_gsmartcontrol.txt \
|
|
||||||
LICENSE_hz.txt \
|
|
||||||
LICENSE_unlicense.txt \
|
|
||||||
LICENSE_zlib.txt
|
|
||||||
|
|
||||||
|
|
||||||
# nobase_ preserves their directory names.
|
|
||||||
nobase_dist_doc_DATA = contrib/cron-based_noadmin/README \
|
|
||||||
contrib/cron-based_noadmin/cron_gather_smart.sh \
|
|
||||||
contrib/cron-based_noadmin/crontab.example \
|
|
||||||
contrib/cron-based_noadmin/smartctl_subst.sh
|
|
||||||
|
|
||||||
|
|
||||||
# Extra files bundled with distribution.
|
|
||||||
# file2csource.sh is needed for building but not installed.
|
|
||||||
EXTRA_DIST = COPYING INSTALL configure autogen.sh \
|
|
||||||
gsmartcontrol.kdev4 \
|
|
||||||
file2csource.sh \
|
|
||||||
gsmartcontrol.spec
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# rpm support
|
|
||||||
|
|
||||||
src-rpm: dist
|
|
||||||
rpmbuild -ts $(distdir).tar.bz2
|
|
||||||
|
|
||||||
|
|
||||||
# NSIS installer support.
|
|
||||||
# Requires installed NSIS, smartctl-nc.exe, smartctl.exe, update-smart-drivedb.exe.
|
|
||||||
# Gtkmm and pcre dlls are required if linking against them.
|
|
||||||
# dos2unix on build machine.
|
|
||||||
# Execute only with win32 build present.
|
|
||||||
|
|
||||||
WIN_ZIP_NAME = $(PACKAGE)-$(VERSION)-@WINDOWS_SUFFIX@
|
|
||||||
|
|
||||||
|
|
||||||
win-dist: win-dist-nocleanup win-dist-cleanup
|
|
||||||
|
|
||||||
win-dist-nocleanup: win-dist-prepare nsis-dist-nocleanup win-zip-dist-nocleanup
|
|
||||||
|
|
||||||
win-dist-cleanup: win-zip-dist-cleanup nsis-dist-cleanup
|
|
||||||
rm -rf win-dist
|
|
||||||
|
|
||||||
win-dist-clean: win-dist-cleanup
|
|
||||||
rm -f gsmartcontrol-*.exe gsmartcontrol-*.zip
|
|
||||||
|
|
||||||
|
|
||||||
win-dist-prepare-all: nsis-dist-prepare win-zip-dist-prepare
|
|
||||||
|
|
||||||
|
|
||||||
# All of GTK+
|
|
||||||
GTK_BIN_FILES = gdk-pixbuf-query-loaders.exe \
|
|
||||||
gspawn-win32-helper-console.exe \
|
|
||||||
gspawn-win32-helper.exe \
|
|
||||||
gspawn-win64-helper-console.exe \
|
|
||||||
gspawn-win64-helper.exe \
|
|
||||||
gtk-query-immodules-3.0.exe \
|
|
||||||
gtk-update-icon-cache-3.0.exe \
|
|
||||||
libatk-1.*.dll \
|
|
||||||
libatkmm-1.*.dll \
|
|
||||||
libbz2-*.dll \
|
|
||||||
libcairo-*.dll \
|
|
||||||
libcairomm-1*.dll \
|
|
||||||
libepoxy-*.dll \
|
|
||||||
libffi-*.dll \
|
|
||||||
libexpat-*.dll \
|
|
||||||
libfontconfig-*.dll \
|
|
||||||
libfreetype-*.dll \
|
|
||||||
libgdk-3*.dll \
|
|
||||||
libgdk_pixbuf-2.*.dll \
|
|
||||||
libgdkmm-3.*.dll \
|
|
||||||
libgio-2.*.dll \
|
|
||||||
libgiomm-2.*.dll \
|
|
||||||
libglib-2.*.dll \
|
|
||||||
libglibmm*2.*.dll \
|
|
||||||
libgmodule-2.*.dll \
|
|
||||||
libgobject-2.*.dll \
|
|
||||||
libgraphite*.dll \
|
|
||||||
libgthread-2.*.dll \
|
|
||||||
libgtk-3*.dll \
|
|
||||||
libgtkmm-3*.dll \
|
|
||||||
libharfbuzz*.dll \
|
|
||||||
libiconv*.dll \
|
|
||||||
libintl*.dll \
|
|
||||||
libjasper*.dll \
|
|
||||||
libjpeg*.dll \
|
|
||||||
liblzma*.dll \
|
|
||||||
libpango*-1.*.dll \
|
|
||||||
libpixman*.dll \
|
|
||||||
libpng16-*.dll \
|
|
||||||
libsigc-2.*.dll \
|
|
||||||
libstdc++-*.dll \
|
|
||||||
libtiff-*.dll \
|
|
||||||
libwinpthread-*.dll \
|
|
||||||
libxml2-*.dll \
|
|
||||||
zlib1.dll
|
|
||||||
|
|
||||||
|
|
||||||
# Don't strip smartctl (it will only change the header), and
|
|
||||||
# don't strip update-smart-drivedb (it will break its CRC check).
|
|
||||||
win-dist-prepare: all
|
|
||||||
$(MKDIR_P) win-dist
|
|
||||||
cp $(top_srcdir)/data/icon_*.png win-dist/
|
|
||||||
|
|
||||||
$(MKDIR_P) win-dist/doc
|
|
||||||
cp data/nsis/distribution.txt win-dist/doc/
|
|
||||||
cp $(top_srcdir)/AUTHORS.txt $(top_srcdir)/LICENSE_* $(top_srcdir)/README.txt win-dist/doc/
|
|
||||||
cp $(top_srcdir)/NEWS win-dist/doc/NEWS.txt
|
|
||||||
|
|
||||||
cp src/gsmartcontrol.exe src/gsmartcontrol.exe.manifest win-dist/
|
|
||||||
|
|
||||||
unix2dos win-dist/doc/*.txt
|
|
||||||
|
|
||||||
cp -p "@WINDOWS_SYSROOT@"/bin/drivedb.h win-dist/
|
|
||||||
cp -p "@WINDOWS_SYSROOT@"/bin/smartctl-nc.exe win-dist/
|
|
||||||
cp -p "@WINDOWS_SYSROOT@"/bin/smartctl.exe win-dist/
|
|
||||||
cp -p "@WINDOWS_SYSROOT@"/bin/update-smart-drivedb.exe win-dist/
|
|
||||||
|
|
||||||
for file in $(GTK_BIN_FILES); do for f in "@WINDOWS_SYSROOT@/bin/"$$file; do if test -f "$${f}"; then cp -p "$${f}" win-dist/; fi; done; done
|
|
||||||
|
|
||||||
# <prefix>/etc/gtk-3.0/ should contain settings.ini with a win32 theme.
|
|
||||||
$(MKDIR_P) win-dist/etc
|
|
||||||
$(MKDIR_P) win-dist/etc/fonts
|
|
||||||
$(MKDIR_P) win-dist/etc/gtk-3.0
|
|
||||||
cp -p "@WINDOWS_SYSROOT@"/etc/fonts/fonts.conf win-dist/etc/fonts/
|
|
||||||
# cp -p "@WINDOWS_SYSROOT@"/etc/gtk-3.0/im-multipress.conf win-dist/etc/gtk-3.0/
|
|
||||||
cp -p "@WINDOWS_SYSROOT@"/etc/gtk-3.0/settings.ini win-dist/etc/gtk-3.0/
|
|
||||||
|
|
||||||
$(MKDIR_P) win-dist/share
|
|
||||||
cp -p -r "@WINDOWS_SYSROOT@"/share/themes win-dist/share
|
|
||||||
|
|
||||||
# needed for file chooser
|
|
||||||
$(MKDIR_P) win-dist/share/glib-2.0
|
|
||||||
cp -p -r "@WINDOWS_SYSROOT@"/share/glib-2.0/schemas win-dist/share/glib-2.0
|
|
||||||
|
|
||||||
# $(MKDIR_P) win-dist/share/icons
|
|
||||||
# cp -p "@WINDOWS_SYSROOT@"/share/icons/hicolor win-dist/share/icons
|
|
||||||
|
|
||||||
# needed for window titlebar (if using client-side decorations),
|
|
||||||
# tree sorting indicators, GUI icons.
|
|
||||||
$(MKDIR_P) win-dist/share/icons/Adwaita/16x16/actions
|
|
||||||
# cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/16x16/actions/window-close-symbolic.symbolic.png win-dist/share/icons/Adwaita/16x16/actions
|
|
||||||
# cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/16x16/actions/window-maximize-symbolic.symbolic.png win-dist/share/icons/Adwaita/16x16/actions
|
|
||||||
# cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/16x16/actions/window-minimize-symbolic.symbolic.png win-dist/share/icons/Adwaita/16x16/actions
|
|
||||||
# cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/16x16/actions/window-restore-symbolic.symbolic.png win-dist/share/icons/Adwaita/16x16/actions
|
|
||||||
cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/16x16/actions/pan-down-symbolic.symbolic.png win-dist/share/icons/Adwaita/16x16/actions
|
|
||||||
cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/16x16/actions/pan-up-symbolic.symbolic.png win-dist/share/icons/Adwaita/16x16/actions
|
|
||||||
$(MKDIR_P) win-dist/share/icons/Adwaita/16x16/status
|
|
||||||
cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/16x16/status/dialog-information.png win-dist/share/icons/Adwaita/16x16/status
|
|
||||||
$(MKDIR_P) win-dist/share/icons/Adwaita/22x22/status
|
|
||||||
cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/22x22/status/dialog-information.png win-dist/share/icons/Adwaita/22x22/status
|
|
||||||
$(MKDIR_P) win-dist/share/icons/Adwaita/24x24/actions
|
|
||||||
# cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/24x24/actions/window-close-symbolic.symbolic.png win-dist/share/icons/Adwaita/24x24/actions
|
|
||||||
# cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/24x24/actions/window-maximize-symbolic.symbolic.png win-dist/share/icons/Adwaita/24x24/actions
|
|
||||||
# cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/24x24/actions/window-minimize-symbolic.symbolic.png win-dist/share/icons/Adwaita/24x24/actions
|
|
||||||
# cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/24x24/actions/window-restore-symbolic.symbolic.png win-dist/share/icons/Adwaita/24x24/actions
|
|
||||||
cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/24x24/actions/pan-down-symbolic.symbolic.png win-dist/share/icons/Adwaita/24x24/actions
|
|
||||||
cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/24x24/actions/pan-up-symbolic.symbolic.png win-dist/share/icons/Adwaita/24x24/actions
|
|
||||||
$(MKDIR_P) win-dist/share/icons/Adwaita/24x24/status
|
|
||||||
cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/24x24/status/dialog-information.png win-dist/share/icons/Adwaita/24x24/status
|
|
||||||
$(MKDIR_P) win-dist/share/icons/Adwaita/32x32/actions
|
|
||||||
# cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/32x32/actions/window-close-symbolic.symbolic.png win-dist/share/icons/Adwaita/32x32/actions
|
|
||||||
# cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/32x32/actions/window-maximize-symbolic.symbolic.png win-dist/share/icons/Adwaita/32x32/actions
|
|
||||||
# cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/32x32/actions/window-minimize-symbolic.symbolic.png win-dist/share/icons/Adwaita/32x32/actions
|
|
||||||
# cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/32x32/actions/window-restore-symbolic.symbolic.png win-dist/share/icons/Adwaita/32x32/actions
|
|
||||||
cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/32x32/actions/pan-down-symbolic.symbolic.png win-dist/share/icons/Adwaita/32x32/actions
|
|
||||||
cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/32x32/actions/pan-up-symbolic.symbolic.png win-dist/share/icons/Adwaita/32x32/actions
|
|
||||||
$(MKDIR_P) win-dist/share/icons/Adwaita/32x32/status
|
|
||||||
cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/32x32/status/dialog-information.png win-dist/share/icons/Adwaita/32x32/status
|
|
||||||
$(MKDIR_P) win-dist/share/icons/Adwaita/48x48/actions
|
|
||||||
# cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/48x48/actions/window-close-symbolic.symbolic.png win-dist/share/icons/Adwaita/48x48/actions
|
|
||||||
# cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/48x48/actions/window-maximize-symbolic.symbolic.png win-dist/share/icons/Adwaita/48x48/actions
|
|
||||||
# cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/48x48/actions/window-minimize-symbolic.symbolic.png win-dist/share/icons/Adwaita/48x48/actions
|
|
||||||
# cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/48x48/actions/window-restore-symbolic.symbolic.png win-dist/share/icons/Adwaita/48x48/actions
|
|
||||||
cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/48x48/actions/pan-down-symbolic.symbolic.png win-dist/share/icons/Adwaita/48x48/actions
|
|
||||||
cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/48x48/actions/pan-up-symbolic.symbolic.png win-dist/share/icons/Adwaita/48x48/actions
|
|
||||||
$(MKDIR_P) win-dist/share/icons/Adwaita/48x48/status
|
|
||||||
cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/48x48/status/dialog-information.png win-dist/share/icons/Adwaita/48x48/status
|
|
||||||
$(MKDIR_P) win-dist/share/icons/Adwaita/64x64/actions
|
|
||||||
# cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/64x64/actions/window-close-symbolic.symbolic.png win-dist/share/icons/Adwaita/64x64/actions
|
|
||||||
# cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/64x64/actions/window-maximize-symbolic.symbolic.png win-dist/share/icons/Adwaita/64x64/actions
|
|
||||||
# cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/64x64/actions/window-minimize-symbolic.symbolic.png win-dist/share/icons/Adwaita/64x64/actions
|
|
||||||
# cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/64x64/actions/window-restore-symbolic.symbolic.png win-dist/share/icons/Adwaita/64x64/actions
|
|
||||||
cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/64x64/actions/pan-down-symbolic.symbolic.png win-dist/share/icons/Adwaita/64x64/actions
|
|
||||||
cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/64x64/actions/pan-up-symbolic.symbolic.png win-dist/share/icons/Adwaita/64x64/actions
|
|
||||||
# $(MKDIR_P) win-dist/share/icons/Adwaita/64x64/status
|
|
||||||
# cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/64x64/status/dialog-information.png win-dist/share/icons/Adwaita/64x64/status
|
|
||||||
$(MKDIR_P) win-dist/share/icons/Adwaita/96x96/actions
|
|
||||||
# cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/96x96/actions/window-close-symbolic.symbolic.png win-dist/share/icons/Adwaita/96x96/actions
|
|
||||||
# cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/96x96/actions/window-maximize-symbolic.symbolic.png win-dist/share/icons/Adwaita/96x96/actions
|
|
||||||
# cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/96x96/actions/window-minimize-symbolic.symbolic.png win-dist/share/icons/Adwaita/96x96/actions
|
|
||||||
# cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/96x96/actions/window-restore-symbolic.symbolic.png win-dist/share/icons/Adwaita/96x96/actions
|
|
||||||
cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/96x96/actions/pan-down-symbolic.symbolic.png win-dist/share/icons/Adwaita/96x96/actions
|
|
||||||
cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/96x96/actions/pan-up-symbolic.symbolic.png win-dist/share/icons/Adwaita/96x96/actions
|
|
||||||
# $(MKDIR_P) win-dist/share/icons/Adwaita/96x96/status
|
|
||||||
# cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/96x96/status/dialog-information.png win-dist/share/icons/Adwaita/96x96/status
|
|
||||||
$(MKDIR_P) win-dist/share/icons/Adwaita/256x256/status
|
|
||||||
cp -p "@WINDOWS_SYSROOT@"/share/icons/Adwaita/256x256/status/dialog-information.png win-dist/share/icons/Adwaita/256x256/status
|
|
||||||
|
|
||||||
# other
|
|
||||||
cp -p "@WINDOWS_SYSROOT@"/bin/libgcc_s_*.dll win-dist/
|
|
||||||
cp -p "@WINDOWS_SYSROOT@"/bin/libpcre-1.dll win-dist/
|
|
||||||
cp -p "@WINDOWS_SYSROOT@"/bin/libpcrecpp-0.dll win-dist/
|
|
||||||
|
|
||||||
|
|
||||||
nsis-dist-prepare: win-dist-prepare
|
|
||||||
cp -a win-dist nsis-dist
|
|
||||||
cp $(top_srcdir)/data/gsmartcontrol.ico nsis-dist/
|
|
||||||
cp data/nsis/*.nsi $(top_srcdir)/data/nsis/nsi_* nsis-dist/
|
|
||||||
unix2dos nsis-dist/*.nsi
|
|
||||||
|
|
||||||
nsis-dist-nocleanup: nsis-dist-prepare
|
|
||||||
cd nsis-dist && @NSIS_EXEC@ gsmartcontrol.nsi
|
|
||||||
mv nsis-dist/$(PACKAGE)-$(VERSION)-@WINDOWS_SUFFIX@.exe .
|
|
||||||
|
|
||||||
nsis-dist-cleanup:
|
|
||||||
rm -rf nsis-dist
|
|
||||||
|
|
||||||
nsis-dist: nsis-dist-prepare nsis-dist-nocleanup nsis-dist-cleanup
|
|
||||||
|
|
||||||
|
|
||||||
win-zip-dist-prepare: win-dist-prepare
|
|
||||||
cp -a win-dist $(WIN_ZIP_NAME)
|
|
||||||
|
|
||||||
win-zip-dist-nocleanup: win-zip-dist-prepare
|
|
||||||
zip -K -9r $(WIN_ZIP_NAME).zip $(WIN_ZIP_NAME)
|
|
||||||
|
|
||||||
win-zip-dist-cleanup:
|
|
||||||
rm -rf $(WIN_ZIP_NAME)
|
|
||||||
|
|
||||||
win-zip-dist: win-zip-dist-prepare win-zip-dist-nocleanup win-zip-dist-cleanup
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
distclean-local: win-dist-clean
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,101 +0,0 @@
|
|||||||
|
|
||||||
About GSmartControl
|
|
||||||
|
|
||||||
GSmartControl - Hard disk drive and SSD health inspection tool.
|
|
||||||
|
|
||||||
GSmartControl is a graphical user interface for smartctl (from smartmontools
|
|
||||||
package, see https://www.smartmontools.org/), which is a tool for
|
|
||||||
querying and controlling SMART (Self-Monitoring, Analysis, and Reporting
|
|
||||||
Technology) data on modern hard disk and solid-state drives. It allows you to
|
|
||||||
inspect the drive's SMART data to determine its health, as well as run various
|
|
||||||
tests on it.
|
|
||||||
|
|
||||||
GSmartControl supports ATA drives (both PATA and SATA), various USB to
|
|
||||||
ATA bridges and drives behind some RAID controllers:
|
|
||||||
* Adaptec (Linux, some models only)
|
|
||||||
* Areca (Linux, Windows)
|
|
||||||
* HP CCISS (Linux)
|
|
||||||
* HP hpsa / hpahcisr (Linux)
|
|
||||||
* Intel Matrix Storage (CSMI) (Linux, Windows, FreeBSD)
|
|
||||||
* LSI 3ware (Linux, Windows)
|
|
||||||
* LSI MegaRAID (Windows)
|
|
||||||
|
|
||||||
Note: Smartmontools supports even more RAID Controllers. The drives
|
|
||||||
behind such controllers can be manually added to GSmartControl using
|
|
||||||
"Add Device..." functionality or --add-device command-line option.
|
|
||||||
See https://www.smartmontools.org/wiki/Supported_RAID-Controllers .
|
|
||||||
|
|
||||||
https://gsmartcontrol.sourceforge.io/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Software Requirements
|
|
||||||
|
|
||||||
Note: If using the official Windows package, no additional software is required.
|
|
||||||
|
|
||||||
Build requirements:
|
|
||||||
* pcre 1 - http://www.pcre.org .
|
|
||||||
* GTK+, version 3.4 or higher - see http://www.gtk.org .
|
|
||||||
* Gtkmm, version 3.4 or higher - see http://www.gtkmm.org .
|
|
||||||
|
|
||||||
Runtime requirements:
|
|
||||||
* smartmontools - see https://www.smartmontools.org/ .
|
|
||||||
* xterm
|
|
||||||
|
|
||||||
The following operating systems are supported:
|
|
||||||
* Linux - All the popular configurations should work.
|
|
||||||
* FreeBSD - Tested with DesktopBSD / x86.
|
|
||||||
* NetBSD - Tested with NetBSD / x86.
|
|
||||||
* OpenBSD - Tested with OpenBSD / x86-64.
|
|
||||||
* DragonFlyBSD - Code written but no testing has been performed yet. Expected
|
|
||||||
to work without any issues.
|
|
||||||
* Windows Vista SP2 (32-bit and 64-bit), Windows 7 SP1, Windows Server 2008,
|
|
||||||
Windows 8.1, Windows 10. The Windows port uses pd0, pd1, etc...
|
|
||||||
for physical drives 0, 1, etc... .
|
|
||||||
* Mac OS X.
|
|
||||||
* Solaris.
|
|
||||||
* QNX - Code written but no testing has been performed yet.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Command Line Options
|
|
||||||
|
|
||||||
GSmartControl inherits options from GTK+ and other libraries, so be sure to
|
|
||||||
run it with --help option to get a full list of accepted parameters.
|
|
||||||
Note: The Windows version may not have a text output at all, so --help and
|
|
||||||
similar arguments won't have any effect.
|
|
||||||
|
|
||||||
The most important parameters are:
|
|
||||||
|
|
||||||
-?, --help - Show help options.
|
|
||||||
|
|
||||||
-l, --no-locale - Don't use system locale.
|
|
||||||
|
|
||||||
-V, --version - Display version information.
|
|
||||||
|
|
||||||
--no-scan - Don't scan devices on startup.
|
|
||||||
|
|
||||||
--no-hide-tabs - Don't hide non-identity tabs when SMART is disabled. Useful
|
|
||||||
for debugging.
|
|
||||||
|
|
||||||
--add-virtual - Load smartctl data from file, creating a virtual drive. You
|
|
||||||
can specify this option multiple times.
|
|
||||||
|
|
||||||
--add-device - Add this device to device list. The format of the device is
|
|
||||||
"<device>::<type>::<extra_args>", where type and extra_args are optional. This
|
|
||||||
option is useful with --no-scan to list certain drives only. You can specify
|
|
||||||
this option multiple times.
|
|
||||||
Example: --add-device /dev/sda --add-device /dev/twa0::3ware,2 --add-device
|
|
||||||
'/dev/sdb::::-T permissive'.
|
|
||||||
|
|
||||||
-v, --verbose - Enable verbose logging; same as --verbosity-level 5.
|
|
||||||
|
|
||||||
-q, --quiet - Disable logging; same as --verbosity-level 0.
|
|
||||||
|
|
||||||
-b, --verbosity-level - Set verbosity level [0-5].
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
License and Copyright
|
|
||||||
|
|
||||||
For license information, see LICENSE_gsmartcontrol.txt file.
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
|
|
||||||
|
|
||||||
GTKMM Notes:
|
|
||||||
|
|
||||||
To transfer an ownership from your local code to a container, use
|
|
||||||
Gtk::Button* pButton = Gtk::manage(new Gtk::Button("Test"));
|
|
||||||
container->add(*pButton);
|
|
||||||
(add() takes an object by reference).
|
|
||||||
otherwise, you will need to delete() it.
|
|
||||||
|
|
||||||
local scope destruction also works if using stack variables.
|
|
||||||
{
|
|
||||||
Gtk::Button aButton;
|
|
||||||
// destroyed here
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
--------------------------------------------------------
|
|
||||||
|
|
||||||
TODO:
|
|
||||||
|
|
||||||
-l defects support? (smartctl 6.6)
|
|
||||||
|
|
||||||
|
|
||||||
Don't rely on smartctl return code (2), parse the output instead.
|
|
||||||
This will allow us to show the Info page.
|
|
||||||
Need usage cases.
|
|
||||||
|
|
||||||
|
|
||||||
Testing:
|
|
||||||
If ETA time has elapsed, but it's still only at 10% completion,
|
|
||||||
ETA 0 is displayed. Fix.
|
|
||||||
Detect running tests on launch (maybe ask the user too? some tests
|
|
||||||
may be stuck due to bad firmware, e.g. 3ware/windows).
|
|
||||||
If smartctl outputs gibberish while testing, the GUI hangs.
|
|
||||||
|
|
||||||
|
|
||||||
Support RAID for these controllers (supported by smartctl 6.5):
|
|
||||||
https://www.smartmontools.org/wiki/Supported_RAID-Controllers
|
|
||||||
|
|
||||||
Adaptec (Windows, Linux using "-d aacraid")
|
|
||||||
HighPoint RocketRAID (Linux, FreeBSD (analyze sent info))
|
|
||||||
LSI MegaRAID (Linux, FreeBSD)
|
|
||||||
3ware (FreeBSD)
|
|
||||||
Areca (FreeBSD)
|
|
||||||
HP CCISS (FreeBSD)
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,982 +0,0 @@
|
|||||||
# ===========================================================================
|
|
||||||
# https://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html
|
|
||||||
# ===========================================================================
|
|
||||||
#
|
|
||||||
# SYNOPSIS
|
|
||||||
#
|
|
||||||
# AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional])
|
|
||||||
#
|
|
||||||
# DESCRIPTION
|
|
||||||
#
|
|
||||||
# Check for baseline language coverage in the compiler for the specified
|
|
||||||
# version of the C++ standard. If necessary, add switches to CXX and
|
|
||||||
# CXXCPP to enable support. VERSION may be '11' (for the C++11 standard)
|
|
||||||
# or '14' (for the C++14 standard).
|
|
||||||
#
|
|
||||||
# The second argument, if specified, indicates whether you insist on an
|
|
||||||
# extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g.
|
|
||||||
# -std=c++11). If neither is specified, you get whatever works, with
|
|
||||||
# preference for an extended mode.
|
|
||||||
#
|
|
||||||
# The third argument, if specified 'mandatory' or if left unspecified,
|
|
||||||
# indicates that baseline support for the specified C++ standard is
|
|
||||||
# required and that the macro should error out if no mode with that
|
|
||||||
# support is found. If specified 'optional', then configuration proceeds
|
|
||||||
# regardless, after defining HAVE_CXX${VERSION} if and only if a
|
|
||||||
# supporting mode is found.
|
|
||||||
#
|
|
||||||
# LICENSE
|
|
||||||
#
|
|
||||||
# Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com>
|
|
||||||
# Copyright (c) 2012 Zack Weinberg <zackw@panix.com>
|
|
||||||
# Copyright (c) 2013 Roy Stogner <roystgnr@ices.utexas.edu>
|
|
||||||
# Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov <sokolov@google.com>
|
|
||||||
# Copyright (c) 2015 Paul Norman <penorman@mac.com>
|
|
||||||
# Copyright (c) 2015 Moritz Klammler <moritz@klammler.eu>
|
|
||||||
# Copyright (c) 2016 Krzesimir Nowak <qdlacz@gmail.com>
|
|
||||||
#
|
|
||||||
# Copying and distribution of this file, with or without modification, are
|
|
||||||
# permitted in any medium without royalty provided the copyright notice
|
|
||||||
# and this notice are preserved. This file is offered as-is, without any
|
|
||||||
# warranty.
|
|
||||||
|
|
||||||
#serial 7
|
|
||||||
|
|
||||||
dnl This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro
|
|
||||||
dnl (serial version number 13).
|
|
||||||
|
|
||||||
AX_REQUIRE_DEFINED([AC_MSG_WARN])
|
|
||||||
AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl
|
|
||||||
m4_if([$1], [11], [ax_cxx_compile_alternatives="11 0x"],
|
|
||||||
[$1], [14], [ax_cxx_compile_alternatives="14 1y"],
|
|
||||||
[$1], [17], [ax_cxx_compile_alternatives="17 1z"],
|
|
||||||
[m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl
|
|
||||||
m4_if([$2], [], [],
|
|
||||||
[$2], [ext], [],
|
|
||||||
[$2], [noext], [],
|
|
||||||
[m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl
|
|
||||||
m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true],
|
|
||||||
[$3], [mandatory], [ax_cxx_compile_cxx$1_required=true],
|
|
||||||
[$3], [optional], [ax_cxx_compile_cxx$1_required=false],
|
|
||||||
[m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])])
|
|
||||||
AC_LANG_PUSH([C++])dnl
|
|
||||||
ac_success=no
|
|
||||||
AC_CACHE_CHECK(whether $CXX supports C++$1 features by default,
|
|
||||||
ax_cv_cxx_compile_cxx$1,
|
|
||||||
[AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
|
|
||||||
[ax_cv_cxx_compile_cxx$1=yes],
|
|
||||||
[ax_cv_cxx_compile_cxx$1=no])])
|
|
||||||
if test x$ax_cv_cxx_compile_cxx$1 = xyes; then
|
|
||||||
ac_success=yes
|
|
||||||
fi
|
|
||||||
|
|
||||||
m4_if([$2], [noext], [], [dnl
|
|
||||||
if test x$ac_success = xno; then
|
|
||||||
for alternative in ${ax_cxx_compile_alternatives}; do
|
|
||||||
switch="-std=gnu++${alternative}"
|
|
||||||
cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
|
|
||||||
AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
|
|
||||||
$cachevar,
|
|
||||||
[ac_save_CXX="$CXX"
|
|
||||||
CXX="$CXX $switch"
|
|
||||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
|
|
||||||
[eval $cachevar=yes],
|
|
||||||
[eval $cachevar=no])
|
|
||||||
CXX="$ac_save_CXX"])
|
|
||||||
if eval test x\$$cachevar = xyes; then
|
|
||||||
CXX="$CXX $switch"
|
|
||||||
if test -n "$CXXCPP" ; then
|
|
||||||
CXXCPP="$CXXCPP $switch"
|
|
||||||
fi
|
|
||||||
ac_success=yes
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
fi])
|
|
||||||
|
|
||||||
m4_if([$2], [ext], [], [dnl
|
|
||||||
if test x$ac_success = xno; then
|
|
||||||
dnl HP's aCC needs +std=c++11 according to:
|
|
||||||
dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf
|
|
||||||
dnl Cray's crayCC needs "-h std=c++11"
|
|
||||||
for alternative in ${ax_cxx_compile_alternatives}; do
|
|
||||||
for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}"; do
|
|
||||||
cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
|
|
||||||
AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
|
|
||||||
$cachevar,
|
|
||||||
[ac_save_CXX="$CXX"
|
|
||||||
CXX="$CXX $switch"
|
|
||||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
|
|
||||||
[eval $cachevar=yes],
|
|
||||||
[eval $cachevar=no])
|
|
||||||
CXX="$ac_save_CXX"])
|
|
||||||
if eval test x\$$cachevar = xyes; then
|
|
||||||
CXX="$CXX $switch"
|
|
||||||
if test -n "$CXXCPP" ; then
|
|
||||||
CXXCPP="$CXXCPP $switch"
|
|
||||||
fi
|
|
||||||
ac_success=yes
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
if test x$ac_success = xyes; then
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
fi])
|
|
||||||
AC_LANG_POP([C++])
|
|
||||||
if test x$ax_cxx_compile_cxx$1_required = xtrue; then
|
|
||||||
if test x$ac_success = xno; then
|
|
||||||
AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
if test x$ac_success = xno; then
|
|
||||||
HAVE_CXX$1=0
|
|
||||||
AC_MSG_NOTICE([No compiler with C++$1 support was found])
|
|
||||||
else
|
|
||||||
HAVE_CXX$1=1
|
|
||||||
AC_DEFINE(HAVE_CXX$1,1,
|
|
||||||
[define if the compiler supports basic C++$1 syntax])
|
|
||||||
fi
|
|
||||||
AC_SUBST(HAVE_CXX$1)
|
|
||||||
m4_if([$1], [17], [AC_MSG_WARN([C++17 is not yet standardized, so the checks may change in incompatible ways anytime])])
|
|
||||||
])
|
|
||||||
|
|
||||||
|
|
||||||
dnl Test body for checking C++11 support
|
|
||||||
|
|
||||||
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11],
|
|
||||||
_AX_CXX_COMPILE_STDCXX_testbody_new_in_11
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
dnl Test body for checking C++14 support
|
|
||||||
|
|
||||||
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14],
|
|
||||||
_AX_CXX_COMPILE_STDCXX_testbody_new_in_11
|
|
||||||
_AX_CXX_COMPILE_STDCXX_testbody_new_in_14
|
|
||||||
)
|
|
||||||
|
|
||||||
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_17],
|
|
||||||
_AX_CXX_COMPILE_STDCXX_testbody_new_in_11
|
|
||||||
_AX_CXX_COMPILE_STDCXX_testbody_new_in_14
|
|
||||||
_AX_CXX_COMPILE_STDCXX_testbody_new_in_17
|
|
||||||
)
|
|
||||||
|
|
||||||
dnl Tests for new features in C++11
|
|
||||||
|
|
||||||
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[
|
|
||||||
|
|
||||||
// If the compiler admits that it is not ready for C++11, why torture it?
|
|
||||||
// Hopefully, this will speed up the test.
|
|
||||||
|
|
||||||
#ifndef __cplusplus
|
|
||||||
|
|
||||||
#error "This is not a C++ compiler"
|
|
||||||
|
|
||||||
#elif __cplusplus < 201103L
|
|
||||||
|
|
||||||
#error "This is not a C++11 compiler"
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
namespace cxx11
|
|
||||||
{
|
|
||||||
|
|
||||||
namespace test_static_assert
|
|
||||||
{
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct check
|
|
||||||
{
|
|
||||||
static_assert(sizeof(int) <= sizeof(T), "not big enough");
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace test_final_override
|
|
||||||
{
|
|
||||||
|
|
||||||
struct Base
|
|
||||||
{
|
|
||||||
virtual void f() {}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Derived : public Base
|
|
||||||
{
|
|
||||||
virtual void f() override {}
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace test_double_right_angle_brackets
|
|
||||||
{
|
|
||||||
|
|
||||||
template < typename T >
|
|
||||||
struct check {};
|
|
||||||
|
|
||||||
typedef check<void> single_type;
|
|
||||||
typedef check<check<void>> double_type;
|
|
||||||
typedef check<check<check<void>>> triple_type;
|
|
||||||
typedef check<check<check<check<void>>>> quadruple_type;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace test_decltype
|
|
||||||
{
|
|
||||||
|
|
||||||
int
|
|
||||||
f()
|
|
||||||
{
|
|
||||||
int a = 1;
|
|
||||||
decltype(a) b = 2;
|
|
||||||
return a + b;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace test_type_deduction
|
|
||||||
{
|
|
||||||
|
|
||||||
template < typename T1, typename T2 >
|
|
||||||
struct is_same
|
|
||||||
{
|
|
||||||
static const bool value = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
template < typename T >
|
|
||||||
struct is_same<T, T>
|
|
||||||
{
|
|
||||||
static const bool value = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
template < typename T1, typename T2 >
|
|
||||||
auto
|
|
||||||
add(T1 a1, T2 a2) -> decltype(a1 + a2)
|
|
||||||
{
|
|
||||||
return a1 + a2;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
test(const int c, volatile int v)
|
|
||||||
{
|
|
||||||
static_assert(is_same<int, decltype(0)>::value == true, "");
|
|
||||||
static_assert(is_same<int, decltype(c)>::value == false, "");
|
|
||||||
static_assert(is_same<int, decltype(v)>::value == false, "");
|
|
||||||
auto ac = c;
|
|
||||||
auto av = v;
|
|
||||||
auto sumi = ac + av + 'x';
|
|
||||||
auto sumf = ac + av + 1.0;
|
|
||||||
static_assert(is_same<int, decltype(ac)>::value == true, "");
|
|
||||||
static_assert(is_same<int, decltype(av)>::value == true, "");
|
|
||||||
static_assert(is_same<int, decltype(sumi)>::value == true, "");
|
|
||||||
static_assert(is_same<int, decltype(sumf)>::value == false, "");
|
|
||||||
static_assert(is_same<int, decltype(add(c, v))>::value == true, "");
|
|
||||||
return (sumf > 0.0) ? sumi : add(c, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace test_noexcept
|
|
||||||
{
|
|
||||||
|
|
||||||
int f() { return 0; }
|
|
||||||
int g() noexcept { return 0; }
|
|
||||||
|
|
||||||
static_assert(noexcept(f()) == false, "");
|
|
||||||
static_assert(noexcept(g()) == true, "");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace test_constexpr
|
|
||||||
{
|
|
||||||
|
|
||||||
template < typename CharT >
|
|
||||||
unsigned long constexpr
|
|
||||||
strlen_c_r(const CharT *const s, const unsigned long acc) noexcept
|
|
||||||
{
|
|
||||||
return *s ? strlen_c_r(s + 1, acc + 1) : acc;
|
|
||||||
}
|
|
||||||
|
|
||||||
template < typename CharT >
|
|
||||||
unsigned long constexpr
|
|
||||||
strlen_c(const CharT *const s) noexcept
|
|
||||||
{
|
|
||||||
return strlen_c_r(s, 0UL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static_assert(strlen_c("") == 0UL, "");
|
|
||||||
static_assert(strlen_c("1") == 1UL, "");
|
|
||||||
static_assert(strlen_c("example") == 7UL, "");
|
|
||||||
static_assert(strlen_c("another\0example") == 7UL, "");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace test_rvalue_references
|
|
||||||
{
|
|
||||||
|
|
||||||
template < int N >
|
|
||||||
struct answer
|
|
||||||
{
|
|
||||||
static constexpr int value = N;
|
|
||||||
};
|
|
||||||
|
|
||||||
answer<1> f(int&) { return answer<1>(); }
|
|
||||||
answer<2> f(const int&) { return answer<2>(); }
|
|
||||||
answer<3> f(int&&) { return answer<3>(); }
|
|
||||||
|
|
||||||
void
|
|
||||||
test()
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
const int c = 0;
|
|
||||||
static_assert(decltype(f(i))::value == 1, "");
|
|
||||||
static_assert(decltype(f(c))::value == 2, "");
|
|
||||||
static_assert(decltype(f(0))::value == 3, "");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace test_uniform_initialization
|
|
||||||
{
|
|
||||||
|
|
||||||
struct test
|
|
||||||
{
|
|
||||||
static const int zero {};
|
|
||||||
static const int one {1};
|
|
||||||
};
|
|
||||||
|
|
||||||
static_assert(test::zero == 0, "");
|
|
||||||
static_assert(test::one == 1, "");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace test_lambdas
|
|
||||||
{
|
|
||||||
|
|
||||||
void
|
|
||||||
test1()
|
|
||||||
{
|
|
||||||
auto lambda1 = [](){};
|
|
||||||
auto lambda2 = lambda1;
|
|
||||||
lambda1();
|
|
||||||
lambda2();
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
test2()
|
|
||||||
{
|
|
||||||
auto a = [](int i, int j){ return i + j; }(1, 2);
|
|
||||||
auto b = []() -> int { return '0'; }();
|
|
||||||
auto c = [=](){ return a + b; }();
|
|
||||||
auto d = [&](){ return c; }();
|
|
||||||
auto e = [a, &b](int x) mutable {
|
|
||||||
const auto identity = [](int y){ return y; };
|
|
||||||
for (auto i = 0; i < a; ++i)
|
|
||||||
a += b--;
|
|
||||||
return x + identity(a + b);
|
|
||||||
}(0);
|
|
||||||
return a + b + c + d + e;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
test3()
|
|
||||||
{
|
|
||||||
const auto nullary = [](){ return 0; };
|
|
||||||
const auto unary = [](int x){ return x; };
|
|
||||||
using nullary_t = decltype(nullary);
|
|
||||||
using unary_t = decltype(unary);
|
|
||||||
const auto higher1st = [](nullary_t f){ return f(); };
|
|
||||||
const auto higher2nd = [unary](nullary_t f1){
|
|
||||||
return [unary, f1](unary_t f2){ return f2(unary(f1())); };
|
|
||||||
};
|
|
||||||
return higher1st(nullary) + higher2nd(nullary)(unary);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace test_variadic_templates
|
|
||||||
{
|
|
||||||
|
|
||||||
template <int...>
|
|
||||||
struct sum;
|
|
||||||
|
|
||||||
template <int N0, int... N1toN>
|
|
||||||
struct sum<N0, N1toN...>
|
|
||||||
{
|
|
||||||
static constexpr auto value = N0 + sum<N1toN...>::value;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct sum<>
|
|
||||||
{
|
|
||||||
static constexpr auto value = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
static_assert(sum<>::value == 0, "");
|
|
||||||
static_assert(sum<1>::value == 1, "");
|
|
||||||
static_assert(sum<23>::value == 23, "");
|
|
||||||
static_assert(sum<1, 2>::value == 3, "");
|
|
||||||
static_assert(sum<5, 5, 11>::value == 21, "");
|
|
||||||
static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, "");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae
|
|
||||||
// Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function
|
|
||||||
// because of this.
|
|
||||||
namespace test_template_alias_sfinae
|
|
||||||
{
|
|
||||||
|
|
||||||
struct foo {};
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
using member = typename T::member_type;
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
void func(...) {}
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
void func(member<T>*) {}
|
|
||||||
|
|
||||||
void test();
|
|
||||||
|
|
||||||
void test() { func<foo>(0); }
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace cxx11
|
|
||||||
|
|
||||||
#endif // __cplusplus >= 201103L
|
|
||||||
|
|
||||||
]])
|
|
||||||
|
|
||||||
|
|
||||||
dnl Tests for new features in C++14
|
|
||||||
|
|
||||||
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[
|
|
||||||
|
|
||||||
// If the compiler admits that it is not ready for C++14, why torture it?
|
|
||||||
// Hopefully, this will speed up the test.
|
|
||||||
|
|
||||||
#ifndef __cplusplus
|
|
||||||
|
|
||||||
#error "This is not a C++ compiler"
|
|
||||||
|
|
||||||
#elif __cplusplus < 201402L
|
|
||||||
|
|
||||||
#error "This is not a C++14 compiler"
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
namespace cxx14
|
|
||||||
{
|
|
||||||
|
|
||||||
namespace test_polymorphic_lambdas
|
|
||||||
{
|
|
||||||
|
|
||||||
int
|
|
||||||
test()
|
|
||||||
{
|
|
||||||
const auto lambda = [](auto&&... args){
|
|
||||||
const auto istiny = [](auto x){
|
|
||||||
return (sizeof(x) == 1UL) ? 1 : 0;
|
|
||||||
};
|
|
||||||
const int aretiny[] = { istiny(args)... };
|
|
||||||
return aretiny[0];
|
|
||||||
};
|
|
||||||
return lambda(1, 1L, 1.0f, '1');
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace test_binary_literals
|
|
||||||
{
|
|
||||||
|
|
||||||
constexpr auto ivii = 0b0000000000101010;
|
|
||||||
static_assert(ivii == 42, "wrong value");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace test_generalized_constexpr
|
|
||||||
{
|
|
||||||
|
|
||||||
template < typename CharT >
|
|
||||||
constexpr unsigned long
|
|
||||||
strlen_c(const CharT *const s) noexcept
|
|
||||||
{
|
|
||||||
auto length = 0UL;
|
|
||||||
for (auto p = s; *p; ++p)
|
|
||||||
++length;
|
|
||||||
return length;
|
|
||||||
}
|
|
||||||
|
|
||||||
static_assert(strlen_c("") == 0UL, "");
|
|
||||||
static_assert(strlen_c("x") == 1UL, "");
|
|
||||||
static_assert(strlen_c("test") == 4UL, "");
|
|
||||||
static_assert(strlen_c("another\0test") == 7UL, "");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace test_lambda_init_capture
|
|
||||||
{
|
|
||||||
|
|
||||||
int
|
|
||||||
test()
|
|
||||||
{
|
|
||||||
auto x = 0;
|
|
||||||
const auto lambda1 = [a = x](int b){ return a + b; };
|
|
||||||
const auto lambda2 = [a = lambda1(x)](){ return a; };
|
|
||||||
return lambda2();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace test_digit_separators
|
|
||||||
{
|
|
||||||
|
|
||||||
constexpr auto ten_million = 100'000'000;
|
|
||||||
static_assert(ten_million == 100000000, "");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace test_return_type_deduction
|
|
||||||
{
|
|
||||||
|
|
||||||
auto f(int& x) { return x; }
|
|
||||||
decltype(auto) g(int& x) { return x; }
|
|
||||||
|
|
||||||
template < typename T1, typename T2 >
|
|
||||||
struct is_same
|
|
||||||
{
|
|
||||||
static constexpr auto value = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
template < typename T >
|
|
||||||
struct is_same<T, T>
|
|
||||||
{
|
|
||||||
static constexpr auto value = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
int
|
|
||||||
test()
|
|
||||||
{
|
|
||||||
auto x = 0;
|
|
||||||
static_assert(is_same<int, decltype(f(x))>::value, "");
|
|
||||||
static_assert(is_same<int&, decltype(g(x))>::value, "");
|
|
||||||
return x;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace cxx14
|
|
||||||
|
|
||||||
#endif // __cplusplus >= 201402L
|
|
||||||
|
|
||||||
]])
|
|
||||||
|
|
||||||
|
|
||||||
dnl Tests for new features in C++17
|
|
||||||
|
|
||||||
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_17], [[
|
|
||||||
|
|
||||||
// If the compiler admits that it is not ready for C++17, why torture it?
|
|
||||||
// Hopefully, this will speed up the test.
|
|
||||||
|
|
||||||
#ifndef __cplusplus
|
|
||||||
|
|
||||||
#error "This is not a C++ compiler"
|
|
||||||
|
|
||||||
#elif __cplusplus <= 201402L
|
|
||||||
|
|
||||||
#error "This is not a C++17 compiler"
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#if defined(__clang__)
|
|
||||||
#define REALLY_CLANG
|
|
||||||
#else
|
|
||||||
#if defined(__GNUC__)
|
|
||||||
#define REALLY_GCC
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <initializer_list>
|
|
||||||
#include <utility>
|
|
||||||
#include <type_traits>
|
|
||||||
|
|
||||||
namespace cxx17
|
|
||||||
{
|
|
||||||
|
|
||||||
#if !defined(REALLY_CLANG)
|
|
||||||
namespace test_constexpr_lambdas
|
|
||||||
{
|
|
||||||
|
|
||||||
// TODO: test it with clang++ from git
|
|
||||||
|
|
||||||
constexpr int foo = [](){return 42;}();
|
|
||||||
|
|
||||||
}
|
|
||||||
#endif // !defined(REALLY_CLANG)
|
|
||||||
|
|
||||||
namespace test::nested_namespace::definitions
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace test_fold_expression
|
|
||||||
{
|
|
||||||
|
|
||||||
template<typename... Args>
|
|
||||||
int multiply(Args... args)
|
|
||||||
{
|
|
||||||
return (args * ... * 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename... Args>
|
|
||||||
bool all(Args... args)
|
|
||||||
{
|
|
||||||
return (args && ...);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace test_extended_static_assert
|
|
||||||
{
|
|
||||||
|
|
||||||
static_assert (true);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace test_auto_brace_init_list
|
|
||||||
{
|
|
||||||
|
|
||||||
auto foo = {5};
|
|
||||||
auto bar {5};
|
|
||||||
|
|
||||||
static_assert(std::is_same<std::initializer_list<int>, decltype(foo)>::value);
|
|
||||||
static_assert(std::is_same<int, decltype(bar)>::value);
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace test_typename_in_template_template_parameter
|
|
||||||
{
|
|
||||||
|
|
||||||
template<template<typename> typename X> struct D;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace test_fallthrough_nodiscard_maybe_unused_attributes
|
|
||||||
{
|
|
||||||
|
|
||||||
int f1()
|
|
||||||
{
|
|
||||||
return 42;
|
|
||||||
}
|
|
||||||
|
|
||||||
[[nodiscard]] int f2()
|
|
||||||
{
|
|
||||||
[[maybe_unused]] auto unused = f1();
|
|
||||||
|
|
||||||
switch (f1())
|
|
||||||
{
|
|
||||||
case 17:
|
|
||||||
f1();
|
|
||||||
[[fallthrough]];
|
|
||||||
case 42:
|
|
||||||
f1();
|
|
||||||
}
|
|
||||||
return f1();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace test_extended_aggregate_initialization
|
|
||||||
{
|
|
||||||
|
|
||||||
struct base1
|
|
||||||
{
|
|
||||||
int b1, b2 = 42;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct base2
|
|
||||||
{
|
|
||||||
base2() {
|
|
||||||
b3 = 42;
|
|
||||||
}
|
|
||||||
int b3;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct derived : base1, base2
|
|
||||||
{
|
|
||||||
int d;
|
|
||||||
};
|
|
||||||
|
|
||||||
derived d1 {{1, 2}, {}, 4}; // full initialization
|
|
||||||
derived d2 {{}, {}, 4}; // value-initialized bases
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace test_general_range_based_for_loop
|
|
||||||
{
|
|
||||||
|
|
||||||
struct iter
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
int& operator* ()
|
|
||||||
{
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
const int& operator* () const
|
|
||||||
{
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
iter& operator++()
|
|
||||||
{
|
|
||||||
++i;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct sentinel
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
};
|
|
||||||
|
|
||||||
bool operator== (const iter& i, const sentinel& s)
|
|
||||||
{
|
|
||||||
return i.i == s.i;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator!= (const iter& i, const sentinel& s)
|
|
||||||
{
|
|
||||||
return !(i == s);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct range
|
|
||||||
{
|
|
||||||
iter begin() const
|
|
||||||
{
|
|
||||||
return {0};
|
|
||||||
}
|
|
||||||
|
|
||||||
sentinel end() const
|
|
||||||
{
|
|
||||||
return {5};
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
void f()
|
|
||||||
{
|
|
||||||
range r {};
|
|
||||||
|
|
||||||
for (auto i : r)
|
|
||||||
{
|
|
||||||
[[maybe_unused]] auto v = i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace test_lambda_capture_asterisk_this_by_value
|
|
||||||
{
|
|
||||||
|
|
||||||
struct t
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
int foo()
|
|
||||||
{
|
|
||||||
return [*this]()
|
|
||||||
{
|
|
||||||
return i;
|
|
||||||
}();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace test_enum_class_construction
|
|
||||||
{
|
|
||||||
|
|
||||||
enum class byte : unsigned char
|
|
||||||
{};
|
|
||||||
|
|
||||||
byte foo {42};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace test_constexpr_if
|
|
||||||
{
|
|
||||||
|
|
||||||
template <bool cond>
|
|
||||||
int f ()
|
|
||||||
{
|
|
||||||
if constexpr(cond)
|
|
||||||
{
|
|
||||||
return 13;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return 42;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace test_selection_statement_with_initializer
|
|
||||||
{
|
|
||||||
|
|
||||||
int f()
|
|
||||||
{
|
|
||||||
return 13;
|
|
||||||
}
|
|
||||||
|
|
||||||
int f2()
|
|
||||||
{
|
|
||||||
if (auto i = f(); i > 0)
|
|
||||||
{
|
|
||||||
return 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (auto i = f(); i + 4)
|
|
||||||
{
|
|
||||||
case 17:
|
|
||||||
return 2;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#if !defined(REALLY_CLANG)
|
|
||||||
namespace test_template_argument_deduction_for_class_templates
|
|
||||||
{
|
|
||||||
|
|
||||||
// TODO: test it with clang++ from git
|
|
||||||
|
|
||||||
template <typename T1, typename T2>
|
|
||||||
struct pair
|
|
||||||
{
|
|
||||||
pair (T1 p1, T2 p2)
|
|
||||||
: m1 {p1},
|
|
||||||
m2 {p2}
|
|
||||||
{}
|
|
||||||
|
|
||||||
T1 m1;
|
|
||||||
T2 m2;
|
|
||||||
};
|
|
||||||
|
|
||||||
void f()
|
|
||||||
{
|
|
||||||
[[maybe_unused]] auto p = pair{13, 42u};
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
#endif // !defined(REALLY_CLANG)
|
|
||||||
|
|
||||||
namespace test_non_type_auto_template_parameters
|
|
||||||
{
|
|
||||||
|
|
||||||
template <auto n>
|
|
||||||
struct B
|
|
||||||
{};
|
|
||||||
|
|
||||||
B<5> b1;
|
|
||||||
B<'a'> b2;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#if !defined(REALLY_CLANG)
|
|
||||||
namespace test_structured_bindings
|
|
||||||
{
|
|
||||||
|
|
||||||
// TODO: test it with clang++ from git
|
|
||||||
|
|
||||||
int arr[2] = { 1, 2 };
|
|
||||||
std::pair<int, int> pr = { 1, 2 };
|
|
||||||
|
|
||||||
auto f1() -> int(&)[2]
|
|
||||||
{
|
|
||||||
return arr;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto f2() -> std::pair<int, int>&
|
|
||||||
{
|
|
||||||
return pr;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct S
|
|
||||||
{
|
|
||||||
int x1 : 2;
|
|
||||||
volatile double y1;
|
|
||||||
};
|
|
||||||
|
|
||||||
S f3()
|
|
||||||
{
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
auto [ x1, y1 ] = f1();
|
|
||||||
auto& [ xr1, yr1 ] = f1();
|
|
||||||
auto [ x2, y2 ] = f2();
|
|
||||||
auto& [ xr2, yr2 ] = f2();
|
|
||||||
const auto [ x3, y3 ] = f3();
|
|
||||||
|
|
||||||
}
|
|
||||||
#endif // !defined(REALLY_CLANG)
|
|
||||||
|
|
||||||
#if !defined(REALLY_CLANG)
|
|
||||||
namespace test_exception_spec_type_system
|
|
||||||
{
|
|
||||||
|
|
||||||
// TODO: test it with clang++ from git
|
|
||||||
|
|
||||||
struct Good {};
|
|
||||||
struct Bad {};
|
|
||||||
|
|
||||||
void g1() noexcept;
|
|
||||||
void g2();
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
Bad
|
|
||||||
f(T*, T*);
|
|
||||||
|
|
||||||
template<typename T1, typename T2>
|
|
||||||
Good
|
|
||||||
f(T1*, T2*);
|
|
||||||
|
|
||||||
static_assert (std::is_same_v<Good, decltype(f(g1, g2))>);
|
|
||||||
|
|
||||||
}
|
|
||||||
#endif // !defined(REALLY_CLANG)
|
|
||||||
|
|
||||||
namespace test_inline_variables
|
|
||||||
{
|
|
||||||
|
|
||||||
template<class T> void f(T)
|
|
||||||
{}
|
|
||||||
|
|
||||||
template<class T> inline T g(T)
|
|
||||||
{
|
|
||||||
return T{};
|
|
||||||
}
|
|
||||||
|
|
||||||
template<> inline void f<>(int)
|
|
||||||
{}
|
|
||||||
|
|
||||||
template<> int g<>(int)
|
|
||||||
{
|
|
||||||
return 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace cxx17
|
|
||||||
|
|
||||||
#endif // __cplusplus <= 201402L
|
|
||||||
|
|
||||||
]])
|
|
||||||
@@ -1,83 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Configure a build directory according to developer flags
|
|
||||||
|
|
||||||
type="$1";
|
|
||||||
configure_script="$2";
|
|
||||||
|
|
||||||
if [ "$type" == "" ]; then
|
|
||||||
echo "Usage: $0 <type> [<configure_script>]"
|
|
||||||
echo "where <type> is one of:"
|
|
||||||
echo "none debug optimized gcc-debug clang-debug icc-debug sun win32-cross win32-cross-debug \
|
|
||||||
win64-cross win64-cross-debug win32-msys win32-msys-debug win64-msys win64-msys-debug";
|
|
||||||
echo "<configure_script> is ../configure by default"
|
|
||||||
exit 1;
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$configure_script" == "" ]; then
|
|
||||||
configure_script="../configure";
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
flags="";
|
|
||||||
|
|
||||||
case $type in
|
|
||||||
none)
|
|
||||||
flags="--enable-tests" ;;
|
|
||||||
debug)
|
|
||||||
flags="--enable-debug-options --enable-tests" ;;
|
|
||||||
optimized)
|
|
||||||
flags="--enable-optimize-options --enable-tests" ;;
|
|
||||||
|
|
||||||
gcc-debug)
|
|
||||||
flags="CC=gcc CXX=g++ --enable-common-options=gnu --enable-debug-options --enable-tests" ;;
|
|
||||||
clang-debug)
|
|
||||||
flags="CC=clang CXX=clang++ --enable-common-options=clang --enable-debug-options --enable-tests" ;;
|
|
||||||
icc-debug)
|
|
||||||
flags="CC=icc64 CXX=icpc64 --enable-common-options=intel --enable-debug-options --enable-tests" ;;
|
|
||||||
sun)
|
|
||||||
flags="CC=suncc CXX=sunCC --enable-common-options=sun CFLAGS=\"-errwarn=%all -I/opt/sun/target64/include\" \
|
|
||||||
CXXFLAGS=\"-I/opt/sun/target64/include\" PATH=\"/opt/sun/sunstudio/bin:$PATH\" \
|
|
||||||
LDFLAGS=\"-R/opt/sun/target64/lib64 -L/opt/sun/target64/lib64\" \
|
|
||||||
PKG_CONFIG_PATH=\"/opt/sun/target64/lib64/pkgconfig:/usr/lib64/pkgconfig\" \
|
|
||||||
PKG_CONFIG_LIBDIR=\"\" --enable-tests" ;;
|
|
||||||
|
|
||||||
win32-cross)
|
|
||||||
flags="PATH=\"/usr/i686-w64-mingw32/bin:/usr/i686-w64-mingw32/sys-root/mingw/bin:$PATH\" \
|
|
||||||
--with-nsis=/usr/bin/makensis --with-windows-sysroot=/usr/i686-w64-mingw32/sys-root/mingw \
|
|
||||||
--enable-optimize-options --enable-tests --host=i686-w64-mingw32" ;;
|
|
||||||
win32-cross-debug)
|
|
||||||
flags="PATH=\"/usr/i686-w64-mingw32/bin:/usr/i686-w64-mingw32/sys-root/mingw/bin:$PATH\" \
|
|
||||||
--enable-debug-options --enable-tests --host=i686-w64-mingw32" ;;
|
|
||||||
win64-cross)
|
|
||||||
flags="PATH=\"/usr/x86_64-w64-mingw32/bin:/usr/x86_64-w64-mingw32/sys-root/mingw/bin:$PATH\" \
|
|
||||||
--with-nsis=/usr/bin/makensis --with-windows-sysroot=/usr/x86_64-w64-mingw32/sys-root/mingw \
|
|
||||||
--enable-optimize-options --enable-tests --host=x86_64-w64-mingw32" ;;
|
|
||||||
win64-cross-debug)
|
|
||||||
flags="PATH=\"/usr/x86_64-w64-mingw32/bin:/usr/x86_64-w64-mingw32/sys-root/mingw/bin:$PATH\" \
|
|
||||||
--enable-debug-options --enable-tests --host=x86_64-w64-mingw32" ;;
|
|
||||||
|
|
||||||
win32-msys)
|
|
||||||
flags="PATH=\"/mingw32/i686-w64-mingw32:/mingw32/bin:$PATH\" \
|
|
||||||
--with-nsis=/mingw32/bin/makensis.exe --with-windows-sysroot=/mingw32 \
|
|
||||||
--enable-optimize-options --enable-tests --host=i686-w64-mingw32" ;;
|
|
||||||
win32-msys-debug)
|
|
||||||
flags="PATH=\"/mingw32/i686-w64-mingw32:/mingw32/bin:$PATH\" \
|
|
||||||
--enable-debug-options --enable-tests --host=i686-w64-mingw32" ;;
|
|
||||||
win64-msys)
|
|
||||||
flags="PATH=\"/mingw64/x86_64-w64-mingw32:/mingw64/bin:$PATH\" \
|
|
||||||
--with-nsis=/mingw64/bin/makensis.exe --with-windows-sysroot=/mingw64 \
|
|
||||||
--enable-optimize-options --enable-tests --host=x86_64-w64-mingw32" ;;
|
|
||||||
win64-msys-debug)
|
|
||||||
flags="PATH=\"/mingw64/x86_64-w64-mingw32:/mingw64/bin:$PATH\" \
|
|
||||||
--enable-debug-options --enable-tests --host=x86_64-w64-mingw32" ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
|
|
||||||
echo "Running:"
|
|
||||||
echo $configure_script $flags;
|
|
||||||
|
|
||||||
$configure_script $flags
|
|
||||||
|
|
||||||
|
|
||||||
exit $?
|
|
||||||
|
Before Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 3.2 KiB |
@@ -1,19 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE policyconfig PUBLIC
|
|
||||||
"-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
|
|
||||||
"http://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd">
|
|
||||||
<policyconfig>
|
|
||||||
|
|
||||||
<action id="org.gsmartcontrol">
|
|
||||||
<message>Authentication is required to run GSmartControl</message>
|
|
||||||
<icon_name>gsmartcontrol</icon_name>
|
|
||||||
<defaults>
|
|
||||||
<allow_any>auth_admin</allow_any>
|
|
||||||
<allow_inactive>auth_admin</allow_inactive>
|
|
||||||
<allow_active>auth_admin</allow_active>
|
|
||||||
</defaults>
|
|
||||||
<annotate key="org.freedesktop.policykit.exec.path">/usr/sbin/gsmartcontrol</annotate>
|
|
||||||
<annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
|
|
||||||
</action>
|
|
||||||
|
|
||||||
</policyconfig>
|
|
||||||
@@ -1,115 +0,0 @@
|
|||||||
|
|
||||||
# This spec file is for openSUSE Build Service.
|
|
||||||
# Supported distributions: openSUSE, Fedora, CentOS, RHEL.
|
|
||||||
|
|
||||||
Name: gsmartcontrol
|
|
||||||
Version: @VERSION@
|
|
||||||
Release: 0
|
|
||||||
License: GPL-2.0 AND GPL-3.0
|
|
||||||
Url: https://gsmartcontrol.sourceforge.io/
|
|
||||||
Vendor: Alexander Shaduri <ashaduri 'at' gmail.com>
|
|
||||||
# Packager: Alexander Shaduri <ashaduri 'at' gmail.com>
|
|
||||||
Source: http://sourceforge.net/projects/gsmartcontrol/files/%{version}/%{name}-%{version}.tar.bz2
|
|
||||||
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
|
||||||
Summary: GSmartControl - Hard Disk Drive and SSD Health Inspection Tool
|
|
||||||
Group: Hardware/Other
|
|
||||||
|
|
||||||
# Empty debug packages cause errors in new RPM. Disable them.
|
|
||||||
%global debug_package %{nil}
|
|
||||||
|
|
||||||
|
|
||||||
# For non-specified distributions we don't specify any dependencies to avoid errors.
|
|
||||||
|
|
||||||
|
|
||||||
# SUSE / OpenSUSE. SLES also defines the correct suse_version.
|
|
||||||
%if 0%{?suse_version}
|
|
||||||
|
|
||||||
Requires: smartmontools >= 5.43, polkit, bash, xterm
|
|
||||||
BuildRequires: gcc-c++, libstdc++-devel, pcre-devel, gtkmm3-devel >= 3.4.0
|
|
||||||
BuildRequires: update-desktop-files
|
|
||||||
BuildRequires: fdupes
|
|
||||||
|
|
||||||
%endif
|
|
||||||
|
|
||||||
|
|
||||||
# Fedora, CentOS, RHEL
|
|
||||||
%if 0%{?fedora_version} || 0%{?rhel_version} || 0%{?centos_version}
|
|
||||||
|
|
||||||
Requires: smartmontools >= 5.43, polkit, bash, xterm
|
|
||||||
BuildRequires: gcc-c++, pcre-devel, gtkmm30-devel >= 3.4.0
|
|
||||||
|
|
||||||
%endif
|
|
||||||
|
|
||||||
|
|
||||||
%description
|
|
||||||
GSmartControl is a graphical user interface for smartctl, which is a tool for
|
|
||||||
querying and controlling SMART (Self-Monitoring, Analysis, and Reporting
|
|
||||||
Technology) data in hard disk and solid-state drives. It allows you to inspect
|
|
||||||
the drive's SMART data to determine its health, as well as run various tests
|
|
||||||
on it.
|
|
||||||
|
|
||||||
%prep
|
|
||||||
|
|
||||||
%setup -q
|
|
||||||
%configure
|
|
||||||
|
|
||||||
|
|
||||||
%build
|
|
||||||
make %{?_smp_mflags}
|
|
||||||
|
|
||||||
|
|
||||||
%install
|
|
||||||
|
|
||||||
# %%makeinstall
|
|
||||||
make DESTDIR=%buildroot install-strip
|
|
||||||
# Remove the icon cache file "make install" generates, to avoid package conflicts.
|
|
||||||
rm -f $RPM_BUILD_ROOT%{_datadir}/icons/hicolor/icon-theme.cache
|
|
||||||
|
|
||||||
|
|
||||||
%if 0%{?suse_version}
|
|
||||||
|
|
||||||
%suse_update_desktop_file -n %{name}
|
|
||||||
|
|
||||||
# There are some png file duplicates, hardlink them.
|
|
||||||
%fdupes
|
|
||||||
|
|
||||||
# We install icons, so this is needed.
|
|
||||||
%if 0%{?suse_version} >= 1140
|
|
||||||
%post
|
|
||||||
%icon_theme_cache_post
|
|
||||||
|
|
||||||
%postun
|
|
||||||
%icon_theme_cache_postun
|
|
||||||
%endif
|
|
||||||
|
|
||||||
# endif suse
|
|
||||||
%endif
|
|
||||||
|
|
||||||
|
|
||||||
%clean
|
|
||||||
rm -rf %buildroot
|
|
||||||
|
|
||||||
|
|
||||||
%files
|
|
||||||
%defattr(-,root,root)
|
|
||||||
|
|
||||||
%attr(0755,root,root) %{_bindir}/gsmartcontrol-root
|
|
||||||
%attr(0755,root,root) %{_sbindir}/gsmartcontrol
|
|
||||||
|
|
||||||
# %%attr(0644,root,root) %%config(noreplace) %%{_sysconfdir}/*
|
|
||||||
|
|
||||||
%doc %{_datadir}/doc/gsmartcontrol
|
|
||||||
%doc %{_mandir}/man1/*
|
|
||||||
|
|
||||||
%{_datadir}/gsmartcontrol
|
|
||||||
# %%{_datadir}/gsmartcontrol/*
|
|
||||||
%{_datadir}/applications/*.desktop
|
|
||||||
%{_datadir}/metainfo
|
|
||||||
%{_datadir}/metainfo/gsmartcontrol.appdata.xml
|
|
||||||
%{_datadir}/polkit-1
|
|
||||||
%{_datadir}/polkit-1/actions
|
|
||||||
%{_datadir}/polkit-1/actions/org.gsmartcontrol.policy
|
|
||||||
%{_datadir}/icons/*
|
|
||||||
%{_datadir}/pixmaps/*
|
|
||||||
|
|
||||||
%changelog
|
|
||||||
@@ -1,157 +0,0 @@
|
|||||||
/**************************************************************************
|
|
||||||
Copyright:
|
|
||||||
(C) 2008 - 2012 Alexander Shaduri <ashaduri 'at' gmail.com>
|
|
||||||
License: See LICENSE_gsmartcontrol.txt
|
|
||||||
***************************************************************************/
|
|
||||||
/// \file
|
|
||||||
/// \author Alexander Shaduri
|
|
||||||
/// \ingroup applib
|
|
||||||
/// \weakgroup applib
|
|
||||||
/// @{
|
|
||||||
|
|
||||||
#include <gtkmm.h>
|
|
||||||
#include <glibmm.h>
|
|
||||||
#include <glib.h>
|
|
||||||
#include <cstring> // std::strlen
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "app_pango_utils.h" // app_pango_strip_markup()
|
|
||||||
#include "app_gtkmm_utils.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Note: This works only if the column has custom widget set.
|
|
||||||
Gtk::Widget* app_gtkmm_get_column_header(Gtk::TreeViewColumn& column)
|
|
||||||
{
|
|
||||||
Gtk::Widget* w = column.get_widget();
|
|
||||||
Gtk::Widget* p1 = 0;
|
|
||||||
Gtk::Widget* p2 = 0;
|
|
||||||
Gtk::Widget* p3 = 0;
|
|
||||||
|
|
||||||
// move up to GtkAlignment, then GtkHBox, then GtkButton.
|
|
||||||
if (w && (p1 = w->get_parent()) && (p2 = p1->get_parent()) && (p3 = p2->get_parent()))
|
|
||||||
return p3;
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Read column header text and create a label with that text, set it as column's custom widget.
|
|
||||||
Gtk::Widget* app_gtkmm_labelize_column(Gtk::TreeViewColumn& column)
|
|
||||||
{
|
|
||||||
Gtk::Label* label = Gtk::manage(new Gtk::Label(column.get_title()));
|
|
||||||
label->show();
|
|
||||||
column.set_widget(*label);
|
|
||||||
return label;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// A wrapper around set_tooltip_*() for portability across different gtkmm versions.
|
|
||||||
void app_gtkmm_set_widget_tooltip(Gtk::Widget& widget,
|
|
||||||
const Glib::ustring& tooltip_text, bool use_markup)
|
|
||||||
{
|
|
||||||
if (use_markup) {
|
|
||||||
widget.set_tooltip_markup(tooltip_text);
|
|
||||||
} else {
|
|
||||||
widget.set_tooltip_text(tooltip_text);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
/// This has been copied from _g_utf8_make_valid() (glib-2.20.4).
|
|
||||||
/// _g_utf8_make_valid() is GLib's private function for auto-correcting
|
|
||||||
/// the potentially invalid utf-8 data.
|
|
||||||
inline gchar* gsc_g_utf8_make_valid (const gchar* name)
|
|
||||||
{
|
|
||||||
GString* str;
|
|
||||||
const gchar* remainder, *invalid;
|
|
||||||
gint remaining_bytes, valid_bytes;
|
|
||||||
|
|
||||||
g_return_val_if_fail (name != NULL, NULL);
|
|
||||||
|
|
||||||
str = NULL;
|
|
||||||
remainder = name;
|
|
||||||
remaining_bytes = gint(std::strlen(name));
|
|
||||||
|
|
||||||
while (remaining_bytes != 0) {
|
|
||||||
if (g_utf8_validate (remainder, remaining_bytes, &invalid))
|
|
||||||
break;
|
|
||||||
|
|
||||||
valid_bytes = gint(invalid - remainder);
|
|
||||||
|
|
||||||
if (str == NULL)
|
|
||||||
str = g_string_sized_new (remaining_bytes);
|
|
||||||
|
|
||||||
g_string_append_len (str, remainder, valid_bytes);
|
|
||||||
/* append U+FFFD REPLACEMENT CHARACTER */
|
|
||||||
g_string_append (str, "\357\277\275");
|
|
||||||
|
|
||||||
remaining_bytes -= valid_bytes + 1;
|
|
||||||
remainder = invalid + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (str == NULL)
|
|
||||||
return g_strdup (name);
|
|
||||||
|
|
||||||
g_string_append (str, remainder);
|
|
||||||
|
|
||||||
g_assert (g_utf8_validate (str->str, -1, NULL));
|
|
||||||
|
|
||||||
return g_string_free (str, FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Glib::ustring app_ustring_from_gchar(gchar* str)
|
|
||||||
{
|
|
||||||
if (!str) {
|
|
||||||
return Glib::ustring();
|
|
||||||
}
|
|
||||||
Glib::ustring ustr(str);
|
|
||||||
g_free(str);
|
|
||||||
return ustr;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Glib::ustring app_utf8_make_valid(const Glib::ustring& str)
|
|
||||||
{
|
|
||||||
char* s = gsc_g_utf8_make_valid(str.c_str());
|
|
||||||
if (!s) {
|
|
||||||
return Glib::ustring();
|
|
||||||
}
|
|
||||||
Glib::ustring res(s);
|
|
||||||
g_free(s);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Glib::ustring app_output_make_valid(const Glib::ustring& str)
|
|
||||||
{
|
|
||||||
#ifdef _WIN32
|
|
||||||
try {
|
|
||||||
return app_utf8_make_valid(Glib::locale_to_utf8(str));
|
|
||||||
} catch (Glib::ConvertError& e) {
|
|
||||||
// nothing, try to fix as it is
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return app_utf8_make_valid(str);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// @}
|
|
||||||
@@ -1,268 +0,0 @@
|
|||||||
/**************************************************************************
|
|
||||||
Copyright:
|
|
||||||
(C) 2008 - 2012 Alexander Shaduri <ashaduri 'at' gmail.com>
|
|
||||||
License: See LICENSE_gsmartcontrol.txt
|
|
||||||
***************************************************************************/
|
|
||||||
/// \file
|
|
||||||
/// \author Alexander Shaduri
|
|
||||||
/// \ingroup applib
|
|
||||||
/// \weakgroup applib
|
|
||||||
/// @{
|
|
||||||
|
|
||||||
#ifndef APP_UI_RES_UTILS_H
|
|
||||||
#define APP_UI_RES_UTILS_H
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <gtkmm.h>
|
|
||||||
|
|
||||||
#include "hz/hz_config.h" // feature test macros (ENABLE_*)
|
|
||||||
|
|
||||||
// Old glibmm versions had exceptions but didn't define this at all.
|
|
||||||
// New ones define it to 0 if there are no glibmm exceptions.
|
|
||||||
#if !defined GLIBMM_EXCEPTIONS_ENABLED || GLIBMM_EXCEPTIONS_ENABLED
|
|
||||||
#include <memory> // std::auto_ptr
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "hz/debug.h"
|
|
||||||
#include "hz/instance_manager.h"
|
|
||||||
#include "hz/down_cast.h"
|
|
||||||
#include "hz/res_data.h"
|
|
||||||
|
|
||||||
#include "gui_utils.h" // gui_show_error_dialog
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// \def APP_UI_RES_DATA_INIT(res_name)
|
|
||||||
/// Use these in window class definitions to declare ui resources.
|
|
||||||
/// E.g. APP_UI_RES_DATA_INIT(main_window) will search for
|
|
||||||
/// main_window.ui in data file search paths.
|
|
||||||
/// Or, if you're using compiled-in buffers, it will make them available.
|
|
||||||
#define APP_UI_RES_DATA_INIT(res_name) \
|
|
||||||
HZ_RES_DATA_INIT_NAMED(res_name##_ui, #res_name ".ui", UIResDataBase); \
|
|
||||||
struct UIResData : public UIResDataBase { \
|
|
||||||
UIResData() \
|
|
||||||
{ \
|
|
||||||
UIResDataBase::root_name = #res_name; /* we need original name here, not with _ui */ \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// \typedef app_ui_res_ref_t
|
|
||||||
/// A reference-counting pointer to application UI resource
|
|
||||||
typedef Glib::RefPtr<Gtk::Builder> app_ui_res_ref_t;
|
|
||||||
|
|
||||||
|
|
||||||
/// \fn bool app_ui_res_create_from(app_ui_res_ref_t& ref, const unsigned char* buf, unsigned int buf_size, std::string& error_msg)
|
|
||||||
/// Create application UI resource from a static buffer.
|
|
||||||
inline bool app_ui_res_create_from(app_ui_res_ref_t& ref,
|
|
||||||
const unsigned char* buf, unsigned int buf_size, std::string& error_msg)
|
|
||||||
{
|
|
||||||
if (!buf_size || !buf || !buf[0]) {
|
|
||||||
error_msg = "Cannot load data buffers.";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if !defined GLIBMM_EXCEPTIONS_ENABLED || GLIBMM_EXCEPTIONS_ENABLED
|
|
||||||
try {
|
|
||||||
// ref->add_from_file("main_window.ui");
|
|
||||||
ref->add_from_string(reinterpret_cast<const char*>(buf), static_cast<gsize>(buf_size));
|
|
||||||
}
|
|
||||||
catch (Gtk::BuilderError& ex) { // the docs say Glib::MarkupError, but examples say otherwise.
|
|
||||||
error_msg = ex.what();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
std::auto_ptr<Glib::BuilderError> error;
|
|
||||||
ref->add_from_string(reinterpret_cast<const char*>(buf), static_cast<gsize>(buf_size),"", "", error);
|
|
||||||
|
|
||||||
if (error.get()) {
|
|
||||||
error_msg = error->what();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// These allow easy attaching of gtkbuilder widget signals to member functions
|
|
||||||
|
|
||||||
/// Connect member function (callback) to signal \c signal_name on widget
|
|
||||||
/// \c ui_element, where \c ui_element is the widget's gtkbuilder name.
|
|
||||||
#define APP_UI_RES_CONNECT(ui_element, signal_name, callback) \
|
|
||||||
if (true) { \
|
|
||||||
if (!ui_element) \
|
|
||||||
this->lookup_object(#ui_element, ui_element); \
|
|
||||||
if (ui_element) { \
|
|
||||||
ui_element->signal_ ## signal_name ().connect(sigc::mem_fun(*this, &self_type::callback)); \
|
|
||||||
} \
|
|
||||||
} else (void)0
|
|
||||||
|
|
||||||
|
|
||||||
/// Connect member function (callback) with a name of \c on_<widget_name>_<signal_name>
|
|
||||||
/// to signal \c signal_name on widget \c ui_element, where \c ui_element is the
|
|
||||||
/// widget's gtkbuilder name.
|
|
||||||
#define APP_UI_RES_AUTO_CONNECT(ui_element, signal_name) \
|
|
||||||
APP_UI_RES_CONNECT(ui_element, signal_name, on_ ## ui_element ## _ ## signal_name)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Inherit this when using GtkBuilder-enabled windows (or any other GtkBuilder-enabled objects).
|
|
||||||
/// \c Child is the child class that inherits all the functionality of having instance lifetime
|
|
||||||
/// management and other benefits.
|
|
||||||
/// If \c MultiInstance is false, create() will return the same instance each time.
|
|
||||||
template<class Child, bool MultiInstance, class WidgetType = Gtk::Window>
|
|
||||||
class AppUIResWidget : public WidgetType, public hz::InstanceManager<Child, MultiInstance> {
|
|
||||||
public:
|
|
||||||
|
|
||||||
/// Instance class type, which is also the parent class.
|
|
||||||
typedef hz::InstanceManager<Child, MultiInstance> instance_class;
|
|
||||||
friend class Gtk::Builder; // allow construction through gtkbuilder
|
|
||||||
friend class hz::InstanceManager<Child, MultiInstance>; // allow construction through instance class
|
|
||||||
|
|
||||||
|
|
||||||
/// Override parent hz::InstanceManager's function because of non-trivial constructor
|
|
||||||
static Child* create()
|
|
||||||
{
|
|
||||||
if (hz::InstanceManager<Child, MultiInstance>::has_single_instance()) // for single-instance objects
|
|
||||||
return hz::InstanceManager<Child, MultiInstance>::get_single_instance();
|
|
||||||
|
|
||||||
std::string error;
|
|
||||||
app_ui_res_ref_t ui = Gtk::Builder::create();
|
|
||||||
const typename Child::UIResData data; // this holds the GtkBuilder data
|
|
||||||
|
|
||||||
// this does the actual object construction
|
|
||||||
bool success = app_ui_res_create_from(ui, data.buf, data.size, error);
|
|
||||||
|
|
||||||
if (!success) {
|
|
||||||
std::string msg = "Fatal error: Cannot create UI-resource widgets: " + error;
|
|
||||||
debug_out_fatal("app", msg << "\n");
|
|
||||||
gui_show_error_dialog(msg);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
Child* o = 0;
|
|
||||||
ui->get_widget_derived(data.root_name, o);
|
|
||||||
|
|
||||||
if (!o) {
|
|
||||||
std::string msg = "Fatal error: Cannot get root widget from UI-resource-created hierarchy.";
|
|
||||||
debug_out_fatal("app", msg << "\n");
|
|
||||||
gui_show_error_dialog(msg);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
o->obj_create();
|
|
||||||
|
|
||||||
hz::InstanceManager<Child, MultiInstance>::set_single_instance(o); // for single-instance objects
|
|
||||||
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// Get UI resource
|
|
||||||
app_ui_res_ref_t get_ui()
|
|
||||||
{
|
|
||||||
return ref_ui_;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// Find a widget in UI and return it.
|
|
||||||
Gtk::Widget* lookup_widget(const Glib::ustring& name)
|
|
||||||
{
|
|
||||||
return lookup_widget<Gtk::Widget*>(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// Find a widget in UI and return it.
|
|
||||||
template<typename WidgetPtr>
|
|
||||||
WidgetPtr lookup_widget(const Glib::ustring& name)
|
|
||||||
{
|
|
||||||
WidgetPtr w = 0;
|
|
||||||
return lookup_widget(name, w);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// Find a widget in UI and return it.
|
|
||||||
template<typename WidgetPtr>
|
|
||||||
WidgetPtr lookup_widget(const Glib::ustring& name, WidgetPtr& w)
|
|
||||||
{
|
|
||||||
ref_ui_->get_widget(name, w);
|
|
||||||
return w;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// Find an object in UI and return it.
|
|
||||||
Glib::Object* lookup_object(const Glib::ustring& name)
|
|
||||||
{
|
|
||||||
return ref_ui_->get_object(name).operator->(); // silly RefPtr doesn't have get().
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// Find an object in UI and return it.
|
|
||||||
template<typename ObjectPtr>
|
|
||||||
ObjectPtr lookup_object(const Glib::ustring& name)
|
|
||||||
{
|
|
||||||
ObjectPtr obj = 0;
|
|
||||||
return lookup_object(name, obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// Find an object in UI and return it.
|
|
||||||
template<typename ObjectPtr>
|
|
||||||
ObjectPtr lookup_object(const Glib::ustring& name, ObjectPtr& obj)
|
|
||||||
{
|
|
||||||
return (obj = hz::down_cast<ObjectPtr>(lookup_object(name))); // up, then down
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
typedef Child self_type; ///< This is needed by APP_UI_ macros
|
|
||||||
typedef WidgetType widget_type; ///< This is needed by APP_UI_ macros
|
|
||||||
|
|
||||||
|
|
||||||
// protected constructor / destructor, use create() / destroy() instead of new / delete.
|
|
||||||
|
|
||||||
/// GtkBuilder needs this constructor in a child.
|
|
||||||
/// BaseObjectType is a C type, defined in specific Gtk:: widget class.
|
|
||||||
AppUIResWidget(typename WidgetType::BaseObjectType* gtkcobj, const app_ui_res_ref_t& ref_ui)
|
|
||||||
: WidgetType(gtkcobj), ref_ui_(ref_ui)
|
|
||||||
{
|
|
||||||
// manually connecting signals:
|
|
||||||
// this->signal_delete_event().connect(sigc::mem_fun(*this, &MainWindow::on_main_window_delete));
|
|
||||||
|
|
||||||
// signals of GtkBuilder-created objects:
|
|
||||||
// Gtk::ToolButton* rescan_devices_toolbutton = 0;
|
|
||||||
// APP_UI_RES_AUTO_CONNECT(rescan_devices_toolbutton, clicked);
|
|
||||||
|
|
||||||
// show();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// Virtual destructor
|
|
||||||
virtual ~AppUIResWidget()
|
|
||||||
{ }
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
app_ui_res_ref_t ref_ui_; ///< UI resource
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/// @}
|
|
||||||