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

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

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

-- A solution contains projects, and defines the available configurations
solution ("gdal")
configurations {"Debug64","Release64", "Debug32", "Release32"}
location "build"
includedirs
{
"/usr/src/linux-headers-3.8.0-30-generic/include/config/pci/",
"/usr/include/x86_64-linux-gnu/c++/4.8"
} configuration "Debug64"
targetdir "output/linux_debug_x64"
defines
{
"DEBUG",
"HAVE_SSE_AT_COMPILE_TIME"
} flags {"Symbols"} configuration "Debug32"
targetdir "output/linux_debug_x32"
defines
{
"DEBUG",
"HAVE_SSE_AT_COMPILE_TIME"
} buildoptions {"-m32"}
linkoptions {"-m32"}
flags {"Symbols"} configuration "Release64"
targetdir "output/linux_release_x64"
defines
{
"NDEBUG",
"HAVE_SSE_AT_COMPILE_TIME"
} flags {"OptimizeSize"} configuration "Release32"
targetdir "output/linux_release_x32"
defines
{
"NDEBUG",
"HAVE_SSE_AT_COMPILE_TIME"
} buildoptions {"-m32"}
linkoptions {"-m32"}
flags {"OptimizeSize"} -- project port defines one build target
p = project("port")
basedir(p.name)
location("build/" .. p.name)
kind "SharedLib"
language "C++"
files { p.name .. "/*.h", p.name .. "/*.cpp" } excludes
{
p.name .. "/cpl_vsil_stdout.cpp",
p.name .. "/cpl_odbc.cpp",
p.name .. "/cpl_win32ce_api.cpp",
p.name .. "/cpl_vsil_simple.cpp",
p.name .. "/cpl_vsil_win32.cpp",
p.name .. "/cpl_vsil_gzip.cpp",
p.name .. "/cpl_vsil_buffered_reader.cpp",
p.name .. "/cpl_minizip_zip",
p.name .. "/cpl_minizip_zip.cpp",
p.name .. "/cpl_minizip_unzip.cpp",
p.name .. "/xmlreformat.cpp",
p.name .. "/cpl_vsil_tar.cpp",
p.name .. "/cpl_quad_tree.cpp",
p.name .. "/cpl_vsil_readahead_reader.cp",
p.name .. "/cpl_google_oauth2.cpp",
p.name .. "/cpl_vsil_curl.cpp",
p.name .. "/cpl_vsil_curl_streaming.cpp",
p.name .. "/cpl_minizip_ioapi.cpp",
p.name .. "/cpl_vsil_abstract_archive.cpp",
p.name .. "/cpl_vsil_cache.cpp",
p.name .. "/cpl_spawn.cpp"
} includedirs
{
"./port",
"./ogr",
"./gcore",
"./alg",
"./ogr/ogrsf_frmts",
"./frmts/zlib"
} -- project ogr defines one build target
p = project("ogr")
basedir(p.name)
location("build/" .. p.name)
-- build .a here because nmake generats ogr.lib
kind "StaticLib"
language "C++"
files
{
p.name .. "/*.c",
p.name .. "/*.cpp"
} excludes
{
p.name .. "/ogrlinearring.cpp",
p.name .. "/ogrutils.cpp",
p.name .. "/ogr2gmlgeometry.cpp",
p.name .. "/ogrmultipoint.cpp",
p.name .. "/ogrmultipolygon.cpp",
p.name .. "/ogrfeaturestyle.cpp",
p.name .. "/swq_op_registrar.cpp",
p.name .. "/ogr_api.cpp",
p.name .. "/ogrsurface.cpp",
p.name .. "/ogrfielddefn.cpp",
p.name .. "/ogr_opt.cpp",
p.name .. "/ogrmultilinestring.cpp",
p.name .. "/ogrfeature.cpp",
p.name .. "/swq.cpp",
p.name .. "/ogrgeometrycollection.cpp",
p.name .. "/ogrcurve.cpp",
p.name .. "/gml2ogrgeometry.cpp",
p.name .. "/ograssemblepolygon.cpp",
p.name .. "/ogrfeaturequery.cpp",
p.name .. "/ogrgeometry.cpp",
p.name .. "/swq_op_general.cpp",
p.name .. "/ogrgeometryfactory.cpp",
p.name .. "/ogrlinestring.cpp",
p.name .. "/swq_parser.cpp",
p.name .. "/ogrpolygon.cpp",
p.name .. "/swq_select.cpp",
p.name .. "/swq_expr_node.cpp",
p.name .. "/ogrpoint.cpp",
p.name .. "/ogrfeaturedefn.cpp",
} includedirs
{
"./port",
"./ogr",
"./gcore",
"./alg",
"./ogr/ogrsf_frmts",
"./ogrsf_frmts",
"./frmts/gtiff/libgeotiff"
} -- project ogr defines one build target
p = project("gcore")
basedir(p.name)
location("build/" .. p.name)
kind "SharedLib"
language "C++"
files { p.name .. "/*.h", p.name .. "/*.cpp" } excludes
{
p.name .. "/gdaljp2metadata.cpp",
p.name .. "/gdaljp2box.cpp",
p.name .. "/gdalgmlcoverage.cpp"
} includedirs
{
"./port",
"./ogr",
"./gcore",
"./alg",
"./ogr/ogrsf_frmts",
"./ogrsf_frmts",
"./frmts/gtiff"
} -- project frmts defines one build target
-- After this last project build is finished, then link all obj and libs to library
p = project("frmts")
basedir(p.name)
location("build/" .. p.name)
kind "SharedLib"
language "C++"
files
{
p.name .. "/*.cpp",
p.name .. "/jpeg/*.cpp",
p.name .. "/jpeg/*.c",
p.name .. "/nitf/*.cpp",
p.name .. "/nitf/*.c",
p.name .. "/gtiff/*.cpp",
p.name .. "/gtiff/*.c",
p.name .. "/gtiff/libtiff/*.c",
p.name .. "/gtiff/libgeotiff/*.c",
p.name .. "/jpeg/*.cpp",
p.name .. "/jpeg/*.c",
p.name .. "/dted/*.cpp",
p.name .. "/dted/*.c",
p.name .. "/zlib/*.cpp",
p.name .. "/zlib/*.c"
} excludes
{
p.name .. "/nitf/rpftocdataset.cpp",
p.name .. "/nitf/nitfdump.c",
p.name .. "/dted/dted_test.c",
p.name .. "/dted/dteddataset.cpp",
p.name .. "/gtiff/libtiff/tif_print.c",
p.name .. "/gtiff/libgeotiff/geo_trans.c",
p.name .. "/zlib/gzio.c"
} includedirs
{
"./port",
"./ogr",
"./gcore",
"./alg",
"./ogr/ogrsf_frmts",
"./frmts/zlib",
"./frmts/jpeg/libjpeg",
"./frmts/gtiff/libtiff",
"./frmts/vrt",
"./frmts/gtiff/libgeotiff",
"./frmts/jpeg/jpeg-8c"
} defines
{
"FRMT_nitf",
"DFRMT_gtiff",
"FRMT_jpeg",
"FRMT_dted",
"FRMT_zlib"
}

