GoGPT Best VPN GoSearch

OnWorks 网站图标

makepp_repositories - 云端在线

通过 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器在 OnWorks 免费托管服务提供商中运行 makepp_repositories

这是命令 makepp_repositories 可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器

程序:

您的姓名


makepp_repositories -- 如何使用存储库进行变体构建,以维护
中央资源集和其他东西

商品描述


A 知识库 是默认目录之外的目录或目录层次结构
包含 makefile 在当前目录树中需要的文件。 马克普可以
自动将存储库中的文件链接到当前目录树,如果它们是
需要。 存储库提供与“VPATH”变量类似的功能,但是(不像
其他版本的 make 中的“VPATH”)你不必对你的 makefile 做任何特别的事情
让他们工作。

存储库使用“-R”或“--repository”命令行选项或使用
makefile 中的“repository”语句。 注意如果你有调用makepp的习惯
在构建树的不同子目录中,很容易意外重新导入
其他地方的存储库。 为了防止这种情况,如果您使用 根Makepp文件, 制作
如果发现高于或低于要导入的位置,则将拒绝启动。

这有点类似于操作系统联合文件系统(unionfs...)
当前目录就像最高级别的可写层。 所有的存储库都像
较低的只读层。

存储库在几种不同的情况下很有用:

· 当你想把你的目标文件和可执行文件放在一个单独的目录中,但是
编写 makefile 是为了将它们与源文件放在同一目录中。

· 当您想以两种不同的方式(例如,使用两种不同的
组编译选项,或用于两种不同的体系结构)。

· 当您没有对全部或部分源代码树的写访问权限时。

· 当多个开发人员在同一个项目上工作,并且有一个共同的源时
包含项目所有源代码的存储库。 每个开发者只能修改
他需要在他的本地目录中更改的文件而不影响另一个
开发人员,makepp 会自动从源中获取未修改的文件
库。

Makepp 的存储库实现不需要重写构建命令
根本不像(例如) cons 中的存储库。 Makepp 将符号链接放入
命令期望它的目录。 只要命令不引用
绝对目录,完全相同的 shell 命令将处理存储库中的文件。
这意味着它不仅适用于编译命令,还适用于任何类型的命令
可以考虑放入你的makefile。

Makepp 有另一种机制,称为 建立 缓存 这解决了一些相同的问题
以不同的方式将各种问题作为存储库。 根据您的问题,构建
缓存可能比存储库更有用。 有关有关信息,请参阅 makepp_build_cache
构建缓存以及构建缓存和存储库的比较。

例子
存储库最好通过几个您可以做什么的示例来解释。

不同 汇编 选项

假设您有一个带有 makefile 的简单程序,如下所示:

CFLAGS = -O2
OBJECTS = 奥博合作
我的程序:$(对象)
cc $(输入) -o $(输出)

%.o: %.c
cc $(CFLAGS) -c $(输入) -o $(输出)

这个 makefile 将文件“ao”、“bo”、“co”和“my_program”放在同一目录中
作为源文件。

有时您想将二进制文件放在一个单独的目录中。 例如,你
可能会在几种不同的体系结构上构建您的程序,而您不想要二进制
一种架构上的文件将被替换为另一种架构上的二进制文件。 或者你可能
想临时修改重新编译,不清除之前的编译
结果。 如果没有存储库,您将不得不修改您的 makefile 以放置
其他地方的对象。

但是,使用存储库,您根本不必接触您的 makefile。 考虑
以下命令序列:

% cd my_program_source
% makepp # 使用上面的 makefile 构建,并且
# 目标文件进入目录
# my_program_source。
%光盘..
% mkdir binary-debug # 创建一个干净的目录来构建
% cd binary-debug # 具有不同选项的相同程序。
% makepp -R ../my_program_source CFLAGS=-g
# 现在对象进入二进制调试。

第一个 makepp 命令编译优化后的源文件并将对象放入
进入目录“my_program_source”,因为这是makefile应该做的
做。 现在我们要重建程序,但是我们想把“CFLAGS”的值改成
编译调试。 我们在命令行中指定了“CFLAGS”的新值,我们也
使用“-R”选项告诉makepp“my_program_source”目录是一个存储库。

