【Premake】构建工程

news2025/1/17 14:11:18

Premake

一、什么是Premake?

Premake 是一种命令工具,通过读取项目脚本,来生成各种开发环境的项目文件。

开源地址:https://github.com/premake/premake-core
下载地址:https://premake.github.io
实例地址:https://github.com/wuguyannian/tutorial_premake

二、为什么使用Premake

  • 通过允许开发人员使用他们喜欢的平台和工具集,最大限度地扩大您的潜在受众。
  • 允许开发人员自定义生成,并输出特定于该配置的项目文件。
  • 通过按需从预制脚本生成项目,使工具集之间的构建保持同步。
  • 使用许多工作区和项目快速更新大型代码库:在预制脚本中进行更改一次,然后重新生成。
  • 为您不拥有的工具集创建工程文件。
  • 快速升级到所选工具集的较新版本。
  • 编写常见配置和生成维护任务的脚本.

三、主要特点

Premake 5.0 的当前开发版本可以生成针对以下目标的 C、C++ 或 C# 项目:

  • 微软视觉工作室 2005-2019
  • GNU Make,包括 Cygwin 和 MinGW
  • Xcode
  • 代码精简版

以前版本的Premake还支持导出MonoDevelopment和Code::Blocks。

预制 5.0 生成的项目可以支持:

  • 32 位和 64 位内部版本
  • Xbox 360(仅限Visual Studio)

附加模块可以通过支持其他语言、框架和工具集来扩展预制件。

除了项目生成功能外,Premake 还提供完整的 Lua 脚本环境,支持复杂配置任务的自动化,例如设置新的源代码树检出或创建部署包。这些脚本将在任何平台上运行,结束批处理/外壳脚本复制。

Premake是一个“普通的旧C”应用程序,作为单个可执行文件分发。它很小,重约200K。它不需要安装任何其他库或运行时,并且应该在几乎任何地方构建和运行。它目前正在Windows,Mac OS X,Linux和其他POSIX环境中进行测试和使用。它只使用少数依赖于平台的例程(主要是目录管理)。添加对其他工具集和语言的支持非常简单。源代码在 BSD 许可证下可用。源代码托管在 GitHub 上;文件下载目前托管在SourceForge上。

四、Premake的下载和使用

4.1 Premake下载

在premake的github地址,可以进行源码下载,点击历史发布的版本,也就是tag标志,查看premake的历史版本

img

在这里插入图片描述

然后在最下方找到window的安装压缩包,点击下载。

在这里插入图片描述

解压之后便可以获得premake5的应用程序:需要记住.exe文件存放的位置,构建的时候使用。

在这里插入图片描述

4.2 编辑premake脚本

创建文件premake5.lua,放在工程的根目录下,然后在vs里进行编辑(其他编辑器也可以),这里以OpenGL中配置GLFW和GLAD为例,编写了如下的premake5.lua文件:

workspace "LearnOpenGL" --指定工作目录
	architecture "x64"  --指定架构,这里选择的是 x64
	startproject "LearnOpenGL" --启动项目

	configurations --配置管理
	{
		"Debug",
		"Release",
		"Dist"
	}
outputdir = "%{cfg.buildcfg}-%{cfg.system}-%{cfg.architecture}"  --输出目录 cfg表示configuration,第一个%后面的内容表示配置方式,第二个%后面表示操作系统,第三个后面为架构,输出的文件夹名字为:“Debug-windows-x86_64”

--Include directories
IncludeDir = {} --这里表示创建了IncludeDir “数组”?表示可以设置多个Dir目录
IncludeDir["GLFW"] = "LearnOpenGL/vendor/GLFW/include"
IncludeDir["Glad"] = "LearnOpenGL/vendor/Glad/include"
-- Include表示包含子项目目录,需要在其项目文件夹中包含premake5.lua文件
include "LearnOpenGL/vendor/GLFW"
include "LearnOpenGL/vendor/Glad"

--项目
project "LearnOpenGL"                --项目名称
	location "LearnOpenGL"          --项目位置
	kind "ConsoleApp" 				   --项目类型 控制台程序
	language "C++" 						 --项目使用的语言
	cppdialect "C++17"				   --C++语言标准
	staticruntime "on"					  --静态运行:开

	targetdir ("bin/" .. outputdir .. "/%{prj.name}")  --目标目录,一般用于放置生成的.exe文件
	objdir ("bin-int/" .. outputdir .. "/%{prj.name}") --中间目录,放生成的.obj文件等

	files  --表示项目包含文件,没有在里面的文件是不被项目包含的
	{
		"%{prj.name}/src/**.h",
		"%{prj.name}/src/**.cpp"
	}

	defines --定义的宏,这里是忽略某种警告
	{
		"_CRT_SECURE_NO_WARNINGS"
	}

	includedirs --头文件目录
	{
		"%{prj.name}/src",
		"%{IncludeDir.GLFW}",
		"%{IncludeDir.Glad}"
	}

	links --链接,引用的项目或者库
	{
		"GLFW",
		"Glad",
		"opengl32.lib"
	}
