create-vcpkg.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. #!/usr/bin/env python
  2. #
  3. # Copyright 2019-2019 by Martin Moene
  4. #
  5. # Distributed under the Boost Software License, Version 1.0.
  6. # (See accompanying file LICENSE.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  7. #
  8. # script/upload-conan.py, Python 3.4 and later
  9. #
  10. import argparse
  11. import os
  12. import re
  13. import sys
  14. import subprocess
  15. # Configuration:
  16. cfg_github_project = 'expected-lite'
  17. cfg_github_user = 'martinmoene'
  18. cfg_description = '(unused)'
  19. cfg_cmakelists = 'CMakeLists.txt'
  20. cfg_readme = 'Readme.md'
  21. cfg_license = 'LICENSE.txt'
  22. cfg_ref_prefix = 'v'
  23. cfg_sha512 = 'dadeda'
  24. cfg_vcpkg_description = '(no description found)'
  25. cfg_vcpkg_root = os.environ['VCPKG_ROOT']
  26. cfg_cmake_optpfx = "EXPECTED_LITE"
  27. # End configuration.
  28. # vcpkg control and port templates:
  29. tpl_path_vcpkg_control = '{vcpkg}/ports/{prj}/CONTROL'
  30. tpl_path_vcpkg_portfile = '{vcpkg}/ports/{prj}/portfile.cmake'
  31. tpl_vcpkg_control =\
  32. """Source: {prj}
  33. Version: {ver}
  34. Description: {desc}"""
  35. tpl_vcpkg_portfile =\
  36. """include(vcpkg_common_functions)
  37. vcpkg_from_github(
  38. OUT_SOURCE_PATH SOURCE_PATH
  39. REPO {usr}/{prj}
  40. REF {ref}
  41. SHA512 {sha}
  42. )
  43. vcpkg_configure_cmake(
  44. SOURCE_PATH ${{SOURCE_PATH}}
  45. PREFER_NINJA
  46. OPTIONS
  47. -D{optpfx}_OPT_BUILD_TESTS=OFF
  48. -D{optpfx}_OPT_BUILD_EXAMPLES=OFF
  49. )
  50. vcpkg_install_cmake()
  51. vcpkg_fixup_cmake_targets(
  52. CONFIG_PATH lib/cmake/${{PORT}}
  53. )
  54. file(REMOVE_RECURSE
  55. ${{CURRENT_PACKAGES_DIR}}/debug
  56. ${{CURRENT_PACKAGES_DIR}}/lib
  57. )
  58. file(INSTALL
  59. ${{SOURCE_PATH}}/{lic} DESTINATION ${{CURRENT_PACKAGES_DIR}}/share/${{PORT}} RENAME copyright
  60. )"""
  61. tpl_vcpkg_note_sha =\
  62. """
  63. Next actions:
  64. - Obtain package SHA: 'vcpkg install {prj}', copy SHA mentioned in 'Actual hash: [...]'
  65. - Add SHA to package: 'script\create-vcpkg --sha={sha}'
  66. - Install package : 'vcpkg install {prj}'"""
  67. tpl_vcpkg_note_install =\
  68. """
  69. Next actions:
  70. - Install package: 'vcpkg install {prj}'"""
  71. # End of vcpkg templates
  72. def versionFrom( filename ):
  73. """Obtain version from CMakeLists.txt"""
  74. with open( filename, 'r' ) as f:
  75. content = f.read()
  76. version = re.search(r'VERSION\s(\d+\.\d+\.\d+)', content).group(1)
  77. return version
  78. def descriptionFrom( filename ):
  79. """Obtain description from CMakeLists.txt"""
  80. with open( filename, 'r' ) as f:
  81. content = f.read()
  82. description = re.search(r'DESCRIPTION\s"(.*)"', content).group(1)
  83. return description if description else cfg_vcpkg_description
  84. def vcpkgRootFrom( path ):
  85. return path if path else './vcpkg'
  86. def to_ref( version ):
  87. """Add prefix to version/tag, like v1.2.3"""
  88. return cfg_ref_prefix + version
  89. def control_path( args ):
  90. """Create path like vcpks/ports/_project_/CONTROL"""
  91. return tpl_path_vcpkg_control.format( vcpkg=args.vcpkg_root, prj=args.project )
  92. def portfile_path( args ):
  93. """Create path like vcpks/ports/_project_/portfile.cmake"""
  94. return tpl_path_vcpkg_portfile.format( vcpkg=args.vcpkg_root, prj=args.project )
  95. def createControl( args ):
  96. """Create vcpkg CONTROL file"""
  97. output = tpl_vcpkg_control.format(
  98. prj=args.project, ver=args.version, desc=args.description )
  99. if args.verbose:
  100. print( "Creating control file '{f}':".format( f=control_path( args ) ) )
  101. if args.verbose > 1:
  102. print( output )
  103. os.makedirs( os.path.dirname( control_path( args ) ), exist_ok=True )
  104. with open( control_path( args ), 'w') as f:
  105. print( output, file=f )
  106. def createPortfile( args ):
  107. """Create vcpkg portfile"""
  108. output = tpl_vcpkg_portfile.format(
  109. optpfx=cfg_cmake_optpfx, usr=args.user, prj=args.project, ref=to_ref(args.version), sha=args.sha, lic=cfg_license )
  110. if args.verbose:
  111. print( "Creating portfile '{f}':".format( f=portfile_path( args ) ) )
  112. if args.verbose > 1:
  113. print( output )
  114. os.makedirs( os.path.dirname( portfile_path( args ) ), exist_ok=True )
  115. with open( portfile_path( args ), 'w') as f:
  116. print( output, file=f )
  117. def printNotes( args ):
  118. if args.sha == cfg_sha512:
  119. print( tpl_vcpkg_note_sha.
  120. format( prj=args.project, sha='...' ) )
  121. else:
  122. print( tpl_vcpkg_note_install.
  123. format( prj=args.project ) )
  124. def createVcpkg( args ):
  125. print( "Creating vcpkg for '{usr}/{prj}', version '{ver}' in folder '{vcpkg}':".
  126. format( usr=args.user, prj=args.project, ver=args.version, vcpkg=args.vcpkg_root, ) )
  127. createControl( args )
  128. createPortfile( args )
  129. printNotes( args )
  130. def createVcpkgFromCommandLine():
  131. """Collect arguments from the commandline and create vcpkg."""
  132. parser = argparse.ArgumentParser(
  133. description='Create microsoft vcpkg.',
  134. epilog="""""",
  135. formatter_class=argparse.ArgumentDefaultsHelpFormatter)
  136. parser.add_argument(
  137. '-v', '--verbose',
  138. action='count',
  139. default=0,
  140. help='level of progress reporting')
  141. parser.add_argument(
  142. '--user',
  143. metavar='u',
  144. type=str,
  145. default=cfg_github_user,
  146. help='github user name')
  147. parser.add_argument(
  148. '--project',
  149. metavar='p',
  150. type=str,
  151. default=cfg_github_project,
  152. help='github project name')
  153. parser.add_argument(
  154. '--description',
  155. metavar='d',
  156. type=str,
  157. # default=cfg_description,
  158. default=descriptionFrom( cfg_cmakelists ),
  159. help='vcpkg description [from ' + cfg_cmakelists + ']')
  160. parser.add_argument(
  161. '--version',
  162. metavar='v',
  163. type=str,
  164. default=versionFrom( cfg_cmakelists ),
  165. help='version number [from ' + cfg_cmakelists + ']')
  166. parser.add_argument(
  167. '--sha',
  168. metavar='s',
  169. type=str,
  170. default=cfg_sha512,
  171. help='sha of package')
  172. parser.add_argument(
  173. '--vcpkg-root',
  174. metavar='r',
  175. type=str,
  176. default=vcpkgRootFrom( cfg_vcpkg_root ),
  177. help='parent folder containing ports to write files to')
  178. createVcpkg( parser.parse_args() )
  179. if __name__ == '__main__':
  180. createVcpkgFromCommandLine()
  181. # end of file