每次 makepp 意识到它需要一个当前没有的文件时
目录,它在存储库中查找。 在这种情况下,它首先查找 makefile,
在“二进制调试”子目录中不存在。 所以它创建了一个符号链接到
它来自“my_program_source”中的makefile,然后读入makefile。 那么它
注意到它需要文件“ac”才能构建“ao”,因此它链接到“ac”
从存储库。 如果“ac”包含“my_program_source”中包含的任何文件,则
这些也将自动链接。 注意:这些链接对事物很有用
喜欢调试,但如果你不喜欢它们,“makeppclean -R”可以删除它们。

在“binary-debug”中运行构建命令不会触及中的任何文件
“my_program_source”。 因此,从同一组源文件中,您现在有两个不同的
程序的副本,一份经过优化编译,一份编译用于调试。 和
这发生在根本没有触及 makefile 的情况下。

使用存储库而不是简单地重新编译和覆盖的优点
原始二进制文件是现在如果我们修复我们的错误并想回到优化的
版本,我们不必重新编译所有内容。 由于原始目标文件仍然
周围,​​而且大部分还是有效的,我们可以节省很多重新编译的时间。
当只涉及三个源文件时,这并没有太大区别,但对于一个
需要几分钟或几小时才能完成的更大的构建,节省了程序员的时间和
挫败感可能很严重。

重建 一种 文件 - a 未成年人 修改 这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 汇编 命令

Makepp 不只从存储库中获取源文件。 如果目标文件在
存储库不需要重建,它会使用它们。 例如,考虑一个轻微的
对上述makefile的修改:

CFLAGS := -O2
A_CFLAGS := -O6 -funroll 循环

对象:= ao bo co

我的程序:$(对象)
cc $(输入) -o $(输出)

%.o: %.c
cc $(CFLAGS) -c $(输入) -o $(输出)

AO:交流
cc $(A_CFLAGS) -c $(输入) -o $(输出)

这个想法是“ao”包含时间关键代码,所以它被编译为更高
优化比其他对象。 现在假设我们想测试一下有多大不同
时间是不同的编译选项。 存储库也可以帮助解决这个问题:

% cd my_program_source
% makepp # 使用上面的 makefile 构建,并且
# 目标文件进入目录
# my_program_source。
%光盘..
% mkdir no-unrolling # 创建一个干净的目录来构建
% cd no-unrolling # 具有不同选项的相同程序。
% makepp -R ../my_program_source A_CFLAGS=-O2
%光盘..
% time no-unrolling/my_program # 对程序的两个版本进行基准测试。
% 时间 my_program_source/my_program

Makepp 像以前一样继续,链接 makefile 的副本,然后检查对象
文件。 现在只有“ao”模块需要重新编译,因为“bo”和“co”的选项
没有改变。 Makepp 注意到它可以使用存储库中的“bo”和“co”,所以
它只是链接那些。但是,它会在“no-unrolling”目录中重新编译“ao”。
一旦编译完成,两个不同版本的程序就可以
基准。

重建 - a 未成年人 修改 这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 资源

现在假设我们要对“ac”进行更改并在之前和之后对程序进行基准测试
改变。 存储库可以再次提供帮助。 考虑以下命令序列:

% mkdir 修改 -a
% cp my_program_source/ac 修改-a
% cd 修改-a
% emacs ac # 只对这个模块做一些修改。
% makepp -R ../my_program_source

在这里,我们创建了一个新目录,其中只包含我们想要的单个源文件
调整。 Makepp 现在从“modified-a”子目录中获取“ac”,但使用
“my_program_source”目录中的“b”和“c”。 无需更改任何二进制文件
“my_program_source”中的文件,我们创建了一个单独的程序副本
合并了我们对“ac”的更改。 如果有其他开发者使用
“my_program_source”,它们将不受我们更改的影响。

因此,存储库可以用作构建程序变体的快速方法,而无需
向 makefile 添加复杂的条件。 原始文件中没有任何文件
目录被修改; 它们根据需要使用。

运用 a 目录 等级制度

存储库实际上不仅仅是一个目录,它是一个完整的目录层次结构。
假设您使用 /我们的/图书馆 作为存储库。 现在 /我们的/图书馆 可能包含许多
子目录,例如, /我们的/图书馆/gui/我们的/图书馆/网络. 考虑这个命令:

