GDAL的编译脚本呈现出不同平台不同解决方案的百花齐放现状。我是从windows平台开始编译GDAL的,用的自然是nmake。那就是一种每个目录下都需要写makefile文件的构建方法,写的人麻烦,我因为要定制,也是不甚其烦。

基于前文:premake 在64位Ubuntu系统下编译32位GCC程序的基础,我在Ubuntu上构建了premake脚本,可以编译出debug64, debug32, release64和releae32的gdal动态和静态库。由于我所用的gdal是定制版本的,可能有所不同,下面的共参考。

创建一个config.lua脚本文件,内容如下:

  1. -- A solution contains projects, and defines the available configurations
  2. solution ("gdal")
  3. configurations {"Debug64","Release64", "Debug32", "Release32"}
  4. location "build"
  5. includedirs
  6. {
  7. "/usr/src/linux-headers-3.8.0-30-generic/include/config/pci/",
  8. "/usr/include/x86_64-linux-gnu/c++/4.8"
  9. }
  10.  
  11. configuration "Debug64"
  12. targetdir "output/linux_debug_x64"
  13. defines
  14. {
  15. "DEBUG",
  16. "HAVE_SSE_AT_COMPILE_TIME"
  17. }
  18.  
  19. flags {"Symbols"}
  20.  
  21. configuration "Debug32"
  22. targetdir "output/linux_debug_x32"
  23. defines
  24. {
  25. "DEBUG",
  26. "HAVE_SSE_AT_COMPILE_TIME"
  27. }
  28.  
  29. buildoptions {"-m32"}
  30. linkoptions {"-m32"}
  31. flags {"Symbols"}
  32.  
  33. configuration "Release64"
  34. targetdir "output/linux_release_x64"
  35. defines
  36. {
  37. "NDEBUG",
  38. "HAVE_SSE_AT_COMPILE_TIME"
  39. }
  40.  
  41. flags {"OptimizeSize"}
  42.  
  43. configuration "Release32"
  44. targetdir "output/linux_release_x32"
  45. defines
  46. {
  47. "NDEBUG",
  48. "HAVE_SSE_AT_COMPILE_TIME"
  49. }
  50.  
  51. buildoptions {"-m32"}
  52. linkoptions {"-m32"}
  53. flags {"OptimizeSize"}
  54.  
  55. -- project port defines one build target
  56. p = project("port")
  57. basedir(p.name)
  58. location("build/" .. p.name)
  59. kind "SharedLib"
  60. language "C++"
  61. files { p.name .. "/*.h", p.name .. "/*.cpp" }
  62.  
  63. excludes
  64. {
  65. p.name .. "/cpl_vsil_stdout.cpp",
  66. p.name .. "/cpl_odbc.cpp",
  67. p.name .. "/cpl_win32ce_api.cpp",
  68. p.name .. "/cpl_vsil_simple.cpp",
  69. p.name .. "/cpl_vsil_win32.cpp",
  70. p.name .. "/cpl_vsil_gzip.cpp",
  71. p.name .. "/cpl_vsil_buffered_reader.cpp",
  72. p.name .. "/cpl_minizip_zip",
  73. p.name .. "/cpl_minizip_zip.cpp",
  74. p.name .. "/cpl_minizip_unzip.cpp",
  75. p.name .. "/xmlreformat.cpp",
  76. p.name .. "/cpl_vsil_tar.cpp",
  77. p.name .. "/cpl_quad_tree.cpp",
  78. p.name .. "/cpl_vsil_readahead_reader.cp",
  79. p.name .. "/cpl_google_oauth2.cpp",
  80. p.name .. "/cpl_vsil_curl.cpp",
  81. p.name .. "/cpl_vsil_curl_streaming.cpp",
  82. p.name .. "/cpl_minizip_ioapi.cpp",
  83. p.name .. "/cpl_vsil_abstract_archive.cpp",
  84. p.name .. "/cpl_vsil_cache.cpp",
  85. p.name .. "/cpl_spawn.cpp"
  86. }
  87.  
  88. includedirs
  89. {
  90. "./port",
  91. "./ogr",
  92. "./gcore",
  93. "./alg",
  94. "./ogr/ogrsf_frmts",
  95. "./frmts/zlib"
  96. }
  97.  
  98. -- project ogr defines one build target
  99. p = project("ogr")
  100. basedir(p.name)
  101. location("build/" .. p.name)
  102. -- build .a here because nmake generats ogr.lib
  103. kind "StaticLib"
  104. language "C++"
  105. files
  106. {
  107. p.name .. "/*.c",
  108. p.name .. "/*.cpp"
  109. }
  110.  
  111. excludes
  112. {
  113. p.name .. "/ogrlinearring.cpp",
  114. p.name .. "/ogrutils.cpp",
  115. p.name .. "/ogr2gmlgeometry.cpp",
  116. p.name .. "/ogrmultipoint.cpp",
  117. p.name .. "/ogrmultipolygon.cpp",
  118. p.name .. "/ogrfeaturestyle.cpp",
  119. p.name .. "/swq_op_registrar.cpp",
  120. p.name .. "/ogr_api.cpp",
  121. p.name .. "/ogrsurface.cpp",
  122. p.name .. "/ogrfielddefn.cpp",
  123. p.name .. "/ogr_opt.cpp",
  124. p.name .. "/ogrmultilinestring.cpp",
  125. p.name .. "/ogrfeature.cpp",
  126. p.name .. "/swq.cpp",
  127. p.name .. "/ogrgeometrycollection.cpp",
  128. p.name .. "/ogrcurve.cpp",
  129. p.name .. "/gml2ogrgeometry.cpp",
  130. p.name .. "/ograssemblepolygon.cpp",
  131. p.name .. "/ogrfeaturequery.cpp",
  132. p.name .. "/ogrgeometry.cpp",
  133. p.name .. "/swq_op_general.cpp",
  134. p.name .. "/ogrgeometryfactory.cpp",
  135. p.name .. "/ogrlinestring.cpp",
  136. p.name .. "/swq_parser.cpp",
  137. p.name .. "/ogrpolygon.cpp",
  138. p.name .. "/swq_select.cpp",
  139. p.name .. "/swq_expr_node.cpp",
  140. p.name .. "/ogrpoint.cpp",
  141. p.name .. "/ogrfeaturedefn.cpp",
  142. }
  143.  
  144. includedirs
  145. {
  146. "./port",
  147. "./ogr",
  148. "./gcore",
  149. "./alg",
  150. "./ogr/ogrsf_frmts",
  151. "./ogrsf_frmts",
  152. "./frmts/gtiff/libgeotiff"
  153. }
  154.  
  155. -- project ogr defines one build target
  156. p = project("gcore")
  157. basedir(p.name)
  158. location("build/" .. p.name)
  159. kind "SharedLib"
  160. language "C++"
  161. files { p.name .. "/*.h", p.name .. "/*.cpp" }
  162.  
  163. excludes
  164. {
  165. p.name .. "/gdaljp2metadata.cpp",
  166. p.name .. "/gdaljp2box.cpp",
  167. p.name .. "/gdalgmlcoverage.cpp"
  168. }
  169.  
  170. includedirs
  171. {
  172. "./port",
  173. "./ogr",
  174. "./gcore",
  175. "./alg",
  176. "./ogr/ogrsf_frmts",
  177. "./ogrsf_frmts",
  178. "./frmts/gtiff"
  179. }
  180.  
  181. -- project frmts defines one build target
  182. -- After this last project build is finished, then link all obj and libs to library
  183. p = project("frmts")
  184. basedir(p.name)
  185. location("build/" .. p.name)
  186. kind "SharedLib"
  187. language "C++"
  188. files
  189. {
  190. p.name .. "/*.cpp",
  191. p.name .. "/jpeg/*.cpp",
  192. p.name .. "/jpeg/*.c",
  193. p.name .. "/nitf/*.cpp",
  194. p.name .. "/nitf/*.c",
  195. p.name .. "/gtiff/*.cpp",
  196. p.name .. "/gtiff/*.c",
  197. p.name .. "/gtiff/libtiff/*.c",
  198. p.name .. "/gtiff/libgeotiff/*.c",
  199. p.name .. "/jpeg/*.cpp",
  200. p.name .. "/jpeg/*.c",
  201. p.name .. "/dted/*.cpp",
  202. p.name .. "/dted/*.c",
  203. p.name .. "/zlib/*.cpp",
  204. p.name .. "/zlib/*.c"
  205. }
  206.  
  207. excludes
  208. {
  209. p.name .. "/nitf/rpftocdataset.cpp",
  210. p.name .. "/nitf/nitfdump.c",
  211. p.name .. "/dted/dted_test.c",
  212. p.name .. "/dted/dteddataset.cpp",
  213. p.name .. "/gtiff/libtiff/tif_print.c",
  214. p.name .. "/gtiff/libgeotiff/geo_trans.c",
  215. p.name .. "/zlib/gzio.c"
  216. }
  217.  
  218. includedirs
  219. {
  220. "./port",
  221. "./ogr",
  222. "./gcore",
  223. "./alg",
  224. "./ogr/ogrsf_frmts",
  225. "./frmts/zlib",
  226. "./frmts/jpeg/libjpeg",
  227. "./frmts/gtiff/libtiff",
  228. "./frmts/vrt",
  229. "./frmts/gtiff/libgeotiff",
  230. "./frmts/jpeg/jpeg-8c"
  231. }
  232.  
  233. defines
  234. {
  235. "FRMT_nitf",
  236. "DFRMT_gtiff",
  237. "FRMT_jpeg",
  238. "FRMT_dted",
  239. "FRMT_zlib"
  240. }