--过滤器
	filter "system:windows"
		systemversion "latest"
--Debug配置属性
	filter "configurations:Debug"
        runtime "Debug"
        symbols "on" -- 开启调试符号
--Release配置属性
    filter "configurations:Release"
        runtime "Release"
        optimize "on" --开启优化参数,为了提升release速度

4.3 构建premake工程

在根目录cmd,键入vendor\bin\premake\premake5.exe vs2022 (这是我存放premake5.exe的文件目录),然后就等待没有报错就说明构建成功。

在这里插入图片描述

之后打开项目属性页,观察构建结果:

在这里插入图片描述

在这里插入图片描述

可以看到目录和标准都按照我们设置的显示了,说明构建成功。OpenGL项目也成功和GLFW以及GLAD链接:
在这里插入图片描述

添加测试代码,并运行,运行之后发现根目录多出了我们设置的输出文件夹:

在这里插入图片描述

bin文件夹下面存放了.exe文件:

在这里插入图片描述

bin-int文件夹中则是中间文件:

在这里插入图片描述

如果不指定这两个输出目录,那么输出的结果应该分别在根目录和项目目录中,这里我随便创建了一个工程:
在这里插入图片描述
在这里插入图片描述

就是这两个x64的文件夹,经过指定目录,整个项目结构更加简洁,找某些文件也更加容易,这也是进行项目管理的一大初衷。

至此,Premake构建项目就到这里了,如果要在脚本中添加其他的功能,可以参考官方的文档Premake

在Reference界面可以找到脚本编辑的说明。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/158703.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

揭秘HTTP/3优先级

编者按 / 相对于HTTP2,HTTP/3的优先级更加简单,浏览器厂商更可能实现统一的优先级策略。本文来自老朋友Robin Marx,已获授权转载,感谢刘连响对本文的技术审校。翻译 / 核子可乐技术审校 / 刘连响原文链接 / https://calendar.per…

【MySQL数据库入门】:面试中常遇到的 ‘ 数据类型 ’