% makepp -R /我们的/图书馆

生成文件中引用目录中文件的任何命令 。/网络 实际上会
从中获取文件 /我们的/图书馆/网络,同样对于 ./图形用户界面. Makepp 自动
创建存储库中存在但不在当前目录中的任何目录。

链接 任何 地方 in 这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 文件 系统

以上所有示例都显示了来自存储库的文件被链接到当前
目录或其子目录,但实际上您可以让 makepp 将它们链接到任何位置
在您具有写入权限的文件系统中。 这是通过指定
“-R 新位置=旧位置”。

例如,有时键入以下内容有点乏味:

mkdir 备用构建
cd 交替构建
makepp -R ..

您可以使用一个命令完成所有操作,如下所示:

makepp -R 替代构建=. -F 交替构建

"-F" 或 "-makeppfile" 在加载 makefile 之前更改到该目录。 你必须
在“-F”之前指定“-R”。 请注意,此示例将新构建树放在
存储库。 如果您使用 根Makepp文件 因为 makepp 保障
针对嵌套树。 如果您使用,这也不是一个好主意 **,因为如果你建造
在存储库中,它还可以在此子树中找到已编辑和生成的文件。

在文件系统中分配不同的位置对于更复杂的
构建,其中有几个库子目录。 例如,这是一个命令 I
曾经用于构建我的一个程序的变体:

% makepp -R 测试构建/seescape=/src/seescape \
-R 测试构建/HLib=/src/HLib \
-R 测试构建/H5pp=/src/H5pp \
-R qwt=/src/external_libraries/qwt \
-F 测试构建/seescape

此命令从四个不同的存储库加载文件,然后 cds 到
./测试构建/seescape 目录并在那里执行生成文件。 中包含的文件
开头的目录树 /src/seescape 链接到 ./测试构建/seescape。在
换句话说,makepp 会临时链接文件 /src/seescape/gui/image_canvas.cxx
./test-build/seescape/gui/image_canvas.cxx 需要的时候。 这个命令甚至可以工作
如果“test-build”目录还不存在; makepp 将为您创建它。 (但是你
必须在命令行中的“-F”选项之前指定“-R”选项。)

当量 资料库

假设您的项目由几个相当自治的小组维护。 你可以有一个
包含所有源的完整存储库,因为它们在生产中或至少
测试成功。 每个组都可以有一个几乎为空的存储库,其中包含(部分)
相同的结构,包含文件组成员已完成开发。

开发人员的当前目录将包含他们仍在处理的文件。 群组
存储库将是第一个给定的,生产存储库将是最后一个,因此
它提供了在组存储库中找不到的文件:

$ makepp -R/路径/到/组/存储库 -R/路径/到/生产/存储库

由于该目录可能相当静态,因此您可能需要放置一个文件
.makepprc 在其根目录中包含以下内容:

-R/路径/到/组/存储库 -R/路径/到/生产/存储库

或者,假设它有一个固定的路径,你可以写入你的 makefile:

存储库 /path/to/production/repository

并且,因为在读取 makefile 之前会看到选项,所以您可以只调用

$ makepp -R/路径/到/组/存储库

as 固定 部分 of 您的 建立 系统

如果您知道您总是使用某个存储库,则可以使用“存储库”或“vpath”
makefile 中的语句。

注意事项 - 资料库
在规划婴儿食品行业的工艺要求时,安全性和可靠性是工艺设计中最重要的方面。 这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 链接 得到 in 这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 方式

找到绕过文件层次结构的方法并允许调试器找到
来源 在构建时使用链接很有用。 但是当你想编辑一个
文件或将其与您的版本控制重新同步,链接可能会妨碍您。 那是
因为系统遍历链接并写入存储库中的文件。 除非
这是您的个人存储库,仅用于将事物分开,这可能不是您的
想。

为了防止无意中覆盖公共文件,建议将
存储库中的源不可写。 删除写入甚至可能还不够
位,因为版本控制系统坚持您锁定文件进行编辑
也可以这样做,但在重新同步文件时暂时使文件可写。 如果那是
对于您来说,存储库实际上应该属于不同的用户。

有一些策略可以克服这个问题:

· 将您编辑的源代码保存在存储库中,与构建树分开。 每当
您将之前从另一个存储库中获取的文件放入此
编辑存储库,makepp 会注意到并从那里获取它,前提是它是
您指定的第一个存储库。

· 在创建用于写入的副本之前,请记住删除任何文件。 如果你按照
上面的保护建议,忘记这样做会在以下情况下给出错误消息
写作。 为了帮助您,以下功能“delink”将用副本替换一个链接
链接的文件。 第一个变体适用于各种 Bournish 贝壳,第二个
一个用于 csh(或至少 tcsh):

$ delink() { { rm $1 && cat >$1; } <$1; }
% alias delink '( rm \!:1 && cat >\!:1; ) <\!:1'

· 如果你觉得你不需要它们,你可以随时删除它们,例如
每次 makepp 运行后,可能是后台运行的(短格式或长格式):

makeppclean --recurse --only-repository-links
mppc-rR

建立 in a 知识库 ,我们将参加 使用

存储库在用作存储库时是只读的。 马克普将
而不去 如果在构建过程中更改存储库中的文件,则可以正常工作。
如果当时没有其他人使用存储库,每晚构建可能适合您。 前
它开始构建,makepp 获取存储库中存在的所有文件的列表,然后
从不更新其列表,除了它希望出现的文件。

如果您需要一个随着构建而变化的存储库,您可能需要考虑 makepp 的
构建缓存机制(参见 makepp_build_cache)。 或者,您可以使用“穷人的
存储库”:您可以将显式规则放入您的 makefile 中以创建软链接,例如
这个:

%.c : $(directory_I_wish_was_a_repository)/%.c
&ln -fs $(输入) $(输出)

这仅适用于源文件; 如果它是,您不能轻松地使用它来链接文件
已在存储库中构建,但如果尚未构建,则在此处构建它,因为那里
只允许作为构建文件的一种方式。

使用 VHDL 语言编写 仅由 相对的 档名

存储库完全透明地工作 if 这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 生成文件 使用 仅由 相对的 档名.
在上面的例子中,如果makefile在 /src/seescape../HLib,但
如果上面的命令涉及到,则它不会按预期工作 /src/HLib. 如果您需要使用
绝对文件名,您可以将它们放入 make 变量中,然后在
命令行,像这样:

% makepp -R test-build/seescape=/src/seescape SEESCAPE=/home/holt/test-build/seescape \
-R 测试构建/HLib=/src/HLib HLIB=/home/holt/test-build/HLib \
-R 测试构建/H5pp=/src/H5pp H5pp=/home/holt/测试构建/H5pp \
-R qwt=/src/external_libraries/qwt QWT=/home/holt/test-build/qwt \
-F 测试构建/seescape

只要“HLib”目录在所有目录中都被称为“$(HLIB)”
生成文件。 请注意,您必须为目录指定绝对路径,因为
在阅读 makefile 之前,makepp cd 到“test-build/seescape”。 这导致长期和
复杂的 make 命令; 尽可能使用相对路径。

马克普 必须 知道 关于 所有 依赖

如果存在 makepp 不知道的隐藏依赖项,则存储库将无法工作
关于。 (实际上,使用存储库进行构建是检查遗忘的一种方法
依赖关系。 但是,仅针对此检查,不要将其与构建缓存结合使用,因为
在那里获取一些东西,而不是构建它,可能会隐藏一个被遗忘的依赖。)
有时,这些依赖关系可能相当微妙。 例如, 的libtool 命令将
不仅可以创建命令行中列出的“.lo”和“.la”文件,而且还可以
创建一个名为“.libs”的子目录,其中包含实际的目标文件。 阻止
构建错误,makepp 拒绝链接存储库中的“.la”文件。 希望在
未来的 libtool 将得到更好的支持。

许多与编译相关的隐藏依赖被命令行扫描器捕获。
如果您的编译器使用常见的 Unix 编译标志(例如,“-I”、“-D”等),则
makepp 通常会找出所有包含文件的位置。 你可能必须
如果您有任何自行开发的脚本来创建 makepp 不知道的文件,请小心
关于。 对于正确的构建,列出非常重要 所有 目标和依赖
(或通过扫描自动确定它们)。

绝对 档名 程式