整个设计是用一个solution包含四个project,分别对应GDAL的port, ogr, gcore和frmts目录下的代码。premake会自动为每个项目build出动态或者静态库。但是premake4还没有办法在编译时知道自己的configuration是什么(这个功能要到premake5.0才有)。为了弥补这个缺憾,我写了四个脚本,分别在最后将所有的*.o和*.a文件link成libgdal.so和libgdal.a文件。

比如rebuild_linxu_debug_32.sh文件,

  1. export CXX=clang++
  2. export CC=clang
  3. rm -rf build
  4. rm -rf output/linux_debug_x32
  5. ../../../depfiles/build/linux/premake4 --file=config.lua gmake
  6. cd build
  7. make config=debug32
  8. cd -
  9. $CXX -o output/linux_debug_x32/libgdal.so build/port/obj/Debug32/*.o output/linux_debug_x32/libogr.a build/gcore/obj/Debug32/*.o build/frmts/obj/Debug32/*.o -m32 -shared
  10. ar -rcs output/linux_debug_x32/libgdal.a build/port/obj/Debug32/*.o output/linux_debug_x32/libogr.a build/gcore/obj/Debug32/*.o build/frmts/obj/Debug32/*.o

这里可以看到,我用的是clang编译器,去掉开头两行,就变成了gcc了。其他脚本类似。

最后有一个rebuild.sh脚本,编译出所有的版本。

  1. rm -rf output
  2. ./rebuild_linux_debug_64.sh
  3. ./rebuild_linux_release_64.sh
  4. ./rebuild_linux_debug_32.sh
  5. ./rebuild_linux_release_32.sh

就在顶层目录下搞定,再也不需要维护那么多makefile了。

Ubuntu上用premake编译GDAL的更多相关文章

  1. 在Ubuntu上下载、编译和安装Android最新内核源代码(Linux Kernel)

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6564592 在前一篇文章提到,从源代码树下载下 ...

  2. .NET跨平台:在Ubuntu上用自己编译的dnx运行ASP.NET 5示例程序

    在 Linux Ubuntu 上成功编译 dnx 之后,会在 artifacts/build/ 文件夹中生成 dnx-coreclr-linux-x64/ 与 dnx-mono/ 这2个文件夹,前者是 ...

  3. ubuntu上安装mysql 编译安装

    为什么要折腾?首先说明的是ubuntu上安装mysql等软件是非常容易简单的,其简单的程度盖过windows上的安装,一句sudo apt-get install就可以搞定.如果想用最简便的方法安装m ...

  4. 【转】在Ubuntu上下载、编译和安装Android最新源代码

    原文网址:http://blog.csdn.net/luoshengyang/article/details/6559955 看完了前面说的几本书之后,对Linux Kernel和Android有一定 ...

  5. 在Ubuntu上下载、编译和安装Android最新源码

    看完了前面说的几本书之后,对Linux Kernel和Android有一定的认识了,是不是心里蠢蠢欲动,想小试牛刀自己编译一把Android源码了呢?一直习惯使用Windows系统,而Android源 ...

  6. 在Ubuntu上下载、编译和安装Android最新源代码

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6559955 看完了前面说的几本书之后,对Lin ...

  7. ubuntu上u-boot的编译

    1,下载u-boot 2,将Windows中的u-boot复制到ubuntu虚拟机中自定义目录并解压 3,进入该目录cd 4,安装dtc:sudo apt-get install device-tre ...

  8. ubuntu上源码编译安装mysql5.7.27

    一.查看操作系统环境和目录结构,并创建mysql用户和组,以及规划安装mysql所需要的目录. #cat /etc/issue 查看发行版本信息: #cat  /proc/version 查看正在运行 ...

  9. [Ubuntu篇] 在ubuntu上源码编译gtest,编写gtest-config.cmake并测试

    本文首发于个人博客https://kezunlin.me/post/4a1427cf/,欢迎阅读! compile gtest on ubuntu 16.04 Guide compile gtest ...

随机推荐

  1. Android 手势锁的实现 为了让自己的应用程序的安全,现在

    转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/36236113 今天偶遇以github上gesturelock关于手势锁的一个样例 ...

  2. os基础

    命令:指计算机用户要求计算机系统为其工作的指示: 命令的表示形式: 1.字符形式: 2.菜单形式: 3.图形形式: 命令的使用方式:1. 脱机使用方式 off_line       2.联机使用方式  ...

  3. visual studio2013负载测试简单问题记录

    问题1: 错误 xxxx/xx/xx xx:xx:xx 未能对测试运行“xxxxxxxxxxx”进行排队: 活动的测试设置配置为使用 Visual Studio Online 运行测试. 使用团队资源 ...

  4. Visual Studio的ASP.NET修改默认打开浏览器

    1.新建web空应用程序,输入项目名称. 2.右击项目名称,添加“新建项”—一般处理程序 3.右击新建一个HTML文件,任意命名. 4.右击新建的Html文件,选择“浏览方式” 5.选择后弹出浏览器选 ...

  5. hive premanent udf 发布...

    起因: hive premanent udf 发布成功,但是hue 无法加载使用(但是cli 是可用的) ,处理半天,依然不可用!后来发现重启hiveserver2 就可以了     具体步骤如下:  ...

  6. C#_socket拆包_封包_模拟乱序包

    拆包一直是个硬伤呀,MLGB的,服务端各种乱数据,果断整理下 拆包思路:设计一个网络协议,一般都会分包,一个包就相当于一个逻辑上的命令. .如果我们用udp协议,省事的多,一次会收到一个完整的包,但U ...

  7. Aone新拉分支

    1.进入Aone新建项目 2.测试人员填huyangjun和husong 3.进入后拉分支 4.弄个日常普通环境 5.吧环境跑起,绑定Host就可以

  8. 68篇Hadoop博客

    http://www.cnblogs.com/smartloli/category/649544.html

  9. spring学习总结(mybatis,事务,测试JUnit4,日志log4j&slf4j,定时任务quartz&spring-task,jetty,Restful-jersey等)

    在实战中学习,模仿博客园的部分功能.包括用户的注册,登陆:发表新随笔,阅读随笔:发表评论,以及定时任务等.Entity层设计3张表,分别为user表(用户),essay表(随笔)以及comment表( ...

  10. Buffer Cache(缓冲区缓存)篇:缓存区块大小

    缓冲区缓存(Buffer Cache) Buffer Cache是SGA的一部分,保存最近从磁盘读取的或修改的(dml修改或添加)数据块.Buffer Cache的目的就是减少磁盘I/O,提高速度. ...