Skip to content

Commit 49037b3

Browse files
committed
Generate the file lists in the .wxs files.
Unfortunately, this is fairly hairy, due to the fact that .wxs file lists are quite far from being simple lists of filenames. Wix comes with a tool (tallow) for creating these lists, but it seems to be principally intended for creating an initial .wxs file, which you then hand-edit. So it's not a good fit for our needs here. Instead, we use find+awk to generate the File elements.
1 parent 892dc7e commit 49037b3

File tree

2 files changed

+53
-131
lines changed

2 files changed

+53
-131
lines changed

dist-msi.sh

Lines changed: 47 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -78,14 +78,9 @@ RELEASE_DIR=releases/$NAME/v$RABBIT_VSN
7878
function main {
7979
get-sources
8080
gen-license-rtf
81-
gen-wxs
8281

8382
build-msm-msi
8483

85-
rm -f wix/dotnet-client-merge-module.wxs
86-
rm -f wix/dotnet-client-product.wxs
87-
rm -f wix/License.rtf
88-
8984
safe-rm-deep-dir tmp
9085

9186
echo "SUCCESS!"
@@ -98,10 +93,12 @@ function build-msm-msi {
9893

9994
cd wix
10095

96+
gen-wxs dotnet-client-merge-module.wxs
10197
candle -out ../tmp/wix/rabbitmq-dotnet-client-msm.wixobj dotnet-client-merge-module.wxs
10298
light -out ../tmp/wix/rabbitmq-dotnet-client.msm ../tmp/wix/rabbitmq-dotnet-client-msm.wixobj
10399
test "$SKIP_MSIVAL2" || MsiVal2.exe ../tmp/wix/rabbitmq-dotnet-client.msm ../lib/wix/mergemod.cub -f
104-
100+
101+
gen-wxs dotnet-client-product.wxs
105102
candle -out ../tmp/wix/rabbitmq-dotnet-client-msi.wixobj dotnet-client-product.wxs
106103
light -out ../tmp/wix/rabbitmq-dotnet-client.msi \
107104
../tmp/wix/rabbitmq-dotnet-client-msi.wixobj \
@@ -129,13 +126,50 @@ function get-sources {
129126

130127

131128
function gen-wxs {
132-
sed -e "s:@VERSION@:$RABBIT_VSN:g" \
133-
< wix/dotnet-client-merge-module.wxs.in \
134-
> wix/dotnet-client-merge-module.wxs
135-
136-
sed -e "s:@VERSION@:$RABBIT_VSN:g" \
137-
< wix/dotnet-client-product.wxs.in \
138-
> wix/dotnet-client-product.wxs
129+
set +x
130+
f=$1
131+
local IFS=''
132+
sed -e "s:@VERSION@:$RABBIT_VSN:g" <${f}.in | while read -r l ; do
133+
if [ -z "$l" -o -n "${l##@FILES *}" ] ; then
134+
echo "$l"
135+
else
136+
# This is fairly hairy, due to the fact that .wxs file
137+
# lists are quite far from being simple lists of
138+
# filenames. Wix comes with a tool (tallow) for creating
139+
# these lists, but it seems to be principally intended for
140+
# creating an initial .wxs file, which you then hand-edit.
141+
# So it's not a good fit for our needs here. Instead, we
142+
# use find+awk to generate the File elements.
143+
echo "$l" | (
144+
IFS=' '
145+
read -r intro args
146+
# Windows has its own find command. Make sure we get
147+
# the cygwin one.
148+
/bin/find $args -printf "%h %f\n" | awk '
149+
{
150+
path = $1 "/" $2;
151+
gsub("/", "\\", path);
152+
153+
id = $2;
154+
gsub("[^a-zA-Z0-9]", "", id);
155+
156+
split($2, shorta, "\\.");
157+
short = substr(shorta[1], 0, 8);
158+
ext = substr(shorta[2], 0, 3);
159+
count = 0;
160+
while (short in shorts) {
161+
count++;
162+
short = substr(short, 0, 7-length(count)) "_" count;
163+
}
164+
shorts[short] = 1;
165+
short = toupper(short) "." toupper(ext);
166+
167+
print "<File Id=\"" id "\" Name=\"" short "\" LongName=\"" $2 "\" Source=\"" path "\" Vital=\"yes\"/>"
168+
}'
169+
)
170+
fi
171+
done >$f
172+
set -x
139173
}
140174

141175

wix/dotnet-client-merge-module.wxs.in

Lines changed: 6 additions & 118 deletions
Original file line numberDiff line numberDiff line change
@@ -25,31 +25,15 @@
2525
</Directory>
2626

2727
<Directory Id='ExamplesFolder' Name='examples'>
28-
<Directory Id='BinExamplesFolder' Name='bin' FileSource='..\tmp\unzip\rabbitmq-dotnet-client-@[email protected]\bin\'>
28+
<Directory Id='BinExamplesFolder' Name='bin'>
2929
<Component Id='ExampleBinaries' Guid='1C270D1C-CD79-49D8-9413-E6211F52B5A8'>
30-
<File Id='AddClientExe' Name='AddClnt.exe' LongName='AddClient.exe' Vital='yes' />
31-
<File Id='AddServerExe' Name='AddServ.exe' LongName='AddServer.exe' Vital='yes' />
32-
<File Id='DeclareQueueExe' Name='DecQueue.exe' LongName='DeclareQueue.exe' Vital='yes' />
33-
<File Id='ExceptionTestExe' Name='ExcnTest.exe' LongName='ExceptionTest.exe' Vital='yes' />
34-
<File Id='LogTailExe' Name='LogTail.exe' LongName='LogTail.exe' Vital='yes' />
35-
<File Id='LowlevelLogTailExe' Name='LLogTail.exe' LongName='LowlevelLogTail.exe' Vital='yes' />
36-
<File Id='SendMapExe' Name='SendMap.exe' LongName='SendMap.exe' Vital='yes' />
37-
<File Id='SendStringExe' Name='SendStr.exe' LongName='SendString.exe' Vital='yes' />
38-
<File Id='SingleGetExe' Name='SnglGet.exe' LongName='SingleGet.exe' Vital='yes' />
30+
@FILES ../tmp/unzip/rabbitmq-dotnet-client-@[email protected]/bin -name *.exe
3931
</Component>
4032
</Directory>
4133

4234
<Directory Id='SrcExamplesFolder' Name='src'>
4335
<Component Id='ExampleSources' Guid='962896C3-D476-4C8E-B5F3-BE963D566A49'>
44-
<File Id='AddClientCs' Name='AddClnt.cs' LongName='AddClient.cs' Source='..\tmp\unzip\rabbitmq-dotnet-client-@[email protected]\projects\examples\client\AddClient\src\examples\AddClient.cs' Vital='yes' />
45-
<File Id='AddServerCs' Name='AddServ.cs' LongName='AddServer.cs' Source='..\tmp\unzip\rabbitmq-dotnet-client-@[email protected]\projects\examples\client\AddServer\src\examples\AddServer.cs' Vital='yes' />
46-
<File Id='DeclareQueueCs' Name='DecQueue.cs' LongName='DeclareQueue.cs' Source='..\tmp\unzip\rabbitmq-dotnet-client-@[email protected]\projects\examples\client\DeclareQueue\src\examples\DeclareQueue.cs' Vital='yes' />
47-
<File Id='ExceptionTestCs' Name='ExcnTest.cs' LongName='ExceptionTest.cs' Source='..\tmp\unzip\rabbitmq-dotnet-client-@[email protected]\projects\examples\client\ExceptionTest\src\examples\ExceptionTest.cs' Vital='yes' />
48-
<File Id='LogTailCs' Name='LogTail.cs' LongName='LogTail.cs' Source='..\tmp\unzip\rabbitmq-dotnet-client-@[email protected]\projects\examples\client\LogTail\src\examples\LogTail.cs' Vital='yes' />
49-
<File Id='LowlevelLogTailCs' Name='LLogTail.cs' LongName='LowlevelLogTail.cs' Source='..\tmp\unzip\rabbitmq-dotnet-client-@[email protected]\projects\examples\client\LowlevelLogTail\src\examples\LowlevelLogTail.cs' Vital='yes' />
50-
<File Id='SendMapCs' Name='SendMap.cs' LongName='SendMap.cs' Source='..\tmp\unzip\rabbitmq-dotnet-client-@[email protected]\projects\examples\client\SendMap\src\examples\SendMap.cs' Vital='yes' />
51-
<File Id='SendStringCs' Name='SendStr.cs' LongName='SendString.cs' Source='..\tmp\unzip\rabbitmq-dotnet-client-@[email protected]\projects\examples\client\SendString\src\examples\SendString.cs' Vital='yes' />
52-
<File Id='SingleGetCs' Name='SnglGet.cs' LongName='SingleGet.cs' Source='..\tmp\unzip\rabbitmq-dotnet-client-@[email protected]\projects\examples\client\SingleGet\src\examples\SingleGet.cs' Vital='yes' />
36+
@FILES ../tmp/unzip/rabbitmq-dotnet-client-@[email protected]/projects/examples/client -name *.cs -not -name AssemblyInfo.cs
5337
</Component>
5438
</Directory>
5539

@@ -61,106 +45,10 @@
6145
</Directory>
6246

6347
<Directory Id='DocFolder' Name='doc'>
64-
<Directory Id='HtmlFolder' Name='html' FileSource='..\tmp\unzip\rabbitmq-dotnet-client-@VERSION@-client-htmldoc\html\'>
48+
<Directory Id='HtmlFolder' Name='html'>
6549
<Component Id='HtmlApiDocumentation' Guid='7B03679B-9677-4679-AE2B-1F70E7D92B45'>
66-
<!--
67-
The following was generated using
68-
> tallow -d build\doc\html -dav
69-
70-
Source attributes were removed with a regex replace of:
71-
Source[=]["][^"]*?["]
72-
with a space.
73-
74-
file0's shortcut was manually included afterwards.
75-
-->
76-
<File Id="file0" Name="INDEX_1.HTM" LongName="index.html" Vital="yes">
77-
<Shortcut Id='HtmlApiDocShortcut' Directory='DOTNET_CLIENT_MENU_DIR' Name='HtmlDoc' LongName='Autogenerated API documentation (HTML)' />
78-
</File>
79-
<File Id="file1" Name="NAMESP_1.HTM" LongName="namespace-RabbitMQ.Client.Content.html" Vital="yes" />
80-
<File Id="file2" Name="NAMESP_2.HTM" LongName="namespace-RabbitMQ.Client.Events.html" Vital="yes" />
81-
<File Id="file3" Name="NAMESP_3.HTM" LongName="namespace-RabbitMQ.Client.Exceptions.html" Vital="yes" />
82-
<File Id="file4" Name="NA19D7_1.HTM" LongName="namespace-RabbitMQ.Client.html" Vital="yes" />
83-
<File Id="file5" Name="NAMESP_4.HTM" LongName="namespace-RabbitMQ.Client.MessagePatterns.html" Vital="yes" />
84-
<File Id="file6" Name="NA712C_1.HTM" LongName="namespace-RabbitMQ.Util.html" Vital="yes" />
85-
<File Id="file7" Name="style.css" Vital="yes" />
86-
<File Id="file8" Name="TYPE-R_1.HTM" LongName="type-RabbitMQ.Client.AmqpTcpEndpoint.html" Vital="yes" />
87-
<File Id="file9" Name="TYPE-R_2.HTM" LongName="type-RabbitMQ.Client.AmqpTimestamp.html" Vital="yes" />
88-
<File Id="file10" Name="TYPE-R_3.HTM" LongName="type-RabbitMQ.Client.AmqpVersion.html" Vital="yes" />
89-
<File Id="file11" Name="TYPE-R_4.HTM" LongName="type-RabbitMQ.Client.BasicGetResult.html" Vital="yes" />
90-
<File Id="file12" Name="TY8B2A_1.HTM" LongName="type-RabbitMQ.Client.BinaryTableValue.html" Vital="yes" />
91-
<File Id="file13" Name="TY4CC6_1.HTM" LongName="type-RabbitMQ.Client.ConnectionFactory.html" Vital="yes" />
92-
<File Id="file14" Name="TY1373_1.HTM" LongName="type-RabbitMQ.Client.ConnectionParameters.html" Vital="yes" />
93-
<File Id="file15" Name="TYA577_1.HTM" LongName="type-RabbitMQ.Client.Content.BasicMessageBuilder.html" Vital="yes" />
94-
<File Id="file16" Name="TY8ED0_1.HTM" LongName="type-RabbitMQ.Client.Content.BasicMessageReader.html" Vital="yes" />
95-
<File Id="file17" Name="TYC537_1.HTM" LongName="type-RabbitMQ.Client.Content.BytesMessageBuilder.html" Vital="yes" />
96-
<File Id="file18" Name="TYCE50_1.HTM" LongName="type-RabbitMQ.Client.Content.BytesMessageReader.html" Vital="yes" />
97-
<File Id="file19" Name="TYE5C7_1.HTM" LongName="type-RabbitMQ.Client.Content.BytesWireFormatting.html" Vital="yes" />
98-
<File Id="file20" Name="TY23C6_1.HTM" LongName="type-RabbitMQ.Client.Content.IBytesMessageBuilder.html" Vital="yes" />
99-
<File Id="file21" Name="TY2FF3_1.HTM" LongName="type-RabbitMQ.Client.Content.IBytesMessageReader.html" Vital="yes" />
100-
<File Id="file22" Name="TY0A1F_1.HTM" LongName="type-RabbitMQ.Client.Content.IMapMessageBuilder.html" Vital="yes" />
101-
<File Id="file23" Name="TY0654_1.HTM" LongName="type-RabbitMQ.Client.Content.IMapMessageReader.html" Vital="yes" />
102-
<File Id="file24" Name="TY8ED6_1.HTM" LongName="type-RabbitMQ.Client.Content.IMessageBuilder.html" Vital="yes" />
103-
<File Id="file25" Name="TY40BF_1.HTM" LongName="type-RabbitMQ.Client.Content.IMessageReader.html" Vital="yes" />
104-
<File Id="file26" Name="TYE566_1.HTM" LongName="type-RabbitMQ.Client.Content.IStreamMessageBuilder.html" Vital="yes" />
105-
<File Id="file27" Name="TY1FB6_1.HTM" LongName="type-RabbitMQ.Client.Content.IStreamMessageReader.html" Vital="yes" />
106-
<File Id="file28" Name="TYDB65_1.HTM" LongName="type-RabbitMQ.Client.Content.MapMessageBuilder.html" Vital="yes" />
107-
<File Id="file29" Name="TYFAC4_1.HTM" LongName="type-RabbitMQ.Client.Content.MapMessageReader.html" Vital="yes" />
108-
<File Id="file30" Name="TYFBF5_1.HTM" LongName="type-RabbitMQ.Client.Content.MapWireFormatting.html" Vital="yes" />
109-
<File Id="file31" Name="TY85CA_1.HTM" LongName="type-RabbitMQ.Client.Content.PrimitiveParser.html" Vital="yes" />
110-
<File Id="file32" Name="TY27D6_1.HTM" LongName="type-RabbitMQ.Client.Content.StreamMessageBuilder.html" Vital="yes" />
111-
<File Id="file33" Name="TY231C_1.HTM" LongName="type-RabbitMQ.Client.Content.StreamMessageReader.html" Vital="yes" />
112-
<File Id="file34" Name="TY36BE_1.HTM" LongName="type-RabbitMQ.Client.Content.StreamWireFormatting.html" Vital="yes" />
113-
<File Id="file35" Name="TYF60D_1.HTM" LongName="type-RabbitMQ.Client.Content.StreamWireFormattingTag.html" Vital="yes" />
114-
<File Id="file36" Name="TYA185_1.HTM" LongName="type-RabbitMQ.Client.DefaultBasicConsumer.html" Vital="yes" />
115-
<File Id="file37" Name="TY893F_1.HTM" LongName="type-RabbitMQ.Client.Events.BasicDeliverEventArgs.html" Vital="yes" />
116-
<File Id="file38" Name="TY78D2_1.HTM" LongName="type-RabbitMQ.Client.Events.BasicDeliverEventHandler.html" Vital="yes" />
117-
<File Id="file39" Name="TY618B_1.HTM" LongName="type-RabbitMQ.Client.Events.BasicReturnEventArgs.html" Vital="yes" />
118-
<File Id="file40" Name="TY787E_1.HTM" LongName="type-RabbitMQ.Client.Events.BasicReturnEventHandler.html" Vital="yes" />
119-
<File Id="file41" Name="TY2300_1.HTM" LongName="type-RabbitMQ.Client.Events.CallbackExceptionEventArgs.html" Vital="yes" />
120-
<File Id="file42" Name="TY59B1_1.HTM" LongName="type-RabbitMQ.Client.Events.CallbackExceptionEventHandler.html" Vital="yes" />
121-
<File Id="file43" Name="TY15CF_1.HTM" LongName="type-RabbitMQ.Client.Events.ConnectionShutdownEventHandler.html" Vital="yes" />
122-
<File Id="file44" Name="TY75BB_1.HTM" LongName="type-RabbitMQ.Client.Events.ConsumerEventArgs.html" Vital="yes" />
123-
<File Id="file45" Name="TY77FA_1.HTM" LongName="type-RabbitMQ.Client.Events.ConsumerEventHandler.html" Vital="yes" />
124-
<File Id="file46" Name="TY7EBE_1.HTM" LongName="type-RabbitMQ.Client.Events.ConsumerShutdownEventHandler.html" Vital="yes" />
125-
<File Id="file47" Name="TYF3AA_1.HTM" LongName="type-RabbitMQ.Client.Events.EventingBasicConsumer.html" Vital="yes" />
126-
<File Id="file48" Name="TY1FF1_1.HTM" LongName="type-RabbitMQ.Client.Events.ModelShutdownEventHandler.html" Vital="yes" />
127-
<File Id="file49" Name="TY4CBD_1.HTM" LongName="type-RabbitMQ.Client.Exceptions.AlreadyClosedException.html" Vital="yes" />
128-
<File Id="file50" Name="TY3804_1.HTM" LongName="type-RabbitMQ.Client.Exceptions.BrokerUnreachableException.html" Vital="yes" />
129-
<File Id="file51" Name="TYD747_1.HTM" LongName="type-RabbitMQ.Client.Exceptions.ChannelAllocationException.html" Vital="yes" />
130-
<File Id="file52" Name="TY37F2_1.HTM" LongName="type-RabbitMQ.Client.Exceptions.OperationInterruptedException.html" Vital="yes" />
131-
<File Id="file53" Name="TY1629_1.HTM" LongName="type-RabbitMQ.Client.Exceptions.PacketNotRecognizedException.html" Vital="yes" />
132-
<File Id="file54" Name="TYFABA_1.HTM" LongName="type-RabbitMQ.Client.Exceptions.ProtocolVersionMismatchException.html" Vital="yes" />
133-
<File Id="file55" Name="TY9FCD_1.HTM" LongName="type-RabbitMQ.Client.Exceptions.UnexpectedMethodException.html" Vital="yes" />
134-
<File Id="file56" Name="TY9BB8_1.HTM" LongName="type-RabbitMQ.Client.Exceptions.UnsupportedMethodException.html" Vital="yes" />
135-
<File Id="file57" Name="TY34C2_1.HTM" LongName="type-RabbitMQ.Client.Exceptions.UnsupportedMethodFieldException.html" Vital="yes" />
136-
<File Id="file58" Name="TYD827_1.HTM" LongName="type-RabbitMQ.Client.Exceptions.WireFormattingException.html" Vital="yes" />
137-
<File Id="file59" Name="TYCFA8_1.HTM" LongName="type-RabbitMQ.Client.ExchangeType.html" Vital="yes" />
138-
<File Id="file60" Name="TY883B_1.HTM" LongName="type-RabbitMQ.Client.IBasicConsumer.html" Vital="yes" />
139-
<File Id="file61" Name="TYE88D_1.HTM" LongName="type-RabbitMQ.Client.IBasicProperties.html" Vital="yes" />
140-
<File Id="file62" Name="TY2F04_1.HTM" LongName="type-RabbitMQ.Client.IConnection.html" Vital="yes" />
141-
<File Id="file63" Name="TYDA15_1.HTM" LongName="type-RabbitMQ.Client.IContentHeader.html" Vital="yes" />
142-
<File Id="file64" Name="TYFFA0_1.HTM" LongName="type-RabbitMQ.Client.IFileProperties.html" Vital="yes" />
143-
<File Id="file65" Name="TY67B6_1.HTM" LongName="type-RabbitMQ.Client.IMethod.html" Vital="yes" />
144-
<File Id="file66" Name="TY5225_1.HTM" LongName="type-RabbitMQ.Client.IModel.html" Vital="yes" />
145-
<File Id="file67" Name="TY5785_1.HTM" LongName="type-RabbitMQ.Client.IProtocol.html" Vital="yes" />
146-
<File Id="file68" Name="TYFC9E_1.HTM" LongName="type-RabbitMQ.Client.IStreamProperties.html" Vital="yes" />
147-
<File Id="file69" Name="TYB6CD_1.HTM" LongName="type-RabbitMQ.Client.MessagePatterns.SimpleRpcClient.html" Vital="yes" />
148-
<File Id="file70" Name="TYB540_1.HTM" LongName="type-RabbitMQ.Client.MessagePatterns.SimpleRpcServer.html" Vital="yes" />
149-
<File Id="file71" Name="TY75DC_1.HTM" LongName="type-RabbitMQ.Client.MessagePatterns.Subscription.html" Vital="yes" />
150-
<File Id="file72" Name="TY70EA_1.HTM" LongName="type-RabbitMQ.Client.Protocols.html" Vital="yes" />
151-
<File Id="file73" Name="TYF3C1_1.HTM" LongName="type-RabbitMQ.Client.PublicationAddress.html" Vital="yes" />
152-
<File Id="file74" Name="TY3DED_1.HTM" LongName="type-RabbitMQ.Client.QueueingBasicConsumer.html" Vital="yes" />
153-
<File Id="file75" Name="TY39A0_1.HTM" LongName="type-RabbitMQ.Client.ShutdownEventArgs.html" Vital="yes" />
154-
<File Id="file76" Name="TY3AD4_1.HTM" LongName="type-RabbitMQ.Client.ShutdownInitiator.html" Vital="yes" />
155-
<File Id="file77" Name="TYA67C_1.HTM" LongName="type-RabbitMQ.Client.ShutdownReportEntry.html" Vital="yes" />
156-
<File Id="file78" Name="TY177D_1.HTM" LongName="type-RabbitMQ.Util.BlockingCell.html" Vital="yes" />
157-
<File Id="file79" Name="TYD6D5_1.HTM" LongName="type-RabbitMQ.Util.DebugUtil.html" Vital="yes" />
158-
<File Id="file80" Name="TY4397_1.HTM" LongName="type-RabbitMQ.Util.Either.html" Vital="yes" />
159-
<File Id="file81" Name="TY32A5_1.HTM" LongName="type-RabbitMQ.Util.EitherAlternative.html" Vital="yes" />
160-
<File Id="file82" Name="TY3355_1.HTM" LongName="type-RabbitMQ.Util.NetworkBinaryReader.html" Vital="yes" />
161-
<File Id="file83" Name="TYDDDB_1.HTM" LongName="type-RabbitMQ.Util.NetworkBinaryWriter.html" Vital="yes" />
162-
<File Id="file85" Name="TYC72D_1.HTM" LongName="type-RabbitMQ.Util.SharedQueue.html" Vital="yes" />
163-
<File Id="file86" Name="TY07F9_1.HTM" LongName="type-RabbitMQ.Util.XmlUtil.html" Vital="yes" />
50+
@FILES ../tmp/unzip/rabbitmq-dotnet-client-@VERSION@-client-htmldoc/html -name *.html
51+
<Shortcut Id='HtmlApiDocShortcut' Target="[#indexhtml]" Directory='DOTNET_CLIENT_MENU_DIR' Name='HtmlDoc' LongName='Autogenerated API documentation (HTML)' />
16452
</Component>
16553
</Directory>
16654

0 commit comments

Comments
 (0)