summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris+github@qwirx.com>2017-07-03 08:33:36 +0100
committerChris Wilson <chris+github@qwirx.com>2017-09-16 20:50:50 +0100
commitc0ff77b8a73e0b7804a9eac26b59603e06d1cbc0 (patch)
tree772203122b2676212fcfeeb0fecefc2ef725c874
parentb1f564266c64b48b99cce410e33d8287bf444d2a (diff)
Build Win32/64 binary packages automatically
Every AppVeyor build on the specified branches that passes will be packaged into a ZIP file and installer using CPack and uploaded to GitHub Releases. Generate version number entirely in AppVeyor config, and build it into the binary, and use it in the names of the created binary packages, and compile it into the binaries. (cherry picked from commit c5d8173bf03ab9fa93d3b3ffd871b378b0819567)
-rw-r--r--appveyor.yml59
-rw-r--r--infrastructure/cmake/CMakeLists.txt67
-rwxr-xr-xinfrastructure/cmake/getversion.pl2
3 files changed, 100 insertions, 28 deletions
diff --git a/appveyor.yml b/appveyor.yml
index a0ccf95c..0ca5d8ee 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -1,4 +1,4 @@
-version: 1.0.{build}-{branch}
+version: 0.12.{branch}.appveyor_{build}
clone_depth: 1
@@ -8,25 +8,34 @@ skip_tags: true
os: Windows Server 2012
platform:
-# - x86
-# - x64
- - Win32
+ - Win32 # CMake sucks
+ - x64
configuration:
- Debug
- Release
environment:
- VisualStudioVersion: 10.0
- Generator: Visual Studio 10
+ VisualStudioVersion: 11.0
+ Generator_Base: Visual Studio 11 2012
OPENSSL_VERSION: 1.0.2f
PCRE_VERSION: 8.38
CMAKE_UNIBUILD_DIR: '%APPVEYOR_BUILD_FOLDER%\..\cmake'
+ BOXBACKUP_VERSION_BASE: 0.12
init:
# Uncomment the following two lines to enable RDP access to the virtual machine for debugging.
# - reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v UserAuthentication /t REG_DWORD /d 0 /f
# - ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
+ - ps: $env:date_string = Get-Date -Format "yyMMdd"
+ - ps: $env:sane_platform = $($env:PLATFORM.replace("Win32", "x86"))
+ # http://help.appveyor.com/discussions/problems/2874-how-can-i-add-commit-id-to-build-version
+ - ps: $env:boxbackup_version_full="$env:BOXBACKUP_VERSION_BASE.$env:APPVEYOR_REPO_BRANCH.$env:date_string.$($env:APPVEYOR_REPO_COMMIT.substring(0,7))"
+ - ps: Update-AppveyorBuild -Version "$env:boxbackup_version_full"
+ - ps: $env:compiled_version="$($env:boxbackup_version_full)_Win_$($env:sane_platform)_$($env:CONFIGURATION)"
+ # The only way to switch between 32-bit and 64-bit compilers appears to be to append " Win64"
+ # to the generator name if you want a 64-bit build (x64 platform):
+ - ps: $env:generator_name="$($env:Generator_Base)$(if ($env:PLATFORM.equals('x64')) {' Win64'})"
build:
parallel: true
@@ -35,15 +44,15 @@ build:
install:
# test_bbackupd needs 7zip (or cmake -E tar) to extract tar archives on Windows:
- - cinst -y --limit-output 7zip.commandline
- # Install cmake.portable instead of cmake, to get it on the path again:
- # http://disq.us/p/xdknrt
+ - cinst -y --limit-output 7zip.commandline nsis.portable
- dir "c:\Program Files"
- dir "c:\Program Files (x86)"
# We don't need strawberryperl on AppVeyor because there is already a Perl in c:\Perl.
# If you are doing this on a fresh box for development, you would probably want to
# install Chocolatey and then run:
- # cinst -y cmake strawberryperl git vim visualstudio2012wdx
+ # cinst -y cmake.portable strawberryperl git vim visualstudio2012wdx
+ # We install cmake.portable instead of cmake, to get it on the path again
+ # <http://disq.us/p/xdknrt>.
- '"C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd" /x86'
- if not exist %CMAKE_UNIBUILD_DIR% md %CMAKE_UNIBUILD_DIR%
@@ -51,7 +60,12 @@ install:
# We need to specify the generator here, in case the user has more than one installed.
# CMake always seems to default to the latest version of Visual Studio, not the one on
# the current PATH.
- - cmake -G "%Generator%" -A %PLATFORM% %APPVEYOR_BUILD_FOLDER%\infrastructure\cmake\windows
+ - echo cmake -G "%generator_name%" -DDEBUG=1
+ -DBOXBACKUP_VERSION=%compiled_version%
+ %APPVEYOR_BUILD_FOLDER%\infrastructure\cmake\windows
+ - cmake -G "%generator_name%" -DDEBUG=1
+ -DBOXBACKUP_VERSION=%compiled_version%
+ %APPVEYOR_BUILD_FOLDER%\infrastructure\cmake\windows
# Leave the current directory in the correct place to find the solution file using its relative path above.
@@ -63,3 +77,26 @@ test_script:
# - dir %PLATFORM%\%CONFIGURATION%
- ctest -C %CONFIGURATION% -V --interactive-debug-mode 0
+ # After running tests successfully, and before collecting artifacts, build them and copy them
+ # to the right place:
+ - cmake --build . --config %CONFIGURATION% --target package
+
+ # AppVeyor refuses to package files outside of the project directory, so we need to push them:
+ - dir
+ - appveyor PushArtifact -path BoxBackup-%compiled_version%.zip -DeploymentName BoxBackup-%compiled_version%
+ - appveyor PushArtifact -path BoxBackup-%compiled_version%.exe -DeploymentName BoxBackup-%compiled_version%
+
+deploy:
+ - provider: GitHub
+ release: BoxBackup-$(boxbackup_version_full)
+ artifact: BoxBackup-$(compiled_version)
+ description: "Windows client binaries auto-built by AppVeyor"
+ draft: false
+ prerelease: true
+ auth_token:
+ secure: WZi3MJGA5zIIAAij0if4auYeltJlyWUOePTYlCGvrNrgEVjYRkqILHzvVKDnLn43
+ on:
+ branch:
+ - master
+ - s3_support_merge
+
diff --git a/infrastructure/cmake/CMakeLists.txt b/infrastructure/cmake/CMakeLists.txt
index cba7c739..25015452 100644
--- a/infrastructure/cmake/CMakeLists.txt
+++ b/infrastructure/cmake/CMakeLists.txt
@@ -78,25 +78,38 @@ foreach(file_to_configure ${files_to_configure})
"${base_dir}/${file_to_configure}.out")
endforeach()
-# Work out the current Box version (requires Perl) and update lib/common/BoxVersion.h,
-# but only if it has changed, to avoid unnecessary complete rebuilds due to timestamps.
-execute_process(
- COMMAND ${PERL_EXECUTABLE} ${base_dir}/infrastructure/cmake/getversion.pl
- WORKING_DIRECTORY ${base_dir}/infrastructure
- RESULT_VARIABLE status
- OUTPUT_VARIABLE new_version_define
- ERROR_VARIABLE command_output)
-if(NOT status EQUAL 0)
- message(FATAL_ERROR "Failed to execute: "
- "${PERL_EXECUTABLE} ${base_dir}/infrastructure/cmake/getversion.pl: "
- "status ${status}: ${command_output}")
+# If BOXBACKUP_VERSION is defined when running CMake (as the AppVeyor config does), use it
+# as-is, since it contains the full version number, branch, and platform (Win32/Win64):
+if(BOXBACKUP_VERSION)
+ set(boxbackup_version ${BOXBACKUP_VERSION})
+ # Remove CPACK_SYSTEM_NAME from the default CPACK_PACKAGE_NAME, because it's already
+ # included in the CPACK_PACKAGE_VERSION:
+ set(CPACK_PACKAGE_FILE_NAME ${CMAKE_PROJECT_NAME}-${boxbackup_version})
+else()
+ # Work out the current Box version (requires Perl) and update lib/common/BoxVersion.h,
+ # but only if it has changed, to avoid unnecessary complete rebuilds due to timestamps.
+ execute_process(
+ COMMAND ${PERL_EXECUTABLE} ${base_dir}/infrastructure/cmake/getversion.pl
+ WORKING_DIRECTORY ${base_dir}/infrastructure
+ RESULT_VARIABLE status
+ OUTPUT_VARIABLE boxbackup_version
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ ERROR_VARIABLE command_output)
+ if(NOT status EQUAL 0)
+ message(FATAL_ERROR "Failed to execute: "
+ "${PERL_EXECUTABLE} ${base_dir}/infrastructure/cmake/getversion.pl: "
+ "status ${status}: ${command_output}")
+ endif()
endif()
-file(WRITE "${base_dir}/lib/common/BoxVersion.h.new" "${new_version_define}")
+
+file(WRITE "${base_dir}/lib/common/BoxVersion.h.new"
+ "#define BOX_VERSION \"${boxbackup_version}\"\n")
replace_file_if_different(
"${base_dir}/lib/common/BoxVersion.h"
"${base_dir}/lib/common/BoxVersion.h.new")
add_definitions(-DBOX_CMAKE -DNEED_BOX_VERSION_H)
+
if(WIN32)
add_definitions(-DWIN32)
endif()
@@ -331,6 +344,16 @@ foreach(module_dep ${module_deps})
endif()
endforeach()
+if(WIN32)
+ install(FILES ${base_dir}/bin/bbackupd/win32/NotifySysAdmin.vbs
+ DESTINATION "." COMPONENT Extras)
+ install(FILES ${base_dir}/bin/bbackupd/win32/bbackupd.conf
+ DESTINATION "." COMPONENT Extras)
+else()
+ install(FILES ${base_dir}/bin/bbackupd/bbackupd-config
+ DESTINATION "." COMPONENT Extras)
+endif()
+
# We can't do anything conditional on CMAKE_BUILD_TYPE because that's not valid for multi-configuration
# generators such as MSVC. We need to use a generator expression instead.
target_compile_definitions(lib_common PUBLIC $<$<CONFIG:Release>:BOX_RELEASE_BUILD>)
@@ -353,9 +376,6 @@ if(WIN32)
target_link_libraries(lib_common PUBLIC ws2_32 gdi32)
endif()
-# Link to ZLib
-# http://stackoverflow.com/a/6174604/648162
-include_directories(${base_dir}/../zlib-win32/include)
# On Windows we want to statically link zlib to make debugging and distribution easier,
# but FindZLIB.cmake doesn't offer that as an option, so we have to go through some
# contortions to "find" the correct library. ZLIB_ROOT is required in this case.
@@ -688,3 +708,18 @@ set_tests_properties(backupdiff PROPERTIES TIMEOUT 32)
set_tests_properties(bbackupd PROPERTIES TIMEOUT 1200)
set_tests_properties(s3store PROPERTIES TIMEOUT 20)
set_tests_properties(httpserver PROPERTIES TIMEOUT 40)
+
+set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Box Backup is an open source, completely automatic, on-line backup system")
+set(CPACK_PACKAGE_VENDOR "www.BoxBackup.org")
+set(CPACK_PACKAGE_DESCRIPTION_FILE "${base_dir}/README.md")
+set(CPACK_RESOURCE_FILE_LICENSE "${base_dir}/LICENSE.txt")
+set(CPACK_PACKAGE_VERSION ${boxbackup_version})
+set(CPACK_PACKAGE_INSTALL_DIRECTORY "Box Backup")
+set(CPACK_COMPONENTS_ALL Applications Extras)
+set(CPACK_GENERATOR "ZIP;NSIS")
+set(CPACK_NSIS_DISPLAY_NAME "Box Backup")
+set(CPACK_NSIS_HELP_LINK "http://www.boxbackup.org/")
+set(CPACK_NSIS_URL_INFO_ABOUT "http://www.boxbackup.org/")
+set(CPACK_NSIS_CONTACT "boxbackup@boxbackup.org")
+set(CPACK_NSIS_MODIFY_PATH ON)
+include(CPack)
diff --git a/infrastructure/cmake/getversion.pl b/infrastructure/cmake/getversion.pl
index 67e1f8a5..d7ca0333 100755
--- a/infrastructure/cmake/getversion.pl
+++ b/infrastructure/cmake/getversion.pl
@@ -8,6 +8,6 @@ chdir $basedir or die "Failed to change to base directory: $basedir: $!";
require "$basedir/infrastructure/BoxPlatform.pm.in";
-print "#define BOX_VERSION \"$BoxPlatform::product_version\"\n";
+print "$BoxPlatform::product_version\n";
exit 0;