2009-11-04 8 views
10

La solution dansComment compiler un environnement binaire 32 bits sur une machine linux 64 bits sans toucher à la CFLAGS variables

How to compile a 32-bit binary on a 64-bit linux machine with gcc/cmake

est pas possible parce que j'utilise le logiciel 3ème partie et d'autres choses qui en utilisant déjà la variable CFLAGS. Et patcher leurs makefiles n'est pas autorisé - dit mon patron.

Donc je dois trouver un autre moyen de l'appliquer. Peut-être un peu de magie avec des liens symboliques redirigeant un appel à gcc vers une version 32bit du compilateur (en espérant que la cible par défaut ne soit pas détectée dynamiquement).

+0

Est-ce une "dépendance aux logiciels tiers et autres" une dépendance qui doit être compilée lors de la construction de votre binaire 32 bits? –

Répondre

14

Vous n'êtes pas autorisé à modifier CFLAGS dans votre environnement, mais y a-t-il une raison pour laquelle vous ne pouvez pas le remplacer temporairement pour la construction?

Pour un ensemble basé Autotool, je voudrais d'abord essayer:

CFLAGS="-m32" ./configure [opts] 
make 
make install 

Un fichier configure.ac bien écrit doit respecter votre CFLAGS variable et ajouter à elle, sans vous obliger à modifier la source de package.

Mise à jour

En supposant donc que vous ne pouvez pas redéfinir votre variable CC, que ce soit, je jouerais quelques trucs de chemin. Faire un script shell dans ${HOME}/gcc32 appelé gcc avec les éléments suivants (non testé):

#!/bin/sh 
/usr/bin/gcc -m32 "[email protected]" 

Ensuite, faites précéder ce à votre chemin quand vous voulez construire 32 bits:

export PATH=${HOME}/gcc32:${PATH} 

Des modifications évidentes soutiendront g++, icc, ou tout autre compilateur.

+0

Malheureusement, le fichier makefile lui-même définit CFLAGS et, pire encore, il le fait en fonction d'une cascade de conditions if. Je ne peux donc pas tenir compte de cela dans ma définition extérieure du CFLAGS. Le writer de makefile aurait dû utiliser un autre nom de variable et a quitté CFLAGS pour son usage prévu mais c'est le code tel qu'il est. – Lothar

+0

Incorporé cette nouvelle info dans la mise à jour ci-dessus – jvasak

+0

Vous devez utiliser un chemin absolu, sinon vous obtiendrez une récursion infinie. –

2

Supposons que gcc et amis se trouvent dans "/ usr/bin". Supposons aussi que vous avez un dossier appelé "~/.local/bin" qui se trouve sur votre chemin. Vous pouvez créer un script bash nommé "gcc" dans "~/.local/bin" comme:

 
#! /bin/bash 
/usr/bin/gcc -m32 [email protected] 

Vous pouvez créer de même un script "g ++" avec le contenu comme suit:

 
#! /bin/bash 
/usr/bin/g++ -m32 [email protected] 

Fondamentalement, continuez à faire cela pour "C++", "cc", "as", "ld", etc. selon les besoins. Rendez les scripts exécutables. Assurez-vous que "~/.local/bin" se trouve dans votre variable d'environnement PATH AVANT "/ usr/bin". Si tel est le cas, alors quand le makefile appelle le compilateur (en supposant qu'ils aient utilisé des chemins relatifs), vos scripts seront invoqués à la place.

+1

Utilisez "$ @" (avec guillemets) pour vous assurer que les espaces dans les arguments sont correctement gérés. – coppit

Questions connexes