文章目录数据类型1.数据类型分类2.数值类型2.1 tinyint类型2.2 bit类型2.3 小数类型2.3.1 float2.3.2 decimal3.字符串类型3.1 char3.2 varchar3.3 char和varchar比较4.日期和时间类型5.enum和set数据类型 1.数据类型分类 2.数值类型 2.1 tinyint类型 create table tt1(num t…

解决unable to find valid certification path to requested target

问题描述 最近java程序去调用远程服务器接口时报错了: I/O error on POST request for “https://XXX.xyz/create”: sun.secu rity.validator.ValidatorException: PKIX path building failed: sun.security.provi der.certpath.SunCertPathBuilderException: una…

终极 3D 图形工具包:Ab3d.PowerToys 10.2.X Crack

Ab3d.PowerToys改进了 Ab3d.Utilities.Triangulator 通过添加对带孔的多个多边形进行三角剖分的支持(之前只能对没有任何孔的单个多边形进行三角剖分)。这可用于从文本创建 3D 网格。 Ab3d.Utilities.PolygonAnalyzer 现在是一个公共类,可用于…

【学习笔记】【Pytorch】五、DataLoader的使用

【学习笔记】【Pytorch】五、DataLoader的使用学习地址主要内容一、DataLoader模块介绍二、DataLoader类的使用1.使用说明2.代码实现好的文章学习地址 PyTorch深度学习快速入门教程【小土堆】. 主要内容 一、DataLoader模块介绍 介绍:分配数据集。 二、DataLoade…

EMS运行数据处理-pandas降采样、合并多表

文章目录read_csv读取出错。因为多余异常列数据解决方法pd.to_datetime(df[time_key])但time_key出现不能转换的序列解决方法pandas 提取时间序列年、月、日方法一:pandas.Series.dt.month() 方法提取月份方法二:strftime() 方法提取年、月、日方法三:pandas.DatetimeIndex.mon…

【阶段三】Python机器学习20篇:机器学习项目实战:AdaBoost回归模型

本篇的思维导图: 项目实战(AdaBoost回归模型) 项目背景 本项目应用AdaBoost回归算法进行项目实战,整体流程包括数据收集、数据预处理、探索性数据分析、特征工程、模型构建及优化、模型评估。 数据收集 本次建模数据来源于网络,数据项统计如下: 编号

问题:在 ArcMap 中编辑数据时,无法使用捕捉功能

问题:在 ArcMap 中编辑数据时,无法使用捕捉功能 说明 编辑时,捕捉命令无法按预期运行。无法连接要素,因为指针没有捕捉到地图文档中的边缘和折点。 原因 此问题可能由以下原因之一引起: 捕捉选项已禁用 当前编辑会…

foxmail 发送邮件到 Poste邮件服务的端口设置

Poste服务器 发件端口设置的是 587 端口,没有开通 465 端口。 在foxmail用户账号设置中,发送端口不使用 ssl 默认是 25,使用 ssl 使用的是 465 端口。 一、无效设置的3种情况 1、在发送邮件的时候,不使用 ssl, 端口…

某固态放大器输出单次微波脉冲信号测量方案

某固态放大器输出单次微波脉冲信号测量方案摘要测量指标范围频率测量测量方案仪器选择衰减器混频器信号发生器频谱分析仪可行性分析脉宽和功率测量方案一方案二仪器选择检波器衰减器示波器可行性分析摘要 某固态放大器输出单次微波脉冲信号测量,需测量单个脉冲的频…

Java锁之ReentrantLock(源码详解)

视频地址Java学习文档 ReentrantLock 这个Java中重要的锁,我想可能很多人只是听过,并没有使用过,我在看RocketMQ客户端源码的时候发现大量的使用了这个ReentrantLock,从而引起了我的兴趣,下面我们一起从源码的角度来学…

JDK7时间相关类超详细总结(含多个实例)

JDK7时间相关类一、概述二、Date类1.构造函数2.常用函数1️⃣格式2️⃣实例三、 SimpleDateFormat类1.概述2.构造方法3.常用方法1️⃣格式2️⃣实例四、Calendar类1.概述2.使用方法3.常用方法4.实例五、结语一、概述 本文主要介绍JDK7中的时间相关类 二、Date类 1.构造函数 …

JSP SSM评估文档管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 JSPSSM评估文档管理系统 是一套完善的系统源码,对理解JSP java SrpingMVC mybiats 框架 MVC编程开发语言有帮助,系统具有完整的源代码和数据库,以及相应配套的设计文档 ,系统主要采用B/S模式开发。 研究的基本…

从零备战蓝桥杯——动态规划(子序列篇)

文章目录啥也别说了直接进入正题:不连续子序列问题300. 最长递增子序列1143. 最长公共子序列1035. 不相交的线连续子序列问题674. 最长连续递增序列718. 最长重复子数组53. 最大子数组和编辑距离问题392. 判断子序列困难题:115. 不同的子序列583. 两个字…

使用 ORM 方式查询 Mongodb 里的数据,再也不用记 Mongodb 的语法(ORM Bee)

使用ORM方式查询Mongodb里的数据,再也不用记Mongodb的语法(ORM Bee) Mongodb的语法可读性差,要写复杂查询,要求技术能力高;Java驱动,还要使用另一种语法;学习成本太高了。 可以使用ORM方式,轻松…

数字IC设计、验证、FPGA笔试必会 - Verilog经典习题 (四)移位运算与乘法

数字IC设计、验证、FPGA笔试必会 - Verilog经典习题 (四)移位运算与乘法 🔈声明: 😃博主主页:王_嘻嘻的CSDN博客 🧨未经作者允许,禁止转载 🔑系列专栏:牛客Ve…

C++:函数对象:Lambda:Lambda详解(三)

1:定义 lambda表达式就是一个函数(匿名函数),也就是一个没有函数名的函数。为什么不需要函数名了? 因为我们直接(一次性的)用它,不需要其他地方调用它。lambda表达式也叫闭包&#x…

K8s部署前后端分离项目(二)

K8s容器部署两个项目(主节点操作) 1、创建yaml文件 master节点上创建todo-list.yaml文件,两个jar包设置了两个副本,vue设置了一个副本,端口号固定配置。 当前文件目录为:/home/docker 创建yaml文件命令为&…

数学建模----图与网络模型

目录 一.图的基本概念与数据结构 1.基本概念 2.图与网络的数据结构 1.邻接矩阵表示法 2.关联矩阵 3.Matlab工具箱简介 1.图的生成 4.问题讨论 1.最短路问题 2.最小生成树问题 一.图的基本概念与数据结构 1.基本概念 点对应于研究对象,根据关系将一些点对应相…

第14章 多数据库支持之MySql

对于一个工程性程序而言,是否支持对多数据库的CURD操作,不是必须的,只是为了预防程序部署和运行过程中如果因为版权问题而产生的额外成本而预留的退路。对于移动设备的前后端分离程序而言,如果数据库需要部署到移动设备中&#xf…