text:
Hotels near Park Beach
Search hotels near Park Beach in Coffs Harbour
Save more with Secret Prices
Get instant savings with Secret Prices
Hotels in Coffs Harbour near Park Beach
Are you looking for a cheap Park Beach hotel, a 5 star Park Beach hotel or a family friendly Park Beach hotel? You just landed in the best site to find the best deals and offers on the most amazing hotels for your stay.
When you search for hotels near Park Beach with Hotels.com, you need to first check our online map and see the distance you will be from Park Beach, New South Wales.
Our maps are based on hotel search and display areas and neighborhoods of each hotel so you can see how close you are from Park Beach and refine your search within Coffs Harbour or New South Wales based on closest public transportation, restaurants and entertainment so you can easily get around the city. All the hotels details page show an option for free or paid onsite parking.
If you wish to see the hotels with the highest featuring discounts and deals near Park Beach, simply filter by price/ average nightly rate. We recommend you filter by star rating and read our genuine guest reviews so you can get the best quality hotel with the best discount.
One of the new features on Hotels.com guest reviews is that also show reviews from Expedia for Park Beach hotels and the TripAdvisor Park Beach hotels reviews so you can make sure that you checking with a reliable source. See the review scores on our Coffs Harbour hotel information pages.
Make the most out of your family vacation when you book your hotel with Hotels.com – book your hotel near Park Beach, Coffs Harbour after reviewing the facilities and amenities listed for each hotel.
After booking your hotel near Park Beach, expect to receive your reservation confirmation in the mail in less than 10 minutes. The confirmation email contains more information on all nearby attractions, local directions and weather forecast, so you can better plan the days during your trip.
After getting the best hotel rates you can still save more by winning 1 free night! That's right, stayed 10 nights in any hotel near Park Beach, Coffs Harbour and after you sign up for the Hotels.com Rewards program, you are eligible hotel you receive 1 night free*
The best hotel deals are here: We have Park Beach hotel deals, Park Beach last minute deals and offers to get you the cheapest Park Beach hotel with our lowest price guarantee.
Coffs Harbour travel guides
From Camping Grounds to Secluded Resorts - Finding the Right Place to Stay in Coffs Harbour
The wide range of options in and around Coffs Harbour makes finding the right accommodation simple....
A Guide to Coffs Harbour Shopping - From the Main Street to Country Markets
Whether you're looking for boutiques on the waterfront, or authentic handicrafts in a rural village,...
What to See and Do In and Around Coffs Harbour
The untainted beaches and protected waters of the Coffs Coast, the area around Coffs Harbour, make it...


text:
It was reported a few weeks ago that Nokia was preparing a firmware revision for the Lumia 920 (and other Windows Phone 8 Lumias) that would continue to bring Nokia's vision of how a Windows Phone should be to fruition.
That update is now being referred to as PR2.0 and we have an exclusive quick glimpse of some of those new features for you.
One of those new additions was a 'double tap the display' to awaken the phone, a novel method first seen in Nokia's N9 (and is much easier than BlackBerry's current "swipe up" method in the Z10). Windows Phone Central has also learned that a new, always-on clock will now be optionally allowed on the display and brings back memories of our Treo 800w days.
There are a few other things coming down the pike too including 'Smart Camera', another new Lens akin to the current 'Smart Shoot' but reportedly brings Blink like features Nokia-style. We'll have more on that later.

subset: commoncrawl


text:
Poker website change cssроботи
I have a [увійдіть, щоб побачити URL] poker mavens license, the poker server must be run on a windows server therefore it is assigned an IP address, I would like the IP address to show a valid SSL so visitors know its safe to play or to point the IP address to a sub domain off of my [увійдіть, щоб побачити URL] hosting account ([увійдіть, щоб побачити URL] for an example) I
hello we want Poker texas holdem game online for casino with nodejs and socket io and work with our api token
Looking for a designer to design a full set of custom playing cards (poker sized). You will be required to design the following: 1 X back design of the playing cards 4 x designs of the kings for spades, hearts, clubs, diamonds 4 x designs of the queens for spades, hearts, clubs, diamonds 4 x designs of the jacks for spades hearts clubs diamonds, 1
Hello and good day to you all, we're looking for the best candidate to work along with our team this is a poker game and will be given other projects based on this type of game if you complete your first project as requested. Will provide apk file for you to analyze the platform and answer a few questions before we can begin. I will send apk file for
Build a support software which integrates an artificial intelligence software with a poker client and gives us a real time solution for each situation. The software to be built should be available for 1-7 tables played simultaneously. - Get data of the current hand and send it to the AI software. - The AI software analyzes this data and shows us results
I need poker game mobile app for android and ios with source code. Features: - Multiplayer online games - Free To Play - Free 100K Chips for new players - Free Additional daily chips - Play online wih 1000's of players over 3G Wifi - 5,7,9 Seat - No registration required - Login via social sites (fb, google) - Play live with your iphone and ipod friends
I need a new website. I need you to design and build a website for my small business.
Hello, Gurus All around the world. I need crypto based online poker gaming app which has to be both in Mobile and Desktop and Web based. Simply RPC connection are cruel to this project both in BTC or ETH or any. Please I have posted a lots of project and failed some of them. So only capable person or people contact me. Otherwise, don't kill
We have a client looking for regular poker videos for their poker website, all around 3 minutes long with specific subjects such as how to play Texas Hold'em, how to play Omaha, tournament strategy, pre-flop strategy etc, looking for someone who understands the game of poker in depth and who can show previous videos of around 3 minutes of good quality
i need a poker king, must be very charismatic, middle-aged is for a small poker club in my locality, maybe throwing the dice or playing cards, thanks Hola necesito un rey del poker, muy carismatico nada serio pero no infantil, es para un club de amigos en mi localidad que nos reunimos a jugar dejo algunos ejemplos.
...feedback on both the Facebook and game platform. We have launched Poker Romania 5 years ago, and we have grown our user base considerably. The applicant must be a Romanian native speaker and have at least 2 hours to dedicate to this position daily. It's preferred to be an experienced poker player, but not a requirement. It's a very simple job for a native
I am interested in developing a project which is replical of [увійдіть, щоб побачити URL] with some changes of rules here and there, but mainly look and feel and funtionality and all other things i need to replicate of [увійдіть, щоб побачити URL] Looking forward for the best quote, Experience And Previous Work pls show When u bid for it
Need several mockup design for a poker club website today. The freelancer with best concept will be given the work of creating the website, I will need social media page design concepts also. In your proposal please tell me which platform is best for building a professional website. I need website to be fast and professional looking to the users. In
It's gonna be a online gambling website where people can play poker. Like Texas poker, Hold em poker, Zynga poker We will add only one payment method - B-kash I'll give the details about it later Features, 1-5 player can play in one table without the dealer it self pot limit will be 10-100 100-1000 1000-5000 10000-20000 Max for now on we
Hi, I want someone to develop a decentralized poker app (for iOS and Android ) as well as a web app so a user can download an app from play store or Google play as well as playing it on a web browser so it must be responsive. I want it to be purely decentralized (there is no centralized server ) using https://gun.eco. It is really important that
I need an iPhone/iPad app. I would like it designed and built. I'm looking for someone to create a online poker app that is also compatible with android. I need it to be 3D
Create a Fate Gaming Poker T-Shirt Design
We have an online poker game built using php 5.4, mysql and flash. It is currently running but has a number of bugs that we require urgently to be fixed. We had a previous developer who was not responsive, did not communicate well and this is costing us time in launching our platform. We require someone to stay on for long term work with us for the
it should be integrate with photon server. are you familiar these fields ? - auto start. - auto sit down/up - solving for Master engine's gone to background mode or net issue. I will share you details via private chat
I need to have some online poker table graphics designed with chairs and etc., I have the layout and where everything must be placed just need someone to modify graphics i currently have.. Table, chairs,.chat box and bubbles must stay in same exact location as my image, just redesign table,chairs and background.. Don't bid if you havent read project
I need a poker autoseater app. It should notify me whenever a person or color sits in or reserves a place in an opened table. It should make an alarm sound when that happens. It should reserve a place for me when that happens.
Looking for Expert app developer online poker games !
Need a turnkey app like pppoker/kkpoker for playing texas omaha (4 and 5 cards), with all the features of those two existing apps. Should include client software (android apk and html5), server software, administrator backoffice panel for controlling all aspects on the client software.
I want to buy a complete sport poker casino site similar to betfair betaland and similar no time wasters, send the site's admin demo to evaluate all the proposals maximum cost $ 120 thousand
build a poker game for both iOS and android to be a simple design with added graphics and animation
I need a simple poker game done in Python. I will provide the details in chat.
Hi If you worked on a similar project then please bid You will need to test the existing engine and html5 client thenmodify it to my sp...(android/ios app). Have mobile and web sync. Integrate payment systems, add lobby in app and mobile so clients can play with real money or play money. Build a website. I have the poker engine source codes.
I would like to add somes hotkeys to a poker site
Hello, I would like to b...as Payment Methode .... and than there will be Tables where people can play on ... there has to be a Livechat..... also required feature is when Players are sitting on the Poker Table they can connect theyre Cam to show Live Streaming of theyre Face into the Profile Pic on the Table anstead of Profile pic if they want to ...
Unity 3d would be a better option but even html5 is acceptable with mobile support! For details contact me!
Hi I need someone to build a website and app to play real money poker. Should include client software (android apk and html5), server software, administrator backoffice panel for controlling all aspects on the client software. Also include payment gateways like neteller and skrill.
I am creating poker application based on blockchain. I need guy to add animation on this app using WebGL. If you can develop all frontend, it's great. it's only 3 pages, splash, home, table screen. All designs will be provided. Please drop bids with your previous projects.
[увійдіть, щоб побачити URL] Copy the game of this website
Hello I search for an freelancer who wants to build me an website and app for an gambling and poker . Please send me an offer if you are interested and ifyou are good in what you do Have a nice day Greetings
I want to create a script poker casino sports Below is the demo of the site I want to create I'm fine with any important script that has admin panel handling poker and casino bets demo site [увійдіть, щоб побачити URL] demo [увійдіть, щоб побачити URL]
I am looking for a developer to build a mobile app (poker game) that main function same as pppoker. Member can signup with FB account. Can create Club.
We need to manage participants, tables and their seating. This can be on windows or web based via the api. Then participants would be able to login to their app on Android and play the game with cards. Back-end system would be able to view the results of the game. No Unity 3d please, need to custom develop it.
solo es una simple sala de poker holdem solo esa modalidad nada mas ....Con una interfaz amigable panel de administrador. las animaciones similares a cualquier sala de poker k existen. Y obviamente que tenga una buena seguridad ya que se manejaran algunos cientos de usuarios no creo que cresca mas de 500 usuarios. Y porfavor que hable español
Requirements Poker Software - A normal poker software where there is always a computer at the table so that you can play at any time. The computer should win more than lose and the PokHelCoins are set to 100 every 24 hours. - the PokHelcoins have no real value - You need the PokHelcoins for a special live tournament where no buy-ins can be bought
I'd like to make a poker program for pot limit omaha that will recognize a certain card is in my hand and on the flop then make a bet or move or action based on my settings. Ex. I get KclubsQclubs7heart2diamond and the program will fold Ex2. I get AheartKheart2diamond4diamond and I raise 3x bet before the flop *this is the idea is with 4 cards and
Hello I am looking for a construction kit to write software. Am I right with you? The software should be structured like on the photo. In the middle is a timer when this has expired must rise with the blinds a level. The same with Next Blinds. The database must be editable in the background. Best in an Excel which is linked to the software. Tournament info must be a + and a - at Entrants so th...
I need you to write some articles. The article I want to write is about Poker, a card game that can make people millions of dollars. I have plenty of advice and strategies that can help people make money by playing the game.
We need a person(s) who can create a Al calculator for poker game (Open Face Chinese Pineapple poker). There are some one on the market for example [увійдіть, щоб побачити URL] , we need something like this but better. About the price or $per hour we will discuss [Removed by Freelancer.com Admin]
I want to use Big Data to play poker game and win most of the time.
we have developed a high end poker chips made of silver. i want exclusive box design for that as selling value of the product would be around 5000$ so the look and feel of the box should be exclusive.
Будь ласка, зареєструйтесь або увійдіть в систему для перегляду деталей.
Poker Gives is a non profit charity in the poker industry. We raise funds to give back to the community. We are interested in a "new look" so we decided we'd start with the logo. The logo may have something poker related in the image but it is not necessary.
hi, have you developed mobile poker game app ? I want to buy source, it should be include omaha, taxas engines. thanks
We requrie designs for two webpages (mobile and desktop) of an online poker app as well as a logo: logo: We are open to any design but are keen on something like the TRON Logo with a royal flush in, around or behind it. main page: "PokerTRON" Title and logo with one panel that has username inputs, game settings and a "Find Game" button. There
...programación en juegos sociales además de la participación y/o desarrollo de los mismos, también puntuaremos conocimientos matemáticos y estadísticos así como conocer el mundo del poker y las distintas modalidades. El dominio de inteligencia artificial es fundamental para entrenamientos contra la maquina. Se estudiarán los presupue...


