370 Commits

Author SHA1 Message Date
TheAssassin 0d57e9ae9b Log error when pipe creation fails 2020-10-05 22:31:16 +02:00
TheAssassin 407ecc408d Read subprocesses' pipes until they're empty 2020-09-22 13:04:23 +02:00
TheAssassin 8ee0e43c23 Switch to new subprocess lib in type 0 plugins, mk. 3
This commit fixes the remaining buffer issues by introducing a little more complexity. It shall be refactored in the future to decrease complexity again, but for now, it works well and function is more important than form at this point.

CC #143
2020-09-04 18:02:40 +02:00
TheAssassin e9bbbc80f4 Switch to new subprocess lib in type 0 plugins, mk. 2
Apparently fixes all buffer-related crashes, but there's a few minor bugs left.

CC #143
2020-08-31 08:39:43 +02:00
TheAssassin 68f4655fc4 Add method to write from buffers to ldLog streams 2020-08-31 06:30:06 +02:00
TheAssassin 1072c6d9f0 Improve check_output performance 2020-08-31 05:08:24 +02:00
TheAssassin f33dc8dd34 Switch to new subprocess lib in type 0 plugins, mk. 1 2020-08-31 04:41:01 +02:00
TheAssassin 6621f1edf7 Forgot to add pipe reader to CMake 2020-08-31 04:20:40 +02:00
TheAssassin ee73ac6c8e Use new pipe_reader in subprocess's check_output
The class will read until the process quits (or until memory's up).

TODO: reduce load on CPU with some sleep (right now, it's pretty much some busy waiting)
2020-08-31 04:20:03 +02:00
TheAssassin 66691ee882 Add new helper class pipe reader
Implements synchronous, non-block reading from pipes.
2020-08-28 17:36:56 +02:00
TheAssassin e91b459fce Use std::distance instead of pointer arithmetics 2020-08-08 11:54:58 +02:00
TheAssassin 3f86f178a5 Use classic C string handling
That way, we don't have to allocate memory, and it's also shorter.
2020-08-08 11:49:17 +02:00
TheAssassin a8975e0e50 Clean up memory in case exec* fails
Prevents memory leaks.
2020-08-08 11:44:21 +02:00
TheAssassin 6c47939fdc Fix initialization bug 2020-08-08 11:34:02 +02:00
TheAssassin 8663e5bf26 Update license information in help text 2020-08-08 01:06:51 +02:00
TheAssassin 89493e399b Build fully static strip binary 2020-08-08 00:47:54 +02:00
TheAssassin 4d999ef5c6 Build somewhat static strip ourselves 2020-08-08 00:30:28 +02:00
TheAssassin b39dfa6591 Fix static binaries handling 2020-08-08 00:30:28 +02:00
TheAssassin 484ff3f004 Fix C string processing bug
Well, makes sense now that I look at it... but caused a couple of hours worrying why my child processes were crashing until I noticed it'd only happen if I specified custom environment variables...
2020-08-08 00:30:28 +02:00
TheAssassin 8b604871cc Refactor duplicate code into static method 2020-08-08 00:30:28 +02:00
TheAssassin 88dd09f2d1 Set all variables to defaults in header 2020-08-08 00:30:28 +02:00
TheAssassin d43e8a42bf Fix whitespace 2020-08-08 00:30:28 +02:00
TheAssassin 5feef7880e Try to fix waitpid issues 2020-08-08 00:30:28 +02:00
TheAssassin 2b2c6a913f Set default value 2020-08-07 21:22:58 +02:00
TheAssassin aeb0bfa98b Use consistent error message for all plugins 2020-08-07 21:22:58 +02:00
TheAssassin 37aa37f5fe Fix behavior of close()
The implementation was obviously wrong/incomplete.
2020-08-07 21:22:58 +02:00
TheAssassin 59a8ec41ba Replace cpp-subprocess with own linuxdeploy-subprocess 2020-08-07 21:22:58 +02:00
TheAssassin 4a0cfe323d Require newer CMake version only for static builds 2020-08-07 21:22:58 +02:00
TheAssassin c895a1dc59 Add kill and poll features for processes 2020-08-07 21:22:58 +02:00
TheAssassin 80a5667ca7 Check waitpid() for errors 2020-08-07 21:22:58 +02:00
TheAssassin 2425ccc832 Extract process handling into separate class
Needed for plugins' subprocess handling.
2020-08-07 21:22:58 +02:00
TheAssassin 55b2d00f23 Add reusable assert template 2020-08-07 21:22:58 +02:00
TheAssassin e1f6da17b4 Add basic subprocess micro library
cpp-subprocess does not work when linked statically for some weird reason. Therefore, we're going to ship our own.
2020-08-07 21:22:58 +02:00
TheAssassin 326b002ed5 Fetch up-to-date CMake for AppImage builds 2020-08-07 21:22:58 +02:00
TheAssassin 86d4404a16 Try to use target_link_options again 2020-08-07 21:22:58 +02:00
TheAssassin cbfbb1ee2d Debug CI build issues mk. 1 2020-08-07 21:22:58 +02:00
TheAssassin 5fde708954 Improve CMake check 2020-08-06 14:44:00 +02:00
TheAssassin dc07fbd401 Build static binaries for releases on Travis 2020-08-06 14:10:57 +02:00
TheAssassin 5b713b3bee Add support for fully static builds 2020-08-06 02:07:31 +02:00
TheAssassin 5644d5ca06 Add license notices to binary for dependencies
Was long overdue.
2020-08-06 01:19:29 +02:00
TheAssassin 557bad2241 Add --deploy-deps-only 2020-07-15 03:17:37 +02:00
TheAssassin 590a746882 Replace std::cerr messages with ldLog
Was long overdue now. Makes for a consistent logging, and helps communicate that the messages are errors to the user.
2020-07-15 03:10:12 +02:00
TheAssassin a609adb4f5 Merge pull request #135 from komputerwiz/master
Fix update information used by Travis builds
2020-07-05 20:41:00 +02:00
Matthew Barry 591e21a766 fix update information used by Travis builds
Seems like this was overlooked by commit 2af5430 when fixing #126
2020-07-05 12:50:47 -05:00
TheAssassin 0f3a118687 Add param to automatically rename deployed icons
Useful e.g., when passing multiple icons with different resolutions via -i, if they have the resolution in the filename.

Also removes all traces of that appName concept that has been abandoned.
2020-06-11 21:04:33 +02:00
TheAssassin 1c0ce6a0a5 Merge pull request #132 from X0rg/patch-1
Update README.md with CPU-X project
2020-05-24 01:50:12 +02:00
Xorg 2f00292756 Update README.md with CPU-X project 2020-05-24 01:00:32 +02:00
TheAssassin f24c167722 Add $LINUXDEPLOY for input plugins
The input plugins can use this environment variable to call linuxdeploy themselves. This can be very handy to have it deploy additional dependencies on libraries they copy themselves.

An alternative approach is to simply use liblinuxdeploy inside the plugin, like the Qt plugin does.
2020-05-03 18:32:55 +02:00
TheAssassin 2af54304e2 Fix update information
Closes #126.
2020-04-08 23:41:58 +02:00
TheAssassin 4391ad24d9 Merge pull request #125 from d1vanov/master
Fix links in README.md
2020-04-04 16:19:13 +02:00
Dmitry Ivanov f3ae65bc57 Fix links in README.md 2020-04-04 17:17:41 +03:00
TheAssassin d086da38c4 Allow users to use custom patchelf
Fixes #120.
2020-02-06 02:34:37 +01:00
TheAssassin 652ef5a215 Use the right method to resolve symlinks
Just checked with absolute, it doesn't always resolve symlinks. canonical is supposed to do that according to https://www.boost.org/doc/libs/1_48_0/libs/filesystem/v3/doc/reference.html#Canonical-path.
2019-12-13 17:53:28 +01:00
TheAssassin 2b13c52452 Workaround for ldd bug
Closes #110.

See https://sourceware.org/bugzilla/show_bug.cgi?id=25263 for more information.
2019-12-13 17:49:22 +01:00
TheAssassin c45cd46319 Move which to utils module
Also uses the native split functionality provided by the utils module
instead of some external dependency's.

Preparation for using this method in plugins such as the Qt plugin.
2019-11-19 11:28:24 +01:00
TheAssassin 1bd5453c61 Fix detection of copyright tools
CC #104
2019-11-18 23:13:44 +01:00
TheAssassin 9783db602e Quick fix unavailability of which command
CC #104
2019-11-18 20:44:53 +01:00
TheAssassin 6cfa741f40 Add missing newline (fixes #102) 2019-11-13 15:31:52 +01:00
TheAssassin 1be3327a11 Use own prebuilt CMake 2019-09-28 15:25:13 +02:00
TheAssassin cca5ad2e07 Merge pull request #96 from linuxdeploy/completely-switch-to-centos6
Build all binaries on CentOS 6
2019-09-28 04:22:40 +02:00
TheAssassin 058832615c Fix binaries upload 2019-09-28 04:02:00 +02:00
TheAssassin cf5927c521 Make sure old build script artifacts carry different name 2019-09-28 03:49:57 +02:00
TheAssassin 103b637944 Make CentOS 6 build script equivalent to old one 2019-09-28 03:49:15 +02:00
TheAssassin 58189efba6 Build binaries on CentOS 6 2019-09-28 03:48:53 +02:00
TheAssassin 019f902b17 Fix Docker build artifacts handling 2019-09-28 03:48:18 +02:00
TheAssassin f97d1e9a01 Improve shell use of Docker images 2019-09-28 03:47:24 +02:00
TheAssassin 543078c11e Clean up Dockerfile 2019-09-28 03:47:05 +02:00
TheAssassin 9ddb0d7650 Remove old debug code 2019-09-28 01:33:45 +02:00
TheAssassin 8252503d97 Merge pull request #95 from linuxdeploy/centos6-builds
Centos6 builds
2019-09-27 21:59:30 +02:00
TheAssassin d312ba07d0 No need to run install step for Docker builds 2019-09-27 21:34:06 +02:00
TheAssassin d3853e961b Clean up Dockerfile 2019-09-27 21:32:44 +02:00
TheAssassin ef7b397d4a Use devtoolset to compile dependencies in CentOS 6 builds 2019-09-27 21:32:27 +02:00
TheAssassin 330f8a393f Use devtoolset 7 for 64-bit CentOS builds 2019-09-27 21:32:09 +02:00
TheAssassin 77ad746c5d Build i386 CentOS 6 binaries on Travis 2019-09-27 21:15:52 +02:00
TheAssassin cd04cc260e 32-bit CentOS 6 builds 2019-09-27 21:09:10 +02:00
TheAssassin 3c4580a325 Allow bundling of additional binaries without moving them
Required to bundle e.g., applications' plugins together with their
dependencies without moving them out of position so they can still
be found by the original apps.
2019-09-22 19:06:00 +02:00
TheAssassin f20af7dc67 Refactor and improve relative directory calculation
Also makes variable names less ambiguous and adds some documenting
comments.
2019-09-22 18:58:21 +02:00
TheAssassin 0ba33879b0 Fix argument forwarding in generated AppRun script 2019-09-12 16:35:09 +02:00
TheAssassin f3b7c5ab73 Never ask to integrate linuxdeploy AppImages 2019-09-06 15:47:45 +02:00
TheAssassin 6bc354bacb Update linuxdeploy-desktopfile 2019-09-06 03:13:21 +02:00
TheAssassin d26947985d Add tests only if they are built and can therefore be run 2019-09-06 03:13:05 +02:00
TheAssassin 2cc962a344 Update README.md 2019-08-22 15:08:04 +02:00
TheAssassin 612bf962a3 Another missing return statement 2019-08-15 01:10:02 +02:00
TheAssassin 19d958d30f There should at least be debug messages for potential errors 2019-08-15 00:00:19 +02:00
TheAssassin fc82028af4 More forgotten return statements in bool methods 2019-08-14 23:57:50 +02:00
TheAssassin 2d45ef4c72 Fix missing return statement in static bool method
Looks like devtoolset compiler behaves differently on bool methods
without an explicit return statement. Kind of strange.

Undefined behavior?
2019-08-14 23:42:57 +02:00
TheAssassin 470caa3db1 Replace ln based subprocess symlinking with boost functionality 2019-08-14 23:25:21 +02:00
TheAssassin d24e6dac56 Clean up symlink helper 2019-08-14 22:47:59 +02:00
TheAssassin 913f5bc6cc Mirror package was hosted on disappeared 2019-08-14 16:12:19 +02:00
TheAssassin 4746fd0e87 Merge pull request #87 from linuxdeploy/apprun-hooks
AppRun hooks for plugins
2019-08-14 16:10:45 +02:00
TheAssassin de363bc90b Merge branch 'master' into apprun-hooks 2019-08-14 15:14:02 +02:00
TheAssassin 8e9114b7c5 Improve generated AppRun script 2019-08-14 14:36:06 +02:00
TheAssassin 72e4fb49e0 Don't try to move if there's no need to do so 2019-08-14 14:35:53 +02:00
TheAssassin abdefbc0ff Use a custom variable to support test runs from IDE better
When your IDE is running as an AppImage, the $APPRUN variable is
already set in the built-in terminal. Now of course you could just
calculate the path of $APPRUN yourself and force-overwrite it in that
script; however that's more effort and more likely to break.

Therefore it's easier to just introduce and use a custom variable.
2019-08-14 14:33:25 +02:00
TheAssassin 58845cee8f Support for AppRun hooks installed by plugins, mk. 1 2019-08-14 04:13:30 +02:00
TheAssassin 5bc8840003 Mark methods const where possible 2019-08-14 04:11:36 +02:00
TheAssassin 1cb5a742db Break up deployment algorithm into independent methods
That makes maintenance easier.
2019-08-14 02:28:21 +02:00
TheAssassin 142facd986 Improve method 2019-08-14 01:35:31 +02:00
TheAssassin aced62378a Move AppDir root deployment into separate class
Makes adding more features easier, as there's a clear defined interface
to the class and the mechanism can be split into more methods more
easily without bloating the AppDir class further.
2019-08-14 01:35:23 +02:00
TheAssassin 3fd595a63b Expose file copying helper in public interface 2019-08-14 01:33:09 +02:00
TheAssassin 9dc10fc0fc Method can be static 2019-08-14 01:08:20 +02:00
TheAssassin 3183ee2f4f Mark methods const where possible 2019-07-27 16:37:16 +02:00
TheAssassin 374e17b5e3 Merge pull request #85 from linuxdeploy/update_cpp_subprocess
Update cpp-subprocess to ensure that the bug in util::read_all() is fixed
2019-07-25 20:32:12 +02:00
TheAssassin d9681ccf5c Merge branch 'master' into update_cpp_subprocess 2019-07-25 20:10:35 +02:00
Alexis Lopez Zubieta 57dbdc6933 Update cpp-subprocess to ensure that the bug in util::read_all() is fixed 2019-07-25 13:08:21 -05:00
TheAssassin 3d766446d9 Improve log message 2019-07-25 17:47:34 +02:00
TheAssassin e24b46d291 Change method name to something more meaningful 2019-07-25 17:44:50 +02:00
TheAssassin 47b8370751 Method can be static 2019-07-25 17:43:45 +02:00
TheAssassin 0d055ebb81 Merge pull request #84 from darealshinji/patch-1
remove all comments
2019-07-07 16:06:52 +02:00
darealshinji ce5aecead5 remove all comments
Otherwise the generated header contains entries like this:
``` c
    "libxcb-dri2.so.0",
    "#",
    "https://github.com/probonopd/linuxdeployqt/issues/331#issuecomment-442276277",
    "libxcb-dri3.so.0",
    "#",
    "https://github.com/AppImage/AppImages/issues/348",
```
2019-07-06 20:21:16 +02:00
TheAssassin f01ae51f58 Merge pull request #79 from haampie/fix-deployment-of-dependencies
Fix an issue where dependencies are not deployed when calling deployLibrary only
2019-06-10 20:31:12 +02:00
Harmen Stoppels 0e95f19a75 Make deployLibrary deploy its dependencies by default, and avoid unnecessary recursion by making deployElfDependencies not deploy its deps of deps 2019-06-10 20:12:30 +02:00
TheAssassin 94bb814d69 Merge pull request #78 from haampie/fix-remove-recursion-elf-deployment
Remove recursion of ELF deployment since ldd already does that for us
2019-06-09 21:08:37 +02:00
Harmen Stoppels 159b082658 Remove recursion of ELF deployment since ldd already does that for us 2019-06-09 14:43:59 +02:00
TheAssassin 2a1127d7e8 Show acceptable icon sizes in error message
CC #75.
2019-05-24 23:25:03 +02:00
TheAssassin 3f81577b04 Fix missing newline in error messages 2019-05-24 22:49:19 +02:00
TheAssassin 834b467a41 Fix data printed in error message 2019-05-24 22:48:53 +02:00
TheAssassin 46ccb8965d Add missing valid resolutions (CC #75) 2019-05-24 16:19:36 +02:00
TheAssassin 5c3a51fd48 Merge pull request #71 from dbarach/master
Add a workspace sanity check
2019-03-27 17:12:19 +01:00
Dave Barach 44cb9466b3 Merge branch 'master' of https://github.com/dbarach/linuxdeploy
Signed-off-by: Dave Barach <dave@barachs.net>
2019-03-27 11:08:11 -04:00
Dave Barach 1dfcab8556 Add a workspace sanity check
Check to make sure that one source file in one of the git submodules
is present. If not, throw a fatal error which explains what probably
went wrong, and how to fix it:

"Missing submodule(s), please 'git clone --recurse-submodules...'"

Signed-off-by: Dave Barach <dave@barachs.net>
2019-03-27 11:03:25 -04:00
Dave Barach e62e8d8396 Add a workspace sanity check
Check to make sure that one source file in one of the git submodules
is present. If not, throw a fatal error which explains what probably
went wrong, and how to fix it:

"Missing submodule(s), please 'git clone --recurse-submodules...'"

Signed-off-by: Dave Barach <dave@barachs.net>
2019-03-27 10:23:47 -04:00
TheAssassin 875842ee3b Fix linking issues 2019-03-21 15:13:08 +01:00
TheAssassin a4fe77305d Reduce redundancy when adding boost header-only libs 2019-03-21 11:51:06 +01:00
TheAssassin 4f44dcf954 Fix Docker build script path issue 2019-03-21 11:28:15 +01:00
TheAssassin 44b234734b Upload CentOS 6 binaries 2019-03-21 11:27:02 +01:00
TheAssassin 871f1d6e99 Fix permissions 2019-03-21 11:20:45 +01:00
TheAssassin f06643ea5f Experimental CentOS 6 build 2019-03-21 11:13:44 +01:00
TheAssassin 6baa443fd7 appimagetool is being annoying 2019-03-21 10:32:17 +01:00
TheAssassin 77c52883f1 Remove deprecated debug code 2019-03-20 17:25:13 +01:00
TheAssassin 157861d236 Make symlinking work for older versions of ln, too 2019-03-20 17:23:14 +01:00
TheAssassin 32dca18eee We don't use exceptions for error communication 2019-03-20 17:22:46 +01:00
TheAssassin 1f498772b4 Properly handle nonexisting files 2019-02-23 18:01:47 +01:00
TheAssassin f9fc51a832 Improve search for patchelf
CC https://github.com/linuxdeploy/linuxdeploy-plugin-qt/issues/24.
2019-02-20 13:13:34 +01:00
TheAssassin a3e06e0024 Statically link desktopfile library 2019-02-07 00:46:59 +01:00
TheAssassin 956a253428 Return final deployment path
deployFile allows for specifying a directory as destination, and copies
files into there, simulating the behavior of tools like cp. To do that,
it creates the directory, then appends the filename of the input file
to it and uses that as destination for the "copy file" call.

It's pretty handy for some applications to get the full path of the
new file returned by this method directly (doesn't have to implement
this concatenation more than once).
2019-02-06 23:23:48 +01:00
TheAssassin ce6597fb9d Better handle debug-symbols-only ELF files 2019-01-29 01:00:36 +01:00
TheAssassin 028d85a070 Explicitly disable all copy/move(-assignment) behavior 2019-01-29 00:03:35 +01:00
TheAssassin 8df605cb19 Use shared pointer to manage PImpl object 2019-01-29 00:02:49 +01:00
TheAssassin 3a0870842c Update linuxdeploy-desktopfile 2019-01-28 16:52:20 +01:00
TheAssassin 1510d0c333 Update README.md
[ci skip]
2019-01-07 15:45:43 +01:00
TheAssassin 7c8ab1c773 Fix desktop file deployment 2018-12-22 23:26:28 +01:00
TheAssassin 5374e7ece9 Switch to extracted desktop file library 2018-12-22 23:09:04 +01:00
TheAssassin 6b715c691a Give test case more suitable name 2018-12-22 23:02:39 +01:00
TheAssassin 78f33a7190 Move linuxdeploy-specific helper out of desktop file class 2018-12-22 23:02:15 +01:00
TheAssassin 3df27ba175 Add proper desktop file
The auto-generated desktop file does trigger integration tools like
AppImageLauncher, this one shows it's a CLI tool and should just be
launched now.
2018-12-21 19:08:33 +01:00
TheAssassin 2ea9a367b5 Check whether parsing with comments is supported 2018-12-21 19:08:33 +01:00
TheAssassin 673ccf5691 Improve simple desktop file test 2018-12-21 19:08:33 +01:00
TheAssassin d743e11486 Merge pull request #63 from linuxdeploy/issue-62
Fix handling of localized desktop file entries
2018-12-09 16:13:06 +01:00
TheAssassin cddefc3806 Validate some constraints on localized keys 2018-12-06 12:09:18 +01:00
TheAssassin 1f5315926d Increase readability 2018-12-06 12:08:51 +01:00
TheAssassin a12f3ac0fe Improve error message 2018-12-06 11:56:21 +01:00
TheAssassin 640b756a7f Temporarily allow localization brackets in key names
Must be revised when introducing proper localization support.
2018-12-06 11:49:14 +01:00
TheAssassin d486f936e2 Test localized keys support
This is the unit test that was missing to cover the use case described
in #69.
2018-12-06 11:47:25 +01:00
TheAssassin b7faefdc56 Merge pull request #60 from linuxdeploy/issue-59
Ship 32-bit strip binary
2018-11-24 00:44:39 +01:00
TheAssassin 4585cb1a28 Download known working version of strip for i386, mk. 2 2018-11-24 00:34:38 +01:00
TheAssassin 23c85c732a Download known working version of strip for i386 2018-11-24 00:04:40 +01:00
TheAssassin b3e259bda1 Merge branch 'master' into issue-59 2018-11-23 22:08:37 +01:00
TheAssassin d42abe363c Merge pull request #61 from linuxdeploy/debug-desktopfile-unit-tests-in-release-builds
Fix desktop file parser unit test failures
2018-11-23 22:08:03 +01:00
TheAssassin ef90b09c79 Fix remaining issues with usage of assert 2018-11-23 20:52:54 +01:00
TheAssassin ce097235f2 Note for self: -O1+ strips out expressions surrounded by assert() 2018-11-23 18:05:56 +01:00
TheAssassin d65574544f Ship 32-bit strip binary, mk. 3 2018-11-23 17:55:53 +01:00
TheAssassin b38612d07e Ship 32-bit strip binary, mk. 2 2018-11-23 17:17:38 +01:00
TheAssassin 9cddf75449 Ship 32-bit strip binary 2018-11-23 16:32:43 +01:00
TheAssassin b974f44ffd Debug desktop file unit tests, mk.1
They're only broken on non-debug builds, so it's quite likely the
optimizations break the code.
2018-11-21 00:03:20 +01:00
TheAssassin ecaeda4533 Deactivate unit tests that fail for no apparent reason on Travis CI
Will re-enable and debug them eventually. Right now, they prevent
binaries from being published, which is really a problem.
2018-11-19 22:25:20 +01:00
TheAssassin ccfd05b5e0 Improve DesktopFile's comparison operators 2018-11-19 22:12:14 +01:00
TheAssassin 6cf9bc55a7 Fix comparison editor 2018-11-19 22:06:29 +01:00
TheAssassin 1e3e074f35 Properly copy desktop file reader 2018-11-19 22:06:08 +01:00
TheAssassin 7b16864dbe Add missing return statement 2018-11-19 21:51:26 +01:00
TheAssassin 0b5ab2fc36 Fix return type of setter 2018-11-19 21:51:26 +01:00
TheAssassin b3d0e7f20f Merge pull request #57 from linuxdeploy/fix-plugin-detection
Fix plugin detection
2018-11-19 21:09:23 +01:00
TheAssassin 132931772c Fix directory check 2018-11-19 20:52:45 +01:00
TheAssassin 6f7a2fd54a Reduce verbosity of debug logging related to plugin detection 2018-11-19 20:50:09 +01:00
TheAssassin c4258759b4 Make sure directories aren't falsely recognized as plugins 2018-11-19 20:48:04 +01:00
TheAssassin 786a24cb25 Fix CMake syntax 2018-11-16 00:25:27 +01:00
TheAssassin 35f1acf00d Cleaning up coverage data after creating them makes no sense
The cleanup shall take place before running the test binaries which
create the new data, not afterwards.
2018-11-16 00:23:03 +01:00
TheAssassin be0a891770 Improve test fixture names 2018-11-15 23:45:42 +01:00
TheAssassin 92a1370b30 Be able to use EXPECT_EQ with DesktopFile objects
GoogleTest internally uses operator==(first, second) instead of
first.operator==(second). By implementing the operators outside the
classes, GoogleTest can be made happy.
2018-11-15 23:36:04 +01:00
TheAssassin 541da1b573 Test (in)equality operators 2018-11-15 23:32:36 +01:00
TheAssassin f274de8045 Make sure default keys don't overwrite existing ones 2018-11-15 21:24:08 +01:00
TheAssassin 6a951558ce Use assert to check for impossible scenarios 2018-11-15 21:23:43 +01:00
TheAssassin a4b13a1916 Clean up coverage data before new run
This makes sure that reports on subsequent runs are accurate.
2018-11-15 21:19:22 +01:00
TheAssassin 1c4e4a3888 Remove redundant setters/getters 2018-11-15 20:53:16 +01:00
TheAssassin e4bf795211 No need for a string conversion operator
Doesn't make sense here anyway.
2018-11-15 20:44:43 +01:00
TheAssassin e994eacfa0 Prevent unnecessary log messages in unit tests 2018-11-15 19:08:03 +01:00
TheAssassin beb2ee15be Don't use exceptions to detect abnormal behavior
https://isocpp.org/wiki/faq/exceptions#why-not-exceptions
2018-11-15 18:48:58 +01:00
TheAssassin 2e1a37ccf5 Fix path to test data 2018-11-15 18:05:08 +01:00
TheAssassin 520ac6de9b Reduce amount of implicit behavior in desktop file parser 2018-11-15 18:03:46 +01:00
TheAssassin 1bcdcab057 Restructure desktop file tests, build single binary 2018-11-15 17:58:02 +01:00
TheAssassin 1d9c907ec3 Merge pull request #55 from linuxdeploy/test_desktopfile_parser_conformance
Test desktopfile parser conformance
2018-11-15 17:51:06 +01:00
TheAssassin 3e584f5551 Merge branch 'master' into test_desktopfile_parser_conformance 2018-11-15 17:21:23 +01:00
TheAssassin f7975f1b80 Use return types with guaranteed sizes
This will ensure the conversions work equally on both 32-bit platforms
(int == long on 32-bit Linux systems, on 64 bit long > int).
2018-11-15 17:19:42 +01:00
TheAssassin 4af76a92c5 Fix duplicate key detection 2018-11-15 13:41:53 +01:00
TheAssassin b6f5f371b6 Avoid copying data more often than necessary c 2018-11-15 13:40:22 +01:00
TheAssassin d10e0614a1 Increase build speed of tests 2018-11-15 13:39:17 +01:00
TheAssassin 4ffa1a66ae Improve code style 2018-11-15 13:22:41 +01:00
TheAssassin 9707b81931 Fix basic format header checks 2018-11-15 13:14:31 +01:00
TheAssassin 21b12cc6b6 Use EXPECT instead of ASSERT 2018-11-15 13:01:10 +01:00
TheAssassin ae61f6b9d8 Update README.md 2018-11-15 01:35:09 +01:00
TheAssassin b43b04f693 Check for valid and invalid keys (spec/basic format) 2018-11-15 01:29:14 +01:00
TheAssassin 61fb8bebdb Fix execution of desktop file tests 2018-11-15 00:58:56 +01:00
TheAssassin 002ba4a496 Split two checks to make sure they're tested separately
Otherwise, one test case is always uncovered (either the first one
passes and the second one triggers, or the first one triggers and the
second one is never tested).
2018-11-14 11:22:38 +01:00
TheAssassin 244d82fede Test behavior on lines with multiple = characters 2018-11-14 11:19:02 +01:00
TheAssassin 9f8121ebff Check whether invalid lines are recognized 2018-11-14 11:16:35 +01:00
TheAssassin 80adfa8872 Recognize broken section headings, mk. 4 2018-11-14 11:14:24 +01:00
TheAssassin 4a07c8151e Make sure errors are recognized in all sections, not just the first one 2018-11-14 11:10:34 +01:00
TheAssassin ded20c162d Recognize broken section headings, mk. 3 2018-11-14 10:59:17 +01:00
TheAssassin bf152a509b Recognize broken section headings, mk. 2 2018-11-14 10:46:48 +01:00
TheAssassin dc8f446ca4 Recognize broken section headings, mk. 1 2018-11-14 10:41:47 +01:00
TheAssassin fbc1d78122 Use custom exceptions for error handling 2018-11-14 10:31:41 +01:00
TheAssassin 9b2ff305e0 Merge pull request #52 from linuxdeploy/generate-coverage-reports
Generate coverage reports
2018-11-10 19:54:05 +01:00
TheAssassin ee0acdb6f1 Patchelf is indeed also needed by the integration tests 2018-11-10 14:18:11 +01:00
TheAssassin e069f6cd22 Fix typos 2018-11-10 14:03:23 +01:00
TheAssassin 74d482612a Add support for ccache 2018-11-10 14:03:11 +01:00
TheAssassin 8f2a49daf0 Fix build command syntax 2018-11-10 14:02:53 +01:00
TheAssassin 4a9e0583d0 Build in parallel before running coverage tools
Also, don't run tests parallelized any more, because the output is
unreadable.
2018-11-10 13:24:01 +01:00
TheAssassin d83ca617e6 Fix release build check 2018-11-10 13:10:47 +01:00
TheAssassin 16483c38e4 Build binaries before running tests when calculating coverage 2018-11-10 13:04:21 +01:00
TheAssassin 65ef0bd7ed Travis accepts but doesn't like multi-value env 2018-11-10 13:00:51 +01:00
TheAssassin 60f2cb78cd Generate textual coverage reports, mk. 4
Fix Travis config syntax
2018-11-10 12:57:29 +01:00
TheAssassin 9b8d7698f4 Remove dependency on lcov
We don't use it anyway, but use the more modern and flexible gcovr.
2018-11-10 03:43:51 +01:00
TheAssassin 5b1b91da5f Generate textual coverage reports, mk. 3 2018-11-10 03:39:34 +01:00
TheAssassin 44571a4c6b Remove obviously broken release build check 2018-11-10 03:38:56 +01:00
TheAssassin 744368868b Generate textual coverage reports, mk. 2 2018-11-10 03:36:33 +01:00
TheAssassin d476f308f8 Generate textual coverage reports, mk. 1 2018-11-10 03:32:50 +01:00
TheAssassin 232a76d1ba Merge pull request #49 from linuxdeploy/restructure-libraries
Restructure libraries
2018-11-10 03:08:35 +01:00
TheAssassin b97c8b45f5 Fix linking issue 2018-11-10 02:59:31 +01:00
TheAssassin d6e6cac6e0 Move libraries into directories following package path 2018-11-10 01:43:36 +01:00
TheAssassin 830dc50136 Avoid recompiling code if excludelist hasn't changed 2018-11-10 01:39:55 +01:00
TheAssassin 16ed8bfa6a Merge pull request #44 from linuxdeploy/issue-39
Implement own desktop file parser
2018-11-09 23:06:59 +01:00
TheAssassin dbfdc6ebe6 Merge branch 'master' into issue-39 2018-11-09 22:19:59 +01:00
TheAssassin a6b09ee30c Revert "Create coverage report during build"
We cannot test for coverage in a release build, but we don't want to
build in debug mode for released binaries.

We might consider creating a separate coverage target for testing code
coverage.

This reverts commit aaaca8b321.
2018-11-09 22:17:49 +01:00
TheAssassin 8b8255b158 Clean up redundant includes 2018-11-09 22:04:59 +01:00
TheAssassin a87fd648e0 Add dedicated test for values with spaces
CC @azubieta
2018-11-09 21:28:40 +01:00
TheAssassin 574a883733 Don't require desktop file's path to exist 2018-11-09 21:28:40 +01:00
TheAssassin aaaca8b321 Create coverage report during build 2018-11-09 21:28:40 +01:00
TheAssassin 22bbd04304 Properly calculate processor count for coverage testing 2018-11-09 21:28:40 +01:00
TheAssassin 96b5c3c479 Generate text report for coverage 2018-11-09 21:28:40 +01:00
TheAssassin 35e67a26bb Add missing dependencies for boost::lexical_cast 2018-11-09 20:08:11 +01:00
TheAssassin 74fb390e2f Make sure to include boost::lexical_cast 2018-11-09 18:53:35 +01:00
TheAssassin 3b3f86f9a2 Revert "Remove unused submodule, mk. 2"
Was working on the wrong branch.

This reverts commit b1838315d9.
2018-11-09 18:52:18 +01:00
TheAssassin e6341435bd Revert "Make sure to include boost::lexical_cast"
Was working on the wrong branch.

This reverts commit e388ad9eb6.
2018-11-09 18:52:10 +01:00
TheAssassin e388ad9eb6 Make sure to include boost::lexical_cast 2018-11-09 18:50:44 +01:00
TheAssassin b1838315d9 Remove unused submodule, mk. 2 2018-11-09 18:50:23 +01:00
TheAssassin 6e525e0a65 Add missing newline 2018-11-09 18:31:27 +01:00
TheAssassin b540240ba5 Improve efficiency 2018-11-09 18:31:19 +01:00
TheAssassin 5d219c99b7 Remove unnecessary dependency from target 2018-11-09 18:30:47 +01:00
TheAssassin 459c5aad9a Fix use of DesktopFile class 2018-11-09 18:24:16 +01:00
TheAssassin c6a517c1f5 Remove unused submodule 2018-11-09 16:07:47 +01:00
TheAssassin 11bbe4d219 Rewrite DesktopFile using own parser 2018-11-09 16:04:40 +01:00
TheAssassin 0d59a27905 Improve test workflow
Use ASSERT first to make sure teh function that performs the work has
run as intended, then use EXPECT to make sure all checks are run.
2018-11-09 13:41:32 +01:00
TheAssassin a4e48db545 Fix include paths 2018-11-09 13:15:03 +01:00
TheAssassin b56e202c40 Add targets for remaining coverage report types 2018-11-09 03:24:03 +01:00
TheAssassin 8b4feb5fd5 Add data getter 2018-11-09 03:16:14 +01:00
TheAssassin 156b45f819 Mark query function as const 2018-11-09 03:10:36 +01:00
TheAssassin 3e1d340612 Add DesktopFileWriter 2018-11-09 03:05:20 +01:00
TheAssassin 8a2d57e8d5 Move definition of types into DesktopFile
Types will be shared with future DesktopFileWriter class.
2018-11-09 02:26:09 +01:00
TheAssassin be1b2c95d4 Move type definitions into class 2018-11-09 02:14:48 +01:00
TheAssassin 4bb1ef124b Move into proper namespace 2018-11-09 01:56:05 +01:00
TheAssassin 93c947b56a Check whether keys and values with spaces are parsed properly 2018-11-09 01:48:44 +01:00
TheAssassin 4bf295d4d6 Validate all values in desktop file 2018-11-09 01:45:36 +01:00
TheAssassin 2c40482bc0 Implement subscript operator returning sections 2018-11-09 01:44:02 +01:00
TheAssassin a647205226 Implement conversion to double 2018-11-09 01:32:18 +01:00
TheAssassin 73832323c8 Implement actual parsing 2018-11-09 01:12:48 +01:00
TheAssassin 169275e023 Fix semantics of isEmpty() 2018-11-09 00:58:09 +01:00
TheAssassin 78e5d0858e Add actual data structures 2018-11-09 00:57:06 +01:00
TheAssassin b4efb2bc56 Increase test coverage 2018-11-09 00:54:32 +01:00
TheAssassin aa2e8b9105 Allow construction from istream 2018-11-09 00:43:02 +01:00
TheAssassin 793b35dc61 Parse file in constructor 2018-11-09 00:37:58 +01:00
TheAssassin 5ba8b613d6 Fix includes 2018-11-09 00:36:55 +01:00
TheAssassin 75f2511437 Add some convenience function to convert/parse value 2018-11-09 00:08:40 +01:00
TheAssassin 9a4916fe84 Desktop file entry initial commit 2018-11-08 23:08:32 +01:00
TheAssassin e584088656 Use already existing function to copy data 2018-11-08 22:45:50 +01:00
TheAssassin 8a79cfbe1d Mark query functions as const 2018-11-08 22:38:29 +01:00
TheAssassin 22ecabc51b Desktop file parser initial commit 2018-11-08 22:18:23 +01:00
TheAssassin 81dfae892c Add support for code coverage measurements 2018-11-08 22:17:21 +01:00
TheAssassin bedd66d161 INI parser now contains a CMake script 2018-11-07 23:20:29 +01:00
TheAssassin 62f04213ce Use fixed fork of INI parser 2018-11-07 23:20:26 +01:00
TheAssassin 4790fabc44 Revert "Temporary workaround for #39"
Fixed the issue properly in the dependency, therefore the workaround is
no longer needed.

This reverts commit 6112a6353e.
2018-11-07 22:21:52 +01:00
TheAssassin 6112a6353e Temporary workaround for #39 2018-11-07 20:09:24 +01:00
TheAssassin 82b7ccd76a Merge pull request #41 from linuxdeploy/integration_test
Improve AppDir root files deployment
2018-11-06 15:48:05 +01:00
TheAssassin 4e33e395de Show warning if existing AppRun is overwritten 2018-11-06 15:39:35 +01:00
Alexis Lopez Zubieta 9d25fee1dc Make "Deploying custom AppRun" a regular message 2018-11-06 08:26:15 -06:00
Alexis Lopez Zubieta 9d78e0786b Ensure that custom AppRun are deployed even if no desktop files are found 2018-11-06 07:48:12 -06:00
Alexis Lopez Zubieta 9f20e5829d Restructure the code in order to make it more clear 2018-11-05 21:26:48 -06:00
Alexis Lopez Zubieta 5055efdc05 Rename linuxdeploy.cpp and linuxdeploy.h to core.cpp and core.h 2018-11-05 18:33:14 -06:00
Alexis Lopez Zubieta 19ecbb2d70 remove empty line 2018-11-05 16:24:09 -06:00
Alexis Lopez Zubieta 0e92331a12 Document linuxdeploy::deployAppDirRootFiles 2018-11-05 16:23:04 -06:00
Alexis Lopez Zubieta 4bf1948774 Document linuxdeploy::getMainDesktopFile 2018-11-05 16:07:01 -06:00
Alexis Lopez Zubieta f201c57177 Optimize imports 2018-11-05 15:57:37 -06:00
Alexis Lopez Zubieta d7c0e94f11 Reformat 2018-11-05 15:55:13 -06:00
Alexis Lopez Zubieta 700f6fe15f Remove declaration of getMainDesktopFile 2018-11-05 15:54:59 -06:00
Alexis Lopez Zubieta 012e621ec5 Throw an exception when no deskotp files are found 2018-11-05 15:47:11 -06:00
Alexis Lopez Zubieta 6c674aa184 Making getMainDesktopFile parameters constant references 2018-11-05 15:43:35 -06:00
Alexis Lopez Zubieta 553bb9fcb0 No need to override constructor 2018-11-05 15:41:06 -06:00
Alexis Lopez Zubieta 906dcab283 Fix code style 2018-11-05 15:40:15 -06:00
Alexis Lopez Zubieta fc3d80c281 remove duplicated 'public' 2018-11-05 15:39:47 -06:00
Alexis Lopez Zubieta f0bb1fb472 bring empty line back 2018-11-05 15:39:00 -06:00
Alexis Lopez Zubieta f3f30166f2 Importing boost::filesystem as bf to keep consistency its usage across the project 2018-11-05 15:38:12 -06:00
Alexis Lopez Zubieta 2210b7e65d Remove integration test 'build_minimal_appimage_with_custom_apprun' 2018-11-05 15:33:15 -06:00
Alexis Lopez Zubieta cc800588d2 Optimize imports 2018-11-05 15:28:11 -06:00
Alexis Lopez Zubieta 29cda3b1ac Change return type to bool 2018-11-05 15:27:58 -06:00
Alexis Lopez Zubieta 16b0a5948a createLinksInAppDirRoot is capable of dealing with an empty customAppRunPath so there is no need to check it 2018-11-05 15:27:58 -06:00
Alexis Lopez Zubieta 41569a4f53 The ".DirIcon" creation seems not to be responsibility of deployAppDirRootFiles 2018-11-05 15:27:58 -06:00
Alexis Lopez Zubieta 7ff05ca98e Removing AppRun file existence check as createLinksInAppDirRoot also perform this check 2018-11-05 15:27:58 -06:00
Alexis Lopez Zubieta cab57f86d6 Put main desktop file lookup into a separated function 2018-11-05 15:27:58 -06:00
Alexis Lopez Zubieta 93fea697e5 Move desktop file deployment away from desktop file lookup 2018-11-05 15:27:58 -06:00
Alexis Lopez Zubieta bd12fefc35 Complete deployAppDirRootFilesWithExistentAppRun definition 2018-11-05 15:12:27 -06:00
Alexis Lopez Zubieta 2cdedc252c Replace args::ValueFlagList by vector<string> in deployAppDirRootFiles function signature 2018-11-05 15:12:27 -06:00
Alexis Lopez Zubieta 1fa90fbd5c Add namespace and prepare unittest 2018-11-05 15:12:27 -06:00
Alexis Lopez Zubieta 7318d68c96 Move deployAppDirRootFiles function into a separated file to allow unit testing 2018-11-05 15:12:27 -06:00
Alexis Lopez Zubieta e5f4755da7 Move deploy AppDir root files into a separated function 2018-11-05 15:12:27 -06:00
Alexis Lopez Zubieta 31f20a398f Add integration test to build a minimal appimage with custom AppRun 2018-11-05 15:12:27 -06:00
Alexis LĂłpez Zubieta d9ca907da8 Add symlinkFile to the public AppDir interface (#42)
* Add symlinkFile to the public AppDir interface

* Rename AppDir::symlinkFile to AppDir::createSymlink

* change return value to bool

* Remove duplicated header

* Remove blank lines

* Add comment

* Fix test name

* Change createSymlink signature. Name changed to createRelativeSymlink and remove the useRelativePath argument

* Remove commented tests.
2018-11-05 22:10:18 +01:00
TheAssassin 542edaf410 Allow disabling copyright files deployment for debugging 2018-11-04 17:21:36 +01:00
TheAssassin e683561430 Merge pull request #38 from linuxdeploy/refactor-subprocessing
Refactor subprocessing
2018-10-25 15:36:57 +02:00
TheAssassin 0de7caa8ee Document complex if query
[ci skip]
2018-10-25 15:33:22 +02:00
TheAssassin f1690cc2a3 Use new subprocessing function to create symlinks 2018-10-25 15:18:55 +02:00
TheAssassin 53e0850a2b Use new subprocessing function to handle calls to strip 2018-10-25 15:17:43 +02:00
TheAssassin 3949a5fc57 Use new subprocessing function to set rpath in ELF files 2018-10-25 15:12:27 +02:00
TheAssassin 001b8f974c Use new subprocessing function to read rpath in ELF files 2018-10-25 14:58:47 +02:00
TheAssassin 2f5e04ec24 Increase stream buffer size again 2018-10-25 14:38:03 +02:00
TheAssassin 8d01c448d3 Increase subprocess stream reading reliability 2018-10-25 14:37:17 +02:00
TheAssassin 10df75f877 Extract subprocessing into separate library 2018-10-25 14:34:54 +02:00
TheAssassin 0c5b198e2f Merge pull request #33 from linuxdeploy/tests
Add Unit Tests
2018-10-25 01:26:46 +02:00
TheAssassin 5d2984ae02 Merge branch 'master' into tests 2018-10-25 01:21:46 +02:00
TheAssassin 33829c07d0 Remove redundant variables and fix paths 2018-10-25 01:16:05 +02:00
TheAssassin 90f8ed26b8 Fix path in unit test 2018-10-25 01:12:47 +02:00
TheAssassin cbaa343a82 Add missing trailing newline character
[ci skip]
2018-10-25 01:08:52 +02:00
TheAssassin 9cf0663baa Hardcode all paths to recognize sudden changes of destination paths 2018-10-25 01:06:12 +02:00
TheAssassin e94494ea31 Move declaration of variables to top 2018-10-25 00:48:13 +02:00
TheAssassin 2dce34daf9 Use ASSERT_* instead of if()s and FAIL() 2018-10-25 00:46:46 +02:00
TheAssassin 7260078b6c Move test into subdirectory named like internal library 2018-10-25 00:39:45 +02:00
TheAssassin 4bdceec7d8 Use standard lower-case file extension 2018-10-25 00:30:41 +02:00
TheAssassin ca6c710c38 Remove deprecated code 2018-10-25 00:27:32 +02:00
TheAssassin 8a31d3d677 Fix cross-compiling toolchain 2018-10-25 00:27:32 +02:00
TheAssassin 5e94977f78 Fix cpp-feather-ini-parser test execution 2018-10-25 00:27:32 +02:00
TheAssassin 2f96dec588 Fix tests' structure, code style and use of GTest 2018-10-25 00:27:32 +02:00
TheAssassin a1308955e7 Use CMake's BUILD_TESTING instead of proprietary custom variable 2018-10-25 00:27:32 +02:00
Alexis Lopez Zubieta 7e4a320f61 Make ctest run un verbose mode. 2018-10-25 00:27:32 +02:00
Alexis Lopez Zubieta 172db51186 Add unit test for AppDir::depoloyLibrary but with an invalid path. 2018-10-25 00:27:32 +02:00
Alexis Lopez Zubieta d09186f69f Run unit tests on the build.sh script 2018-10-25 00:27:32 +02:00
Alexis Lopez Zubieta 376eddb14d Add unit test for AppDir::deployFile 2018-10-25 00:27:32 +02:00
Alexis Lopez Zubieta 47ff6c8e9d Add AppDir::deployIcon test. 2018-10-25 00:27:03 +02:00
TheAssassin 41371c9d90 Improve Travis uploading 2018-10-25 00:20:05 +02:00
Alexis Lopez Zubieta eacc907c85 Add unit test for AppDir::deployDesktopFile 2018-10-24 13:09:59 +02:00
Alexis Lopez Zubieta 4c9943f0d1 Add unit test for AppDir::deployExecutable 2018-10-24 13:09:59 +02:00
Alexis Lopez Zubieta a0503a7102 Add test for AppDir::depoloyLibrary 2018-10-24 13:09:59 +02:00
Alexis Lopez Zubieta f1e752d452 Add unit test for AppDir::createBasicStructure 2018-10-24 13:09:59 +02:00
Alexis Lopez Zubieta 55b6ee19e1 Add tests infrastructure 2018-10-24 13:09:50 +02:00
TheAssassin 4c0d5ea891 Remove erroneous null termination
The std::string is created using char pointer _and_ buffer size, so
null termination wasn't necessary in there (might even be problematic
with other tools which aren't strictly text based).

CC #35.
2018-10-24 12:46:24 +02:00
TheAssassin 83a8f52f98 Replace communicate() to prevent buffer overflow 2018-10-14 17:11:05 +02:00
TheAssassin b1bf306510 Fix compatibility with newer versions of ldd 2018-10-14 17:11:05 +02:00
TheAssassin d2a021d57b Update README.md 2018-10-07 22:17:20 +02:00
TheAssassin 2f7ad201f1 Don't overwrite existing AppRun
... unless custom AppRun was specified
2018-10-07 00:10:57 +02:00
TheAssassin 485507a2d1 Buffer subprocess communication 2018-10-07 00:05:59 +02:00
TheAssassin cdee469e60 Fix uploading of .zsync file 2018-10-05 02:03:38 +02:00
TheAssassin a892d066cc Improve update information 2018-10-04 15:21:38 +02:00
TheAssassin 57175e0c75 Embed update information 2018-10-04 15:16:22 +02:00
TheAssassin 88695de067 Fix desktop file filename handling 2018-09-30 21:20:36 +02:00
TheAssassin 0f19458792 Improve error message 2018-09-30 21:11:05 +02:00
TheAssassin c8d78eb602 Remove --app-name parameter completely
Fixes #19.
2018-09-30 17:12:28 +02:00
TheAssassin 6b8b59ee77 Search for plugins in current working directory 2018-09-29 21:56:58 +02:00
TheAssassin 3674af54b2 Fix syntax 2018-09-26 00:39:21 +02:00
TheAssassin 73ecd9d318 Actually copy files before running plugins
Some plugins like the Qt one expect libraries etc. to be deployed
already, like the plugin spec defines. We should try to adhere to the
spec.
2018-09-26 00:36:57 +02:00
TheAssassin 1ad4e5e6a9 Make sure to run ldd with LC_ALL=C 2018-09-22 23:21:00 +02:00
TheAssassin f3b54236a6 Update build.sh 2018-09-16 04:23:17 +02:00
TheAssassin e885b47208 Merge pull request #30 from asashnov/fix-examples-link
fix examples link (ancor on the target HTML page is lowercased)
2018-09-06 13:08:36 +02:00
Alexander Sashnov 89788f5e26 fix examples link (ancor on the target HTML page is lowercased) 2018-09-06 17:55:24 +07:00
72 changed files with 3084 additions and 943 deletions
-1
View File
@@ -2,5 +2,4 @@ cmake-build-*/
*build*/
.idea/
squashfs-root/
tests/
*.AppImage
+9 -6
View File
@@ -1,12 +1,6 @@
[submodule "lib/cpp-subprocess"]
path = lib/cpp-subprocess
url = https://github.com/arun11299/cpp-subprocess.git
[submodule "lib/args"]
path = lib/args
url = https://github.com/Taywee/args.git
[submodule "lib/cpp-feather-ini-parser"]
path = lib/cpp-feather-ini-parser
url = https://github.com/Turbine1991/cpp-feather-ini-parser.git
[submodule "lib/boost-filesystem"]
path = lib/boost-filesystem
url = https://github.com/boostorg/filesystem.git
@@ -76,3 +70,12 @@
[submodule "lib/CImg"]
path = lib/CImg
url = https://github.com/dtschump/CImg.git
[submodule "lib/googletest"]
path = lib/googletest
url = https://github.com/google/googletest
[submodule "lib/boost-container"]
path = lib/boost-container
url = https://github.com/boostorg/container
[submodule "lib/linuxdeploy-desktopfile"]
path = lib/linuxdeploy-desktopfile
url = https://github.com/linuxdeploy/linuxdeploy-desktopfile
+50 -24
View File
@@ -1,9 +1,10 @@
language: cpp
sudo: required
matrix:
include:
- env: ARCH=x86_64
- name: Ubuntu bionic x86_64 release build
env: ARCH=x86_64
dist: bionic
addons:
apt:
update: true
@@ -12,8 +13,15 @@ matrix:
- libjpeg-dev
- libpng-dev
- cimg-dev
- automake # required for patchelf
- env: ARCH=i386
script: travis/build.sh
after_success:
- if [ "$TRAVIS_BRANCH" != "$TRAVIS_TAG" ] && [ "$TRAVIS_BRANCH" != "master" ]; then export TRAVIS_EVENT_TYPE=pull_request; fi
- wget -c https://github.com/probonopd/uploadtool/raw/master/upload.sh
- bash upload.sh linuxdeploy-"$ARCH".AppImage*
- name: Ubuntu bionic i386 build
env: ARCH=i386
dist: bionic
addons:
apt:
update: true
@@ -23,30 +31,48 @@ matrix:
- libpng-dev:i386
- gcc-multilib
- g++-multilib
- automake # required for patchelf
- libfuse2:i386
- libcairo2:i386
script: travis/build.sh
after_success:
- if [ "$TRAVIS_BRANCH" != "$TRAVIS_TAG" ] && [ "$TRAVIS_BRANCH" != "master" ]; then export TRAVIS_EVENT_TYPE=pull_request; fi
- wget -c https://github.com/probonopd/uploadtool/raw/master/upload.sh
- bash upload.sh linuxdeploy-"$ARCH".AppImage*
install:
- git clone https://github.com/NixOS/patchelf.git -b 0.8
- cd patchelf
- ./bootstrap.sh
- if [ "$ARCH" == "i386" ]; then ./configure --prefix=/usr --build=i686-pc-linux-gnu CFLAGS=-m32 CXXFLAGS=-m32 LDFLAGS=-m32; fi
- if [ "$ARCH" == "x86_64" ]; then ./configure --prefix=/usr; fi
- make -j$(nproc)
- sudo make install
- cd ..
- rm -rf patchelf
- name: Ubuntu xenial x86_64 coverage build (no binaries uploaded)
env: ARCH=x86_64 BUILD_TYPE=coverage
dist: xenial
addons:
apt:
update: true
packages:
- libmagic-dev
- libjpeg-dev
- libpng-dev
- cimg-dev
before_script:
- sudo pip install gcovr
script: travis/test-coverage.sh
after_success: true # also, we don't intend to upload release binaries
script:
- travis/build.sh
after_success:
- ls -lh
# make sure only pushes to rewrite create a new release, otherwise pretend PR and upload to transfer.sh
- if [ "$TRAVIS_BRANCH" != "master" ]; then export TRAVIS_EVENT_TYPE=pull_request; fi
- wget -c https://github.com/probonopd/uploadtool/raw/master/upload.sh
- bash upload.sh linuxdeploy-"$ARCH".AppImage*
- name: Ubuntu xenial i386 coverage build (no binaries uploaded)
env: ARCH=i386 BUILD_TYPE=coverage
dist: xenial
addons:
apt:
update: true
packages:
- libmagic-dev:i386
- libjpeg-dev:i386
- libpng-dev:i386
- gcc-multilib
- g++-multilib
- libfuse2:i386
- libcairo2:i386
before_script:
- sudo pip install gcovr
script: travis/test-coverage.sh
after_success: true # also, we don't intend to upload release binaries
branches:
except:
+38
View File
@@ -10,6 +10,44 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake/Modules/
set(USE_SYSTEM_BOOST OFF CACHE BOOL "Set to ON to use system boost libraries instead of building up to date boost libraries from source")
set(USE_SYSTEM_CIMG ON CACHE BOOL "Set to OFF to use CImg library bundled in lib directory")
# support for ccache
# call CMake with -DUSE_CCACHE=ON to make use of it
set(USE_CCACHE ON CACHE BOOL "")
if(USE_CCACHE)
find_program(CCACHE ccache)
if(CCACHE)
message(STATUS "Using ccache")
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE})
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE})
else()
message(WARNING "USE_CCACHE set, but could not find ccache")
endif()
endif()
set(ENABLE_COVERAGE OFF CACHE BOOL "Enable coverage measurements")
if(ENABLE_COVERAGE)
include(CodeCoverage)
message(WARNING "Enabling code coverage measurements -> disables optimizations and embeds debug information!")
append_coverage_compiler_flags()
set(COVERAGE_GCOVR_EXCLUDES ${PROJECT_SOURCE_DIR}/lib ${PROJECT_BINARY_DIR})
include(ProcessorCount)
ProcessorCount(processor_count)
set(command cmake --build . --target all -- -j ${processor_count} && ctest -V)
setup_target_for_coverage_gcovr_html(NAME coverage EXECUTABLE "${command}")
setup_target_for_coverage_gcovr_xml(NAME coverage_xml EXECUTABLE "${command}")
setup_target_for_coverage_gcovr_text(NAME coverage_text EXECUTABLE "${command}")
endif()
add_subdirectory(lib)
add_subdirectory(src)
include(CTest)
if(BUILD_TESTING)
add_subdirectory(tests)
endif()
+13 -52
View File
@@ -14,58 +14,22 @@ linuxdeploy is designed to be an AppDir maintenance tool. It provides extensive
linuxdeploy was greatly influenced by [linuxdeployqt](https://github.com/probonopd/linuxdeployqt), and while it employs stricter rules on AppDirs, it's more flexible in use. If you use linuxdeployqt at the moment, consider switching to linuxdeploy today!
## Usage
## User guides and examples
linuxdeploy, being a tool for creating AppDirs and eventually AppImages, is released as an AppImage itself. Please download and use the AppImage for normal use. If you encounter errors, e.g., when building the tool from source, please try with the AppImage first before [creating an issue](https://github.com/TheAssassin/linuxdeploy/issues/new).
Please see the [linuxdeploy user guide](https://docs.appimage.org/packaging-guide/from-source/linuxdeploy-user-guide.html) and the [native binaries packaging guide](https://docs.appimage.org/packaging-guide/from-source/native-binaries.html) in the [AppImage documentation](https://docs.appimage.org). There's also an [examples section](https://docs.appimage.org/packaging-guide/from-source/native-binaries.html#examples).
There are two main ways to use linuxdeploy: Provide the paths to all files you want to bundle manually, or create an FHS-like directory and run linuxdeploy on it.
Most build systems provide some kind of `make install` functionality that is capable of producing FHS-like directory trees that can be turned into AppDirs:
## Projects using linuxdeploy
```sh
# automake
./configure --prefix=/usr
make install DESTDIR=AppDir
This is an incomplete list of projects using linuxdeploy. You might want to read their build scripts to see how they use linuxdeploy.
# cmake
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=/usr
make install DESTDIR=AppDir
# qmake
qmake CONFIG+=release PREFIX=/usr .
make install INSTALL_ROOT=AppDir
```
Now, simply run linuxdeploy like `./linuxdeploy*.AppImage --appdir AppDir`.
Please use `./linuxdeploy*.AppImage --help` to get a list of options supported by linuxdeploy.
If your build system cannot produce such install trees or you prefer to bundle everything manually, you can also specify the paths to the resources yourself. linuxdeploy provides the following options for this use case:
```
-l[library...],
--lib=[library...],
--library=[library...] Shared library to deploy
-e[executable...],
--executable=[executable...] Executable to deploy
-d[desktop file...],
--desktop-file=[desktop file...] Desktop file to deploy
enough for some tests
-i[icon file...],
--icon-file=[icon file...] Icon to deploy
```
An example run could look like this:
```bash
./linuxdeploy*.AppImage --appdir AppDir -e myapp -d myapp.desktop -i myapp_64x64.png
```
Of course both approaches can be combined, e.g., you can bundle additional executables with your main app.
linuxdeploy doesn't mind being run on an AppDir more than once, as it recognize previous runs, and should not break files within the AppDir. This is called an "iterative workflow". In case of errors, you can simply fix them, and re-run linuxdeploy afterwards.
If you ever encounter issues when running linuxdeploy on an existing AppDir, please let us know by [creating an issue](https://github.com/TheAssassin/linuxdeploy/issues/new).
- [Pext](https://github.com/Pext/Pext)
- [AppImageLauncher](https://github.com/TheAssassin/AppImageLauncher)
- [OpenRCT2](https://github.com/OpenRCT2/OpenRCT2)
- [AppImageUpdate](https://github.com/AppImage/AppImageUpdate)
- [appimaged](https://github.com/AppImage/appimaged)
- [MediaElch](https://github.com/Komet/MediaElch/)
- [CPU-X](https://github.com/X0rg/CPU-X) (details available [here](https://github.com/AppImage/AppImageKit/wiki/Bundling-GTK3-apps#fully-automated-deployment-from-sources-with-github-actions-cpu-x))
## Plugins
@@ -86,14 +50,11 @@ linuxdeploy currently ships with some plugins. These are likely out of date. In
If you want to use a plugin to bundle additional resources, please add `./linuxdeploy*.AppImage --plugin <name>` to your linuxdeploy command. Output plugins can be activated using `./linuxdeploy*.AppImage --output <name>`.
**A list of official and community plugins can be found in the [awesome-linuxdeploy](http://github.com/linuxdeploy/awesome-linuxdeploy) project.**
**Note:** If you want to suggest a plugin for a specific framework, language etc., please feel free to [create a new issue](https://github.com/linuxdeploy/linuxdeploy/issues/new). Current plugin requests can be found [here](https://github.com/linuxdeploy/linuxdeploy/issues?utf8=%E2%9C%93&q=label%3A%22plugin+request%22).
## User guides and examples
Please see the [linuxdeploy user guide](https://docs.appimage.org/packaging-guide/linuxdeploy-user-guide.html) and the [native binaries packaging guide](https://docs.appimage.org/packaging-guide/native-binaries.html) in the [AppImage documentation](https://docs.appimage.org). There's also an [examples section](https://docs.appimage.org/packaging-guide/native-binaries.html#Examples).
## Troubleshooting
> I bundled additional resources, but when I try to run them, either the system binary is called or the file is not found.
+362
View File
@@ -0,0 +1,362 @@
# Copyright (c) 2012 - 2017, Lars Bilke
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification,
# are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice, this
# list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# 3. Neither the name of the copyright holder 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 HOLDER 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.
#
# CHANGES:
#
# 2012-01-31, Lars Bilke
# - Enable Code Coverage
#
# 2013-09-17, Joakim Söderberg
# - Added support for Clang.
# - Some additional usage instructions.
#
# 2016-02-03, Lars Bilke
# - Refactored functions to use named parameters
#
# 2017-06-02, Lars Bilke
# - Merged with modified version from github.com/ufz/ogs
#
#
# USAGE:
#
# 1. Copy this file into your cmake modules path.
#
# 2. Add the following line to your CMakeLists.txt:
# include(CodeCoverage)
#
# 3. Append necessary compiler flags:
# APPEND_COVERAGE_COMPILER_FLAGS()
#
# 4. If you need to exclude additional directories from the report, specify them
# using the COVERAGE_LCOV_EXCLUDES variable before calling SETUP_TARGET_FOR_COVERAGE_LCOV.
# Example:
# set(COVERAGE_LCOV_EXCLUDES 'dir1/*' 'dir2/*')
#
# 5. Use the functions described below to create a custom make target which
# runs your test executable and produces a code coverage report.
#
# 6. Build a Debug build:
# cmake -DCMAKE_BUILD_TYPE=Debug ..
# make
# make my_coverage_target
#
include(CMakeParseArguments)
# Check prereqs
find_program( GCOV_PATH gcov )
find_program( LCOV_PATH NAMES lcov lcov.bat lcov.exe lcov.perl)
find_program( GENHTML_PATH NAMES genhtml genhtml.perl genhtml.bat )
find_program( GCOVR_PATH gcovr PATHS ${CMAKE_SOURCE_DIR}/scripts/test)
find_program( SIMPLE_PYTHON_EXECUTABLE python )
if(NOT GCOV_PATH)
message(FATAL_ERROR "gcov not found! Aborting...")
endif() # NOT GCOV_PATH
if("${CMAKE_CXX_COMPILER_ID}" MATCHES "(Apple)?[Cc]lang")
if("${CMAKE_CXX_COMPILER_VERSION}" VERSION_LESS 3)
message(FATAL_ERROR "Clang version must be 3.0.0 or greater! Aborting...")
endif()
elseif(NOT CMAKE_COMPILER_IS_GNUCXX)
message(FATAL_ERROR "Compiler is not GNU gcc! Aborting...")
endif()
set(COVERAGE_COMPILER_FLAGS "-g -O0 --coverage -fprofile-arcs -ftest-coverage"
CACHE INTERNAL "")
set(CMAKE_CXX_FLAGS_COVERAGE
${COVERAGE_COMPILER_FLAGS}
CACHE STRING "Flags used by the C++ compiler during coverage builds."
FORCE )
set(CMAKE_C_FLAGS_COVERAGE
${COVERAGE_COMPILER_FLAGS}
CACHE STRING "Flags used by the C compiler during coverage builds."
FORCE )
set(CMAKE_EXE_LINKER_FLAGS_COVERAGE
""
CACHE STRING "Flags used for linking binaries during coverage builds."
FORCE )
set(CMAKE_SHARED_LINKER_FLAGS_COVERAGE
""
CACHE STRING "Flags used by the shared libraries linker during coverage builds."
FORCE )
mark_as_advanced(
CMAKE_CXX_FLAGS_COVERAGE
CMAKE_C_FLAGS_COVERAGE
CMAKE_EXE_LINKER_FLAGS_COVERAGE
CMAKE_SHARED_LINKER_FLAGS_COVERAGE )
if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
message(WARNING "Code coverage results with an optimised (non-Debug) build may be misleading")
endif() # NOT CMAKE_BUILD_TYPE STREQUAL "Debug"
if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
link_libraries(gcov)
else()
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage")
endif()
# Defines a target for running and collection code coverage information
# Builds dependencies, runs the given executable and outputs reports.
# NOTE! The executable should always have a ZERO as exit code otherwise
# the coverage generation will not complete.
#
# SETUP_TARGET_FOR_COVERAGE_LCOV(
# NAME testrunner_coverage # New target name
# EXECUTABLE testrunner -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR
# DEPENDENCIES testrunner # Dependencies to build first
# )
function(SETUP_TARGET_FOR_COVERAGE_LCOV)
set(options NONE)
set(oneValueArgs NAME)
set(multiValueArgs EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES LCOV_ARGS GENHTML_ARGS)
cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
if(NOT LCOV_PATH)
message(FATAL_ERROR "lcov not found! Aborting...")
endif() # NOT LCOV_PATH
if(NOT GENHTML_PATH)
message(FATAL_ERROR "genhtml not found! Aborting...")
endif() # NOT GENHTML_PATH
# Setup target
add_custom_target(${Coverage_NAME}
# Cleanup lcov
COMMAND ${LCOV_PATH} ${Coverage_LCOV_ARGS} --gcov-tool ${GCOV_PATH} -directory . --zerocounters
# Create baseline to make sure untouched files show up in the report
COMMAND ${LCOV_PATH} ${Coverage_LCOV_ARGS} --gcov-tool ${GCOV_PATH} -c -i -d . -o ${Coverage_NAME}.base
# Run tests
COMMAND ${Coverage_EXECUTABLE} ${Coverage_EXECUTABLE_ARGS}
# Capturing lcov counters and generating report
COMMAND ${LCOV_PATH} ${Coverage_LCOV_ARGS} --gcov-tool ${GCOV_PATH} --directory . --capture --output-file ${Coverage_NAME}.info
# add baseline counters
COMMAND ${LCOV_PATH} ${Coverage_LCOV_ARGS} --gcov-tool ${GCOV_PATH} -a ${Coverage_NAME}.base -a ${Coverage_NAME}.info --output-file ${Coverage_NAME}.total
COMMAND ${LCOV_PATH} ${Coverage_LCOV_ARGS} --gcov-tool ${GCOV_PATH} --remove ${Coverage_NAME}.total ${COVERAGE_LCOV_EXCLUDES} --output-file ${PROJECT_BINARY_DIR}/${Coverage_NAME}.info.cleaned
COMMAND ${GENHTML_PATH} ${Coverage_GENHTML_ARGS} -o ${Coverage_NAME} ${PROJECT_BINARY_DIR}/${Coverage_NAME}.info.cleaned
COMMAND ${CMAKE_COMMAND} -E remove ${Coverage_NAME}.base ${Coverage_NAME}.total ${PROJECT_BINARY_DIR}/${Coverage_NAME}.info.cleaned
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
DEPENDS ${Coverage_DEPENDENCIES}
COMMENT "Resetting code coverage counters to zero.\nProcessing code coverage counters and generating report."
)
# Show where to find the lcov info report
add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
COMMAND ;
COMMENT "Lcov code coverage info report saved in ${Coverage_NAME}.info."
)
# Show info where to find the report
add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
COMMAND ;
COMMENT "Open ./${Coverage_NAME}/index.html in your browser to view the coverage report."
)
endfunction() # SETUP_TARGET_FOR_COVERAGE_LCOV
# Defines a target for running and collection code coverage information
# Builds dependencies, runs the given executable and outputs reports.
# NOTE! The executable should always have a ZERO as exit code otherwise
# the coverage generation will not complete.
#
# SETUP_TARGET_FOR_COVERAGE_GCOVR_XML(
# NAME ctest_coverage # New target name
# EXECUTABLE ctest -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR
# DEPENDENCIES executable_target # Dependencies to build first
# )
function(SETUP_TARGET_FOR_COVERAGE_GCOVR_XML)
set(options NONE)
set(oneValueArgs NAME)
set(multiValueArgs EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES)
cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
if(NOT SIMPLE_PYTHON_EXECUTABLE)
message(FATAL_ERROR "python not found! Aborting...")
endif() # NOT SIMPLE_PYTHON_EXECUTABLE
if(NOT GCOVR_PATH)
message(FATAL_ERROR "gcovr not found! Aborting...")
endif() # NOT GCOVR_PATH
# Combine excludes to several -e arguments
set(GCOVR_EXCLUDES "")
foreach(EXCLUDE ${COVERAGE_GCOVR_EXCLUDES})
list(APPEND GCOVR_EXCLUDES "-e")
list(APPEND GCOVR_EXCLUDES "${EXCLUDE}")
endforeach()
add_custom_target(${Coverage_NAME}
# Clean old coverage data
COMMAND find ${PROJECT_BINARY_DIR} -type f -iname '*.gcno' -delete
# Run tests
COMMAND ${Coverage_EXECUTABLE} ${Coverage_EXECUTABLE_ARGS}
# Running gcovr
COMMAND ${GCOVR_PATH} --xml
-r ${PROJECT_SOURCE_DIR} ${GCOVR_EXCLUDES}
--object-directory=${PROJECT_BINARY_DIR}
-o ${Coverage_NAME}.xml
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
DEPENDS ${Coverage_DEPENDENCIES}
COMMENT "Running gcovr to produce Cobertura code coverage report."
)
# Show info where to find the report
add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
COMMAND ;
COMMENT "Cobertura code coverage report saved in ${Coverage_NAME}.xml."
)
endfunction() # SETUP_TARGET_FOR_COVERAGE_GCOVR_XML
# Defines a target for running and collection code coverage information
# Builds dependencies, runs the given executable and outputs reports.
# NOTE! The executable should always have a ZERO as exit code otherwise
# the coverage generation will not complete.
#
# SETUP_TARGET_FOR_COVERAGE_GCOVR_HTML(
# NAME ctest_coverage # New target name
# EXECUTABLE ctest -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR
# DEPENDENCIES executable_target # Dependencies to build first
# )
function(SETUP_TARGET_FOR_COVERAGE_GCOVR_HTML)
set(options NONE)
set(oneValueArgs NAME)
set(multiValueArgs EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES)
cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
if(NOT SIMPLE_PYTHON_EXECUTABLE)
message(FATAL_ERROR "python not found! Aborting...")
endif() # NOT SIMPLE_PYTHON_EXECUTABLE
if(NOT GCOVR_PATH)
message(FATAL_ERROR "gcovr not found! Aborting...")
endif() # NOT GCOVR_PATH
# Combine excludes to several -e arguments
set(GCOVR_EXCLUDES "")
foreach(EXCLUDE ${COVERAGE_GCOVR_EXCLUDES})
list(APPEND GCOVR_EXCLUDES "-e")
list(APPEND GCOVR_EXCLUDES "${EXCLUDE}")
endforeach()
add_custom_target(${Coverage_NAME}
# Clean old coverage data
COMMAND find ${PROJECT_BINARY_DIR} -type f -iname '*.gcno' -delete
# Run tests
COMMAND ${Coverage_EXECUTABLE} ${Coverage_EXECUTABLE_ARGS}
# Create folder
COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/${Coverage_NAME}
# Running gcovr
COMMAND ${GCOVR_PATH} --html --html-details
-r ${PROJECT_SOURCE_DIR} ${GCOVR_EXCLUDES}
--object-directory=${PROJECT_BINARY_DIR}
-o ${Coverage_NAME}/index.html
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
DEPENDS ${Coverage_DEPENDENCIES}
COMMENT "Running gcovr to produce HTML code coverage report."
)
# Show info where to find the report
add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
COMMAND ;
COMMENT "Open ./${Coverage_NAME}/index.html in your browser to view the coverage report."
)
endfunction() # SETUP_TARGET_FOR_COVERAGE_GCOVR_HTML
# Defines a target for running and collection code coverage information
# Builds dependencies, runs the given executable and outputs reports.
# NOTE! The executable should always have a ZERO as exit code otherwise
# the coverage generation will not complete.
#
# SETUP_TARGET_FOR_COVERAGE_GCOVR_TEXT(
# NAME ctest_coverage # New target name
# EXECUTABLE ctest -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR
# DEPENDENCIES executable_target # Dependencies to build first
# )
function(SETUP_TARGET_FOR_COVERAGE_GCOVR_TEXT)
set(options NONE)
set(oneValueArgs NAME)
set(multiValueArgs EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES)
cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
if(NOT SIMPLE_PYTHON_EXECUTABLE)
message(FATAL_ERROR "python not found! Aborting...")
endif() # NOT SIMPLE_PYTHON_EXECUTABLE
if(NOT GCOVR_PATH)
message(FATAL_ERROR "gcovr not found! Aborting...")
endif() # NOT GCOVR_PATH
# Combine excludes to several -e arguments
set(GCOVR_EXCLUDES "")
foreach(EXCLUDE ${COVERAGE_GCOVR_EXCLUDES})
list(APPEND GCOVR_EXCLUDES "-e")
list(APPEND GCOVR_EXCLUDES "${EXCLUDE}")
endforeach()
add_custom_target(${Coverage_NAME}
# Clean old coverage data
COMMAND find ${PROJECT_BINARY_DIR} -type f -iname '*.gcno' -delete
# Run tests
COMMAND ${Coverage_EXECUTABLE} ${Coverage_EXECUTABLE_ARGS}
# Create folder
COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/${Coverage_NAME}
# Running gcovr
COMMAND ${GCOVR_PATH}
-r ${PROJECT_SOURCE_DIR} ${GCOVR_EXCLUDES}
--object-directory=${PROJECT_BINARY_DIR}
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
DEPENDS ${Coverage_DEPENDENCIES}
COMMENT "Running gcovr to produce HTML code coverage report."
)
endfunction() # SETUP_TARGET_FOR_COVERAGE_GCOVR_TEXT
function(APPEND_COVERAGE_COMPILER_FLAGS)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE)
message(STATUS "Appending code coverage compiler flags: ${COVERAGE_COMPILER_FLAGS}")
endfunction() # APPEND_COVERAGE_COMPILER_FLAGS
+41 -5
View File
@@ -1,8 +1,35 @@
# required for PNG imported target
cmake_minimum_required(VERSION 3.5)
cmake_minimum_required(VERSION 3.6)
find_package(PNG REQUIRED)
find_package(JPEG REQUIRED)
find_package(PkgConfig)
pkg_check_modules(libpng REQUIRED IMPORTED_TARGET libpng)
# build custom static version of libjpeg for static builds
if(STATIC_BUILD)
include(ExternalProject)
if($ENV{ARCH} MATCHES "i[356]86")
set(configure_command_prefix env CFLAGS=-m32 CXXFLAGS=-m32)
endif()
ExternalProject_Add(libjpeg_static_extproj
URL https://www.ijg.org/files/jpegsrc.v9d.tar.gz
URL_HASH SHA256=99cb50e48a4556bc571dadd27931955ff458aae32f68c4d9c39d624693f69c32
BUILD_IN_SOURCE ON
EXCLUDE_FROM_ALL ON
CONFIGURE_COMMAND ${configure_command_prefix} ./configure --prefix=/usr
INSTALL_COMMAND ""
)
ExternalProject_Get_property(libjpeg_static_extproj SOURCE_DIR)
add_library(libjpeg_static INTERFACE IMPORTED)
set_property(TARGET libjpeg_static PROPERTY INTERFACE_LINK_LIBRARIES ${SOURCE_DIR}/.libs/libjpeg.a)
add_dependencies(libjpeg_static libjpeg_static_extproj)
set(JPEG_LIBRARIES libjpeg_static)
else()
find_package(JPEG REQUIRED)
endif()
if(NOT USE_SYSTEM_CIMG)
message(STATUS "Using bundled CImg library")
@@ -22,7 +49,16 @@ else()
endif()
endif()
set(PNG_INCLUDE_DIR ${libpng_INCLUDE_DIRS})
if(NOT STATIC_BUILD)
set(PNG_LIBRARY ${libpng_LIBRARIES})
else()
set(PNG_LIBRARY ${libpng_STATIC_LIBRARIES})
endif()
#message(FATAL_ERROR "${PNG_LIBRARY}")
add_library(CImg INTERFACE)
set_property(TARGET CImg PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${CIMG_H_DIR};${JPEG_INCLUDE_DIR}")
set_property(TARGET CImg PROPERTY INTERFACE_LINK_LIBRARIES "PNG::PNG;${JPEG_LIBRARIES}")
set_property(TARGET CImg PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${CIMG_H_DIR};${PNG_INCLUDE_DIR};${JPEG_INCLUDE_DIR}")
set_property(TARGET CImg PROPERTY INTERFACE_LINK_LIBRARIES "${PNG_LIBRARY};${JPEG_LIBRARIES}")
set_property(TARGET CImg PROPERTY INTERFACE_COMPILE_DEFINITIONS "cimg_display=0;cimg_use_png=1;cimg_use_jpeg=1")
+3
View File
@@ -3,3 +3,6 @@ set(CMAKE_SYSTEM_PROCESSOR i386 CACHE STRING "" FORCE)
set(CMAKE_C_FLAGS "-m32" CACHE STRING "" FORCE)
set(CMAKE_CXX_FLAGS "-m32" CACHE STRING "" FORCE)
# https://gitlab.kitware.com/cmake/cmake/issues/16920#note_299077
set(THREADS_PTHREAD_ARG "2" CACHE STRING "Forcibly set by CMakeLists.txt" FORCE)
+35 -13
View File
@@ -1,11 +1,12 @@
// system includes
#include <memory>
#include <string>
// library includes
#include <boost/filesystem.hpp>
// local includes
#include "linuxdeploy/core/desktopfile.h"
#include "linuxdeploy/desktopfile/desktopfile.h"
#pragma once
@@ -19,7 +20,7 @@ namespace linuxdeploy {
private:
// private data class pattern
class PrivateData;
PrivateData* d;
std::shared_ptr<PrivateData> d;
public:
// default constructor
@@ -27,14 +28,18 @@ namespace linuxdeploy {
// the directory will be created if it doesn't exist
explicit AppDir(const boost::filesystem::path& path);
~AppDir();
// we don't want any copy/move(-assignment) behavior, therefore we delete those operators/constructors
AppDir(const AppDir&) = delete;
AppDir(AppDir&&) = delete;
void operator=(const AppDir&) = delete;
void operator=(AppDir&&) = delete;
// alternative constructor
// shortcut for using a normal string instead of a path
explicit AppDir(const std::string& path);
// creates basic directory structure of an AppDir in "FHS" mode
bool createBasicStructure();
bool createBasicStructure() const;
// deploy shared library
//
@@ -52,45 +57,62 @@ namespace linuxdeploy {
// deploy executable
bool deployExecutable(const boost::filesystem::path& path, const boost::filesystem::path& destination = "");
// deploy dependencies for ELF file in AppDir, without copying it into the library dir
//
// the dependencies end up in the regular location
bool deployDependenciesOnlyForElfFile(const boost::filesystem::path& elfFilePath, bool failSilentForNonElfFile = false);
// deploy desktop file
bool deployDesktopFile(const desktopfile::DesktopFile& desktopFile);
// deploy icon
bool deployIcon(const boost::filesystem::path& path);
// deploy icon, changing its name to <target filename>.<ext>
bool deployIcon(const boost::filesystem::path& path, const std::string& targetFilename);
// deploy arbitrary file
void deployFile(const boost::filesystem::path& from, const boost::filesystem::path& to);
boost::filesystem::path deployFile(const boost::filesystem::path& from, const boost::filesystem::path& to);
// copy arbitrary file (immediately)
bool copyFile(const boost::filesystem::path& from, const boost::filesystem::path& to, bool overwrite = false) const;
// create an <AppDir> relative symlink to <target> at <symlink>.
bool createRelativeSymlink(const boost::filesystem::path& target, const boost::filesystem::path& symlink) const;
// execute deferred copy operations
bool executeDeferredOperations();
// return path to AppDir
boost::filesystem::path path();
boost::filesystem::path path() const;
// create a list of all icon paths in the AppDir
std::vector<boost::filesystem::path> deployedIconPaths();
std::vector<boost::filesystem::path> deployedIconPaths() const;
// create a list of all executable paths in the AppDir
std::vector<boost::filesystem::path> deployedExecutablePaths();
std::vector<boost::filesystem::path> deployedExecutablePaths() const;
// create a list of all desktop file paths in the AppDir
std::vector<desktopfile::DesktopFile> deployedDesktopFiles();
std::vector<desktopfile::DesktopFile> deployedDesktopFiles() const;
// create symlinks for AppRun, desktop file and icon in the AppDir root directory
bool createLinksInAppDirRoot(const desktopfile::DesktopFile& desktopFile, boost::filesystem::path customAppRunPath = "");
bool setUpAppDirRoot(const desktopfile::DesktopFile& desktopFile, boost::filesystem::path customAppRunPath = "");
// list all executables in <AppDir>/usr/bin
// this function does not perform a recursive search, but only searches the bin directory
std::vector<boost::filesystem::path> listExecutables();
std::vector<boost::filesystem::path> listExecutables() const;
// list all shared libraries in <AppDir>/usr/lib
// this function recursively searches the entire lib directory for shared libraries
std::vector<boost::filesystem::path> listSharedLibraries();
std::vector<boost::filesystem::path> listSharedLibraries() const;
// search for executables and libraries and deploy their dependencies
// calling this function can turn sure file trees created by make install commands into working
// AppDirs
bool deployDependenciesForExistingFiles();
bool deployDependenciesForExistingFiles() const;
// disable deployment of copyright files for this instance
void setDisableCopyrightFilesDeployment(bool disable);
};
}
}
-71
View File
@@ -1,71 +0,0 @@
// system includes
// library includes
#include <boost/filesystem.hpp>
#pragma once
namespace linuxdeploy {
namespace core {
namespace desktopfile {
/*
* Parse and read desktop files.
*/
class DesktopFile {
private:
// private data class pattern
class PrivateData;
PrivateData* d;
public:
// default constructor
DesktopFile();
// construct from existing desktop file
// file must exist
explicit DesktopFile(const boost::filesystem::path& path);
// read desktop file
// sets path associated with this file
bool read(const boost::filesystem::path& path);
// get path associated with this file
boost::filesystem::path path() const;
// sets the path associated with this desktop file
// used to e.g., save the desktop file
void setPath(const boost::filesystem::path& path);
// clear contents of desktop file
void clear();
// save desktop file
bool save() const;
// save desktop file to path
// does not change path associated with desktop file
bool save(const boost::filesystem::path& path) const;
// check if entry exists in given section and key
bool entryExists(const std::string& section, const std::string& key) const;
// get key from desktop file
// an std::string passed as value parameter will be populated with the contents
// returns true (and populates value) if the key exists, false otherwise
bool getEntry(const std::string& section, const std::string& key, std::string& value) const;
// add key to section in desktop file
// the section will be created if it doesn't exist already
// returns true if an existing key was overwritten, false otherwise
bool setEntry(const std::string& section, const std::string& key, const std::string& value);
// create common application entries in desktop file
// returns false if one of the keys exists and was left unmodified
bool addDefaultKeys(const std::string& executableFileName);
// validate desktop file
bool validate() const;
};
}
}
}
+2
View File
@@ -65,6 +65,8 @@ namespace linuxdeploy {
ldLog operator<<(stdEndlType strm);
ldLog operator<<(const LD_LOGLEVEL logLevel);
ldLog operator<<(const LD_STREAM_CONTROL streamControl);
void write(const char* s, const size_t n);
};
}
}
+20 -92
View File
@@ -2,15 +2,19 @@
#include <set>
#include <string>
#include <vector>
#include <fcntl.h>
#include <poll.h>
// library headers
#include <boost/filesystem.hpp>
#include <fnmatch.h>
#include <subprocess.hpp>
#include <thread>
// local headers
#include "linuxdeploy/core/log.h"
#include "linuxdeploy/util/util.h"
#include "linuxdeploy/subprocess/process.h"
#include "linuxdeploy/plugin/plugin_process_handler.h"
#pragma once
@@ -45,13 +49,20 @@ namespace linuxdeploy {
private:
int getApiLevelFromExecutable() {
auto output = subprocess::check_output({pluginPath.c_str(), "--plugin-api-version"});
std::string stdoutOutput = output.buf.data();
const auto arg = "--plugin-api-version";
const subprocess::subprocess proc({pluginPath.string(), arg});
const auto stdoutOutput = proc.check_output();
if (stdoutOutput.empty()) {
ldLog() << LD_WARNING << "received empty response from plugin" << pluginPath << "while trying to fetch data for" << "--plugin-api-version" << std::endl;
return -1;
}
try {
auto apiLevel = std::stoi(stdoutOutput);
return apiLevel;
} catch (const std::invalid_argument&) {
} catch (const std::exception&) {
return -1;
}
}
@@ -62,9 +73,8 @@ namespace linuxdeploy {
// check whether plugin implements --plugin-type
try {
auto output = subprocess::check_output({pluginPath.c_str(), "--plugin-type"});
std::string stdoutOutput = output.buf.data();
const subprocess::subprocess proc({pluginPath.c_str(), "--plugin-type"});
const auto stdoutOutput = proc.check_output();
// the specification requires a single line, but we'll silently accept more than that, too
if (std::count(stdoutOutput.begin(), stdoutOutput.end(), '\n') >= 1) {
@@ -75,7 +85,7 @@ namespace linuxdeploy {
else if (firstLine == "output")
type = OUTPUT_TYPE;
}
} catch (const subprocess::CalledProcessError&) {}
} catch (const std::logic_error&) {}
return type;
}
@@ -126,90 +136,8 @@ namespace linuxdeploy {
template<int API_LEVEL>
int PluginBase<API_LEVEL>::run(const boost::filesystem::path& appDirPath) {
auto pluginPath = path();
auto args = {pluginPath.c_str(), "--appdir", appDirPath.string().c_str()};
auto log = ldLog();
log << "Running process:";
for (const auto& arg : args) {
log << "" << arg;
}
log << std::endl;
auto process = subprocess::Popen(args, subprocess::output{subprocess::PIPE}, subprocess::error{subprocess::PIPE});
std::vector<pollfd> pfds(2);
auto* opfd = &pfds[0];
auto* epfd = &pfds[1];
opfd->fd = fileno(process.output());
opfd->events = POLLIN;
epfd->fd = fileno(process.error());
epfd->events = POLLIN;
for (const auto& fd : {process.output(), process.error()}) {
auto flags = fcntl(fileno(fd), F_GETFL, 0);
flags |= O_NONBLOCK;
fcntl(fileno(fd), F_SETFL, flags);
}
auto printOutput = [&pfds, opfd, epfd, this, &process]() {
poll(pfds.data(), pfds.size(), -1);
if (opfd->revents & POLLIN) {
std::vector<char> lineBuf(16384);
fgets(lineBuf.data(), static_cast<int>(lineBuf.size()), process.output());
std::stringstream ss;
ss << lineBuf.data();
lineBuf.clear();
std::string currentLine;
std::ostringstream oss;
while (std::getline(ss, currentLine)) {
oss << "[" << d->name << "/stdout] " << currentLine << std::endl;
}
linuxdeploy::core::log::ldLog() << oss.str();
}
if (epfd->revents & POLLIN) {
std::vector<char> lineBuf(16384);
fgets(lineBuf.data(), static_cast<int>(lineBuf.size()), process.error());
std::stringstream ss;
ss << lineBuf.data();
lineBuf.clear();
std::string currentLine;
std::ostringstream oss;
while (std::getline(ss, currentLine)) {
oss << "[" << d->name << "/stderr] " << currentLine << std::endl;
}
linuxdeploy::core::log::ldLog() << oss.str();
}
return true;
};
do {
if (!printOutput()) {
ldLog() << LD_ERROR << "Failed to communicate with process" << std::endl;
process.kill();
return -1;
}
} while (process.poll() < 0);
if (!printOutput()) {
ldLog() << LD_ERROR << "Failed to communicate with process" << std::endl;
process.kill();
return -1;
}
return process.retcode();
plugin_process_handler handler(d->name, path());
return handler.run(appDirPath);
}
}
}
@@ -0,0 +1,19 @@
#pragma once
// library headers
#include <boost/filesystem/path.hpp>
namespace linuxdeploy {
namespace plugin {
class plugin_process_handler {
private:
std::string name_;
boost::filesystem::path path_;
public:
plugin_process_handler(std::string name, boost::filesystem::path path);
int run(const boost::filesystem::path& appDir) const;
};
}
}
@@ -0,0 +1,36 @@
#pragma once
#include <string>
#include <set>
#include <vector>
#include <poll.h>
/**
* Reads from a pipe when data is available, and hands data to registered callbacks.
*/
class pipe_reader {
private:
const int pipe_fd_;
public:
/**
* Construct new instance from pipe file descriptor.
* @param pipe_fd file descriptor for pipe we will read from (e.g., a subprocess's stdout, stderr pipes)
*/
explicit pipe_reader(int pipe_fd);
/**
* Read from pipe file descriptor and store data in buffer.
* This method is non-blocking, i.e., if there is no data to read, it returns immediately.
* Otherwise, it will read until either of the following conditions is met:
*
* - no more data left in the pipe to be read
* - buffer is completely filled
*
* On errors, a subprocess_error is thrown.
*
* @param buffer buffer to store read data into
* @returns amount of characters read from the pipe
*/
size_t read(std::vector<std::string::value_type>& buffer) const;
};
+86
View File
@@ -0,0 +1,86 @@
// system headers
#include <unordered_map>
#include <vector>
#include <signal.h>
// local headers
#include "linuxdeploy/subprocess/subprocess.h"
namespace linuxdeploy {
namespace subprocess {
class process {
private:
// child process ID
int child_pid_ = -1;
// pipes to child process's stdout/stderr
int stdout_fd_ = -1;
int stderr_fd_ = -1;
// process exited
bool exited_ = false;
// exit code -- will be initialized by close()
int exit_code_ = -1;
// these constants help make the pipe code more readable
static constexpr int READ_END_ = 0, WRITE_END_ = 1;
static std::vector<char*> make_args_vector_(const std::vector<std::string>& args);
static std::vector<char*> make_env_vector_(const subprocess_env_map_t& env);
static int check_waitpid_status_(int status);
public:
/**
* Create a child process.
* @param args parameters for process
* @param env additional environment variables (current environment will be copied)
*/
process(std::initializer_list<std::string> args, const subprocess_env_map_t& env);
/**
* Create a child process.
* @param args parameters for process
* @param env additional environment variables (current environment will be copied)
*/
process(const std::vector<std::string>& args, const subprocess_env_map_t& env);
~process();
/**
* @return child process's ID
*/
int pid() const;
/**
* @return child process's stdout file descriptor ID
*/
int stdout_fd() const;
/**
* @return child process's stderr file descriptor ID
*/
int stderr_fd() const;
/**
* Close all pipes and wait for process to exit.
* If process is not running any more, just returns exit code.
* @return child process's exit code
*/
int close();
/**
* Kill underlying process with given signal. By default, SIGTERM is used to end the process.
*/
void kill(int signal = SIGTERM) const;
/**
* Check whether process is still alive. Use close() to fetch exit code.
* @return true while process is alive, false otherwise
*/
bool is_running();
};
}
}
@@ -0,0 +1,32 @@
#pragma once
// system headers
#include <cstdio>
#include <unordered_map>
#include <string>
#include <utility>
#include <vector>
// local headers
#include "subprocess_result.h"
namespace linuxdeploy {
namespace subprocess {
typedef std::unordered_map<std::string, std::string> subprocess_env_map_t;
class subprocess {
private:
std::vector<std::string> args_{};
std::unordered_map<std::string, std::string> env_{};
public:
subprocess(std::initializer_list<std::string> args, subprocess_env_map_t env = {});
explicit subprocess(std::vector<std::string> args, subprocess_env_map_t env = {});
subprocess_result run() const;
std::string check_output() const;
};
}
}
@@ -0,0 +1,37 @@
#pragma once
// system headers
#include <cstdlib>
#include <string>
#include <utility>
#include <vector>
namespace linuxdeploy {
namespace subprocess {
typedef std::vector<std::string::value_type> subprocess_result_buffer_t;
/**
* Result of subprocess execution. Follows Value Object design pattern.
*/
class subprocess_result {
private:
int exit_code_;
subprocess_result_buffer_t stdout_contents_;
subprocess_result_buffer_t stderr_contents_;
public:
subprocess_result(int exit_code, subprocess_result_buffer_t stdout_contents,
subprocess_result_buffer_t stderr_contents);
int exit_code() const;
const subprocess_result_buffer_t& stdout_contents() const;
std::string stdout_string() const;
const subprocess_result_buffer_t& stderr_contents() const;
std::string stderr_string() const;
};
}
}
+17
View File
@@ -0,0 +1,17 @@
#pragma once
// system headers
#include <stdexcept>
namespace linuxdeploy {
namespace util {
namespace assert {
template<typename T>
void assert_not_empty(T container) {
if (container.empty()) {
throw std::invalid_argument{"container must not be empty"};
}
}
}
}
}
+31 -22
View File
@@ -1,38 +1,20 @@
#pragma once
// system headers
#include <algorithm>
#include <climits>
#include <cstring>
#include <sstream>
#include <string>
#include <unistd.h>
#include <vector>
// libraries
#include <boost/filesystem.hpp>
namespace linuxdeploy {
namespace util {
namespace misc {
static bool path_contains_file(boost::filesystem::path dir, boost::filesystem::path file) {
// If dir ends with "/" and isn't the root directory, then the final
// component returned by iterators will include "." and will interfere
// with the std::equal check below, so we strip it before proceeding.
if (dir.filename() == ".")
dir.remove_filename();
// We're also not interested in the file's name.
assert(file.has_filename());
file.remove_filename();
// If dir has more components than file, then file can't possibly
// reside in dir.
auto dir_len = std::distance(dir.begin(), dir.end());
auto file_len = std::distance(file.begin(), file.end());
if (dir_len > file_len)
return false;
// This stops checking when it reaches dir.end(), so it's OK if file
// has more directory components afterward. They won't be checked.
return std::equal(dir.begin(), dir.end(), file.begin());
};
static inline bool ltrim(std::string& s, char to_trim = ' ') {
// TODO: find more efficient way to check whether elements have been removed
size_t initialLength = s.length();
@@ -109,6 +91,33 @@ namespace linuxdeploy {
return buf.data();
}
// very simple but for our purposes good enough which like algorithm to find binaries in $PATH
static boost::filesystem::path which(const std::string& name) {
const auto* path = getenv("PATH");
namespace bf = boost::filesystem;
if (path == nullptr)
return "";
for (const auto& binDir : split(path, ':')) {
if (!bf::is_directory(binDir)) {
continue;
}
for (bf::directory_iterator it(binDir); it != bf::directory_iterator{}; ++it) {
const auto binary = it->path();
if (binary.filename() == name) {
// TODO: check if file is executable (skip otherwise)
return binary;
}
}
}
return {};
};
}
}
}
+3 -1
View File
@@ -1,9 +1,11 @@
// local includes
#include "misc.h"
#include "linuxdeploy/util/assert.h"
#include "linuxdeploy/util/misc.h"
// import functions from misc module for convenience
namespace linuxdeploy {
namespace util {
using namespace misc;
using namespace assert;
}
}

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