将大型软件项目移植到tup构建系统的技巧

时间:2012-11-15 22:37:43

标签: build-system tup

将一个包含数千个.cpp文件和相关标头的软件项目移植到结构良好的源代码树中的最佳方法是什么?

如果树看起来像:

colors/                                                                            
 primaries/
  red.cpp 
  green.cpp
  blue.cpp
 fruity/
  orange.cpp
  grape.cpp
 grayscale/
  white.cpp
  gray.cpp
  black.cpp
some/annoying/nesting/animals/
    horse.cpp
    bear.cpp

对于每个具有数十个目标文件的数十个类别,编写一次性使用shell脚本在每个目录中转储Tupfiles似乎是一个相当不优雅的解决方案,即使它们大部分相似也要归功于共享Tuprules.tup。什么是正确的,“最佳实践”,希望用tup来构建像这样的项目的可移植方式?

2 个答案:

答案 0 :(得分:2)

最近添加了(仍然没有详细记录)LUA解析器,您可以避免每个目录有一个Tupfile。看看这里http://gittup.org/tup/lua_parser.html阅读有关Tupdefault.lua

的信息

此外 - 最近的更改允许在DIFFERENT文件夹中输出文件,您可以更加明白。您可以“在某处”编译文件,将它们添加到全局组,然后 - 当您需要时,将它们全部链接/存档。

简单的Tuprules.tup:

TOP = $(TUP_CWD)
!cc = |> gcc $(CFLAGS) -c %f -o %o |> %B.o $(TOP)/<objects>

简单的Tupfile只是用于编译(通用的,不修改标志或sth):

include_rules

: foreach *.c |> !cc |>

用于编译和最终链接的简单Tupfile(如上所述):

include_rules

: foreach *.c |> !cc |>
: $(TOP)/<objects> |> gcc %<objects> -o %o |> application.exe

不幸的是,我(还)不知道如何使用LUA解析器使用此特定功能(全局组)。我甚至在tup-users邮件列表上询问过这个问题。

答案 1 :(得分:0)

从tup联机帮助页,tup支持运行外部shell脚本:

      run ./script args
          Runs an external script with the given arguments to generate
          :-rules. This is an advanced feature that can be used when the
          standard Tupfile syntax is too simplistic for a complex program.
          The script is expected to write the :-rules to stdout. No other
          Tupfile commands are allowed - for example, the script cannot
          create $-variables or !-macros, but it can output :-rules that use
          those features. As a simple example, consider if a command must be
          executed 5 times, but there are no input files to use tup's
          foreach keyword. An external script called 'build.sh' could be
          written as follows:

你可以触发一个生成必要的tup规则的脚本,但我认为这不是可移植的,因为你依赖shell。