text:
(→%prep 部分)
|Line 123:
|Line 123:
尽可能利用一切已有的信息!很明显,请您不要打包一些已经存在于源里面的程序!为了防止您犯这种错误,请查阅 [https://admin.fedoraproject.org/pkgdb/ Fedora 软件仓库信息数据库] 。同时建议您查阅 [[PackageMaintainers/InProgressReviewRequests | In Progress Review Requests]] (那些正在被审核的软件包)和 [[PackageMaintainers/RetiredPackages | Retired Packages]] (已退休的软件包)列表。
尽可能利用一切已有的信息!很明显,请您不要打包一些已经存在于源里面的程序!为了防止您犯这种错误,请查阅 [https://admin.fedoraproject.org/pkgdb/ Fedora 软件仓库信息数据库] 。同时建议您查阅 [[PackageMaintainers/InProgressReviewRequests | In Progress Review Requests]] (那些正在被审核的软件包)和 [[PackageMaintainers/RetiredPackages | Retired Packages]] (已退休的软件包)列表。
如果以上都没有即将被您打包的程序的信息,请使用 Google 以 "您想打包的程序名 Fedora rpm" 或者类似的关键字进行搜索,您可以直接访问 [http://pkgs.fedoraproject.org/
如果以上都没有即将被您打包的程序的信息,请使用 Google 以 "您想打包的程序名 Fedora rpm" 或者类似的关键字进行搜索,您可以直接访问 [http://pkgs.fedoraproject.org// Fedora 软件仓库 Git 源] 来查看已存在于 Fedora 源中的 .spec 文件。
您还可以通过 yum-utils 工具包的一个工具,yumdownloader,来获得源代码 RPM 包(SRPM):
您还可以通过 yum-utils 工具包的一个工具,yumdownloader,来获得源代码 RPM 包(SRPM):
$ yum -y install yum-utils
$ yum -y install yum-utils
Revision as of 13:31, 28 August 2012
- 1 关于本指南
- 2 配置好您的系统和账户
- 4 做好准备打包一个特殊程序
- 5 新建一个 .spec 文件
- 5.1 新建一个空白的 .spec 文件
- 5.2 示例: eject
- 5.3 .Spec 文件具体内容解析
- 5.4 %prep 部分
- 5.5 %build 部分
- 5.6 %check 部分
- 5.7 %install section
- 5.8 %files section
- 5.9 Scriptlets
- 5.10 Macros
- 5.11 Other tags
- 5.12 Subpackages
- 5.13 Conditionals
- 5.14 Application Specific Guidelines
- 5.15 Miscellaneous hints
- 5.16 Older RPM documents
- 6 Quick test with rpmlint
- 7 Creating RPMs from the spec file
- 8 Testing RPMs you've built (including rpmlint)
- 9 Helpful tools
- 10 Guidelines and rules
- 11 维护软件包
- 12 更多信息
本指南详细讲述了如何针对 Fedora 系统制作 RPM 包(特别是如何写.spec配置文件),同时还给您许多实际的提示,帮助您减少不必要的时间损耗。
但是,本指南并不是 Fedora 官方的打包指南(官方指南在此:Fedora打包官方指南和软件包命名向导)。尽管如此,本指南与前两者100%兼容,您不必担心内容是否不准确。
请您注意:本指南不会在某些方面作深入讨论,但是指南会引入相关链接以帮助您理解这些内容。而且,本指南特殊之处在于,不像有些 RPM 指南不解释详细。本文档会解释在 Fedora 中 RPM 的特殊之处(会有大量链接指向 Fedora 的特殊指南),并且尽可能的保持最新。
举个例子,本指南会提醒 RPM version 4.4.2.x版本 的影响。由于本文档是主要针对 Fedora 编写,因此绝大部分内容也会适用其他基于 RPM 机制的发行版。如果您等不及了,您可以先看看如何创建一个GNU Hello World软件包,这是一个创建 RPM 包的简短总结(但是没有很详细的信息)。
如果您计划为 Fedora 的官方源创建一个 RPM 包,请按照 如何参与维护软件包 页面的步骤一步步来。它包含了许多有关在 Fedora 中打包的指南。
在您为 Fedora 创建 RPM 包之前,您需要安装一些必须的开发组件并且设置好您即将使用的账户。请在
# yum install @development-tools # yum install fedora-packager
# /usr/sbin/useradd makerpm # passwd makerpm
$ rpmdev-setuptree
rpmdev-setuptree 程序新建一个位置是
~/rpmbuild 的目录。在"rpmbuild"目录下是一些预设好的子目录(比如
rpmdev-setuptree 也会创建一个位置是
~/.rpmmacros 的文件。它是一个保存有关设置的文件。
wget 或者
curl 获取软件源代码的时候就会自动保存。
wget 来获取源代码,确保在
~/.wgetrc 文件加入一行
timestamping = on 。类似的,如果您使用
curl ,确保
~/.curlrc 文件包含 "-R"。
.spec 文本文档,里面包含即将被安装的软件的所有详细信息。然后您对这个文本文档在系统中执行
rpmbuild 命令,经过这一步,系统会按照步骤生成最终的 RPM 包。
.tar.gz 结尾的文件, 放入
~/rpmbuild/SOURCES 目录下。您应该把
.spec 文件放入
~/rpmbuild/SPECS 目录下,并且把它命名为 "软件包名字.spec" 。当然, 软件包名字 就是最终 RPM 包的名字。为了创建所有软件包(包括预编译好的包(Binary RPM)和源代码包(SRPM)),您需要把终端切换至
~/rpmbuild/SPECS 目录然后执行:
$ rpmbuild -ba NAME.spec
rpmbuild 会自动读取
.spec 文件并尝试按照其中所设定的步骤完成构建。(以下表格中,以
% 开头的短语都是宏,每一个宏起到的作用已经详细列出):
%_sourcedir 目录(通常位于(~/rpmbuild/SOURCES)的源代码和patch 。随后会解压源代码到一个
%_builddir 目录(通常位于~/rpmbuild/BUILD/)的子目录并应用所有 patch。
%_builddir 目录(通常位于~/rpmbuild/BUILD/)下的所有文件。本步类似于 "./configure ; make" 命令。
|这一步检查程序是否正常运行。本步类似于 "make test" 但是很多软件包都不需要这步。
%_builddir 目录(通常位于~/rpmbuild/BUILD/)下的文件并把它们写入至
%_buildrootdir 最终安装目录(通常位于~/rpmbuild/BUILDROOT)。这些文件就是用户通过 RPM 方式安装后最终得到的文件。请注意一个奇怪的地方: 最终安装目录 不是 构建目录 !本部类似于 "make install"。
%_buildrootdir 最终安装目录(通常位于~/rpmbuild/BUILDROOT/) 下的文件,以便最终在
%_rpmdir 目录(通常位于~/rpmbuild/RPMS/)下创建 RPM 包。在
%_rpmdir 目录下,针对不同架构(例如x86,x86_64或者ppc)制作的 RPM 包会分目录放置,同时一个叫做 "noarch" 的目录放置针对所有架构均适用的 RPM 包。
|这步创建源代码 RPM 包(简称SRPM,通常以.src.rpm作为后缀名)。然后这些SRPM会被放在
%_srcrpmdir 目录(通常位于~/rpmbuild/SRPMS)下。SRPM 包通常被用于审核和升级软件包。
As you can tell, certain directories have certain purposes in rpmbuild. These are:
|Specification directory
|RPM 包配置(.spec) 文件存放的目录
|存放源代码包(比如 .tar包) 和所有 patch 的目录
|Source files are unpacked and compiled in a subdirectory underneath this.
|Files are installed under here during the %install stage.
Should a stage fail, you'll need to look at the output to see why it failed, and change the .spec file (or other input) as needed.
如果想为 Fedora 源打包一个程序,您"务必"使用源代码来打包(一定包含patch补丁以及打包简介)。我们不建议您使用预编译好的代码来进行打包。Install the file with the original source (usually a .tar.gz file) in the "~/rpmbuild/SOURCES" directory (of the rpm building user account).
Read through the manual installation instructions for your program; you're going to be automating this by editing a ".spec" file, so you have to understand what you're supposed to do first. It's probably best if you try a "dry run", going through its build and installation procedure without trying to do it via RPM first (that's especially true if you're not familiar with RPM). With a few exceptions, all program binaries and program libraries included in Fedora packages must be built from the source code that is included in the source package.
请参阅:把绑入的外部组件分离成单独程序 以了解更多信息。请您把绑入的组件从主程序分离,制作成单独的包再发布。
就像在 packaging guidelines' legal section 声明的那样,如果您打算把您的软件包放入 Fedora 源,请一定遵守Licensing:Main 和 Packaging:LicensingGuidelines 。 通常情况下,您只可以打包使用开源许可证(比如GNU GPL、GNU LGPL、BSD-new、MIT/X或者Apache 2.0 许可证)发放的开源软件(OSS)。 请仔细检查许可证是否名副其实,同时软件整体是否均基于开源协议发放。(比如抽查源代码开头的注释、README 文件等等)。 如果软件有附加组件被绑入,请确保这些组件也是开源软件。这步十分重要。
使用已有的 .spec 文件
尽可能利用一切已有的信息!很明显,请您不要打包一些已经存在于源里面的程序!为了防止您犯这种错误,请查阅 Fedora 软件仓库信息数据库 。同时建议您查阅 In Progress Review Requests (那些正在被审核的软件包)和 Retired Packages (已退休的软件包)列表。
如果以上都没有即将被您打包的程序的信息,请使用 Google 以 "您想打包的程序名 Fedora rpm" 或者类似的关键字进行搜索,您可以直接访问 Fedora 软件仓库 Git 源 来查看已存在于 Fedora 源中的 .spec 文件。
yum-utils 工具包的一个工具,
yumdownloader,来获得源代码 RPM 包(SRPM):
$ yum -y install yum-utils $ yumdownloader --source 您想要获得的源代码包的名字
或者您可以通过浏览 Fedora 镜像列表 的 HTTP 或者 FTP 页面以获取 SRPM 包。select releases/29/Everything/source/SRPMS (请把"29"换成您想要的 Fedora 版本),然后下载即可。通常源代码包以 .src.rpm 为后缀名。
$ rpm -ivh 您下载的源代码包名字.src.rpm
rpm2cpio 把源代码包解压到任意目录:
$ mkdir 您下载的源代码包名字_src_rpm $ cd 您下载的源代码包名字E_src_rpm $ rpm2cpio ../您下载的源代码包名字.src.rpm | cpio -i
使用这些已经存在的信息有助于您更快打包。RPM Find may help you find rpm's for non-Fedora systems.
(You can install source RPMs for other systems the same way as for Fedora).
Failing that, you might look at the source package files (not the
.deb binary package files)
for Ubuntu or
(source package files are standard tarballs with a
debian/ subdirectory, possibly
associated with patch files).
If the FreeBSD ports collection has it,
you could
download the FreeBSD ports tarball
and see if their packaging information helps as a starting point.
However, this is sometimes not helpful at all.
Different distributions have different rules, and what they do may be quite
inappropriate for Fedora.
新建一个 .spec 文件
现在您需要新建一个 ".spec" 文件,并让它位于 "~/rpmbuild/SPECS" 目录下。您应该把它命名为"程序名.spec" 。程序名根据原始软件包作者的建议或者通用命名来填写即可。但是, 软件包命名规定 是您必须要遵守的。
新建一个空白的 .spec 文件
如果您第一次新建 .spec 文件,您可以遵照这个示例(vim 7.1.270-1)来做。当您执行下列命令时,系统会自动建立好一个带有参数名的模板供您使用:
$ cd ~/rpmbuild/SPECS $ vi 您取的软件包名字.spec
Name: Version: Release: 1%{?dist} Summary: Group: License: URL: Source0: BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: Requires: %description %prep %setup -q %build %configure make %{?_smp_mflags} %install rm -rf %{buildroot} make install DESTDIR=%{buildroot} %clean rm -rf %{buildroot} %files %defattr(-,root,root,-) %doc %changelog
You may have $RPM_BUILD_ROOT instead of %{buildroot}; just be consistent.
You may also use the
rpmdev-newspec command to create a spec file for you.
rpmdev-newspec NAME-OF-NEW-PACKAGE can create an initial spec file for a new package, tailored to various types of packages. It will guess what kind of template to use based on the package name, or you can specify a particular template; see
/etc/rpmdevtools/spectemplate-*.spec for available templates. See
rpmdev-newspec --help for more information. For example, to create a new spec file for a python module:
cd ~/rpmbuild/SPECS rpmdev-newspec python-antigravity vi python-antigravity.spec
Here's a simple example, a Fedora 9 package for the "eject" program:
Summary: A program that ejects removable media using software control Name: eject Version: 2.1.5 Release: 11%{dist} License: GPL Group: System Environment/Base Source: http://metalab.unc.edu/pub/Linux/utils/disk-management/%{name}-%{version}.tar.gz Source1: eject.pam Patch1: eject-2.1.1-verbose.patch Patch2: eject-timeout.patch Patch3: eject-2.1.5-opendevice.patch Patch4: eject-2.1.5-spaces.patch Patch5: eject-2.1.5-lock.patch Patch6: eject-2.1.5-umount.patch BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root URL: http://www.pobox.com/~tranter ExcludeArch: s390 s390x BuildRequires: gettext BuildRequires: automake BuildRequires: autoconf BuildRequires: libtool %description The eject program allows the user to eject removable media (typically CD-ROMs, floppy disks or Iomega Jaz or Zip disks) using software control. Eject can also control some multi-disk CD changers and even some devices' auto-eject features. Install eject if you'd like to eject removable media using software control. %prep %setup -q -n %{name} %patch1 -p1 -b .versbose %patch2 -p1 -b .timeout %patch3 -p0 -b .opendevice %patch4 -p0 -b .spaces %patch5 -p0 -b .lock %patch6 -p1 -b .umount %build %configure make %install rm -rf %{buildroot} make DESTDIR=%{buildroot} install # pam stuff install -m 755 -d %{buildroot}/%{_sysconfdir}/pam.d install -m 644 %{SOURCE1} %{buildroot}/%{_sysconfdir}/pam.d/%{name} install -m 755 -d %{buildroot}/%{_sysconfdir}/security/console.apps/ echo "FALLBACK=true" > %{buildroot}/%{_sysconfdir}/security/console.apps/%{name} install -m 755 -d %{buildroot}/%{_sbindir} pushd %{buildroot}/%{_bindir} mv eject ../sbin ln -s consolehelper eject popd %find_lang %{name} %clean rm -rf %{buildroot} %files -f %{name}.lang %defattr(-,root,root) %doc README TODO COPYING ChangeLog %attr(644,root,root) %{_sysconfdir}/security/console.apps/* %attr(644,root,root) %{_sysconfdir}/pam.d/* %{_bindir}/* %{_sbindir}/* %{_mandir}/man1/* %changelog * Wed Apr 02 2008 Zdenek Prikryl <zprikryl at, redhat.com> 2.1.5-11 - Added check if device is hotpluggable - Resolves #438610
.Spec 文件具体内容解析
The RPM Guide, section on creating RPMs, describes the details of how to fill in a spec file. The developerWorks series "Packaging software with RPM" Part 1, Part 2, and Part 3 is also handy. Maximum RPM has the most complete information, but is dated.
You will need to follow the Fedora guidelines, such as the Package Naming Guidelines, Packaging Guidelines, and Package review guidelines.
You can insert comments with a leading "#" character, but don't insert potentially-multiline-macros (words beginning with "%") in a comment (macros are expanded first); if you're commenting out a line, double the percent signs ("%%"). Also, don't use inline comments ("#") on the same line after a script command.
Here are the major fields/areas that you will need to fill in:
- Name: The (base) name of the package. It must follow the Package Naming Guidelines. In many cases, this will be in all lower case. Elsewhere in the spec file, you can refer to the name using the macro %{name} - that way, if the name changes, the new name will be used by those other locations. This name should match the spec file name.
- Version: The upstream version number. See Packaging/Naming guidelines - package version for more information. If the version is non-numeric (contains tags that are not numbers or digits), you may need to include the additional non-numeric characters in the release field. If upstream uses full dates to distinguish versions, consider using version numbers of the form yy.mm[dd] (so a 2008-05-01 release becomes 8.05). Elsewhere in the spec file, refer to this value as %{version}.
- Release: The initial value of the release should normally be "1%{?dist}". Then, increment the number every time you release a new package for the same version of software. If a new version of the software being packaged is released, the version number should be changed to reflect the new software version, and the release number should be reset to 1. See Name Guidelines - package release for more. Packaging/DistTag describes the "dist" tag, which isn't required but can be useful. Use %{release} to reuse this value.
- Summary: A brief, one-line summary of the package. Use American English, and do not end in a period.
- Group: This needs to be a pre-existing group, like "Applications/Engineering"; run "less /usr/share/doc/rpm-*/GROUPS" to see the complete list. If you create a sub-package "...-doc" with documentation, use the group "Documentation".
- License: Its license; for software, this must be an open source software license. Use a standard abbreviation, e.g., "GPLv2+". Try to be specific, e.g., use "GPLv2+" (GPL version 2 or greater) instead of just "GPL" or "GPLv2" where it's true. See Licensing and the Licensing Guidelines for more information. You can list multiple licenses by combining them with "and" and "or", e.g., "GPLv2 and BSD". Call this tag "License"; don't use the older, inaccurately named tag "Copyright".
- URL: The URL for more information about the program, e.g., the project website. Note: This is NOT where the original source code came from, see "Source" (next!).
- Source0: The URL for the compressed archive containing (original) pristine source code, as upstream released it. "Source" is synonymous with "Source0". If you give a full URL (and you should), its basename will be used when looking in the SOURCES directory. If possible, embed %{name} and %{version}, so that changes to either will go to the right place. Warning: Source0: and URL: are different - normally they are both URLs, but the "URL:" entry points to the project website, while the "Source0:" entry points to the actual file containing the source code (and is typically a .tar.gz file). As noted in the guidelines, "When downloading sources, patches etc, consider using a client that preserves the upstream timestamps. For example wget -N or curl -R. To make the change global for wget, add this to your ~/.wgetrc: timestamping = on, and for curl, add to your ~/.curlrc: -R." If there is more than one source, name them Source1, Source2, and so on. If you're adding whole new files in addition to the pristine sources, you can list each of them as sources as well, but list them after the pristine sources. A copy of each of these sources will be included in any source package you create (unless you specially direct otherwise). See Packaging/SourceURL for more information on special cases (using revision control, when upstream uses prohibited code, etc.).
- Patch0: The name of the first patch that you will apply to the source code. If you need to patch the files after they've been uncompressed, you should edit the files, save their differences as a "patch" file in your ~/rpmbuild/SOURCES directory. Patches should make only one logical change, so it's quite possible to have multiple patch files.
- BuildArch: If you're packaging files that are architecture-independent (e.g., shell scripts, data files, etc.), then add "BuildArch: noarch". The architecture for the binary RPM will then be "noarch".
- BuildRoot: This is where files will be "installed" during the "%install" process (which happens after the %build compilation process). Normally you should just leave this line alone; under the usual Fedora setup, this will be a macro that will create a new special directory under /var/tmp. Newer versions of RPM will ignore this value, and instead place the build root in "%{_topdir}/BUILDROOT/".
- BuildRequires: A comma-separated list of packages required for building (compiling) the program. These are not automatically determined, so you need to include everything needed to build the program. There are a few packages that are so common in builds that you don't need to mention them, such as "gcc"; see the Packaging Guidelines for the complete list of the packages you may omit. You can also specify minimum versions, if necessary, like this: "ocaml >= 3.08". You can have more than one line of BuildRequires (in which case they are all required for building). If you need file /EGGS, you can get its package by running "rpm -qf /EGGS"; if EGGS is a program, you determine its package quickly by running "rpm -qf
which EGGS". Try to specify only the minimal set of packages necessary to properly build the package, since each one will slow down a "mock"-based build (e.g., try to use sed instead of perl if you don't really need perl's abilities). Watch out: Some applications permanently disable functions if their package isn't detected during the build; in those cases you may need to include those additional packages. If you have trouble figuring out this list, the "auto-br-rpmbuild" command (from the auto-buildrequires package) may be helpful.
- Requires: A comma-separate list of packages that are required when the program is installed. Note that the list of packages for Requires (what's required when installing/running) and BuildRequires (what's required to build the binary RPM) are independent; a package may be in one list but not the other, or it could be in both. The dependencies of binary packages are in many cases automatically detected by rpmbuild, so it is often the case that you don't need to specify the Requires tag at all. But if you want to highlight some specific packages as being required, or require a package that rpm can't detect should be required, then add it here.
- %description - A longer, multi-line description of the program. Use American English. All lines must be 80 characters or less. "Blank lines are assumed to separate paragraphs. Some graphical user interface installation programs will reformat paragraphs... (lines that) start with whitespace, such as a space or tab, will be treated as preformatted text and displayed as is, normally with a fixed-width font." (per the RPM Guide).
- %prep - Script commands to "prepare" the program, that is, to uncompress it so that it will be ready for building (compiling). Typically this is just "%setup -q" or some variation of it; a common variation is "%setup -q -n NAME" if the source file unpacks into NAME. See the "%prep" section below for more.
- %build - Script commands to "build" the program, that is, to compile it and get it ready for installing. The program should come with instructions on how to do this. See the "%build" section below for more.
- %check - Script commands to self-test the program. This is run after %build and before %install, so you should place it there if you have this section. Often it simply contains "make test" or "make check". This is separated from %build so that people can skip the self-test if they desire. This isn't documented in many places.
- %install - Script commands to "install" the program. The commands should copy the files from the "build directory" %{_builddir} (which would be under ~/rpmbuild/BUILD) into the buildroot directory, %{buildroot} (which would normally be under /var/tmp). See the "%install" section below for more.
- %clean - instructions to clean out the build root. Typically:
rm -rf %{buildroot}
- %files - the list of files that will be installed. See the "%files" section below for more.
- %changelog - Changes in the package. Use the format example above.
- ExcludeArch: If the package does not successfully compile, build or work on an architecture, then those architectures should be listed in the spec in an ExcludeArch tag.
- You can add sections so that code will run when packages are installed or removed on the real system (as opposed to just running the %install script, which only does a pseudo-install to the build root). These are called "scriptlets", and they are usually used to update the running system with information from the package. See the "Scriptlets" section below for more.
Don't use the tags "Packager" or "Vendor". Don't use "Copyright" - use "License" instead. Don't create a "relocatable" package - they don't add value in Fedora yet they make things more complicated.
RPM supports subpackages, that is, a single spec file can generate many binary packages. For example, if the documentation is very large, you might generate a separate "-doc" subpackage. See below for more.
%prep 部分
"%prep" 部分描述了如何解包,以便构建。通常,这里有一组 "%setup" 部分,和(或) %patch 部分,其中包含 Source0:, Source1:等等。请见 Maximum RPM %setup 和 %patch 部分以了解细节。
警告: 在 spec 文件中,不要使用 in-line comments (a "#" comment on the same line after a command), and don't put macros (words beginning with "%") in a comment unless you quote the "%" as "%%". Macros can cause failures if they are in a comment, because they are always expanded (even when in a comment) and they can expand to multiple lines. This is true for %prep, %build, and so on.
The new RPM 4.4.2.x series adds two new macros, %{patches} and %{sources}, so you can do things like:
for p in %{patches}; do ... done
These new macros can be very useful if you have a large list of patches or sources. However, keep in mind that using these will make your spec incompatible with the rpm used in Fedora 9 and earlier, RHEL, and many other RPM-based distros.
%prep 部分: %setup 命令
The "%setup" command unpacks a source package, and takes several switches. Normally you should use "-q" (quiet) to prevent setup from babbling about every file it unpacks. Here are a few switches besides -q:
- -n name: If the name of the rpm is something other than what the Source unpacks to, use this switch to state the name it unpacks to. E.G., if the tarball unpacks into a directory MYNAME, use %setup -q -n MYNAME
- -c name: If the tarball doesn't unpack into a single directory, this creates a directory named name and then unpacks into it. Useful if you have one of those annoying tarballs that doesn't have a single common subdirectory embedded in it.
There are more %spec options if you are unpacking multiple files, which is primarily useful if you are creating subpackages (see below). The key ones are:
|-a number
|Only unpack the source directive of the given number, such as –a 0 for source0:, after changing to the directory.
|-b number
|Only unpack the source directive of the given number, such as –b 0 for source0:, before changing to the directory.
|Do not delete the directory before unpacking.
|Disable the automatic unpacking of the archives.
%prep 部分: %patch commands
The "%patch0" command applies patch 0 (similar for 1, 2, etc.). Patches are the normal way to change to the source code if necessary to package it. The normal "-pNUMBER" option applies, which simply passes that argument on to patch.
Patch file names often look like "telnet-0.17-env.patch", that is, %{name}-%{version}-patch_purpose.patch (some people omit -%{version}). Patch files are typically the result of a "diff -u"; if you do this from the subdirectory of ~/rpmbuild/BUILD, you won't have to specify a -p level later. You can use all the normal ways of creating a patch file.
If you're creating a patch file a single file FILENAME, a common way is to copy it to FILENAME.orig, modify it, and then save the results of "diff -u FILENAME.orig FILENAME". If you change directory to "~/rpmbuild/BUILD/NAME", you could create a patch file to change a single file by doing:
cp X/Y.Z X/Y.Z.orig vim X/Y.Z diff -u X/Y.Z.orig X/Y.Z > ~/rpmbuild/SOURCES/PKGNAME.REASON.patch
If you're going to edit many files, one easy method is to copy the whole subdirectory underneath BUILD, and then do subdirectory diffs; once you change directory to "~rpmbuild/BUILD/NAME", you can:
cp -pr ./ ../PACKAGENAME.orig/ ... many edits ... diff -u ../PACKAGENAME.orig . > ~/rpmbuild/SOURCES/NAME.REASON.patch
If you edit many files in one patch, you can also copy the original files using some consistent ending such as ".orig" before editing them. Then, you can use "gendiff" (in the rpm package) to create a patch with the differences. Do "man gendiff" for more information.
Try to ensure that in your patch the "context" matches exactly. In old versions of Fedora, the default "fuzz" value was 2, which meant that imprecise matches were acceptable. However, the version of RPM used by Fedora 10 and later have a default fuzz to 0, requiring that matches be exact. You can work around this by adding "%global _default_patch_fuzz 2", but it's better to not have the problem by making the patch match the context exactly.
As explained in Packaging/PatchUpstreamStatus, all patches in Fedora spec files SHOULD have a comment above them about their upstream status. This should document the upstream bug/email that includes it (including the date), or if it's Fedora-unique, why it is unique. The Fedora Project focuses, as much as possible, on not deviating from upstream in the software it includes in the repository - see Staying close to upstream projects for more about why it's important to do this.
%prep 部分: Unmodified files
Sometimes, you'll package just a straight file that doesn't need to be uncompressed, e.g., a "Source1:" that is just a simple PDF file. These might not be from external sources, e.g., perhaps you've had to create a few additional files that weren't in the original sources so that the package cleanly installs in Fedora. You can "prep" those into the build directory by doing this (replace "1" with whatever number it is):
cp -p %SOURCE1 .
%build 部分
The "%build" 部分 is sometimes complicated; here you configure and compile/build the files to be installed.
Many programs follow the GNU configure approach (or some variation). By default, they will install to a prefix of "/usr/local" (/usr/local/bin, /usr/local/lib, etc.), which is a reasonable default for unpackaged files. However, since you are packaging it, you will want to change the prefix to "/usr", since this is now a package maintained by the system itself. If there are any libraries, they'll need to be installed in the right directory, which is either /usr/lib or /usr/lib64 depending on the architecture (the actual value is in %{_libdir}).
Since the GNU "configure" system is so common, rpm pre-defines a macro named "%configure", which invokes GNU configure with the right options (e.g., it changes --prefix to /usr). This means that some variation of this will often work as a build command:
%configure make %{?_smp_mflags}
Sometimes you'll want to override the variables of a makefile; you can easily do that by passing them as parameters to make, like this:
make %{?_smp_mflags} CFLAGS="%{optflags}" BINDIR=%{_bindir}
If you need to do something complicated with GNU-generated configure, take a look at "GNU autoconf, automake, and libtool". A good presentation on these as well as "make" is "Open Source Development Tools: An Introduction to Make, Configure, Automake, Autoconf" by Stefan Hundhammer.
Some programs use Cmake. See Packaging/cmake for some suggestions.
If you include some self-tests (and that's a good idea), put them in a separate "%check" 部分 that immediately follows the "%build" area, instead of including them in %build. That way, it will be easy for the system to skip unnecessary self-tests.
%check 部分
"%check" 部分负责测试,与 "make test" 产生的效果一致。 不过,绝大多数软件包并没有包含这步,因为 RPM 都会在严格的测试后放出。
%install section
The "%install" section is a set of script commands to "install" the program. The commands in this section should copy the files from a directory inside the "build directory" %{_builddir} (normally ~/rpmbuild/BUILD/something) into the build root directory, %{buildroot} (normally /var/tmp/something), creating the directories inside %{buildroot} as necessary.
Watch out: Some of the terminology is very misleading:
- The build directory (under which compilations occur during %build) and the build root (where files are copied into during the %install process) are different. The point of the %install process is to copy files, such as those under the build directory, to the right place in the build root. Perhaps "buildroot" should be called "installroot", but it's too late now, the terminology is entrenched.
- The build directory is normally ~/rpmbuild/BUILD, while the build root (where files get installed to during %install) is normally ~/rpmbuild/BUILDROOT. The %prep stage will normally create a subdirectory underneath the build directory as part of %setup, and populate the build directory with files (based on the source information in %_sourcedir, which is typically in ~/rpmbuild/SOURCES). During %build, the current directory will actually start at %{buildsubdir}, that newly-created subdirectory under the build directory. Typically %{buildsubdir} is something like ~/rpmbuild/BUILD/%{name}-%{version}.
- The "%install" script is not used when the binary rpm package is installed by the end-user!! The term "%install" is misleading, in fact, the script must not install the programs in the REAL final locations (e.g., in /usr/bin), but under the buildroot %{buildroot}.
Normally, the install script would first erase the %{buildroot} directory, and then do some variation of "make install" (ideally using DESTDIR=%{buildroot}, if the program supports it). Here's an example of an %install section:
%install rm -rf %{buildroot} make DESTDIR=%{buildroot} INSTALL="install -p" CP="cp -p" install
Ideally, every program would have a "make install" command that supported the DESTDIR convention. If the program includes a "make install" that supports DESTDIR, where possible, use it. The DESTDIR convention supports redirecting file installations to descend from a specific directory, which is exactly what we want during %install.
Installing a program that does not support DESTDIR can be much harder, and no option is as good as native DESTDIR support. Consider these alternatives:
- Patch the makefile so that it does support DESTDIR. Create directories inside DESTDIR where necessary (feel free to use "mkdir -p", the "-p" option of mkdir is now standard and widely supported). Be sure to submit the patch upstream.
- Use "%makeinstall". Many older RPM documents suggest using "%makeinstall", which might work if "make install" doesn't support DESTDIR. However, as noted in the Fedora guidelines, the %makeinstall macro "must NOT be used when make install DESTDIR=%{buildroot} works. %makeinstall is (merely) a kludge that can work with Makefiles that don't make use of the DESTDIR variable...". Unfortunately, this sometimes has subtle failures, which is why %makeinstall should not be used if DESTDIR works. The reason is based on how %makeinstall works. The "%makeinstall" macro expands to something like "make prefix=%{buildroot}%{_prefix} bindir=%{buildroot}%{_bindir} ... install". Many programs will quietly recompile or change parts of the program when values like prefix are changed, resulting in an incorrect installation. See the Fedora guidelines if you want the details on why this approach can fail. You will probably need to create appropriate directories inside %buildroot before calling %makeinstall (e.g., mkdir -p %{buildroot}%{_bindir}/).
- Consider using the auto-destdir package. This requires "BuildRequires: auto-destdir", and changing "make install" to "make-redir DESTDIR=%{buildroot} install". This only works well if the installation uses only certain common commands to install files, like cp and install; see "man make-redir" for details.
- Do the installation "by hand", that is, instead of invoking a build system, copy the files to the correct locations. Basically, this would be a sequence that would create directories that weren't already created by the "BuildRequires" packages (typically using install -d or mkdir -p), followed by copying of files from the current directory (inside the build directory) into the buildroot directory (typically using "cp -p" and/or "install -p"). Running "make -n install" may make it easy to determine what this sequence should be. Be sure to create directories inside %buildroot where necessary. One serious problem with this approach is that it's easy to fail to install new or renamed files during an update—so if there's a better approach, use it instead. If you do perform the installation "by hand", be especially careful with updates when using this approach. For example:
%install rm -rf %{buildroot} mkdir -p %{buildroot}%{_bindir}/ cp -p mycommand %{buildroot}%{_bindir}/
As noted in the packaging guidelines' timestamp section, "when adding file copying commands in the spec file, consider using a command that preserves the files' timestamps, eg. cp -p or install -p". So, if the makefile lets you override the install command (typically named INSTALL), you might want something like INSTALL="install -p" CP="cp -p" as make parameters, like this:
make INSTALL="install -p" CP="cp -p" DESTDIR=%{buildroot} install
%files section
The %files section identifies what files and directories were added by the package - and thus, which files and directories are owned by the package. Ownership is important - when you type "rpm -qif blah", you'll see who owns blah. This section is used when performing the bin stage, to determine which files are placed into each binary RPM file.
%files Basics
The %files section normally begins with a %defattr line which sets the default file permissions. The format of this is %defattr(<file permissions>, <user>, <group>, <directory permissions>), that is, one can specify the permissions to apply to files and directories in the %files section. The fourth parameter is often omitted. Usually one uses %defattr(-,root,root,-), where "-" means "use the default permissions".
This is followed by names or patterns of the directories or files to be installed and owned by this package. You should use macros for directory names, e.g., use %{_bindir}/myfile instead of /usr/bin/myfile, and %{_sbindir}/killaccount instead of /usr/sbin/killaccount. If a name or pattern begins with "/" when expanded, then it is presumed to have been copied into the %{buildroot} followed by that pattern; when installed on the final system, it will be copied into that name without the buildroot prefix. If you don't precede the pattern with "/", then it is presumed to be in the current directory (e.g., inside the build directory) - this is used for "documentation" files. So if your package just installs /usr/sbin/mycommand, then your %files section could simply say:
%files %defattr(-,root,root,-) %{_sbindir}/mycommand
Any file or directory identified in the %files section is owned by the defining package. You should make sure that you declare ownership of every new file or directory the package creates. You can use wildcards (*) which match a set of files - this makes the package less sensitive to changes. For example, you can declare that all the files that were copied into %{buildroot}/usr/bin are owned by this package by declaring:
Note that "%{_bindir}/*" does not claim that this package owns the /usr/bin directory - it claims that all the files that were installed inside the build root 's /usr/bin are owned by the package. If you list a directory in the %files section, then you are claiming that this package owns that subdirectory and all files and directories in it, recursively (all the way down) if they are present in the build root. Do not list the "/usr/bin" or "%{_bindir}" directories directly in your %files list, because that would claim ownership of /usr/bin and everything inside it. Claiming ownership of "%{_bindir}/*" is fine, though; that just claims ownership of the subdirectories and files you placed under %{buildroot}/%{_bindir}. If you create a subdirectory such as %{_datadir}/%{name}, (/usr/share/NAME), you should include that directory in the %files list:
It's usually easier to use wildcards for filenames, and that's also better at coping with changes in upstream. Older RPM documentation typically shows long lists under %files with individual names, such as /usr/bin/program1 followed by /usr/bin/program2. Because of the way Fedora now uses buildroots, that is no longer necessary.
It's an error if no file matches the wildcard of a line, so only note the directories that actually matter. Also, you can't identify the same file or directory more than once. Finally, it's an error to have something in the buildroot and not listed under %files; the whole point of copying something into the buildroot is because you intend to have it installed in the final system. If you don't intend that, remove those files during the %install process.
It is also possible to exclude files from a previous match by using a %exclude glob. This can be useful for including "almost all" of the files that match a different glob. However, note that, like any other file glob, even a %exclude glob will fail if it matches nothing. (This might be considered counterintuitive, as the whole point is essentially to ensure that a certain file ISN'T there, so this rule is especially important to remember.)
%files prefixes
You may need to add one or more prefixes to a %files entry (if more than one, use a space to separate them).
Typically there is a "%doc" entry with a list of documentation files that didn't get copied into the buildroot; usually there is at least a README and LICENSE file. You must include the license file, if there is one. You may prefix some of these with %attr(mode, user, group) to set the file permission mode, user, or group. You don't need to claim ownership of the /usr/share/doc/%{name} directory, that's automatic if there's a %doc entry. Any %doc entry must not affect the runtime of the application (if it is in %doc, the program must run properly if it is not present).
There is a potential 'gotcha' with %doc entries: if you have a %doc entry, then you can't use commands during %install to copy files into the documentation directory descending from %_defaultdocdir. That's because if there's a %doc entry, rpmbuild will automatically remove the docdir files created by %install before installing the files listed with %doc. This can hit you if, for example, you want an "examples" subdirectory in the documentation directory. In this case, don't use "%doc" to mark documentation. Instead, create the directories and copy the files into %{buildroot}%{_defaultdocdir}/%{name}-%{version}/ during %install, and make sure that %files includes an entry for "%{_defaultdocdir}/%{name}-%{version}/". They will still be correctly marked as documentation.
If you save configuration files (under /etc - don't put them under /usr), you should normally prefix them with %config(noreplace) unless this program version uses a non-backwards-compatible configuration format (in which case, prefix them with %config).
Prefixing a %files entry with "%attr(mode, user, group)" lets you set the permissions for particular file(s), e.g., "%attr(0644, root, root)". A "-" means "use the default".
If a file is in particular natural language, use %lang to note that. E.G.:
%lang(de) %{_datadir}/locale/de/LC_MESSAGES/tcsh*
Programs using Locale files should follow the recommended method of handling the i18n files:
- find the filenames in the
%find_lang ${name}
- add the required build dependencies:
BuildRequires: gettext
- use the found filenames:
%files -f ${name}.lang
Some documentation claims that %license and %readme are valid prefixes; they are not valid in Fedora. Use %doc instead.
%files and Filesystem Hierarchy Standard (FHS)
You should follow the Filesystem Hierarchy Standard (FHS), i.e., ordinary application executables go into /usr/bin, global configuration files go into /etc, ordinary libraries go into /usr/lib, and so on, with one exception: executables that should not normally be executed directly by users or administrators should go into a subdirectory of /usr/libexec; usually you'd refer to the necessary directory as "%{_libexecdir}/%{name}".
You shouldn't be installing files under /usr/local; that is where unpackaged files go. Typically there will be a "prefix" attribute that lets you set the prefix to be "/usr" instead of "/usr/local".
Unfortunately, many programs' "normal" installation routines do not follow the FHS. In particular, many programs normally place architecture-independent libraries under /usr/lib, instead of under /usr/share as the FHS requires. The FHS /usr/lib section says that /usr/lib is for architecture-dependent data (e.g., ELF files like .so files), while /usr/share is for architecture-independent data. That way, systems with different CPUs can share /usr/share. There are many exceptions to this rule in Fedora (e.g., Python and Perl), but Fedora applies this rule more strictly than some distributions. Note, for example, that rpmlint will complain if you put just about anything other than ELF files into /usr/lib.
%files example
Here's a simple example of a %files section:
%files %defattr(-,root,root,-) %doc README LICENSE %{_bindir}/* %{_sbindir}/* %{_datadir}/%{name}/
Finding duplicates
The Fedora guidelines require that "A Fedora package must not list a file more than once in the spec file's %files listings."
You can list any duplicates of two binary packages by doing:
cd ~/rpmbuild/RPMS/ARCH # Substitute "ARCH" for your architecture rpm -qlp PACKAGE1.*.rpm | sort > ,1 rpm -qlp PACKAGE2.*.rpm | sort > ,2 comm -12 ,1 ,2
You can add sections so that code will run when packages are installed or removed on the real system (as opposed to just running the %install script, which only does a pseudo-install to the build root). These are called "scriptlets", and they are usually used to update the running system with information from the package.
The scriptlets in %pre and %post are run before and after a package is installed (respectively). The scriptlets %preun and %postun are run before and after a package is uninstalled. The scriptlets %pretrans and %posttrans are run at start and end of a transaction. See Packaging/ScriptletSnippets for more examples and details. For example, every binary RPM package which stores shared library files (not just symlinks) in any of the dynamic linker's default paths, must call ldconfig in %post and %postun (post-install and post-uninstall). If the package has multiple subpackages with libraries, each subpackage should also have a %post/%postun section that calls /sbin/ldconfig. For example:
%post -p /sbin/ldconfig %postun -p /sbin/ldconfig
Beware: The "-p" option specifies what command processor to use for the commands on the following lines. If there are no following lines, then using /sbin/ldconfig as the "command processor" is a minor efficiency improvement compared to putting "/sbin/ldconfig" on the next line, and letting the shell invoke it. That's because by using "-p", the shell isn't invoked simply to invoke a single program. But if you have multiple shell commands, don't use "-p" or /sbin/ldconfig after it! Instead, leave it blank, and include the shell commands under it.
If you are going to run programs in scriptlets, they must be installed before you run them. You have to use special variants of the "Requires:" tag, so that the program will be installed before you try to use it. These are of the form "Requires(CONTEXT):", e.g., "Requires(post)".
Most scriptlets (%pre, %post, %preun, and %postun) provide an argument you can use, accessed via $1, which is the number of packages of this name which will be left on the system when the action completes. Don't compare for equality with 2; check if they are greater than or equal than 2, since users can arrange to have multiple versions of a package installed simultaneously. For %pretrans and %posttrans, $1 is always 0.
For example, after adding an info manual to the system the dir file which indexes the info manuals should be updated. Basically, after you install the info manual, you need to run the program install-info. That's fine, except that install-info is part of package info, and there's no guarantee that info is installed unless we require it. Also, if "install-info" fails, we don't want to fail all processing. Here's one way to do that:
Requires(post): info Requires(preun): info ... %post /sbin/install-info %{_infodir}/%{name}.info %{_infodir}/dir || : %preun if [ $1 = 0 ] ; then /sbin/install-info --delete %{_infodir}/%{name}.info %{_infodir}/dir || : fi
There is another glitch related to installing info files. The
install-info command will update
the info directory, but we have to prevent the install of a useless, empty directory file from the
RPM_BUILD_ROOT environment, by deleting it in the
%install section:
rm -f $RPM_BUILD_ROOT%{_infodir}/dir
Another scriptlet-like abilility are triggers. You can define triggers for when other packages are installed or uninstalled. See Maximum RPM for more information about triggers.
Spec files may contain "macro" references (text beginning with "%"), which are replaced with other values. You can follow % by a word, e.g., "%name", but just like shell variables you must bracket the name with {...} if letters or digits immediately follow, e.g., "%{name}".
As noted in the Packaging Guidelines, There are two styles for referring some values such as the rpm Build Root and Optimization Flags:
- "macro style": %{buildroot}, %{optflags}
- "variable style": $RPM_BUILD_ROOT, $RPM_OPT_FLAGS
Pick a style and use it consistently throughout your packaging; this document uses "macro style".
Here are some typical macros:
|Typical Expansion
|Binary directory (where executables are usually stored)
|Build directory; files are compiled a subdirectory of the build directory. See %buildsubdir.
|Build root, where files are "installed" during %install. The %install stage copies files from a subdirectory of %{_builddir} to a subdirectory of %{buildroot}. Historically %{buildroot} was in "/var/tmp/".
|Build subdirectory, where files are compiled during %build. It's under %{_builddir}, set after %setup.
|Share directory.
|Default documentation directory.
|Distribution+version short name (e.g., ".fc9")
|Number of fedora release (e.g., 9)
|Name of package, set by Name: tag
|Version of package, set by Version: tag
To see more about macros you can look in /etc/rpm/* and the "macros" files under "/usr/lib/rpm/", especially /usr/lib/rpm/macros. You can also use "rpm --showrc" to show the values rpm will use for all of the options currently set in rpmrc and macro configuration files.
You can set your own macro values using %global; be sure to define them before you use them. Macro definitions can refer to other macros. For example:
%global myvalue 50
You can use rpmbuild to find the value of some macro, using its "-E" (--eval) option. For example, to find the current expansion of %{_bindir} in myfile.spec, you can run:
rpmbuild -E '%{_bindir}' myfile.spec
Packaging/RPMMacros has more information on macros, as does RPM Guide chapter 9.
We noted the "Requires" and "BuildRequires" tags earlier. There are a few other tags for controlling dependencies: Provides, Obsoletes, Conflicts, and BuildConflicts.
- "Provides:" lets you list virtual package names that this package provides. Sometimes there are several different packages that can provide a function, and using packages won't care which one. In that case, each of the packages that provide the function should "provide" a virtual package, and then using packages can list the virtual package name under "Requires:". For example, several different packages might provide "latex"; if you depend on the virtual package "tex(latex)", then users can choose which package to get "latex" from. If you provide virtual packages, you might also want to use the "alternatives" system, but be careful: "alternatives" settings are system-wide, so if multiple users on the same system might want different defaults, don't use the alternatives system. You can find out what a given package provides (both virtual and non-virtual names) by querying "rpm -q --provides PACKAGENAME". Some virtual packages in Fedora are:
- MTA : Used for mail transport agents, such as sendmail.
- tex(latex) : Used for latex
- "Obsoletes:" lets you state that installing this package should (normally) cause the removal of the other named package(s). This is useful when a package's name changes, or when a package wholly replaces a different package.
- "Conflicts:" lets you state what packages cannot be installed simultaneously this one. Obviously, try to avoid this if you can; see Packaging/Conflicts if you think you need to use it.
- "BuildConflicts:" lets you state what packages cannot be installed when building this package. Obviously, try to avoid this if you can.
You can control which architectures a package builds (or doesn't build). For example, if your package can't compile on ppc, you can do this:
ExcludeArch: ppc
There's also an "ExclusiveArch" tag. The valid architectures one can specify in these tags are listed in the Architectures section.
A spec file can define more than one binary package, e.g., client and server, or runtime and developer packages. If there's a large amount of documentation, it may be split into a NAME-doc subpackage. You will always have one spec file and one source RPM (SRPM), even if there are multiple binary RPMs that they generate. A spec file that produces multiple binary packages still has only one creation process, so there is only one %prep, %build, %check, and %install section that creates all the files for all the packages.
In a spec file, use the %package directive to start defining a subpackage:
%package sub_package_name
By default, the subpackage name is PACKAGE_NAME, "-", SUBPACKAGE_NAME; you can use "-n" to override this and make a new name:
%package -n new_sub_package_name
After the %package directive, list the tags for the subpackage. This should include at least the "Summary:" and "Group:" tags and directives "%description SUBPACKAGE_NAME" and "%files SUBPACKAGE_NAME". Anything not specified by the subpackage will be inherited from its parent. For the directives, if you used "-n" with %package, you'll need it again for these directives. You need to specify the name for the other directives, e.g., %pre and %post, if you use them in the subpackage.
See the RPM Guide section on subpackages for more information.
You can insert conditional statements. E.G., you can test if you are creating a binary for a certain architecture with:
%ifarch ARCHITECTURE_NAME
the negated version with:
%ifnarch ARCHITECTURE_NAME
or the more general conditional:
%if TRUE_OR_FALSE
There is an optional "%else" section; all of these are closed with "%endif".
Application Specific Guidelines
There are many application-specific guidelines that can help you (e.g., for specific programming languages, applications, libraries, and build systems). Many of them are listed as part of the Application Specific Guidelines of Packaging/Guidelines. Examples of application-specific guidelines are those for:
Failing that, some other ways of finding application-specific help are:
- The 'SEARCH' command on Fedoraproject.org.
- PackagingDrafts
- A Special Interest Group (SIG)
- Wiki pages prefixed with 'Packaging'
Miscellaneous hints
Try to write your scripts so that when upstream makes changes, the packaging is likely to work when you change the version number and reload the source file(s). For example, if it contains *.txt files with execute bits, instead of doing:
chmod a-x Filename1.txt Filename2.txt Filename3.txt
consider doing this, which will handle new filenames that use the same file naming convention:
chmod a-x *.txt
If you want to see lots of examples of scriptlets, you can show all the scriptlets on installed programs using:
rpm -qa --queryformat "\n\nPACKAGE: %{name}\n" --scripts | less
Packaging/FrequentlyMadeMistakes has information on frequently-made mistakes.
Don't try to interact with the user; RPM is designed to support batch installs. If an application needs to show a EULA, that needs to be part of its initial execution, not its installation.
You might not want to start services, because in a big install that could slow things down. If you install an init script, consider using chkconfig to arrange for the service to be started and stopped on the next reboot. Before uninstalling you should normally try to stop its services if it's running.
Uninstall should reverse most changes made during installation, but don't remove any user-created files.
Normally, if there are binary executables, a separate "debug" package is created with the symbols, and the symbols are stripped from the normal binary packages. If this shouldn't happen, you can disable the package-creation and stripping with:
%global _enable_debug_package 0 %global debug_package %{nil} %global __os_install_post /usr/lib/rpm/brp-compress %{nil}
To prevent stripping you may also need to do this in the %install section:
export DONT_STRIP=1
A way to check for the version of Fedora in a spec file for conditional builds is:
%if 0%{?fedora} <= <version>
(The ? causes the macro to evaluate to blank if %fedora is not defined, and this causes the end result to be "0", which is a number and thus ok, while not interfering with the result if there is actually a value for %fedora.)
Note that the previous trick DOES NOT work in Koji "scratch" builds - %fedora is set during the creation of a source RPM. (Thus, this trick does work in actual Koji builds as the system extracts sources from the source RPM and rebuilds the source RPM with the appropriate %fedora value.)
There are also some recommendations and controversial tricks on PackageMaintainers/Packaging Tricks.
GUI programs must have a desktop entry (so that people can invoke it from a graphical menu). The Fedora packaging guidelines discuss desktop files. See also the desktop entry spec (for .desktop files) and icon theme spec (for icon-related materials such as those in /usr/share/icon).
Older RPM documents
Some older documents about RPM have the most information, but some older documents make claims that are no longer true:
- rpm files are no longer placed in a shared /usr/src/redhat directory. This is an obsolete way of using rpm and not recommended; modern systems set a %{_topdir} instead like ~/rpmbuild.
- the %install process does not install files in their final location. Instead, it "installs" files to the buildroot.
- The "rpm" command no longer creates packages (e.g., "rpm -ba" was once legal). Use the separate "rpmbuild" program instead.
- Many historical specs use the "%define" command to define macros. However, "%define" creates a locally defined submacro within other macro definitions; this is very rarely needed, and using %define incorrectly can cause subtle bugs. For nearly all uses, use "%global" instead. (See PackagingDrafts/global_preferred_over_define.)
- The "BuildRoot:" value is now ignored.
Quick test with rpmlint
Before trying to build anything from it, you should run rpmlint on the spec file:
rpmlint program.spec
This will catch many errors early. If the reported error doesn't make sense, run it again with the "-i" option (this gives longer messages).
Generally, you should not have errors from rpmlint, but sometimes rpmlint is excessively noisy. The Fedora packaging guidelines explain which ones to ignore, e.g., ignore "no-packager-tag" and "no-signature" errors.
Creating RPMs from the spec file
Once you've create a spec file, say "program.spec", you can create source and binary RPMs by simply running this:
$ rpmbuild -ba program.spec
If this works, then your binary RPM files will be created underneath ~/rpmbuild/RPMS/ and the source RPM will be in ~/rpmbuild/SRPMS.
When things go wrong, you can "cd" into the appropriate directory and see what's left over. If you want to skip earlier stages, use the "--short-circuit" option; this is handy if you had a successful build, but have an error in the %install section. For example, to restart at the %install stage (skipping earlier stages), do this:
$ rpmbuild -bi --short-circuit program.spec
If you just want to create a source RPM (.src.rpm), do this in the SPECS directory:
rpmbuild -bs program.spec
This will create the source RPM in ~/rpmbuild/SRPMS. Creating only a source rpm (.src.rpm) is quite quick, because rpm simply needs to copy the .spec file and associated SOURCES files into a .src.rpm file. Creating a binary rpm typically takes much longer, because this requires running the %prep, %build, and %install scripts.
Testing RPMs you've built (including rpmlint)
Run rpmlint on the .spec files, generated binary RPM, and generated source RPM. Rpmlint works on .spec files, binary RPMs, and source RPMs, finding different things in each. You need to eliminate or justify rpmlint warnings before posting a package. If you are in the SPECS directory, do this:
$ rpmlint NAME.spec ../RPMS/*/NAME*.rpm ../SRPMS/NAME*.rpm
Normally rpmbuild will build a binary RPM with debugging information - this will handle that.
If you "cd" to the "~/rpmbuild/RPMS" directory, and then cd to the architecture subdirectory, you'll find some binary rpms. You can quickly see their files and their permissions by using rpmls (check to see that they are what you expect):
$ rpmls *.rpm
If those look okay, you can become root and try to install them:
# rpm -ivp XYZ1.rpm XYZ2.rpm XYZ3.rpm ...
Then, you can test them out. Use it a few different ways and see if it works correctly. If it's a GUI tool, make sure it shows up in the menu (if it doesn't, something is wrong with your .desktop entry).
You can uninstall packages later using:
# rpm -e XYZ1 XYZ2 XYZ3
If that works, you can use Mock to do a more rigorous test that you have accurate build dependencies. Basically, mock will create a nearly-empty environment and try to rebuild the package; if it fails, then you forgot to list something in a "BuildRequires:" statement. See Using Mock to test package builds for more information about how to use Mock; once your account is a member of the "mock" group, you can run commands like this to do local testing:
$ mock -r fedora-9-i386 rebuild path_to_source_RPM
If a mock build fails, or the resulting program doesn't work correctly, then you almost certainly have one or more missing BuildRequires packages.
Once Mock works on your system, you can use Koji (which uses Mock) to do builds on many different systems, some of which you may not have. PackageMaintainers/Join and PackageMaintainers/UsingKoji have more information about Koji. Once it's set up, you can test your source RPM on a variety of platforms by running commands like:
$ koji build --scratch dist-f9 path_to_source_RPM
You can replace dist-f9 with dist-f8, dist-f10, etc., to try other releases. Don't use "dist-rawhide", that's not really rawhide. Remember, the values of %fedora, %fc9, etc., will not be correct for a scratch build, so this won't work if your spec file does something different based on those values.
Your koji builds can only depend on packages that are actually in the TARGET distribution repository. Thus, you can't use koji to build for released distributions if your package depends on other new packages that Bodhi hasn't released yet. You can use koji to build for rawhide (the next unreleased version), even if it depends on other new packages, as long as the other packages were built in the CVS "devel" section as described below. If you need to build against a package that is not yet a stable released update, you can file a ticket with rel-eng at: https://fedorahosted.org/rel-eng/newticket and request that that package be added as a buildroot override.
Helpful tools
The "rpmdevtools" package has a number of helpful tools; "rpm -qil rpmdevtools" will show you what it installs. One particularly useful tool is rpmdev-bumpspec, which has this form:
rpmdev-bumpspec --comment=COMMENT --userstring=NAME+EMAIL_STRING SPECFILES
rpmdev-bumpspec will bump the release tag in the spec file(s), and add a changelog comment with the right datetime and version format. COMMENT should typically start with "- ".
Similarly, "yum-utils" has a number of yum-specific tools. "yumdownloader" is especially helpful; you can download the source RPM of a package by simply running "yumdownloader --source PACKAGENAME". You can then use "rpm -U SOURCEPACKAGENAME" to install the source files. E.G., "yumdownloader --source glib; rpm -Uvh glib*.src.rpm".
The auto-buildrequires package has a pair of nice tools for helping to figure out the proper BuildRequires entries. After installing this package, replace "rpmbuild" with "auto-br-rpmbuild" and you'll see an automatically-generated buildrequires list.
You might find RUST useful (GPL). It is "a drag & drop RPM creation GUI and a 'sandboxing' toolkit that allows you to do software installations within a chrooted environment and automatically generate RPMs from arbitrary source code, without ever seeing a spec file." If you're creating spec files, it can help you determine the %files. Note, however, that it does not create .spec files, nor does it create packages of adequate quality for the Fedora repository; it is primarily a tool for making quick-and-dirty binary RPM packages. (Note: it is no longer at "rusthq.com".)
Alien converts between package formats. It won't produce clean source RPMs, but converting an existing package might provide helpful information.
Guidelines and rules
When you create your packages, you'll need to follow the following rules and guidelines:
- How to join the Fedora Package Collection Maintainers - describes the process for becoming a Fedora package maintainer
- Packaging Guidelines
- Package Naming Guidelines
- Dist Tag Guidelines
- Package Review Guidelines
There are many official guidelines that will help you with specific circumstances (Java programs, OCaml programs, GNOME programs, etc.); the Packaging Guidelines include cross-references to those guidelines. You can also learn more from the SIGs and Package Maintainers sections. You can also see the list of all Wiki pages about Packaging to see if any apply.
Failing that, you might find some useful recommendations in the unofficial Packaging Drafts and Packaging Drafts To Do. These are unofficial, obviously. You might find ideas from SuSE, Debian, but distributions differ in their rules, so do not presume they can be used directly.
The .spec files that you create must be open source software, as noted in the CLA.
一旦您的软件包被批准放入官方软件源,您需要维护或者协助维护它。 请见 Package update HOWTO 和 Package update guidelines 以便了解更多。 如果您为多个不同的 Fedora 版本维护软件包,有空一定要为之前的 Fedora 版本也制作一个。
Encourage the upstream developers to use standard source code release conventions. Using standard conventions makes packaging much easier. For more information, see:
- Releasing Free/Libre/Open Source Software (FLOSS) for Source Installation (a quick summary)
- GNU Coding Standards release process
- Software Release Practice HOWTO
- Filesystem Hierarchy Standard (FHS)
- Packaging Unix software
软件包维护人员 页面加入了许多有用页面的链接,您不妨去看看。如何升级您维护的软件包 页面描述了如何升级您维护的在 Fedora 源里面的软件包。
- 如何在 Fedora 系统中制作RPM包——很简单的贯通介绍
- 使用 RPM 为软件打包(developerWorks): 第一章, 第二章, and 第三章
- Fedora Classroom had a IRC session on packaging and you can refer to the logs at https://fedoraproject.org/wiki/Building_RPM_packages_%2820090405%29
- Fedora 打包者手册
- 当 Sally 遇见 Eddie------一个较详细的 RPM 故事
- Maximum RPM Book——一个内容虽然最丰富,可惜早已过时的 RPM 教程 (由 Red Hat 公司撰写)
- Developer's guide, section on building RPMs
- Creating RPMS slides from Guru Labs
- The fight, my first attempt to make a readable rpm package building introduction.
- RPM Tutorial (Fullhart)
- Cambridge RPM tutorial is a presentation on creating basic RPMs
- 由 Donnie Barnes 撰写的 RPM 指南
- 由 DawsonRPM 撰写的 RPM 指南
- SuSE 构建向导SuSE 系统的 RPM 打包教程,不是针对 Fedora 的但是可以参考;Cross-distribution package HOWTO 倒是有很多针对不同发行版制作 RPM 包的指导。
- Mandriva RPM 指南 (alt) Mandriva 系统的 RPM 打包指南。注意: 在 Fedora 中, 万万不可重新压缩软件源代码,正如 Mandriva 官方提示,这样会导致软件无法完成自身校验。
- Creating Your Own Linux RPM's - The Initial Software Build is another brief intro, but it makes the point that "The process of building RPM's is much simpler than creating packages for Solaris... Fewer steps, and the ability to add all of your software information into one specification file, makes for a much tighter (and easier to modify or reproduce) software packaging system."
- All you need to know about RPM (more about installing packages than creating them)
- rpm.org的维基页面 也含有大量对您有用的信息,比如 已知的一些有关 RPM 机制的问题。
注意: rpm5.org 也有一些文档,但是请不要过度依赖这个网站的内容。这个网站是由 Jeff Johnson 维护的一个 RPM 5.x 版本的网站。事实上RPM 5.x 版本并不适用于 Fedora 系统!和 Novell/SuSE 系统一样,Fedora 采用的 RPM 安装器基于 rpm.org 维护的版本。 在 lwn.net 有一个关于这两者的简短区别介绍。


text:
The Delaware Republican Party victory party held at the Rollins Center at Dover Downs was supposed to be a jubilant affair where GOP members would celebrate Mitt Romney's victory, at least one victory among the big, statewide races and the Kent County Republicans would make some inroads in Democratically controlled areas with some young blood. Well, the young bloods could not make a dent, but at least most of the incumbents held, save for Lincoln Willis. That left the GOP feeling, if not blue, a little purple Tuesday night.
Kent County Republicans had some victories to celebrate Tuesday night but lost a few races that put somewhat of a damper on the "victory party" held at the Rollins Center at Dover Downs.
State Sen. Dave Lawson (R-Marydel), State Sen. Colin Bonini (R-Camden-Wyoming), State Rep. Donald Blakey (R-Camden) and State Rep. Bobby Outten (R-Harrington) all won re-election, as anticipated.
And young Republican Jeff Spiegelman won the District 11 seat in a tight race for the seat that moved down from the Wilmington area to the western portion of Kent County due to redistricting.
However, the Kent County GOP's hope to make inroads in other races, despite the Democratic opposition's superiority in numbers, failed to materialize. Namely, Democrat Charles "Trey" Paradee defeated incumbent Lincoln Willis for House District 29, State Rep. Darryl Scott (D-Dover) defeated Republican Sam Chick on his way to re-election and Democrat Andria Bennett soundly defeated Republican Ellis Parrott for the open seat in the House's District 32.
In addition, Republicans Kevin McCarthy and Pat Boyle lost respectively to Kent County Levy Court Commissioner George "Jody" Sweeney and Kent County Comptroller Georgette Williams, both Democrats.
"On Tuesday night we did not do as well as we had hoped," Kent County Republican Committee Chairman Hans Reigle said. "Without a doubt, Sussex County has become the stronghold of the Delaware GOP. It was the only county in which Mitt Romney won the popular vote.
"The Republican Party is outnumbered here in Kent County and we did not get as much down-ballot support among Democrats and independents as we would have liked from the Romney ticket," he said. "However, there were some success stories. Almost all of our incumbents were able to hold their seats and we won the newly created 11th Representative District race."
In addition, several candidates under the age of 30 ran solid, respectable races that gave Reigle hope.
"We are going to lean on them in the future to help strengthen the party," he said. "Additionally, we are going to try to expand our voter base by reaching out to young voters and community groups who are not happy with the status quo in Delaware."
As Bonini celebrated his victory Tuesday night, he acknowledged to the Dover Post that Kent County Republicans and the Delaware GOP as a whole had to do a better job of resonating with voters.
"We're in trouble. There's no question about it," he said. "But lots of states have been flipped over the years. It just takes a lot of hard work."


text:
Most people are happy just to have one job, but Darren Brock makes working an art form
Most people are happy just to have one job, but Darren Brock makes working an art form. He owns a construction company and several restaurant franchises in Davidson County.
Brock is a native of Davidson County and graduate of West Davidson High School. He started off as a general contractor until he started his own construction company, Brock Builders and Construction, in 1994.
Even though construction was his life-long career choice, he had always had an interest in owning other businesses. Brock bought his first Subway franchise after waiting for a tract of land he had bought in Tyro to have all the amenities he needed to open a business.
"I waited for five years until the sewer lines were built," Brock said. "I bought the land specifically to put a Subway there. I knew it was what people wanted in that area."
His next franchise was the purchase of a Godfather's Pizza, which he opened on N.C. Highway 150. Brock said he wanted to bring back the Godfather's name which used to be so popular years ago.
"Many people remember when there was a Godfather's in Salisbury or Winston Salem," he said. "But over the years, due to different reasons, the stores in this area have closed. I wanted to bring that restaurant back."
Although many people struggled during the economic downturn, Brock said that is not the reason he decided to begin purchasing restaurant franchises.
"I always had an interest in owning a franchise," Brock said. "The economic downturn wasn't really a factor for me."
But finances was one of the reasons Brock decided to move the Godfather's store from Tyro to its new location in Lexington. He said that he needed a place where his business could grow and the current location did not offer that option.
"We have been successful in Tyro and it is nothing against them," Brock said. "It is just that this location allows me to offer a buffet as well as serve alcohol. I have space to expand and to offer services I couldn't before."
The new Godfather's Pizza will be located on U.S Highway 64 West, across from Lexington Shopping Center. They are currently remodeling the building and have not yet determined when they will officially open.
But even owning three businesses was not enough for Brock; he is opening another Subway franchise in Denton in the near future.
Brock has combined his two passions by using his construction company to do the upkeep on his businesses. It also keeps the cost down by not having to pay someone else to do repairs. He has two long time workers, Wayne Everhart and Jason Empson, who are well versed at repair work as well as building.
Brock said that even though he is the one who is out doing all the leg work, he couldn't do it without the support of his wife, Kim.
"She has always been my biggest supporter," he said. "She would always tell me to go for it if it was something I wanted to do. And if I failed, which I have, she would be there to tell me to keep trying."
Brock has four children, Zach who is graduating with a business degree at the University of North Carolina in Wilmington. His daughter, Jessica, is getting married this fall in a church that he built. Their adopted daughter, Josie who is eight and their "surprise" baby, Heidi who is three years old.
"I definitely have enough to keep me busy," Brock said with a laugh.
During the limited time when he is not working, Brock said the family likes to camp. They have a Fifth Wheel camper-trailer that they have taken all over the country, including Niagara Falls. He says they have plans to go to the Grand Canyon soon.
Through it all, Brock said that it was his faith that has kept him centered and has allowed him the success he has had.
"God has my back," Brock said. "He is the reason I am where I am today. I give all the credit to him."
Sharon Myers can be reached at 249-3981, ext, 228 or at firstname.lastname@example.com.


text:
They can never play 4 quarters of football in one game.
They fly half the game and crash the second. I don't pretend to know the answer but its been up front the entire season.
Actually last season too. Even with the drops if they had played with the same enthusiam and execution in the second half they did in the first they would have won going away.


text:
Mock Table Talk
Each academic year, the Office of Student Professional Development recruits attorney volunteers from public interest and government organizations to visit the law school and re-create the typical public sector interview experience: "table talk" or walk up interviews.
In these interviews, students are not pre-selected, and while the interviews can take place one-on-one, they are generally in an open job fair setting (instead of private interview rooms). Public sector employers guage the students' interest by their willingness to engage in conversation and by their preparedness.
The mock interviews simulate the table talk experience inasmuch as possible, with volunteers seated at tables while students circulate to discuss the organizations, their work, and potential upcoming and future opportunities.
Students are given the opportunity to attend interview preparation workshops and Public Interest Career Information sessions prior to mock table talk simulations.
Announcements for the scheduling of Pubic Interest Career and interview workshops and mock table talk events are sent via e-mail and are posted to student and Symplicity events calendars.
Questions? Contact Beth Shackleford at firstname.lastname@example.com or at 706-542-5156, or stop by the Student Professional Development Office in Room 108.


text:
NewBridge Bank Park
NewBridge Bank Park
408 Bellemeade Street • Greensboro, NC 27401
336.268.2255 (phone) • 336.273.7350 (fax)
Greensboro's downtown stadium opened its gates to a crowd of 8,540 on April 3, 2005 with a Grasshoppers exhibition game against the Florida Marlins. This state-of-the-art facility features a 30' wide, open-air concourse, 36 concession points of sale, the Go Triad GrandStand outdoor sports bar, a kid-safe play park and numerous amenities.
The stadium's seating capacity currently stands at 7,499 which includes 5,300 chair back seats, 16 luxury suites and 2 grass berm and picnic areas, though the stadium was constructed to meet Class AA standards with room for expansion beyond. In November 2007, the stadium was renamed NewBridge Bank Park.
NewBridge Bank Park plays host to numerous additional events each year, including the ACC Baseball Tournament in 2010 and 2012. On May 26, 2012, the University of North Carolina took on North Carolina State University in a game that broke the attendance record for a college baseball game in the state of North Carolina. The crowd of 10,229 was also the largest ever for an ACC baseball game.


text: Music of NoteOpportunities to create and enjoy music abound at Hamline. Just walk by the practice rooms in Drew Fine Arts Center and you'll hear notes from any number of instruments and voices mingling in the hall. During the academic year there are multiple concerts and solo performances nearly every week in one of the on-campus venues. "Sundin Music Hall has encouraged a very lively music-making scene," professor and Music Department Chair Rees Allison said. "Almost any instrument that a student is interested in we can accommodate."In addition to the opportunities for solo instruction and recitals, ensembles offer the chance to connect with other music lovers and perform for audiences locally and even internationally. The Hamline A Cappella Choir has toured nationally as well as in Europe and South America. Semester long classes and January term study abroad courses also give students the chance to examine the academic side of music. "In the "Music in Central Europe" class we spent about three weeks traveling to places like Vienna, Prague, Leipzig, and Berlin," music major Haley Rheinhart said. "The trip centered around music history so we attended amazing events like operas and explored a lot of the places where great composers lived and worked."Rheinhart plays the violin and is a member of the Hamline Orchestra. Other established ensembles include: Hamline Winds, Women's Choir, and Jazz Ensemble. In addition, students can form their own small music groups. Rheinhart did just that last semester when she and some other students began their own chamber group. Students don't have to pursue a music major or minor to take private lessons or participate ensembles. Likewise, music students have the time and ability to explore other interests. "The nice thing about Hamline is that you can be very involved in music, but also participate in activities or student organizations you are interested in outside of the department," Rheinhart said. "There are a lot of chances to find new interests and be involved in all the things you enjoy." Hear more about music at Hamline from Rheinhart and Allison in the video below and check out the department's web page for details about all it offers.


text:
Press Release
Hosted by the Kennel Club of Philadelphia
National Dog Show returns to Philadelphia as Thanksgiving Day TV Special starts 2nd decade
Philadelphia, PA (OCT. 18, 2012) ---"The National Dog Show Presented by Purina®" and hosted by Kennel Club of Philadelphia (KCP) will return to Philadelphia for the fourth consecutive year this fall, continuing a tradition that started in 1879.
The shows will take place Saturday and Sunday, Nov. 17 and 18, at the Greater Philadelphia Expo Center at Oaks, where some 2,000 purebred canines will be on display for the public while competing for top honors in the ring. The weekend shows are "benched" format shows at which the public has the opportunity to interact with the dogs, learn about different breeds and talk with experts about owning a dog through the course of the day. Philadelphia is one of only five "benched" format shows remaining in the United States.
The KCP and its predecessor clubs have been involved with dog shows since an event in 1876 at the Centennial Exposition, presenting dog shows since 1879 and hosting the Philadelphia shows annually since 1933.
The National Dog Show competition on Saturday will be contested among some of the finest dogs in the world, with $20,000 in prize money and enormous prestige at stake. NBC will televise coverage of the show as a two-hour special on Thanksgiving Day, Nov. 22, immediately following the Macy's Thanksgiving Day Parade.
Returning this year to host the TV show is the renowned comedic actor, author, canine aficionado and TV personality John O'Hurley. He will be joined by expert analyst David Frei, who is an AKC-licensed judge and host of USA Network's "The Westminster Kennel Club Dog Show." NBC's Mary Carillo is the interviewer/reporter.
The annual celebration of the canine has had other statewide venues as its host in recent years, including Fort Washington, Harrisburg and Reading. The Greater Philadelphia Expo Center at Oaks is located just 20 miles from Center City Philadelphia. KCP officials expect 15,000 spectators from the mid-Atlantic region at the Expo Center over the weekend.
"The National Dog Show Presented by Purina®" debuted in 2002 as one of the year's most successful network television specials, prompting NBC and sponsor Nestlé Purina PetCare to commit long-term to the Thanksgiving Day time slot following the Macy's Parade. A huge ratings success over the past 10 years with a total annual audience approaching 20 million, it is by far the most widely viewed single telecast of a dog show in television history.
The event producer of "The National Dog Show Presented by Purina" is Carson International of Ketchum, ID, the world's most prominent producer and packager of canine events for live audiences and television.
About Nestlé Purina
Nestlé Purina PetCare Company is a global leader in the pet care industry and promotes responsible pet care, humane education, community involvement and the positive bond between people and their pets. The North American headquarters for Nestlé Purina is located at Checkerboard Square in St. Louis, Missouri. Nestlé Purina is part of Swiss-based Nestlé, the world's leading nutrition, health and wellness company.
Steve Griffith, 484 433 7757, email@example.com
Tim Davis, 610 540 0184 x30, email@example.com