如果构建的任何文件包含绝对文件名,存储库也将不起作用
它们(例如,如果您的任何构建命令写出绝对文件名)。 例如,
事实证明,“.la”文件由 的libtool 有这个属性。 (如果你看
“.la”文件的内容你会看到依赖列表包含绝对
文件名。)为了解决这个特殊问题,makepp 不会链接“.la”文件
来自存储库; 它将坚持重建它们。

避免 链接 in 不必要 目录

存储库在启动时可能会很慢,并且如果有很多
存储库中不需要的文件。 例如,如果您使用自动 HTML
文档生成器从您的源代码中生成数千个“.html”文件,您
可能不想将它们放在用作存储库的目录的子目录中。
最好将它们完全放在不同的目录树中,因此存储库
机制不会加载到他们的名字中。

更多来自Google的

存储库的缺点是符号链接,存储库机制
用途,是单独的文件(尽管它们几乎不使用磁盘空间)。 这与真实不同
链接,但那些不能跨越文件系统边界。 在极端情况下,存在
非常多的符号链接会导致可预见的文件数量用尽(所谓的
inode),即使有足够的空间。 在这种情况下,系统管理员将需要
来调整文件系统。

覆写 知识库 副本
如果在本地对文件进行任何修改,makepp 通常会意识到这一点并
使用本地副本而不是存储库副本重新编译文件。

如果您使用存储库来维护中央代码库,并且您有开发人员
处理只包含他们修改过的文件的本地副本,一个问题
出现的是:如果开发人员想从他的本地构建中删除一个文件,但是
存储库仍然包含它? 如果开发者删除本地副本,makepp 将
愉快地从存储库中放入副本,构建将继续进行,就像文件一样
存在。

解决此问题的一种技术(对于 root 用户而言并非如此)是制作您想要的文件
不要在构建过程中包含不可读的内容,如下所示:

chmod a-rw 要排除的文件

这将阻止 makepp 从存储库中合并它。 Makepp 还包括
特殊代码,以便不可读的文件不匹配通配符或模式规则。

同样,为了防止 makepp 合并整个子目录,请创建一个本地
具有相同名称但不可写的目录。 如果你想让 makepp 忽略
目录完全,然后使它不可读。 (只读目录被搜索,但
它们中的目标通常不会被构建。)

另一种方法是使用一个或多个排除选项调用 makepp:

mpp -R /path/to/rep --dont-read=/path/to/rep/要排除的文件

使用 资料库 HPMC胶囊 能够 更改!
不要尝试将存储库用于构建中的文件。 例如,你
可能会尝试使用存储库将所有公共 .h 文件放在同一个
目录,像这样:

# 顶级生成文件
存储库包含=module1/include
存储库包含=module2/include
存储库包含=module3/include
存储库包含=module4/include

这可能不是一个好主意,如果 任何.h 文件本身就是一个的输出
程序(例如,yacc 或其他一些吐出 C 源代码的程序),因为 makepp
假设存储库中的文件永远不会改变。 如果构建需要 包括/xyz.h
模块2/include/xyz.h 实际需要由某个程序生成,makepp 不会知道
运行程序。 最好使用这样的技术将你所有的 .h
进入一个公共的包含目录:

#module1/Makeppfile
../include/%.h : 包含/%.h
&cp $(输入) $(输出)
# 您还可以(在 Windows 上更有效但有问题)执行以下操作:
# &ln -r $(输入) $(输出)

如果有问题,Makepp 可能仍会尝试构建碰巧在存储库中的文件
直接为它们,但它不会构建它们 on 代表 本地目录。 结果
这可能非常令人困惑,因为它可能导致存储库符号链接被
在其存储库目标已过期时使用,但该目标可能会在以后更新
在构建中。 您可以通过确保
存储库被引用 仅由 通过存储库路径,或通过确保有
也是所有生成的存储库文件的本地规则。

避免在不同目录中重新编译相同文件的另一种方法是使用
构建缓存(有关详细信息,请参阅 makepp_build_cache)。 构建缓存没有
文件不得更改的限制。

使用 onworks.net 服务在线使用 makepp_repositories


免费服务器和工作站

下载 Windows 和 Linux 应用程序

Linux 命令

Ad




×
广告
❤️在这里购物、预订或购买——免费,有助于保持服务免费。