整个设计是用一个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文件,

export CXX=clang++
export CC=clang
rm -rf build
rm -rf output/linux_debug_x32
../../../depfiles/build/linux/premake4 --file=config.lua gmake
cd build
make config=debug32
cd -
$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
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脚本,编译出所有的版本。

rm -rf output
./rebuild_linux_debug_64.sh
./rebuild_linux_release_64.sh
./rebuild_linux_debug_32.sh
./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. uva 10905 Children's Game (排序)

    题目连接:uva 10905 Children's Game 题目大意:给出n个数字, 找出一个序列,使得连续的数字组成的数值最大. 解题思路:排序,很容易想到将数值大的放在前面,数值小的放在后面.可 ...

  2. 为什么C#动态调用Java的cxf多了bool型参数

    最近的一个项目需要C#调用Java的cxf发布的接口,接口参数文档只给我的是两个long型,但是通过我动态加载发现,参数是四个. 比如接口文档给的接口是 TestFunc(long, long); 而 ...

  3. jsp 有哪些内置对象?作用分别是什么? 分别有什么方 法?

    JSP共有以下9种基本内置组件 request对象          客户端请求,此请求包含来自GET/POST的请求参数,通过它才能了解到客户的需求,然后做出相应. response对象       ...

  4. Spring—Hibernate

    1.家jar包 2配置applicationContext与xxx.hbm.xml(根据需要决定是否配置hibernate.hbm.xml) applicationContext.xml <?x ...

  5. 1.1. chromium源代码分析 - chromiumframe - 介绍

    本人能力有效,面对chromium庞大的代码就头大.还是先由前辈的chromiumFrame入手. 1. chromeFrame概貌 chromiumFrame是前辈的心血之作,以最小化的方式抽出ch ...

  6. Hibernate的搭建及使用

    1.创建普通的java项目. 因为Hibernate是一个轻量级的框架,不像servlet,还必须需要tomcat的支持,Hibernate只要jdk支持即可. 2.引入jar包. 可以在项目中直接引 ...

  7. 解决windows7搜索不了txt文本内容的问题

    windows7默认的搜索框是只搜索文件名,若是要文件内容的话,需要这样设置: 打开"我的电脑",左上角"组织"→"文件夹和搜索选项"→&q ...

  8. 利用python进行数据分析之pandas库的应用(一)

    一.pandas的数据结构介绍 Series Series是由一种类似于一维数组的对象,它由一组数据以及一组与之相关的数据索引构成.仅由一组数据可产生最简单的Series. obj=Series([4 ...

  9. Object-c KVC的使用和举例

    如果我们的对象需要使用KVC,必须符合object-c的非正式协议NSKeyValueCoding.我们可以简单的来理解KVC,即所有符合KVC机制的对象都看成一个字典(NSDictionary),对 ...

  10. Windows Azure 成为业内首家被授权为 FedRAMP JAB P-ATO 的供应商

    编辑人员注释:本文章由 Windows Azure 业务和运营部门产品市场营销总监 Sarah Fender 撰写 我们高兴地宣布,Windows Azure 被 FedRAMP 联合授权董事会 (J ...